amlvideosink: CB2 refile caps extraction [1/1]

PD#SWPL-177912

Problem:
refile caps extraction.

Solution:
refile caps extraction.

Verify:
Yocto ap222

Change-Id: I7fd5b3c9a5eba195efcb6d3a0d867d3b001a19ff
Signed-off-by: bo.xiao <bo.xiao@amlogic.com>
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index f1606c8..2ab5492 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -119,10 +119,6 @@
 #endif
 };
 
-// #define AML_VIDEO_FORMATS                                          \
-//     "{ BGRx, BGRA, RGBx, xBGR, xRGB, RGBA, ABGR, ARGB, RGB, BGR, " \
-//     "RGB16, BGR16, YUY2, YVYU, UYVY, AYUV, NV12, NV21, NV16, "     \
-//     "YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }"
 #define AML_VIDEO_FORMATS "{ NV21 }"
 
 #define GST_CAPS_FEATURE_MEMORY_DMABUF "memory:DMABuf"
@@ -132,7 +128,7 @@
 
 #define USE_DMABUF TRUE
 
-#define DRMBP_EXTRA_BUF_SZIE_FOR_DISPLAY 1
+#define DRMBP_EXTRA_BUF_SIZE_FOR_DISPLAY 1
 #define DRMBP_LIMIT_MAX_BUFSIZE_TO_BUFSIZE 1
 #define DRMBP_UNLIMIT_MAX_BUFSIZE 0
 #define GST_AML_WAIT_TIME 5000
@@ -174,7 +170,6 @@
     GstAmlVideoSinkWindowSet window_set;
     GstBuffer *preroll_buffer;
     void *render_device_handle;
-    GstVideoInfo video_info;
     gboolean video_info_changed;
     gboolean use_dmabuf;
     gboolean is_flushing;
@@ -188,6 +183,19 @@
     gboolean show_first_frame_asap;
     gboolean emitUnderflowSignal;
 
+    /* video info from caps */
+    GstVideoFormat    format;
+    gboolean          interlace;
+    gint              dw_width;
+    gint              dw_height;
+    gint              src_width;
+    gint              src_height;
+    gsize             dw_size;
+    gint              par_n;
+    gint              par_d;
+    gint              fps_n;
+    gint              fps_d;
+
 #if GST_IMPORT_LGE_PROP
     GstAmlVideoSinkLgeCtxt lge_ctxt;
 #endif
@@ -1023,7 +1031,7 @@
     gboolean need_pool;
 
     gst_query_parse_allocation(query, &caps, &need_pool);
-    GST_DEBUG_OBJECT(bsink, "need_pool: %d, secure_mode: %d", need_pool, sink->secure_mode);
+    GST_DEBUG_OBJECT(bsink, "need_pool: %d, secure_mode: %d, size=%d", need_pool, sink->secure_mode, sink_priv->dw_size);
 
     if (need_pool)
         pool = gst_drm_bufferpool_new(sink->secure_mode, GST_DRM_BUFFERPOOL_TYPE_VIDEO_PLANE);
@@ -1032,7 +1040,7 @@
     if (TRUE == sink->secure_mode)
         gst_base_sink_set_last_sample_enabled(bsink, FALSE);
 
-    gst_query_add_allocation_pool(query, pool, sink_priv->video_info.size, DRMBP_EXTRA_BUF_SZIE_FOR_DISPLAY, DRMBP_LIMIT_MAX_BUFSIZE_TO_BUFSIZE);
+    gst_query_add_allocation_pool(query, pool, sink_priv->dw_size, DRMBP_EXTRA_BUF_SIZE_FOR_DISPLAY, DRMBP_LIMIT_MAX_BUFSIZE_TO_BUFSIZE);
     if (pool)
         g_object_unref(pool);
 
@@ -1073,10 +1081,14 @@
     GstAmlVideoSinkPrivate *sink_priv = GST_AML_VIDEO_SINK_GET_PRIVATE(sink);
     // gboolean use_dmabuf;
     gboolean ret = TRUE;
+    GstStructure *structure;
+    const gchar *s;
 
-    GST_OBJECT_LOCK(sink);
+    g_return_val_if_fail (caps != NULL, FALSE);
 
     GST_DEBUG_OBJECT(sink, "set caps %" GST_PTR_FORMAT, caps);
