summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-10-29 14:08:58 +0200
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-10-29 14:11:47 +0200
commitba35b17b987d8c0c8028881dfb9ce44a988ba014 (patch)
tree1ce83964c98905bd62c5348ddd5bb4a0fa002a83
parent61cf6f2ffa54b8bbd60f412a07297417da7e30fc (diff)
baseparse: use only upstream duration if it provides one
-rw-r--r--gst/audioparsers/gstbaseparse.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/gst/audioparsers/gstbaseparse.c b/gst/audioparsers/gstbaseparse.c
index fbbe30a29..bfdcc1356 100644
--- a/gst/audioparsers/gstbaseparse.c
+++ b/gst/audioparsers/gstbaseparse.c
@@ -258,6 +258,7 @@ struct _GstBaseParsePrivate
gboolean own_index;
/* seek table entries only maintained if upstream is BYTE seekable */
gboolean upstream_seekable;
+ gboolean upstream_has_duration;
/* minimum distance between two index entries */
GstClockTimeDiff idx_interval;
/* ts and offset of last entry added */
@@ -529,6 +530,7 @@ gst_base_parse_reset (GstBaseParse * parse)
parse->priv->index_last_ts = 0;
parse->priv->index_last_offset = 0;
parse->priv->upstream_seekable = FALSE;
+ parse->priv->upstream_has_duration = FALSE;
parse->priv->idx_interval = 0;
parse->priv->exact_position = TRUE;
@@ -1298,6 +1300,24 @@ done:
parse->priv->idx_interval = idx_interval * GST_MSECOND;
}
+/* some misc checks on upstream */
+static void
+gst_base_parse_check_upstream (GstBaseParse * parse)
+{
+ GstFormat fmt = GST_FORMAT_TIME;
+ gint64 stop;
+
+ if (gst_pad_query_peer_duration (parse->sinkpad, &fmt, &stop))
+ if (GST_CLOCK_TIME_IS_VALID (stop) && stop) {
+ /* upstream has one, accept it also, and no further updates */
+ gst_base_parse_set_duration (parse, GST_FORMAT_TIME, stop, 0);
+ parse->priv->upstream_has_duration = TRUE;
+ }
+
+ GST_DEBUG_OBJECT (parse, "upstream_has_duration: %d",
+ parse->priv->upstream_has_duration);
+}
+
/**
* gst_base_parse_handle_and_push_buffer:
* @parse: #GstBaseParse.
@@ -1323,6 +1343,12 @@ gst_base_parse_handle_and_push_buffer (GstBaseParse * parse,
parse->priv->discont = FALSE;
}
+ /* some one-time start-up */
+ if (G_UNLIKELY (!parse->priv->framecount)) {
+ gst_base_parse_check_seekability (parse);
+ gst_base_parse_check_upstream (parse);
+ }
+
GST_LOG_OBJECT (parse,
"parsing frame at offset %" G_GUINT64_FORMAT
" (%#" G_GINT64_MODIFIER "x) of size %d",
@@ -1383,11 +1409,6 @@ gst_base_parse_push_buffer (GstBaseParse * parse, GstBuffer * buffer)
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
- /* some one-time start-up */
- if (G_UNLIKELY (!parse->priv->framecount)) {
- gst_base_parse_check_seekability (parse);
- }
-
/* update stats */
parse->priv->bytecount += GST_BUFFER_SIZE (buffer);
if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BASE_PARSE_BUFFER_FLAG_NO_FRAME)) {
@@ -2386,6 +2407,11 @@ gst_base_parse_set_duration (GstBaseParse * parse,
g_return_if_fail (parse != NULL);
GST_BASE_PARSE_LOCK (parse);
+ if (parse->priv->upstream_has_duration) {
+ GST_DEBUG_OBJECT (parse, "using upstream duration; discarding update");
+ goto exit;
+ }
+
if (duration != parse->priv->duration) {
GstMessage *m;
@@ -2405,6 +2431,7 @@ gst_base_parse_set_duration (GstBaseParse * parse,
}
GST_DEBUG_OBJECT (parse, "set update interval: %d", interval);
parse->priv->update_interval = interval;
+exit:
GST_BASE_PARSE_UNLOCK (parse);
}