add buf stat info

Change-Id: I5057a5131f93e54a538191357cf053c7f41c03f7
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index db64099..c897a5c 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -88,6 +88,7 @@
 #define GST_CAPS_FEATURE_MEMORY_DMABUF "memory:DMABuf"
 #define GST_USE_PLAYBIN 1
 #define GST_DEFAULT_AVSYNC_MODE 1 // 0:v master, 1:a master
+#define GST_DUMP_STAT_FILENAME "amlvideosink_buf_stat"
 
 #define RENDER_DEVICE_NAME "westeros"
 #define USE_DMABUF TRUE
@@ -166,6 +167,7 @@
 static gboolean gst_render_set_params(GstVideoSink *vsink);
 static void gst_emit_eos_signal(GstAmlVideoSink *vsink);
 static void gst_wait_eos_signal(GstAmlVideoSink *vsink);
+static void gst_aml_video_sink_dump_stat(GstAmlVideoSink *sink, const gchar *file_name);
 
 /* public interface definition */
 static void gst_aml_video_sink_class_init(GstAmlVideoSinkClass *klass)
@@ -589,8 +591,8 @@
 
     GST_OBJECT_LOCK(vsink);
 
-    GST_LOG_OBJECT(sink, "revice buffer:%p (start: %" GST_TIME_FORMAT", end: %" GST_TIME_FORMAT"), from pool:%p, need_preroll:%d", 
-                   buffer, GST_TIME_ARGS (GST_BUFFER_PTS(buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION(buffer)),
+    GST_LOG_OBJECT(sink, "revice buffer:%p (start: %" GST_TIME_FORMAT ", end: %" GST_TIME_FORMAT "), from pool:%p, need_preroll:%d",
+                   buffer, GST_TIME_ARGS(GST_BUFFER_PTS(buffer)), GST_TIME_ARGS(GST_BUFFER_DURATION(buffer)),
                    buffer->pool, ((GstBaseSink *)sink)->need_preroll);
 
     if (!sink_priv->render_device_handle)
@@ -627,7 +629,7 @@
         }
     }
 
-    if(sink_priv->window_set.window_change)
+    if (sink_priv->window_set.window_change)
     {
         RenderWindowSize window_size = {sink_priv->window_set.x, sink_priv->window_set.y, sink_priv->window_set.w, sink_priv->window_set.h};
         if (render_set(sink_priv->render_device_handle, KEY_WINDOW_SIZE, &window_size) == -1)
@@ -697,7 +699,7 @@
         GST_INFO_OBJECT(sink, "flush start");
         GST_OBJECT_LOCK(sink);
         sink_priv->is_flushing = TRUE;
-        if(render_flush(sink_priv->render_device_handle) == 0)
+        if (render_flush(sink_priv->render_device_handle) == 0)
         {
             GST_INFO_OBJECT(sink, "recv flush start and set render lib flushing succ");
         }
@@ -787,22 +789,22 @@
         if (buffer)
         {
             sink->last_displayed_buf_pts = GST_BUFFER_PTS(buffer);
-            if(type == MSG_DROPED_BUFFER)
+            if (type == MSG_DROPED_BUFFER)
             {
                 GST_LOG_OBJECT(sink, "get message: MSG_DROPED_BUFFER from tunnel lib");
                 sink->droped++;
             }
-            else if(type == MSG_DISPLAYED_BUFFER)
+            else if (type == MSG_DISPLAYED_BUFFER)
             {
                 GST_LOG_OBJECT(sink, "get message: MSG_DISPLAYED_BUFFER from tunnel lib");
                 sink->rendered++;
             }
 
             GST_DEBUG_OBJECT(sink, "buf:%p planeCnt:%d, plane[0].fd:%d, plane[1].fd:%d pts:%lld, buf stat | queued:%d, dequeued:%d, droped:%d, rendered:%d",
-                            buffer,
-                            dmabuf->planeCnt, dmabuf->fd[0], dmabuf->fd[1],
-                            buffer ? GST_BUFFER_PTS(buffer) : -1, sink->queued, sink->dequeued, sink->droped, sink->rendered);
-
+                             buffer,
+                             dmabuf->planeCnt, dmabuf->fd[0], dmabuf->fd[1],
+                             buffer ? GST_BUFFER_PTS(buffer) : -1, sink->queued, sink->dequeued, sink->droped, sink->rendered);
+            gst_aml_video_sink_dump_stat(sink, GST_DUMP_STAT_FILENAME);
             if ((sink_priv->got_eos || sink_priv->is_flushing) && sink->queued == sink->rendered + sink->droped)
             {
                 gst_emit_eos_signal(sink);
@@ -826,6 +828,7 @@
             GST_DEBUG_OBJECT(sink, "get message: MSG_RELEASE_BUFFER from tunnel lib, buffer:%p, from pool:%p", buffer, buffer->pool);
             gst_buffer_unref(buffer);
             sink->dequeued++;
+            gst_aml_video_sink_dump_stat(sink, GST_DUMP_STAT_FILENAME);
         }
         else
         {
@@ -1185,6 +1188,39 @@
     return TRUE;
 }
 
+static void gst_aml_video_sink_dump_stat(GstAmlVideoSink *sink, const gchar *file_name)
+{
+    const gchar *dump_dir = NULL;
+    gchar *full_file_name = NULL;
+    FILE *out = NULL;
+
+    dump_dir = g_getenv("GST_DEBUG_DUMP_AMLVIDEOSINK_STAT_DIR");
+    if (G_LIKELY(dump_dir == NULL))
+        return;
+
+    if (!file_name)
+    {
+        file_name = "unnamed";
+    }
+
+    full_file_name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.stat", dump_dir, file_name);
+
+    if ((out = fopen(full_file_name, "w")))
+    {
+        gchar *stat_info;
+        stat_info = g_strdup_printf("Q:%d,  Dq:%d,  Render:%d,  Drop:%d\n", sink->queued, sink->dequeued, sink->rendered, sink->droped);
+        fputs(stat_info, out);
+        g_free(stat_info);
+        fclose(out);
+        GST_INFO("wrote amlvideosink stat to : '%s' succ", full_file_name);
+    }
+    else
+    {
+        GST_WARNING("Failed to open file '%s' for writing: %s", full_file_name, g_strerror(errno));
+    }
+    g_free(full_file_name);
+}
+
 /* plugin init */
 static gboolean plugin_init(GstPlugin *plugin)
 {