mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 00:06:36 +00:00
gst/speexresample/gstspeexresample.c: If the resampler gives less output samples than expected adjust the output buff...
Original commit message from CVS: * gst/speexresample/gstspeexresample.c: (gst_speex_fix_output_buffer), (gst_speex_resample_process): If the resampler gives less output samples than expected adjust the output buffer and print a warning.
This commit is contained in:
parent
644432907c
commit
a6a91b4ff8
2 changed files with 40 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-11-20 Sebastian Dröge <slomo@circular-chaos.org>
|
||||
|
||||
* gst/speexresample/gstspeexresample.c:
|
||||
(gst_speex_fix_output_buffer), (gst_speex_resample_process):
|
||||
If the resampler gives less output samples than expected
|
||||
adjust the output buffer and print a warning.
|
||||
|
||||
2007-11-20 Sebastian Dröge <slomo@circular-chaos.org>
|
||||
|
||||
* configure.ac:
|
||||
|
|
|
@ -534,6 +534,28 @@ gst_speex_resample_check_discont (GstSpeexResample * resample,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_speex_fix_output_buffer (GstSpeexResample * resample, GstBuffer * outbuf,
|
||||
guint diff)
|
||||
{
|
||||
GstClockTime timediff =
|
||||
gst_util_uint64_scale (diff, GST_SECOND, resample->outrate);
|
||||
|
||||
GST_LOG ("Adjusting buffer by %d samples", diff);
|
||||
|
||||
GST_BUFFER_DURATION (outbuf) -= timediff;
|
||||
GST_BUFFER_SIZE (outbuf) -= diff * ((resample->fp) ? 4 : 2);
|
||||
|
||||
if (resample->ts_offset != -1) {
|
||||
GST_BUFFER_OFFSET_END (outbuf) -= diff;
|
||||
resample->offset -= diff;
|
||||
resample->ts_offset -= diff;
|
||||
resample->next_ts =
|
||||
gst_util_uint64_scale_int (resample->ts_offset, GST_SECOND,
|
||||
resample->outrate);
|
||||
}
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
gst_speex_resample_process (GstSpeexResample * resample, GstBuffer * inbuf,
|
||||
GstBuffer * outbuf)
|
||||
|
@ -568,9 +590,17 @@ gst_speex_resample_process (GstSpeexResample * resample, GstBuffer * inbuf,
|
|||
if (in_len != in_processed)
|
||||
GST_WARNING ("Converted %d of %d input samples", in_processed, in_len);
|
||||
|
||||
if (out_len != out_processed)
|
||||
GST_WARNING ("Converted to %d instead of %d output samples", out_processed,
|
||||
out_len);
|
||||
if (out_len != out_processed) {
|
||||
/* One sample difference is allowed as this will happen
|
||||
* because of rounding errors */
|
||||
if (out_len - out_processed != 1)
|
||||
GST_WARNING ("Converted to %d instead of %d output samples",
|
||||
out_processed, out_len);
|
||||
if (out_len > out_processed)
|
||||
gst_speex_fix_output_buffer (resample, outbuf, out_len - out_processed);
|
||||
else
|
||||
g_error ("Wrote more output then allocated!");
|
||||
}
|
||||
|
||||
if (err != RESAMPLER_ERR_SUCCESS) {
|
||||
GST_ERROR ("Failed to convert data: %s", resample_resampler_strerror (err));
|
||||
|
|
Loading…
Reference in a new issue