summaryrefslogtreecommitdiffstats
path: root/ext/dv
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2009-06-18 23:43:49 +0100
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-06-22 10:49:02 +0100
commit42936a73e6d149cd1267957f0661a9fce7757d9b (patch)
tree8e4bd4765091a4bf021e0ecc80faba74208d07a3 /ext/dv
parent6c6e96becde568e95e17b10841cc5a60137998b6 (diff)
dvdemux: don't screw up first audio buffer
Query the audio format, esp. dvdemux->num_channels, before we use that variable to allocate the initial buffer. That way we don't accidentally push a zero-sized buffer as first audio buffer.
Diffstat (limited to 'ext/dv')
-rw-r--r--ext/dv/gstdvdemux.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c
index 99dea754..524444c0 100644
--- a/ext/dv/gstdvdemux.c
+++ b/ext/dv/gstdvdemux.c
@@ -1235,30 +1235,10 @@ gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer,
GstBuffer *outbuf;
gint frequency, channels;
- outbuf = gst_buffer_new_and_alloc (num_samples *
- sizeof (gint16) * dvdemux->channels);
-
- a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf);
-
- for (i = 0; i < num_samples; i++) {
- for (j = 0; j < dvdemux->channels; j++) {
- *(a_ptr++) = dvdemux->audio_buffers[j][i];
- }
- }
-
- GST_DEBUG ("pushing audio %" GST_TIME_FORMAT,
- GST_TIME_ARGS (dvdemux->time_segment.last_stop));
-
- GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop;
- GST_BUFFER_DURATION (outbuf) = duration;
- GST_BUFFER_OFFSET (outbuf) = dvdemux->audio_offset;
- dvdemux->audio_offset += num_samples;
- GST_BUFFER_OFFSET_END (outbuf) = dvdemux->audio_offset;
-
if (!dvdemux->audiosrcpad)
gst_dvdemux_add_audio_pad (dvdemux);
- /* check if format changed */
+ /* get initial format or check if format changed */
frequency = dv_get_frequency (dvdemux->decoder);
channels = dv_get_num_channels (dvdemux->decoder);
@@ -1280,6 +1260,26 @@ gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer,
gst_caps_unref (caps);
}
+ outbuf = gst_buffer_new_and_alloc (num_samples *
+ sizeof (gint16) * dvdemux->channels);
+
+ a_ptr = (gint16 *) GST_BUFFER_DATA (outbuf);
+
+ for (i = 0; i < num_samples; i++) {
+ for (j = 0; j < dvdemux->channels; j++) {
+ *(a_ptr++) = dvdemux->audio_buffers[j][i];
+ }
+ }
+
+ GST_DEBUG ("pushing audio %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (dvdemux->time_segment.last_stop));
+
+ GST_BUFFER_TIMESTAMP (outbuf) = dvdemux->time_segment.last_stop;
+ GST_BUFFER_DURATION (outbuf) = duration;
+ GST_BUFFER_OFFSET (outbuf) = dvdemux->audio_offset;
+ dvdemux->audio_offset += num_samples;
+ GST_BUFFER_OFFSET_END (outbuf) = dvdemux->audio_offset;
+
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (dvdemux->audiosrcpad));
ret = gst_pad_push (dvdemux->audiosrcpad, outbuf);