diff options
author | Petr Kulhavy <brain@jikos.cz> | 2016-10-21 14:30:31 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-11-28 17:24:13 +0200 |
commit | 640c54d8f8cf1a035044fa4f034b866883925a4d (patch) | |
tree | 1d6744f0d86985f5e14cbd924420749b969d8037 /gst-libs/gst/audio/audio-converter.c | |
parent | b2b8e775664fa35130e4617fd7cceb846939550b (diff) |
audio-convert: simplify the chain free process
It is not needed to store a pointer to every single chain element to free it.
Instead walk the channel list backwards and free the chain elements one by one.
Rename GstAudioConverter->chain_pack to chain_end.
https://bugzilla.gnome.org/show_bug.cgi?id=773073
Diffstat (limited to 'gst-libs/gst/audio/audio-converter.c')
-rw-r--r-- | gst-libs/gst/audio/audio-converter.c | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/gst-libs/gst/audio/audio-converter.c b/gst-libs/gst/audio/audio-converter.c index 1f0b4506a..61cd60392 100644 --- a/gst-libs/gst/audio/audio-converter.c +++ b/gst-libs/gst/audio/audio-converter.c @@ -116,32 +116,26 @@ struct _GstAudioConverter /* unpack */ gboolean in_default; gboolean unpack_ip; - AudioChain *unpack_chain; /* convert in */ AudioConvertFunc convert_in; - AudioChain *convert_in_chain; /* channel mix */ gboolean mix_passthrough; GstAudioChannelMixer *mix; - AudioChain *mix_chain; /* resample */ GstAudioResampler *resampler; - AudioChain *resample_chain; /* convert out */ AudioConvertFunc convert_out; - AudioChain *convert_out_chain; /* quant */ GstAudioQuantize *quant; - AudioChain *quant_chain; /* pack */ gboolean out_default; - AudioChain *pack_chain; + AudioChain *chain_end; /* NULL for empty chain or points to the last element in the chain */ AudioConvertSamplesFunc convert; }; @@ -598,7 +592,7 @@ chain_unpack (GstAudioConverter * convert) gst_audio_format_to_string (in->finfo->format), gst_audio_format_to_string (convert->current_format)); - prev = convert->unpack_chain = audio_chain_new (NULL, convert); + prev = audio_chain_new (NULL, convert); prev->allow_ip = prev->finfo->width <= in->finfo->width; prev->pass_alloc = FALSE; audio_chain_set_make_func (prev, do_unpack, convert, NULL); @@ -621,7 +615,7 @@ chain_convert_in (GstAudioConverter * convert, AudioChain * prev) convert->convert_in = (AudioConvertFunc) audio_orc_s32_to_double; convert->current_format = GST_AUDIO_FORMAT_F64; - prev = convert->convert_in_chain = audio_chain_new (prev, convert); + prev = audio_chain_new (prev, convert); prev->allow_ip = FALSE; prev->pass_alloc = FALSE; audio_chain_set_make_func (prev, do_convert_in, convert, NULL); @@ -656,7 +650,7 @@ chain_mix (GstAudioConverter * convert, AudioChain * prev) in->channels, out->channels); if (!convert->mix_passthrough) { - prev = convert->mix_chain = audio_chain_new (prev, convert); + prev = audio_chain_new (prev, convert); prev->allow_ip = FALSE; prev->pass_alloc = FALSE; audio_chain_set_make_func (prev, do_mix, convert, NULL); @@ -692,7 +686,7 @@ chain_resample (GstAudioConverter * convert, AudioChain * prev) gst_audio_resampler_new (method, flags, format, channels, in->rate, out->rate, convert->config); - prev = convert->resample_chain = audio_chain_new (prev, convert); + prev = audio_chain_new (prev, convert); prev->allow_ip = FALSE; prev->pass_alloc = FALSE; audio_chain_set_make_func (prev, do_resample, convert, NULL); @@ -715,7 +709,7 @@ chain_convert_out (GstAudioConverter * convert, AudioChain * prev) convert->current_format = GST_AUDIO_FORMAT_S32; GST_INFO ("convert F64 to S32"); - prev = convert->convert_out_chain = audio_chain_new (prev, convert); + prev = audio_chain_new (prev, convert); prev->allow_ip = TRUE; prev->pass_alloc = FALSE; audio_chain_set_make_func (prev, do_convert_out, convert, NULL); @@ -769,7 +763,7 @@ chain_quantize (GstAudioConverter * convert, AudioChain * prev) gst_audio_quantize_new (dither, ns, 0, convert->current_format, out->channels, 1U << (32 - out_depth)); - prev = convert->quant_chain = audio_chain_new (prev, convert); + prev = audio_chain_new (prev, convert); prev->allow_ip = TRUE; prev->pass_alloc = TRUE; audio_chain_set_make_func (prev, do_quantize, convert, NULL); @@ -809,7 +803,7 @@ setup_allocators (GstAudioConverter * convert) } /* now walk backwards, we try to write into the dest samples directly * and keep track if the source needs to be writable */ - for (chain = convert->pack_chain; chain; chain = chain->prev) { + for (chain = convert->chain_end; chain; chain = chain->prev) { chain->alloc_func = alloc_func; chain->alloc_data = convert; chain->allow_ip = allow_ip && chain->allow_ip; @@ -832,7 +826,7 @@ converter_passthrough (GstAudioConverter * convert, AudioChain *chain; gsize samples; - chain = convert->pack_chain; + chain = convert->chain_end; samples = in_frames * chain->inc; @@ -863,7 +857,7 @@ converter_generic (GstAudioConverter * convert, gint i; gsize produced; - chain = convert->pack_chain; + chain = convert->chain_end; convert->in_writable = flags & GST_AUDIO_CONVERTER_FLAG_IN_WRITABLE; convert->in_data = in; @@ -953,7 +947,7 @@ gst_audio_converter_new (GstAudioConverterFlags flags, GstAudioInfo * in_info, /* step 6, optional quantize */ prev = chain_quantize (convert, prev); /* step 7, pack */ - convert->pack_chain = chain_pack (convert, prev); + convert->chain_end = chain_pack (convert, prev); convert->convert = converter_generic; @@ -993,20 +987,17 @@ unpositioned: void gst_audio_converter_free (GstAudioConverter * convert) { + AudioChain *chain; + g_return_if_fail (convert != NULL); - if (convert->unpack_chain) - audio_chain_free (convert->unpack_chain); - if (convert->convert_in_chain) - audio_chain_free (convert->convert_in_chain); - if (convert->mix_chain) - audio_chain_free (convert->mix_chain); - if (convert->resample_chain) - audio_chain_free (convert->resample_chain); - if (convert->convert_out_chain) - audio_chain_free (convert->convert_out_chain); - if (convert->quant_chain) - audio_chain_free (convert->quant_chain); + /* walk the chain backwards and free all elements */ + for (chain = convert->chain_end; chain;) { + AudioChain *prev = chain->prev; + audio_chain_free (chain); + chain = prev; + } + if (convert->quant) gst_audio_quantize_free (convert->quant); if (convert->mix) |