+
+    GST_OBJECT_LOCK(sink);
     // use_dmabuf = gst_caps_features_contains(gst_caps_get_features(caps, 0), GST_CAPS_FEATURE_MEMORY_DMABUF);
     // if (use_dmabuf == FALSE)
     // {
@@ -1085,30 +1097,48 @@
     //     goto done;
     // }
 
-    /* extract info from caps */
-    if (!gst_video_info_from_caps(&sink_priv->video_info, caps))
-    {
-        GST_ERROR_OBJECT(sink, "can't get video info from caps");
-        ret = FALSE;
-        goto done;
+    structure = gst_caps_get_structure (caps, 0);
+
+    if (!(s = gst_structure_get_string (structure, "format"))) {
+      GST_WARNING_OBJECT(sink, "can't get format from caps");
+    } else {
+      sink_priv->format = gst_video_format_from_string (s);
     }
 
-    // #if GST_IMPORT_LGE_PROP
-    //     GstMessage *message;
-    //     GstStructure *s;
-    //     s = gst_structure_new("media-info",
-    //                           "type", "G_TYPE_INT", 1,
-    //                           "mime-type", G_TYPE_STRING, sink_priv->video_info.finfo->name,
-    //                           "width", G_TYPE_INT, sink_priv->video_info.width,
-    //                           "height", "G_TYPE_INT", sink_priv->video_info.height,
-    //                           NULL);
-    //     message = gst_message_new_custom(GST_MESSAGE_APPLICATION, GST_OBJECT(sink), s);
-    //     gst_element_post_message(GST_ELEMENT_CAST(sink), message);
-    // #endif
+    if (!gst_structure_get_int (structure, "width", &sink_priv->dw_width)) {
+      GST_WARNING_OBJECT(sink, "can't get width from caps");
+    }
+    if (!gst_structure_get_int (structure, "height", &sink_priv->dw_height)) {
+      GST_WARNING_OBJECT(sink, "can't get height from caps");
+    }
+    if (!gst_structure_get_int (structure, "src_width", &sink_priv->src_width)) {
+      GST_WARNING_OBJECT(sink, "can't get src_width from caps");
+    }
+    if (!gst_structure_get_int (structure, "src_height", &sink_priv->src_height)) {
+      GST_WARNING_OBJECT(sink, "can't get src_height from caps");
+    }
+
+    sink_priv->dw_size = sink_priv->dw_width*sink_priv->dw_height*3/2;
+
+    if (!gst_structure_get_fraction (structure, "framerate", &sink_priv->fps_n, &sink_priv->fps_d)) {
+      GST_WARNING_OBJECT(sink, "can't get fps from caps");
+      sink_priv->fps_n = 0;
+      sink_priv->fps_d = 1;
+    }
+    if (!gst_structure_get_fraction (structure, "pixel-aspect-ratio", &sink_priv->par_n, &sink_priv->par_d)) {
+      GST_WARNING_OBJECT(sink, "can't get par from caps");
+      sink_priv->par_n = 1;
+      sink_priv->par_d = 1;
+    }
+
+    if (!(s = gst_structure_get_string (structure, "interlace-mode"))) {
+      GST_WARNING_OBJECT(sink, "can't get interlace-mode from caps");
+    } else {
+      sink_priv->interlace = !g_str_equal ("progressive", s);
+    }
 
     sink_priv->video_info_changed = TRUE;
 
-done:
     GST_OBJECT_UNLOCK(sink);
     return ret;
 }
