summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-10-10 18:14:40 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-10-10 18:18:23 +0200
commit14023fff89d073b5758ce8c46abf15951f6607f7 (patch)
tree7768568133529acd641a7218ea8c9b73e21bcccf
parent53a3392e3cbb8e8337ec3b742855bcf146adf8df (diff)
basetransform: Report the output position on POSITION queries on the srcpad
There can be a difference between input and output last_stop. Fixes bug #629410.
-rw-r--r--libs/gst/base/gstbasetransform.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c
index 6feb39f635..0e225bc9de 100644
--- a/libs/gst/base/gstbasetransform.c
+++ b/libs/gst/base/gstbasetransform.c
@@ -258,6 +258,8 @@ struct _GstBaseTransformPrivate
/* QoS stats */
guint64 processed;
guint64 dropped;
+
+ GstClockTime last_stop_out;
};
static GstElementClass *parent_class = NULL;
@@ -1208,9 +1210,12 @@ gst_base_transform_query (GstPad * pad, GstQuery * query)
gst_query_parse_position (query, &format, NULL);
if (format == GST_FORMAT_TIME && trans->segment.format == GST_FORMAT_TIME) {
ret = TRUE;
+
gst_query_set_position (query, format,
gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME,
- trans->segment.last_stop));
+ (pad ==
+ trans->sinkpad) ? trans->segment.last_stop : trans->
+ priv->last_stop_out));
} else {
ret = gst_pad_peer_query (otherpad, query);
}
@@ -1947,6 +1952,7 @@ gst_base_transform_sink_eventfunc (GstBaseTransform * trans, GstEvent * event)
/* we need new segment info after the flush. */
trans->have_newsegment = FALSE;
gst_segment_init (&trans->segment, GST_FORMAT_UNDEFINED);
+ trans->priv->last_stop_out = GST_CLOCK_TIME_NONE;
break;
case GST_EVENT_EOS:
break;
@@ -2319,11 +2325,24 @@ gst_base_transform_chain (GstPad * pad, GstBuffer * buffer)
* GST_BASE_TRANSFORM_FLOW_DROPPED we will not push either. */
if (outbuf != NULL) {
if ((ret == GST_FLOW_OK)) {
+ GstClockTime last_stop_out = GST_CLOCK_TIME_NONE;
+
/* Remember last stop position */
- if ((last_stop != GST_CLOCK_TIME_NONE) &&
- (trans->segment.format == GST_FORMAT_TIME))
+ if (last_stop != GST_CLOCK_TIME_NONE &&
+ trans->segment.format == GST_FORMAT_TIME)
gst_segment_set_last_stop (&trans->segment, GST_FORMAT_TIME, last_stop);
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (outbuf)) {
+ last_stop_out = GST_BUFFER_TIMESTAMP (outbuf);
+ if (GST_BUFFER_DURATION_IS_VALID (outbuf))
+ last_stop_out += GST_BUFFER_DURATION (outbuf);
+ } else if (last_stop != GST_CLOCK_TIME_NONE) {
+ last_stop_out = last_stop;
+ }
+ if (last_stop_out != GST_CLOCK_TIME_NONE
+ && trans->segment.format == GST_FORMAT_TIME)
+ trans->priv->last_stop_out = last_stop_out;
+
/* apply DISCONT flag if the buffer is not yet marked as such */
if (trans->priv->discont) {
if (!GST_BUFFER_IS_DISCONT (outbuf)) {
@@ -2409,6 +2428,7 @@ gst_base_transform_activate (GstBaseTransform * trans, gboolean active)
trans->negotiated = FALSE;
trans->have_newsegment = FALSE;
gst_segment_init (&trans->segment, GST_FORMAT_UNDEFINED);
+ trans->priv->last_stop_out = GST_CLOCK_TIME_NONE;
trans->priv->proportion = 1.0;
trans->priv->earliest_time = -1;
trans->priv->discont = FALSE;