diff --git a/gst-libs/gst/audio/audio-converter.c b/gst-libs/gst/audio/audio-converter.c index 44aac261e0..e2f6c82a54 100644 --- a/gst-libs/gst/audio/audio-converter.c +++ b/gst-libs/gst/audio/audio-converter.c @@ -1088,6 +1088,8 @@ gst_audio_converter_get_max_latency (GstAudioConverter * convert) void gst_audio_converter_reset (GstAudioConverter * convert) { + if (convert->resampler) + gst_audio_resampler_reset (convert->resampler); if (convert->quant) gst_audio_quantize_reset (convert->quant); } diff --git a/gst-libs/gst/audio/audio-resampler.c b/gst-libs/gst/audio/audio-resampler.c index 187be88a86..9bb89f235a 100644 --- a/gst-libs/gst/audio/audio-resampler.c +++ b/gst-libs/gst/audio/audio-resampler.c @@ -936,6 +936,34 @@ get_sample_bufs (GstAudioResampler * resampler, gsize need) return resampler->sbuf; } +/** + * gst_audio_resampler_reset: + * @resampler: a #GstAudioResampler + * + * Reset @resampler to the state it was when it was first created, discarding + * all sample history. + */ +void +gst_audio_resampler_reset (GstAudioResampler * resampler) +{ + g_return_if_fail (resampler != NULL); + + if (resampler->samples) { + gsize bytes; + gint c, blocks, bpf; + + bpf = resampler->bps * resampler->inc; + bytes = (resampler->n_taps / 2) * bpf; + blocks = resampler->blocks; + + for (c = 0; c < blocks; c++) + memset (resampler->sbuf[c], 0, bytes); + } + /* half of the filter is filled with 0 */ + resampler->samp_index = 0; + resampler->samples_avail = resampler->n_taps / 2 - 1; +} + /** * gst_audio_resampler_update: * @resampler: a #GstAudioResampler diff --git a/gst-libs/gst/audio/audio-resampler.h b/gst-libs/gst/audio/audio-resampler.h index c31789af2b..714d9bae5c 100644 --- a/gst-libs/gst/audio/audio-resampler.h +++ b/gst-libs/gst/audio/audio-resampler.h @@ -164,6 +164,7 @@ GstAudioResampler * gst_audio_resampler_new (GstAudioResamplerMetho GstStructure *options); void gst_audio_resampler_free (GstAudioResampler *resampler); +void gst_audio_resampler_reset (GstAudioResampler *resampler); gboolean gst_audio_resampler_update (GstAudioResampler *resampler, guint in_rate, guint out_rate, diff --git a/gst/audioresample/gstaudioresample.c b/gst/audioresample/gstaudioresample.c index 416dda38b7..0f15ac59fc 100644 --- a/gst/audioresample/gstaudioresample.c +++ b/gst/audioresample/gstaudioresample.c @@ -429,6 +429,8 @@ update_failed: static void gst_audio_resample_reset_state (GstAudioResample * resample) { + if (resample->converter) + gst_audio_converter_reset (resample->converter); } static gboolean @@ -507,32 +509,20 @@ invalid_outcaps: static void gst_audio_resample_dump_drain (GstAudioResample * resample, guint history_len) { -#if 0 - gint outsize; - guint in_len G_GNUC_UNUSED, in_processed; - guint out_len, out_processed; - guint num, den; - gpointer buf; - - g_assert (resample->converter != NULL); - - resample->funcs->get_ratio (resample->state, &num, &den); - - in_len = in_processed = history_len; - out_processed = out_len = - gst_util_uint64_scale_int_ceil (history_len, den, num); - outsize = out_len * resample->channels * (resample->funcs->width / 8); + gsize out_len, outsize; + gpointer out[1]; + out_len = + gst_audio_converter_get_out_frames (resample->converter, history_len); if (out_len == 0) return; - buf = g_malloc (outsize); - resample->funcs->process (resample->state, NULL, &in_processed, buf, - &out_processed); - g_free (buf); + outsize = out_len * resample->out.bpf; - g_assert (in_len == in_processed); -#endif + out[0] = g_malloc (outsize); + gst_audio_converter_samples (resample->converter, 0, NULL, history_len, + out, out_len); + g_free (out[0]); } static void @@ -616,10 +606,6 @@ gst_audio_resample_sink_event (GstBaseTransform * base, GstEvent * event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: gst_audio_resample_reset_state (resample); -#if 0 - if (resample->converter) - resample->funcs->skip_zeros (resample->converter); -#endif resample->num_gap_samples = 0; resample->num_nongap_samples = 0; resample->t0 = GST_CLOCK_TIME_NONE; @@ -630,18 +616,12 @@ gst_audio_resample_sink_event (GstBaseTransform * base, GstEvent * event) resample->need_discont = TRUE; break; case GST_EVENT_SEGMENT: -#if 0 if (resample->converter) { - guint latency = - resample->funcs->get_input_latency (resample->converter); + gsize latency = + gst_audio_converter_get_max_latency (resample->converter); gst_audio_resample_push_drain (resample, latency); } -#endif gst_audio_resample_reset_state (resample); -#if 0 - if (resample->converter) - resample->funcs->skip_zeros (resample->converter); -#endif resample->num_gap_samples = 0; resample->num_nongap_samples = 0; resample->t0 = GST_CLOCK_TIME_NONE; @@ -652,13 +632,11 @@ gst_audio_resample_sink_event (GstBaseTransform * base, GstEvent * event) resample->need_discont = TRUE; break; case GST_EVENT_EOS: -#if 0 if (resample->converter) { - guint latency = - resample->funcs->get_input_latency (resample->converter); + gsize latency = + gst_audio_converter_get_max_latency (resample->converter); gst_audio_resample_push_drain (resample, latency); } -#endif gst_audio_resample_reset_state (resample); break; default: @@ -859,9 +837,6 @@ gst_audio_resample_transform (GstBaseTransform * base, GstBuffer * inbuf, /* handle discontinuity */ if (G_UNLIKELY (resample->need_discont)) { -#if 0 - resample->funcs->skip_zeros (resample->state); -#endif resample->num_gap_samples = 0; resample->num_nongap_samples = 0; /* reset */ @@ -962,12 +937,10 @@ gst_audio_resample_query (GstPad * pad, GstObject * parent, GstQuery * query) gint rate = resample->in.rate; gint resampler_latency; -#if 0 - if (resample->state) + if (resample->converter) resampler_latency = - resample->funcs->get_input_latency (resample->state); + gst_audio_converter_get_max_latency (resample->converter); else -#endif resampler_latency = 0; if (gst_base_transform_is_passthrough (trans)) diff --git a/win32/common/libgstaudio.def b/win32/common/libgstaudio.def index 722aacc962..1fa3dd25a1 100644 --- a/win32/common/libgstaudio.def +++ b/win32/common/libgstaudio.def @@ -164,6 +164,7 @@ EXPORTS gst_audio_resampler_new gst_audio_resampler_options_set_quality gst_audio_resampler_resample + gst_audio_resampler_reset gst_audio_resampler_update gst_audio_ring_buffer_acquire gst_audio_ring_buffer_activate