@@ -1127,69 +1157,71 @@
 
 static gboolean gst_aml_video_sink_show_vr_frame(GstAmlVideoSink *sink, GstBuffer *buffer)
 {
-    bufferInfo *binfo;
+    bufferInfo *binfo = NULL;
     GstStructure *s;
     GstBuffer *buf;
     gint fd0 = -1, fd1 = -1, fd2 = -1;
-    gint stride0, stride1, stride2;
+    gint stride0 = 0, stride1 = 0, stride2 = 0;
     GstVideoMeta *vmeta = NULL;
+    int offset1= 0, offset2 = 0;
+    guint n_mem = 0;
+    GstMemory *dma_mem0 = NULL;
+    GstMemory *dma_mem1 = NULL;
+
     GST_DEBUG("pts: %lld   %p", GST_BUFFER_PTS (buffer),buffer);
 
     binfo= (bufferInfo*)malloc( sizeof(bufferInfo) );
-    if (binfo)
+    if (!binfo) {
+      GST_ERROR_OBJECT(sink, "malloc bufferInfo fail.");
+      return FALSE;
+    }
+
+    gst_buffer_ref(buffer);
+    binfo->sink= sink;
+    binfo->buf = buffer;
+    n_mem = gst_buffer_n_memory(buffer);
+    vmeta = gst_buffer_get_video_meta(buffer);
+    if (vmeta == NULL)
     {
-        int offset1= 0, offset2 = 0;
-        guint n_mem = 0;
-        GstMemory *dma_mem0 = NULL;
-        GstMemory *dma_mem1 = NULL;
-        GstMemory *dma_mem2 = NULL;
-        gst_buffer_ref(buffer);
-        binfo->sink= sink;
-        binfo->buf = buffer;
-        n_mem = gst_buffer_n_memory(buffer);
-        vmeta = gst_buffer_get_video_meta(buffer);
-        if (vmeta == NULL)
-        {
-            GST_ERROR_OBJECT(sink, "not found video meta info");
-            gst_buffer_unref(binfo->buf);
-            free(binfo);
-            return FALSE;
-        }
-        GST_DEBUG("height:%d,width:%d,n_mem:%d",vmeta->height,vmeta->width,n_mem);
+        GST_ERROR_OBJECT(sink, "not found video meta info");
+        gst_buffer_unref(binfo->buf);
+        free(binfo);
+        return FALSE;
+    }
+    GST_DEBUG("height:%d,width:%d,n_mem:%d",vmeta->height,vmeta->width,n_mem);
 
-        if (n_mem > 1)
+    if (n_mem > 1)
+    {
+        dma_mem0 = gst_buffer_peek_memory(buffer, 0);
+        dma_mem1 = gst_buffer_peek_memory(buffer, 1);
+        fd0 = gst_dmabuf_memory_get_fd(dma_mem0);
+        fd1 = gst_dmabuf_memory_get_fd(dma_mem1);
+        GST_DEBUG("fd0:%d,fd1:%d,fd2:%d",fd0,fd1,fd2);
+        stride0 = vmeta->stride[0];
+        stride1 = vmeta->stride[1];
+        stride2 = 0;
+        if ( fd1 < 0 )
         {
-            dma_mem0 = gst_buffer_peek_memory(buffer, 0);
-            dma_mem1 = gst_buffer_peek_memory(buffer, 1);
-            fd0 = gst_dmabuf_memory_get_fd(dma_mem0);
-            fd1 = gst_dmabuf_memory_get_fd(dma_mem1);
-            GST_DEBUG("fd0:%d,fd1:%d,fd2:%d",fd0,fd1,fd2);
-            stride0 = vmeta->stride[0];
-            stride1 = vmeta->stride[1];
-            stride2 = 0;
-            if ( fd1 < 0 )
-            {
-                stride1= stride0;
-                offset1= stride0*vmeta->height;
-            }
-            if ( fd2 < 0 )
-            {
-                offset2= offset1+(vmeta->width*vmeta->height)/2;
-                stride2= stride0;
-            }
-            GST_DEBUG("stride0:%d,stride1:%d,stride2:%d",stride0,stride1,stride2);
-            GST_DEBUG("offset0:%d,offset1:%d,offset2:%d",offset2,offset2,offset2);
-
-        }
-        else
-        {
-            GST_DEBUG("single plane");
-            dma_mem0 = gst_buffer_peek_memory(buffer, 0);
-            fd0 = gst_dmabuf_memory_get_fd(dma_mem0);
-            stride0 = vmeta->stride[0];
+            stride1= stride0;
             offset1= stride0*vmeta->height;
         }
+        if ( fd2 < 0 )
+        {
+            offset2= offset1+(vmeta->width*vmeta->height)/2;
+            stride2= stride0;
+        }
+        GST_DEBUG("stride0:%d,stride1:%d,stride2:%d",stride0,stride1,stride2);
+        GST_DEBUG("offset0:%d,offset1:%d,offset2:%d",offset2,offset2,offset2);
     }
+    else
+    {
+        GST_DEBUG("single plane");
+        dma_mem0 = gst_buffer_peek_memory(buffer, 0);
+        fd0 = gst_dmabuf_memory_get_fd(dma_mem0);
+        stride0 = vmeta->stride[0];
+        offset1= stride0*vmeta->height;
+    }
+
     s = gst_structure_new ("drmbuffer_info",
           "fd0", G_TYPE_INT, fd0,
           "fd1", G_TYPE_INT, fd1,
@@ -1214,16 +1246,16 @@
         free(binfo);
         return FALSE;;
     }
+
     gst_buffer_add_protection_meta(buf, s);
     GST_BUFFER_PTS (buf) = GST_BUFFER_PTS(buffer);
     GST_DEBUG("pts: %lld, %p", GST_BUFFER_PTS (buf),buf);
     g_signal_emit (G_OBJECT(sink),g_signals[SIGNAL_DECODEDBUFFER],0,buf);
     gst_buffer_unref(buf);
+
     return TRUE;
-
 }
 
-
 static GstFlowReturn gst_aml_video_sink_show_frame(GstVideoSink *vsink, GstBuffer *buffer)
 {
     GstAmlVideoSink *sink = GST_AML_VIDEO_SINK(vsink);
@@ -1607,7 +1639,7 @@
     }
     else if (GST_CLOCK_TIME_IS_VALID (start) && !GST_CLOCK_TIME_IS_VALID (duration))
     {
-        if (sink_priv->video_info.fps_n != 0)
+        if (sink_priv->fps_n != 0)
         {
             //TODO calc with framerate
             stop = start + 40 * GST_MSECOND;
@@ -1629,7 +1661,7 @@
 
     segment = &sink_priv->segment;
     GST_LOG_OBJECT(sink, "check buffer start: %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT "fps_n:%d, fps_d:%d",
-                         GST_TIME_ARGS(start), GST_TIME_ARGS(stop), sink_priv->video_info.fps_n, sink_priv->video_info.fps_d);
+                         GST_TIME_ARGS(start), GST_TIME_ARGS(stop), sink_priv->fps_n, sink_priv->fps_d);
     if (gst_segment_clip(segment, GST_FORMAT_TIME, start, stop, &cstart, &cstop))
     {
         GST_BUFFER_PTS(buf) = cstart;
@@ -1676,6 +1708,18 @@
     sink_priv->mediasync_instanceid = -1;
     sink_priv->show_first_frame_asap = FALSE;
     sink_priv->emitUnderflowSignal = FALSE;
+
+    sink_priv->format = GST_VIDEO_FORMAT_UNKNOWN;
+    sink_priv->interlace = FALSE;
+    sink_priv->dw_width = 0;
+    sink_priv->dw_height = 0;
+    sink_priv->src_width = 0;
+    sink_priv->src_height = 0;
+    sink_priv->dw_size = 0;
+    sink_priv->par_n = 0;
+    sink_priv->par_d = 0;
+    sink_priv->fps_n = 0;
+    sink_priv->fps_d = 0;
 }
 
 static void gst_render_msg_callback(void *userData, RenderMsgType type, void *msg)
@@ -1786,17 +1830,8 @@
     }
     case KEY_VIDEO_FORMAT:
     {
-        if (sink_priv->video_info.finfo != NULL)
-        {
-            *val = sink_priv->video_info.finfo->format;
-            GST_DEBUG_OBJECT(vsink, "get video format:%d", *val);
-        }
-        else
-        {
-            GST_ERROR_OBJECT(vsink, "get video format error");
-            *val = GST_VIDEO_FORMAT_UNKNOWN;
-            ret = -1;
-        }
+        *val = sink_priv->format;
+        GST_DEBUG_OBJECT(vsink, "get video format:%d", *val);
         break;
     }
     default:
@@ -2032,12 +2067,10 @@
 {
     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 = 0; // 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};
-    GstVideoFormat format = video_info->finfo ? video_info->finfo->format : GST_VIDEO_FORMAT_UNKNOWN;
+    RenderFrameSize frame_size = {sink_priv->src_width, sink_priv->src_height};
+    GstVideoFormat format = sink_priv->format;
 
     if (render_set_value(sink_priv->render_device_handle, KEY_MEDIASYNC_TUNNEL_MODE, (void *)&tunnelmode) == -1)
     {
@@ -2125,7 +2158,6 @@
 
     if (!sink->quit_eos_detect_thread)
     {
-        GThread *thread= sink->eos_detect_thread_handle;
         g_thread_unref( sink->eos_detect_thread_handle );
         sink->eos_detect_thread_handle= NULL;
     }