diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2008-05-26 09:06:54 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-05-26 09:06:54 +0000 |
commit | dd9c29938bcf8e4182468da1e624609801d858c6 (patch) | |
tree | 85993f687f360747f8084aafb20c4a74d4a1e1bb | |
parent | 916a018b6022fdea07a7c4d840468477224051af (diff) | |
download | gstreamer-plugins-ugly-dd9c29938bcf8e4182468da1e624609801d858c6.tar.gz |
ext/a52dec/gsta52dec.*: Mark discont on outgoing buffers after receiving a DISCONT buffer or when we have a decoding ...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_push),
(gst_a52dec_sink_event), (gst_a52dec_handle_frame),
(gst_a52dec_chain), (gst_a52dec_change_state):
* ext/a52dec/gsta52dec.h:
Mark discont on outgoing buffers after receiving a DISCONT buffer or
when we have a decoding error.
We don't need to clear the cache when we receive a NEWSEGMENT event.
Clear buffer cache in DISCONT.
Add beginnings of GstSegment handling.
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | ext/a52dec/gsta52dec.c | 40 | ||||
-rw-r--r-- | ext/a52dec/gsta52dec.h | 2 |
3 files changed, 42 insertions, 12 deletions
@@ -1,3 +1,15 @@ +2008-05-26 Wim Taymans <wim.taymans@collabora.co.uk> + + * ext/a52dec/gsta52dec.c: (gst_a52dec_init), (gst_a52dec_push), + (gst_a52dec_sink_event), (gst_a52dec_handle_frame), + (gst_a52dec_chain), (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Mark discont on outgoing buffers after receiving a DISCONT buffer or + when we have a decoding error. + We don't need to clear the cache when we receive a NEWSEGMENT event. + Clear buffer cache in DISCONT. + Add beginnings of GstSegment handling. + 2008-05-26 Sebastian Dröge <slomo@circular-chaos.org> * gst/mpegaudioparse/gstxingmux.c: (generate_xing_header): diff --git a/ext/a52dec/gsta52dec.c b/ext/a52dec/gsta52dec.c index 388a861c..4f49d799 100644 --- a/ext/a52dec/gsta52dec.c +++ b/ext/a52dec/gsta52dec.c @@ -225,6 +225,7 @@ gst_a52dec_init (GstA52Dec * a52dec) a52dec->request_channels = A52_CHANNEL; a52dec->dynamic_range_compression = FALSE; a52dec->cache = NULL; + gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED); } static int @@ -345,6 +346,12 @@ gst_a52dec_push (GstA52Dec * a52dec, } GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_DURATION (buf) = 256 * GST_SECOND / a52dec->sample_rate; + /* set discont when needed */ + if (a52dec->discont) { + GST_LOG_OBJECT (a52dec, "marking DISCONT"); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); + a52dec->discont = FALSE; + } GST_DEBUG_OBJECT (a52dec, "Pushing buffer with ts %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT, @@ -409,32 +416,27 @@ gst_a52dec_sink_event (GstPad * pad, GstEvent * event) } else { a52dec->time = val; a52dec->sent_segment = TRUE; - ret = gst_pad_event_default (pad, event); - } - - if (a52dec->cache) { - gst_buffer_unref (a52dec->cache); - a52dec->cache = NULL; + ret = gst_pad_push_event (a52dec->srcpad, event); } break; } case GST_EVENT_TAG: - case GST_EVENT_EOS:{ - ret = gst_pad_event_default (pad, event); + case GST_EVENT_EOS: + ret = gst_pad_push_event (a52dec->srcpad, event); break; - } case GST_EVENT_FLUSH_START: - ret = gst_pad_event_default (pad, event); + ret = gst_pad_push_event (a52dec->srcpad, event); break; case GST_EVENT_FLUSH_STOP: if (a52dec->cache) { gst_buffer_unref (a52dec->cache); a52dec->cache = NULL; } - ret = gst_pad_event_default (pad, event); + gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED); + ret = gst_pad_push_event (a52dec->srcpad, event); break; default: - ret = gst_pad_event_default (pad, event); + ret = gst_pad_push_event (a52dec->srcpad, event); break; } @@ -527,6 +529,7 @@ gst_a52dec_handle_frame (GstA52Dec * a52dec, guint8 * data, a52dec->level = 1; if (a52_frame (a52dec->state, data, &flags, &a52dec->level, a52dec->bias)) { GST_WARNING ("a52_frame error"); + a52dec->discont = TRUE; return GST_FLOW_OK; } channels = flags & (A52_CHANNEL_MASK | A52_LFE); @@ -552,7 +555,9 @@ gst_a52dec_handle_frame (GstA52Dec * a52dec, guint8 * data, /* each frame consists of 6 blocks */ for (i = 0; i < 6; i++) { if (a52_block (a52dec->state)) { + /* ignore errors but mark a discont */ GST_WARNING ("a52_block error %d", i); + a52dec->discont = TRUE; } else { GstFlowReturn ret; @@ -593,6 +598,16 @@ gst_a52dec_chain (GstPad * pad, GstBuffer * buf) GstFlowReturn ret; gint first_access; + if (GST_BUFFER_IS_DISCONT (buf)) { + GST_LOG_OBJECT (a52dec, "received DISCONT"); + /* clear cache on discont and mark a discont in the element */ + if (a52dec->cache) { + gst_buffer_unref (a52dec->cache); + a52dec->cache = NULL; + } + a52dec->discont = TRUE; + } + if (a52dec->dvdmode) { gint size = GST_BUFFER_SIZE (buf); guchar *data = GST_BUFFER_DATA (buf); @@ -767,6 +782,7 @@ gst_a52dec_change_state (GstElement * element, GstStateChange transition) a52dec->bias = 0; a52dec->time = 0; a52dec->sent_segment = FALSE; + gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; diff --git a/ext/a52dec/gsta52dec.h b/ext/a52dec/gsta52dec.h index 299b905a..51a2bffb 100644 --- a/ext/a52dec/gsta52dec.h +++ b/ext/a52dec/gsta52dec.h @@ -45,9 +45,11 @@ struct _GstA52Dec { /* pads */ GstPad *sinkpad, *srcpad; + GstSegment segment; gboolean dvdmode; gboolean sent_segment; + gboolean discont; int bit_rate; int sample_rate; |