gst/mve/gstmvedemux.c: Fix audio discontinuity that happens when silent chunks are followed by real data again. Fixes...

Original commit message from CVS:
Patch by: Jens Granseuer <jensgr at gmx dot net>
* gst/mve/gstmvedemux.c: (gst_mve_audio_data),
(gst_mve_demux_get_type):
Fix audio discontinuity that happens when silent chunks are
followed by real data again. Fixes bug #519905.
This commit is contained in:
Jens Granseuer 2008-03-03 04:39:48 +00:00 committed by Sebastian Dröge
parent 8be7f45f67
commit 3f4628dd47
2 changed files with 22 additions and 17 deletions

View file

@ -1,3 +1,12 @@
2008-03-03 Sebastian Dröge <slomo@circular-chaos.org>
Patch by: Jens Granseuer <jensgr at gmx dot net>
* gst/mve/gstmvedemux.c: (gst_mve_audio_data),
(gst_mve_demux_get_type):
Fix audio discontinuity that happens when silent chunks are
followed by real data again. Fixes bug #519905.
2008-03-01 Zaheer Abbas Merali <zaheerabbas at merali dot org> 2008-03-01 Zaheer Abbas Merali <zaheerabbas at merali dot org>
* sys/dvb/gstdvbsrc.c: * sys/dvb/gstdvbsrc.c:

View file

@ -1,6 +1,6 @@
/* GStreamer demultiplexer plugin for Interplay MVE movie files /* GStreamer demultiplexer plugin for Interplay MVE movie files
* *
* Copyright (C) 2006 Jens Granseuer <jensgr@gmx.net> * Copyright (C) 2006-2008 Jens Granseuer <jensgr@gmx.net>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -759,7 +759,7 @@ gst_mve_audio_data (GstMveDemux * mve, guint8 type, const guint8 * data,
guint16 n_samples = size / s->n_channels / (s->sample_size / 8); guint16 n_samples = size / s->n_channels / (s->sample_size / 8);
GstClockTime duration = (GST_SECOND / s->sample_rate) * n_samples; GstClockTime duration = (GST_SECOND / s->sample_rate) * n_samples;
if (type == 8) { if (type == MVE_OC_AUDIO_DATA) {
guint16 required = (s->compression ? size / 2 + s->n_channels : size); guint16 required = (s->compression ? size / 2 + s->n_channels : size);
if (len < required) if (len < required)
@ -776,29 +776,25 @@ gst_mve_audio_data (GstMveDemux * mve, guint8 type, const guint8 * data,
else else
memcpy (GST_BUFFER_DATA (buf), data, size); memcpy (GST_BUFFER_DATA (buf), data, size);
GST_BUFFER_DURATION (buf) = duration;
GST_BUFFER_OFFSET_END (buf) = s->offset + n_samples;
GST_DEBUG_OBJECT (mve, "created audio buffer, size:%u, stream_mask:%x", GST_DEBUG_OBJECT (mve, "created audio buffer, size:%u, stream_mask:%x",
size, stream_mask); size, stream_mask);
*output = buf;
} else { } else {
/* silence - /* silence - create a minimal buffer with no sound */
don't return a buffer but notify downstream there won't be size = s->n_channels * (s->sample_size / 8);
any data in this chunk */ ret = gst_mve_buffer_alloc_for_pad (s, size, &buf);
if (mve->audio_stream->pad) memset (GST_BUFFER_DATA (buf), 0, size);
gst_pad_push_event (mve->audio_stream->pad,
gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME,
s->last_ts + duration, GST_CLOCK_TIME_NONE, 0));
} }
GST_BUFFER_DURATION (buf) = duration;
GST_BUFFER_OFFSET_END (buf) = s->offset + n_samples;
*output = buf;
s->offset += n_samples; s->offset += n_samples;
s->last_ts += duration; s->last_ts += duration;
} else { } else {
/* alternate audio streams not supported. /* alternate audio streams not supported.
are there any movies which use them? */ are there any movies which use them? */
if (type == 8) if (type == MVE_OC_AUDIO_DATA)
GST_WARNING_OBJECT (mve, "found non-empty alternate audio stream"); GST_WARNING_OBJECT (mve, "found non-empty alternate audio stream");
} }
@ -1141,7 +1137,7 @@ gst_mve_demux_get_type (void)
static GType plugin_type = 0; static GType plugin_type = 0;
if (!plugin_type) { if (!plugin_type) {
static const GTypeInfo plugin_info = { const GTypeInfo plugin_info = {
sizeof (GstMveDemuxClass), sizeof (GstMveDemuxClass),
(GBaseInitFunc) gst_mve_demux_base_init, (GBaseInitFunc) gst_mve_demux_base_init,
NULL, NULL,