mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
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:
parent
916a018b60
commit
dd9c29938b
3 changed files with 42 additions and 12 deletions
12
ChangeLog
12
ChangeLog
|
@ -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):
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue