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.
This commit is contained in:
Wim Taymans 2008-05-26 09:06:54 +00:00
parent 916a018b60
commit dd9c29938b
3 changed files with 42 additions and 12 deletions

View file

@ -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> 2008-05-26 Sebastian Dröge <slomo@circular-chaos.org>
* gst/mpegaudioparse/gstxingmux.c: (generate_xing_header): * gst/mpegaudioparse/gstxingmux.c: (generate_xing_header):

View file

@ -225,6 +225,7 @@ gst_a52dec_init (GstA52Dec * a52dec)
a52dec->request_channels = A52_CHANNEL; a52dec->request_channels = A52_CHANNEL;
a52dec->dynamic_range_compression = FALSE; a52dec->dynamic_range_compression = FALSE;
a52dec->cache = NULL; a52dec->cache = NULL;
gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED);
} }
static int static int
@ -345,6 +346,12 @@ gst_a52dec_push (GstA52Dec * a52dec,
} }
GST_BUFFER_TIMESTAMP (buf) = timestamp; GST_BUFFER_TIMESTAMP (buf) = timestamp;
GST_BUFFER_DURATION (buf) = 256 * GST_SECOND / a52dec->sample_rate; 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, GST_DEBUG_OBJECT (a52dec,
"Pushing buffer with ts %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT, "Pushing buffer with ts %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT,
@ -409,32 +416,27 @@ gst_a52dec_sink_event (GstPad * pad, GstEvent * event)
} else { } else {
a52dec->time = val; a52dec->time = val;
a52dec->sent_segment = TRUE; a52dec->sent_segment = TRUE;
ret = gst_pad_event_default (pad, event); ret = gst_pad_push_event (a52dec->srcpad, event);
}
if (a52dec->cache) {
gst_buffer_unref (a52dec->cache);
a52dec->cache = NULL;
} }
break; break;
} }
case GST_EVENT_TAG: case GST_EVENT_TAG:
case GST_EVENT_EOS:{ case GST_EVENT_EOS:
ret = gst_pad_event_default (pad, event); ret = gst_pad_push_event (a52dec->srcpad, event);
break; break;
}
case GST_EVENT_FLUSH_START: case GST_EVENT_FLUSH_START:
ret = gst_pad_event_default (pad, event); ret = gst_pad_push_event (a52dec->srcpad, event);
break; break;
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
if (a52dec->cache) { if (a52dec->cache) {
gst_buffer_unref (a52dec->cache); gst_buffer_unref (a52dec->cache);
a52dec->cache = NULL; 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; break;
default: default:
ret = gst_pad_event_default (pad, event); ret = gst_pad_push_event (a52dec->srcpad, event);
break; break;
} }
@ -527,6 +529,7 @@ gst_a52dec_handle_frame (GstA52Dec * a52dec, guint8 * data,
a52dec->level = 1; a52dec->level = 1;
if (a52_frame (a52dec->state, data, &flags, &a52dec->level, a52dec->bias)) { if (a52_frame (a52dec->state, data, &flags, &a52dec->level, a52dec->bias)) {
GST_WARNING ("a52_frame error"); GST_WARNING ("a52_frame error");
a52dec->discont = TRUE;
return GST_FLOW_OK; return GST_FLOW_OK;
} }
channels = flags & (A52_CHANNEL_MASK | A52_LFE); 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 */ /* each frame consists of 6 blocks */
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
if (a52_block (a52dec->state)) { if (a52_block (a52dec->state)) {
/* ignore errors but mark a discont */
GST_WARNING ("a52_block error %d", i); GST_WARNING ("a52_block error %d", i);
a52dec->discont = TRUE;
} else { } else {
GstFlowReturn ret; GstFlowReturn ret;
@ -593,6 +598,16 @@ gst_a52dec_chain (GstPad * pad, GstBuffer * buf)
GstFlowReturn ret; GstFlowReturn ret;
gint first_access; 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) { if (a52dec->dvdmode) {
gint size = GST_BUFFER_SIZE (buf); gint size = GST_BUFFER_SIZE (buf);
guchar *data = GST_BUFFER_DATA (buf); guchar *data = GST_BUFFER_DATA (buf);
@ -767,6 +782,7 @@ gst_a52dec_change_state (GstElement * element, GstStateChange transition)
a52dec->bias = 0; a52dec->bias = 0;
a52dec->time = 0; a52dec->time = 0;
a52dec->sent_segment = FALSE; a52dec->sent_segment = FALSE;
gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED);
break; break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING: case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
break; break;

View file

@ -45,9 +45,11 @@ struct _GstA52Dec {
/* pads */ /* pads */
GstPad *sinkpad, GstPad *sinkpad,
*srcpad; *srcpad;
GstSegment segment;
gboolean dvdmode; gboolean dvdmode;
gboolean sent_segment; gboolean sent_segment;
gboolean discont;
int bit_rate; int bit_rate;
int sample_rate; int sample_rate;