add query pos flow
Change-Id: I910ef03512a9465574e32aedc2dc18392f2bc93a
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index 263cd6f..e95a5b2 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -135,6 +135,7 @@
static void gst_aml_video_sink_finalize(GObject *object);
static GstStateChangeReturn
gst_aml_video_sink_change_state(GstElement *element, GstStateChange transition);
+static gboolean gst_aml_video_sink_query(GstElement *element, GstQuery *query);
static gboolean gst_aml_video_sink_propose_allocation(GstBaseSink *bsink, GstQuery *query);
static GstCaps *gst_aml_video_sink_get_caps(GstBaseSink *bsink,
GstCaps *filter);
@@ -179,8 +180,9 @@
"Output to video tunnel lib",
"Xuesong.Jiang@amlogic.com<Xuesong.Jiang@amlogic.com>");
- gstelement_class->change_state =
- GST_DEBUG_FUNCPTR(gst_aml_video_sink_change_state);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR(gst_aml_video_sink_change_state);
+ gstelement_class->query = GST_DEBUG_FUNCPTR(gst_aml_video_sink_query);
+ ;
gstbasesink_class->propose_allocation = GST_DEBUG_FUNCPTR(gst_aml_video_sink_propose_allocation);
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR(gst_aml_video_sink_get_caps);
@@ -206,17 +208,18 @@
"Vmaster(0) Amaster(1) PCRmaster(2) IPTV(3) FreeRun(4)",
G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE));
- g_object_class_install_property (
- G_OBJECT_CLASS (klass), PROP_VIDEO_FRAME_DROP_NUM,
- g_param_spec_int ("frames-dropped", "frames-dropped",
- "number of dropped frames",
- 0, G_MAXINT32, 0, G_PARAM_READABLE));
+ g_object_class_install_property(
+ G_OBJECT_CLASS(klass), PROP_VIDEO_FRAME_DROP_NUM,
+ g_param_spec_int("frames-dropped", "frames-dropped",
+ "number of dropped frames",
+ 0, G_MAXINT32, 0, G_PARAM_READABLE));
}
static void gst_aml_video_sink_init(GstAmlVideoSink *sink)
{
GstBaseSink *basesink = (GstBaseSink *)sink;
+ sink->last_displayed_buf_pts = 0;
/* init eos detect */
sink->queued = 0;
sink->dequeued = 0;
@@ -257,11 +260,11 @@
g_value_set_boolean(value, sink->avsync_mode);
GST_OBJECT_UNLOCK(sink);
break;
- case PROP_VIDEO_FRAME_DROP_NUM:
+ case PROP_VIDEO_FRAME_DROP_NUM:
GST_OBJECT_LOCK(sink);
g_value_set_int(value, sink->droped);
GST_OBJECT_UNLOCK(sink);
- break;
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -404,6 +407,36 @@
return ret;
}
+static gboolean gst_aml_video_sink_query(GstElement *element, GstQuery *query)
+{
+ GstAmlVideoSink *sink = GST_AML_VIDEO_SINK(element);
+
+ switch (GST_QUERY_TYPE(query))
+ {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+ gst_query_parse_position(query, &format, NULL);
+ if (GST_FORMAT_BYTES == format)
+ {
+ return GST_ELEMENT_CLASS(parent_class)->query(element, query);
+ }
+ else
+ {
+ GST_OBJECT_LOCK(sink);
+ gint64 position = sink->last_displayed_buf_pts;
+ GST_OBJECT_UNLOCK(sink);
+ GST_LOG_OBJECT(sink, "got position: %" GST_TIME_FORMAT, GST_TIME_ARGS(position));
+ gst_query_set_position(query, GST_FORMAT_TIME, position);
+ return TRUE;
+ }
+ break;
+ }
+ default:
+ return GST_ELEMENT_CLASS(parent_class)->query(element, query);
+ }
+}
+
static gboolean gst_aml_video_sink_propose_allocation(GstBaseSink *bsink, GstQuery *query)
{
GST_DEBUG_OBJECT(bsink, "trace in");
@@ -595,8 +628,15 @@
case GST_EVENT_FLUSH_STOP:
{
GST_INFO_OBJECT(sink, "flush stop");
-
- gst_wait_eos_signal(sink);
+ GST_DEBUG_OBJECT(sink, "flushing need waitting display render all buf, queued:%d, rendered:%d, droped:%d",
+ sink->queued,
+ sink->rendered,
+ sink->droped);
+ // gst_wait_eos_signal(sink);
+ if (sink->queued > sink->rendered + sink->droped)
+ {
+ gst_wait_eos_signal(sink);
+ }
GST_OBJECT_LOCK(sink);
sink->queued = 0;
@@ -625,10 +665,10 @@
if (sink->queued > sink->rendered + sink->droped)
{
- GST_DEBUG_OBJECT(sink, "need waitting display render all buf, queued:%d, rendered:%d, droped:%d",
- sink->queued,
- sink->rendered,
- sink->droped);
+ GST_DEBUG_OBJECT(sink, "need waitting display render all buf, queued:%d, rendered:%d, droped:%d",
+ sink->queued,
+ sink->rendered,
+ sink->droped);
gst_wait_eos_signal(sink);
}
}
@@ -666,6 +706,7 @@
GstBuffer *buffer = (GstBuffer *)tunnel_lib_buf_wrap->priv;
if (buffer)
{
+ sink->last_displayed_buf_pts = GST_BUFFER_PTS(buffer);
sink->rendered++;
if ((sink_priv->got_eos || sink_priv->is_flushing) && sink->queued == sink->rendered + sink->droped)
{
@@ -1033,7 +1074,7 @@
GstAmlVideoSink *sink = GST_AML_VIDEO_SINK(vsink);
GstAmlVideoSinkPrivate *sink_priv = GST_AML_VIDEO_SINK_GET_PRIVATE(sink);
GstVideoInfo *video_info = &(sink_priv->video_info);
- int tunnelmode = 1; //1 for tunnel mode; 0 for non-tunnel mode
+ int tunnelmode = 1; // 1 for tunnel mode; 0 for non-tunnel mode
// RenderWindowSize window_size = {0, 0, video_info->width, video_info->height};
RenderFrameSize frame_size = {video_info->width, video_info->height};
diff --git a/src/gstamlvideosink.h b/src/gstamlvideosink.h
index f21da00..7e604b9 100644
--- a/src/gstamlvideosink.h
+++ b/src/gstamlvideosink.h
@@ -49,6 +49,8 @@
{
GstVideoSink parent;
+ GstClockTime last_displayed_buf_pts;
+
/* eos detect */
gint queued;
gint dequeued;