amlvideosink: CF2 add video latency [1/1]

PD#SWPL-190851

Problem:
add video latency feature to set extra
video latency

Solution:
add video latency feature to set extra
video latency. video latency's unit of
value is us

Verify:
ah212

Change-Id: Ic6e7836a9545c8f6d1246e3773fb927da44c98d1
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index e9d3044..471a0da 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -114,6 +114,7 @@
     PROP_VIDEO_PTS,
     PROP_ZORDER,
     PROP_FRAME_STEP_ON_PREROLL,
+    PRO_VIDEO_LATENCY,
 #if GST_IMPORT_LGE_PROP
     PROP_LGE_RESOURCE_INFO,
     PROP_LGE_CURRENT_PTS,
@@ -220,6 +221,8 @@
     gint              par_d;
     gint              fps_n;
     gint              fps_d;
+    gint              video_latency;
+    gboolean          set_video_latency;
 
 #if GST_IMPORT_LGE_PROP
     GstAmlVideoSinkLgeCtxt lge_ctxt;
@@ -405,6 +408,12 @@
                          "video plane zorder",
                          G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
 
+    g_object_class_install_property(
+        G_OBJECT_CLASS(klass), PRO_VIDEO_LATENCY,
+        g_param_spec_int("video-latency", "video latency",
+                         "video extra latency,the unit of value is us",
+                         G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
+
     /*
      * frame-step-on-preroll is for nts case VPEEK-001-TC2
      * case step:
@@ -665,6 +674,13 @@
         GST_OBJECT_UNLOCK(sink);
         break;
     }
+    case PRO_VIDEO_LATENCY:
+    {
+        GST_OBJECT_LOCK(sink);
+        g_value_set_int(value, sink_priv->video_latency);
+        GST_OBJECT_UNLOCK(sink);
+        break;
+    }
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_CURRENT_PTS:
     {
@@ -863,6 +879,14 @@
             }
         }
     } break;
+    case PRO_VIDEO_LATENCY:
+    {
+        GST_OBJECT_LOCK(sink);
+        sink_priv->video_latency = g_value_get_int(value);
+        sink_priv->set_video_latency = TRUE;
+        GST_DEBUG_OBJECT(sink, "set video latency:%d us",sink_priv->video_latency);
+        GST_OBJECT_UNLOCK(sink);
+    } break;
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_RESOURCE_INFO:
     {
@@ -1516,6 +1540,10 @@
         sink->update_zorder = FALSE;
         render_set_value(sink_priv->render_device_handle, KEY_ZORDER, &sink->zorder);
     }
+    if (sink_priv->set_video_latency) {
+        sink_priv->set_video_latency = FALSE;
+        render_set_value(sink_priv->render_device_handle, KEY_MEDIASYNC_VIDEOLATENCY, &sink_priv->video_latency);
+    }
 
     tunnel_lib_buf_wrap = render_allocate_render_buffer_wrap(sink_priv->render_device_handle, BUFFER_FLAG_DMA_BUFFER);
     if (!tunnel_lib_buf_wrap)
@@ -1886,6 +1914,8 @@
     sink_priv->par_d = 0;
     sink_priv->fps_n = 0;
     sink_priv->fps_d = 0;
+    sink_priv->video_latency = 0;
+    sink_priv->set_video_latency = FALSE;
 }
 
 static void gst_set_report_info(void *userData, RenderMsgType type, int64_t pts, int64_t duration)