mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-02 22:46:35 +00:00
opusdec: Handle GstAudioClippingMeta instead of the pre-skip field in the OpusHead
oggdemux is outputting the meta now, and only outputs if it should really apply to the current buffer. Previously we would skip N samples also if we started the decoder in the middle of the stream. https://bugzilla.gnome.org/show_bug.cgi?id=757153
This commit is contained in:
parent
328f9088f3
commit
fc475ce01a
1 changed files with 30 additions and 5 deletions
|
@ -380,6 +380,7 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer)
|
||||||
unsigned int packet_size;
|
unsigned int packet_size;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstMapInfo map, omap;
|
GstMapInfo map, omap;
|
||||||
|
GstAudioClippingMeta *cmeta = NULL;
|
||||||
|
|
||||||
if (dec->state == NULL) {
|
if (dec->state == NULL) {
|
||||||
/* If we did not get any headers, default to 2 channels */
|
/* If we did not get any headers, default to 2 channels */
|
||||||
|
@ -534,17 +535,41 @@ opus_dec_chain_parse_data (GstOpusDec * dec, GstBuffer * buffer)
|
||||||
GST_DEBUG_OBJECT (dec, "decoded %d samples", n);
|
GST_DEBUG_OBJECT (dec, "decoded %d samples", n);
|
||||||
gst_buffer_set_size (outbuf, n * 2 * dec->n_channels);
|
gst_buffer_set_size (outbuf, n * 2 * dec->n_channels);
|
||||||
|
|
||||||
|
cmeta = gst_buffer_get_audio_clipping_meta (buf);
|
||||||
|
|
||||||
|
g_assert (!cmeta || cmeta->format == GST_FORMAT_DEFAULT);
|
||||||
|
|
||||||
/* Skip any samples that need skipping */
|
/* Skip any samples that need skipping */
|
||||||
if (dec->pre_skip > 0) {
|
if (cmeta && cmeta->start) {
|
||||||
guint scaled_pre_skip = dec->pre_skip * dec->sample_rate / 48000;
|
guint pre_skip = cmeta->start;
|
||||||
|
guint scaled_pre_skip = pre_skip * dec->sample_rate / 48000;
|
||||||
guint skip = scaled_pre_skip > n ? n : scaled_pre_skip;
|
guint skip = scaled_pre_skip > n ? n : scaled_pre_skip;
|
||||||
guint scaled_skip = skip * 48000 / dec->sample_rate;
|
guint scaled_skip = skip * 48000 / dec->sample_rate;
|
||||||
|
|
||||||
gst_buffer_resize (outbuf, skip * 2 * dec->n_channels, -1);
|
gst_buffer_resize (outbuf, skip * 2 * dec->n_channels, -1);
|
||||||
dec->pre_skip -= scaled_skip;
|
|
||||||
GST_INFO_OBJECT (dec,
|
GST_INFO_OBJECT (dec,
|
||||||
"Skipping %u samples (%u at 48000 Hz, %u left to skip)", skip,
|
"Skipping %u samples at the beginning (%u at 48000 Hz)",
|
||||||
scaled_skip, dec->pre_skip);
|
skip, scaled_skip);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmeta && cmeta->end) {
|
||||||
|
guint post_skip = cmeta->end;
|
||||||
|
guint scaled_post_skip = post_skip * dec->sample_rate / 48000;
|
||||||
|
guint skip = scaled_post_skip > n ? n : scaled_post_skip;
|
||||||
|
guint scaled_skip = skip * 48000 / dec->sample_rate;
|
||||||
|
guint outsize = gst_buffer_get_size (outbuf);
|
||||||
|
guint skip_bytes = skip * 2 * dec->n_channels;
|
||||||
|
|
||||||
|
if (outsize > skip_bytes)
|
||||||
|
outsize -= skip_bytes;
|
||||||
|
else
|
||||||
|
outsize = 0;
|
||||||
|
|
||||||
|
gst_buffer_resize (outbuf, 0, outsize);
|
||||||
|
|
||||||
|
GST_INFO_OBJECT (dec,
|
||||||
|
"Skipping %u samples at the end (%u at 48000 Hz)", skip, scaled_skip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_buffer_get_size (outbuf) == 0) {
|
if (gst_buffer_get_size (outbuf) == 0) {
|
||||||
|
|
Loading…
Reference in a new issue