mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-01 14:11:15 +00:00
audioresample: initial filter transient discarded; unit tests passing
This commit is contained in:
parent
b4cd3329a9
commit
87f2422737
1 changed files with 17 additions and 18 deletions
|
@ -389,6 +389,8 @@ gst_audio_resample_init_state (GstAudioResample * resample, gint width,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
funcs->skip_zeros (ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -941,8 +943,7 @@ gst_audio_resample_event (GstBaseTransform * base, GstEvent * event)
|
||||||
case GST_EVENT_FLUSH_STOP:
|
case GST_EVENT_FLUSH_STOP:
|
||||||
gst_audio_resample_reset_state (resample);
|
gst_audio_resample_reset_state (resample);
|
||||||
if (resample->state)
|
if (resample->state)
|
||||||
resample->count_gap = resample->funcs->get_filt_len (resample->state);
|
resample->funcs->skip_zeros (resample->state);
|
||||||
else
|
|
||||||
resample->count_gap = 0;
|
resample->count_gap = 0;
|
||||||
resample->count_nongap = 0;
|
resample->count_nongap = 0;
|
||||||
resample->t0 = GST_CLOCK_TIME_NONE;
|
resample->t0 = GST_CLOCK_TIME_NONE;
|
||||||
|
@ -957,8 +958,7 @@ gst_audio_resample_event (GstBaseTransform * base, GstEvent * event)
|
||||||
gst_audio_resample_push_drain (resample, resample->count_nongap);
|
gst_audio_resample_push_drain (resample, resample->count_nongap);
|
||||||
gst_audio_resample_reset_state (resample);
|
gst_audio_resample_reset_state (resample);
|
||||||
if (resample->state)
|
if (resample->state)
|
||||||
resample->count_gap = resample->funcs->get_filt_len (resample->state);
|
resample->funcs->skip_zeros (resample->state);
|
||||||
else
|
|
||||||
resample->count_gap = 0;
|
resample->count_gap = 0;
|
||||||
resample->count_nongap = 0;
|
resample->count_nongap = 0;
|
||||||
resample->t0 = GST_CLOCK_TIME_NONE;
|
resample->t0 = GST_CLOCK_TIME_NONE;
|
||||||
|
@ -985,9 +985,6 @@ gst_audio_resample_check_discont (GstAudioResample * resample, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
guint64 offset;
|
guint64 offset;
|
||||||
guint64 delta;
|
guint64 delta;
|
||||||
guint filt_len = resample->funcs->get_filt_len (resample->state);
|
|
||||||
guint64 delay =
|
|
||||||
gst_util_uint64_scale_round (filt_len, GST_SECOND, 2 * resample->inrate);
|
|
||||||
|
|
||||||
/* is the incoming buffer a discontinuity? */
|
/* is the incoming buffer a discontinuity? */
|
||||||
if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buf)))
|
if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buf)))
|
||||||
|
@ -1001,7 +998,7 @@ gst_audio_resample_check_discont (GstAudioResample * resample, GstBuffer * buf)
|
||||||
/* convert the inbound timestamp to an offset. */
|
/* convert the inbound timestamp to an offset. */
|
||||||
offset =
|
offset =
|
||||||
gst_util_uint64_scale_int_round (GST_BUFFER_TIMESTAMP (buf) -
|
gst_util_uint64_scale_int_round (GST_BUFFER_TIMESTAMP (buf) -
|
||||||
resample->t0 - delay, resample->inrate, GST_SECOND);
|
resample->t0, resample->inrate, GST_SECOND);
|
||||||
|
|
||||||
/* many elements generate imperfect streams due to rounding errors, so we
|
/* many elements generate imperfect streams due to rounding errors, so we
|
||||||
* permit a small error (up to one sample) without triggering a filter
|
* permit a small error (up to one sample) without triggering a filter
|
||||||
|
@ -1054,9 +1051,12 @@ gst_audio_resample_process (GstAudioResample * resample, GstBuffer * inbuf,
|
||||||
{
|
{
|
||||||
guint num, den;
|
guint num, den;
|
||||||
resample->funcs->get_ratio (resample->state, &num, &den);
|
resample->funcs->get_ratio (resample->state, &num, &den);
|
||||||
|
if (resample->samples_in + in_len >= filt_len / 2)
|
||||||
out_processed =
|
out_processed =
|
||||||
gst_util_uint64_scale_int_ceil (resample->samples_in + in_len, den,
|
gst_util_uint64_scale_int_ceil (resample->samples_in + in_len -
|
||||||
num) - resample->samples_out;
|
filt_len / 2, den, num) - resample->samples_out;
|
||||||
|
else
|
||||||
|
out_processed = 0;
|
||||||
|
|
||||||
memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf));
|
memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf));
|
||||||
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
|
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
|
||||||
|
@ -1209,17 +1209,16 @@ gst_audio_resample_transform (GstBaseTransform * base, GstBuffer * inbuf,
|
||||||
|
|
||||||
/* handle discontinuity */
|
/* handle discontinuity */
|
||||||
if (G_UNLIKELY (resample->need_discont)) {
|
if (G_UNLIKELY (resample->need_discont)) {
|
||||||
guint filt_len = resample->funcs->get_filt_len (resample->state);
|
resample->funcs->skip_zeros (resample->state);
|
||||||
guint64 delay = gst_util_uint64_scale_round (filt_len, GST_SECOND,
|
resample->count_gap = 0;
|
||||||
2 * resample->inrate);
|
resample->count_nongap = 0;
|
||||||
resample->count_gap = resample->funcs->get_filt_len (resample->state);
|
|
||||||
/* reset */
|
/* reset */
|
||||||
resample->samples_in = 0;
|
resample->samples_in = 0;
|
||||||
resample->samples_out = 0;
|
resample->samples_out = 0;
|
||||||
GST_DEBUG_OBJECT (resample, "found discontinuity; resyncing");
|
GST_DEBUG_OBJECT (resample, "found discontinuity; resyncing");
|
||||||
/* resync the timestamp and offset counters if possible */
|
/* resync the timestamp and offset counters if possible */
|
||||||
if (GST_BUFFER_TIMESTAMP_IS_VALID (inbuf)) {
|
if (GST_BUFFER_TIMESTAMP_IS_VALID (inbuf)) {
|
||||||
resample->t0 = GST_BUFFER_TIMESTAMP (inbuf) - delay;
|
resample->t0 = GST_BUFFER_TIMESTAMP (inbuf);
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (resample, "... but new timestamp is invalid");
|
GST_DEBUG_OBJECT (resample, "... but new timestamp is invalid");
|
||||||
resample->t0 = GST_CLOCK_TIME_NONE;
|
resample->t0 = GST_CLOCK_TIME_NONE;
|
||||||
|
|
Loading…
Reference in a new issue