kmssink: add fps print when exit
upstream status: i.mx specific
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index e35028a..7c3b3ee 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -1372,6 +1372,60 @@
return TRUE;
}
+static GstStateChangeReturn
+gst_kms_sink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstKMSSink *self;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ GST_DEBUG ("changing state: %s => %s",
+ gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
+ gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
+
+ self = GST_KMS_SINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ {
+ self->run_time = gst_element_get_start_time (element);
+ break;
+ }
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ {
+ break;
+ }
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ if (self->run_time > 0) {
+ g_print ("Total showed frames (%lld), playing for (%"GST_TIME_FORMAT"), fps (%.3f).\n",
+ self->frame_showed, GST_TIME_ARGS (self->run_time),
+ (gfloat)GST_SECOND * self->frame_showed / self->run_time);
+ }
+
+ self->frame_showed = 0;
+ self->run_time = 0;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
static GstBuffer *
gst_kms_sink_copy_to_dumb_buffer (GstKMSSink * self, GstBuffer * inbuf)
{
@@ -1611,6 +1665,8 @@
GST_OBJECT_UNLOCK (self);
res = GST_FLOW_OK;
+ self->frame_showed++;
+
bail:
gst_buffer_unref (buffer);
return res;
@@ -1784,6 +1840,8 @@
gst_poll_fd_init (&sink->pollfd);
sink->poll = gst_poll_new (TRUE);
gst_video_info_init (&sink->vinfo);
+ sink->frame_showed = 0;
+ sink->run_time = 0;
}
static void
@@ -1808,6 +1866,7 @@
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps));
gst_caps_unref (caps);
+ element_class->change_state = GST_DEBUG_FUNCPTR (gst_kms_sink_change_state);
basesink_class->start = GST_DEBUG_FUNCPTR (gst_kms_sink_start);
basesink_class->stop = GST_DEBUG_FUNCPTR (gst_kms_sink_stop);
basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_set_caps);
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index 5dc4772..22d1967 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -55,6 +55,10 @@
gint plane_id;
guint pipe;
+ /* fps print support */
+ guint64 frame_showed;
+ GstClockTime run_time;
+
/* crtc data */
guint16 hdisplay, vdisplay;
guint32 buffer_id;