summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-08-16 15:42:08 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-09-03 11:26:54 +0200
commitb44873e16d1dcded0aeceab985d194657d971c50 (patch)
tree3d138184dcfd49e6c8301b2e212963e9bd422a68
parent9d11bab50afed327df3e953c1edb4fa7d8f73d56 (diff)
auddec1: implement NEWSEGMENT handling
... so as to improve timestamp tracking following seek.
-rw-r--r--gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.c23
-rw-r--r--gstreamer_ti/ti_build/ticodecplugin/src/gsttiauddec1.h1
-rw-r--r--gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.c4
-rw-r--r--gstreamer_ti/ti_build/ticodecplugin/src/gstticommonutils.h2
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. */