mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
module-rtp: don't leak opus codec and ptp_sender
Add a deinit() function and use it to free the opus codec we created in init(). Also free the ptp_sender when it was created.
This commit is contained in:
parent
a09bf57944
commit
42b779974c
2 changed files with 21 additions and 1 deletions
|
|
@ -320,6 +320,16 @@ static void rtp_opus_process_capture(void *data)
|
||||||
rtp_opus_flush_packets(impl);
|
rtp_opus_flush_packets(impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rtp_opus_deinit(struct impl *impl, enum spa_direction direction)
|
||||||
|
{
|
||||||
|
if (impl->stream_data) {
|
||||||
|
if (direction == SPA_DIRECTION_INPUT)
|
||||||
|
opus_multistream_encoder_destroy(impl->stream_data);
|
||||||
|
else
|
||||||
|
opus_multistream_decoder_destroy(impl->stream_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int rtp_opus_init(struct impl *impl, enum spa_direction direction)
|
static int rtp_opus_init(struct impl *impl, enum spa_direction direction)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
@ -342,6 +352,7 @@ static int rtp_opus_init(struct impl *impl, enum spa_direction direction)
|
||||||
for (i = 0; i < impl->info.info.opus.channels; i++)
|
for (i = 0; i < impl->info.info.opus.channels; i++)
|
||||||
mapping[i] = i;
|
mapping[i] = i;
|
||||||
|
|
||||||
|
impl->deinit = rtp_opus_deinit;
|
||||||
impl->receive_rtp = rtp_opus_receive;
|
impl->receive_rtp = rtp_opus_receive;
|
||||||
if (direction == SPA_DIRECTION_INPUT) {
|
if (direction == SPA_DIRECTION_INPUT) {
|
||||||
impl->stream_events.process = rtp_opus_process_capture;
|
impl->stream_events.process = rtp_opus_process_capture;
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ struct impl {
|
||||||
|
|
||||||
const struct format_info *format_info;
|
const struct format_info *format_info;
|
||||||
|
|
||||||
|
enum spa_direction direction;
|
||||||
void *stream_data;
|
void *stream_data;
|
||||||
|
|
||||||
uint32_t rate;
|
uint32_t rate;
|
||||||
|
|
@ -103,6 +104,7 @@ struct impl {
|
||||||
|
|
||||||
int (*receive_rtp)(struct impl *impl, uint8_t *buffer, ssize_t len);
|
int (*receive_rtp)(struct impl *impl, uint8_t *buffer, ssize_t len);
|
||||||
void (*flush_timeout)(struct impl *impl, uint64_t expirations);
|
void (*flush_timeout)(struct impl *impl, uint64_t expirations);
|
||||||
|
void (*deinit)(struct impl *impl, enum spa_direction direction);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pw_filter where the filter would be driven at the PTP clock
|
* pw_filter where the filter would be driven at the PTP clock
|
||||||
|
|
@ -304,7 +306,7 @@ static void on_flush_timeout(void *d, uint64_t expirations)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rtp_stream *rtp_stream_new(struct pw_core *core,
|
struct rtp_stream *rtp_stream_new(struct pw_core *core,
|
||||||
enum pw_direction direction, struct pw_properties *props,
|
enum spa_direction direction, struct pw_properties *props,
|
||||||
const struct rtp_stream_events *events, void *data)
|
const struct rtp_stream_events *events, void *data)
|
||||||
{
|
{
|
||||||
struct impl *impl;
|
struct impl *impl;
|
||||||
|
|
@ -326,6 +328,7 @@ struct rtp_stream *rtp_stream_new(struct pw_core *core,
|
||||||
}
|
}
|
||||||
impl->first = true;
|
impl->first = true;
|
||||||
spa_hook_list_init(&impl->listener_list);
|
spa_hook_list_init(&impl->listener_list);
|
||||||
|
impl->direction = direction;
|
||||||
impl->stream_events = stream_events;
|
impl->stream_events = stream_events;
|
||||||
impl->context = pw_core_get_context(core);
|
impl->context = pw_core_get_context(core);
|
||||||
impl->main_loop = pw_context_get_main_loop(impl->context);
|
impl->main_loop = pw_context_get_main_loop(impl->context);
|
||||||
|
|
@ -631,6 +634,12 @@ void rtp_stream_destroy(struct rtp_stream *s)
|
||||||
|
|
||||||
rtp_stream_emit_destroy(impl);
|
rtp_stream_emit_destroy(impl);
|
||||||
|
|
||||||
|
if (impl->deinit)
|
||||||
|
impl->deinit(impl, impl->direction);
|
||||||
|
|
||||||
|
if (impl->ptp_sender)
|
||||||
|
pw_filter_destroy(impl->ptp_sender);
|
||||||
|
|
||||||
if (impl->stream)
|
if (impl->stream)
|
||||||
pw_stream_destroy(impl->stream);
|
pw_stream_destroy(impl->stream);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue