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;