From c2a98834b6c9e7249b7450c16a1bdcf3b0cb0cd9 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Wed, 15 Mar 2006 22:01:40 +0000 Subject: [PATCH] ext/a52dec/gsta52dec.*: Fix #334550: failure to play raw AC3 files due to segment problems. Original commit message from CVS: * ext/a52dec/gsta52dec.c: (gst_a52dec_sink_event), (gst_a52dec_chain_raw), (gst_a52dec_change_state): * ext/a52dec/gsta52dec.h: Fix #334550: failure to play raw AC3 files due to segment problems. --- ChangeLog | 7 +++++++ ext/a52dec/gsta52dec.c | 18 ++++++++++++++++++ ext/a52dec/gsta52dec.h | 1 + 3 files changed, 26 insertions(+) diff --git a/ChangeLog b/ChangeLog index ed89163e9d..00fd4073b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-03-15 Michael Smith + + * ext/a52dec/gsta52dec.c: (gst_a52dec_sink_event), + (gst_a52dec_chain_raw), (gst_a52dec_change_state): + * ext/a52dec/gsta52dec.h: + Fix #334550: failure to play raw AC3 files due to segment problems. + 2006-03-15 Tim-Philipp Müller Patch by: Christophe Fergeau diff --git a/ext/a52dec/gsta52dec.c b/ext/a52dec/gsta52dec.c index 2785a85de9..d710842766 100644 --- a/ext/a52dec/gsta52dec.c +++ b/ext/a52dec/gsta52dec.c @@ -369,6 +369,7 @@ gst_a52dec_sink_event (GstPad * pad, GstEvent * event) GST_WARNING ("No time in newsegment event %p", event); } else { a52dec->time = val; + a52dec->sent_segment = TRUE; } if (a52dec->cache) { @@ -579,6 +580,22 @@ gst_a52dec_chain_raw (GstPad * pad, GstBuffer * buf) gint length = 0, flags, sample_rate, bit_rate; GstFlowReturn result = GST_FLOW_OK; + if (!a52dec->sent_segment) { + GstSegment segment; + + /* Create a basic segment. Usually, we'll get a new-segment sent by + * another element that will know more information (a demuxer). If we're + * just looking at a raw AC3 stream, we won't - so we need to send one + * here, but we don't know much info, so just send a minimal TIME + * new-segment event + */ + gst_segment_init (&segment, GST_FORMAT_TIME); + gst_pad_push_event (a52dec->srcpad, gst_event_new_new_segment (FALSE, + segment.rate, segment.format, segment.start, + segment.duration, segment.start)); + a52dec->sent_segment = TRUE; + } + /* merge with cache, if any. Also make sure timestamps match */ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { a52dec->time = GST_BUFFER_TIMESTAMP (buf); @@ -662,6 +679,7 @@ gst_a52dec_change_state (GstElement * element, GstStateChange transition) a52dec->level = 1; a52dec->bias = 0; a52dec->time = 0; + a52dec->sent_segment = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; diff --git a/ext/a52dec/gsta52dec.h b/ext/a52dec/gsta52dec.h index 88d82edbd3..51aa6078e4 100644 --- a/ext/a52dec/gsta52dec.h +++ b/ext/a52dec/gsta52dec.h @@ -47,6 +47,7 @@ struct _GstA52Dec { *srcpad; gboolean dvdmode; + gboolean sent_segment; int bit_rate; int sample_rate;