diff options
author | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-08-16 15:42:08 +0200 |
---|---|---|
committer | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-09-03 11:26:54 +0200 |
commit | b44873e16d1dcded0aeceab985d194657d971c50 (patch) | |
tree | 3d138184dcfd49e6c8301b2e212963e9bd422a68 | |
parent | 9d11bab50afed327df3e953c1edb4fa7d8f73d56 (diff) |
auddec1: implement NEWSEGMENT handling
... so as to improve timestamp tracking following seek.
4 files changed, 20 insertions, 10 deletions
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.c index 1ff1c86..30df36a 100644 --- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.c +++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.c @@ -432,6 +432,7 @@ static void gst_tiauddec1_init(GstTIAuddec1 *auddec1, GstTIAuddec1Class *gclass) auddec1->totalDuration = 0; auddec1->totalBytes = 0; auddec1->sampleRate = 0; + auddec1->bufTime = 0; auddec1->rtCodecThread = TRUE; @@ -733,8 +734,12 @@ static gboolean gst_tiauddec1_sink_event(GstPad *pad, GstEvent *event) /* Parse new segment event (if needed then convert from byte format * to time format). */ - gst_ti_parse_newsegment(&event, auddec1->segment, - &auddec1->totalDuration, auddec1->totalBytes); + if (!gst_ti_parse_newsegment(&event, auddec1->segment, + &auddec1->totalDuration, auddec1->totalBytes)) { + /* Track new timestamp */ + GST_DEBUG("clearing base time"); + auddec1->bufTime = GST_CLOCK_TIME_NONE; + } /* Propagate NEWSEGMENT to downstream elements */ ret = gst_pad_push_event(auddec1->srcpad, event); @@ -849,9 +854,12 @@ static GstFlowReturn gst_tiauddec1_chain(GstPad * pad, GstBuffer * buf) } } - GST_TICIRCBUFFER_TIMESTAMP(auddec1->circBuf) = - GST_CLOCK_TIME_IS_VALID(GST_BUFFER_TIMESTAMP(buf)) ? - GST_BUFFER_TIMESTAMP(buf) : 0ULL; + } + + if (!GST_CLOCK_TIME_IS_VALID(auddec1->bufTime) + && GST_BUFFER_TIMESTAMP_IS_VALID(buf)) { + auddec1->bufTime = GST_BUFFER_TIMESTAMP(buf); + GST_DEBUG("new basetime from buffer"); } /* Queue up the encoded data stream into a circular buffer */ @@ -1152,6 +1160,7 @@ static gboolean gst_tiauddec1_codec_start (GstTIAuddec1 *auddec1) gst_ticircbuffer_unref(auddec1->circBuf); auddec1->circBuf = gst_ticircbuffer_new( Adec1_getInBufSize(auddec1->hAd), 30, FALSE); + GST_TICIRCBUFFER_TIMESTAMP(auddec1->circBuf) = GST_CLOCK_TIME_NONE; if (auddec1->circBuf == NULL) { GST_ELEMENT_ERROR(auddec1, RESOURCE, NO_SPACE_LEFT, @@ -1334,7 +1343,6 @@ thread_resume: numSamples = sampleDataSize / (2 * auddec1->channels) ; sampleDuration = GST_FRAMES_TO_CLOCK_TIME(numSamples, sampleRate); - encDataTime = auddec1->totalDuration; offset = GST_CLOCK_TIME_TO_FRAMES(auddec1->totalDuration, sampleRate); @@ -1354,8 +1362,9 @@ thread_resume: if (auddec1->genTimeStamps) { GST_BUFFER_OFFSET(outBuf) = offset; GST_BUFFER_DURATION(outBuf) = sampleDuration; - GST_BUFFER_TIMESTAMP(outBuf) = encDataTime; + GST_BUFFER_TIMESTAMP(outBuf) = auddec1->bufTime; auddec1->totalDuration += GST_BUFFER_DURATION (outBuf); + auddec1->bufTime += GST_BUFFER_DURATION (outBuf); } else { GST_BUFFER_TIMESTAMP(outBuf) = GST_CLOCK_TIME_NONE; diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.h b/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.h index b78f381..4e587e1 100644 --- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.h +++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.h @@ -99,6 +99,7 @@ struct _GstTIAuddec1 /* Buffer timestamp */ gint64 totalDuration; guint64 totalBytes; + GstClockTime bufTime; }; /* _GstTIAuddec1Class object */ diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.c b/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.c index f0a223a..975140a 100644 --- a/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.c +++ b/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.c @@ -371,7 +371,7 @@ gboolean gst_ti_query_srcpad(GstPad * pad, GstQuery * query, * If recieved event format is in GST_FORMAT_BYTES then convert in * GST_FORMAT_TIME. *****************************************************************************/ -void gst_ti_parse_newsegment(GstEvent **event, GstSegment *segment, +gboolean gst_ti_parse_newsegment(GstEvent **event, GstSegment *segment, gint64 *totalDuration, guint64 totalBytes) { GstFormat fmt; @@ -430,7 +430,7 @@ void gst_ti_parse_newsegment(GstEvent **event, GstSegment *segment, *totalDuration = new_start; } - return; + return update; } diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.h b/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.h index 4a4f096..cd06199 100644 --- a/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.h +++ b/gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.h @@ -64,7 +64,7 @@ gboolean gst_ti_src_convert_format(GstFormat src_format, gint64 src_val, guint64 consumed_bytes); /* Function to parse and prepare newsegment for srcpad */ -void gst_ti_parse_newsegment(GstEvent **event, GstSegment *segment, +gboolean gst_ti_parse_newsegment(GstEvent **event, GstSegment *segment, gint64 *elapsedDuration, guint64 consumedBytes); /* Function to query position and duration of the stream. */ |