amlvideosink: CF2 set video plane zorder [1/2]

PD#SWPL-180521

Problem:
set video plane zorder

Solution:
set video plane zorder

Verify:
ah212

Change-Id: I4948cad4c0db75ab91b98a3b650b065811d0f9c9
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index eca2242..d608fd7 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -109,6 +109,7 @@
     PROP_IMMEDIATELY_RENDER,
     PROP_VIDEO_FRAME_DISPLAY_NUM,
     PROP_VIDEO_PTS,
+    PROP_ZORDER,
 #if GST_IMPORT_LGE_PROP
     PROP_LGE_RESOURCE_INFO,
     PROP_LGE_CURRENT_PTS,
@@ -375,6 +376,12 @@
                              "0: disable; 1: enable",
                              FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+    g_object_class_install_property(
+        G_OBJECT_CLASS(klass), PROP_ZORDER,
+        g_param_spec_int("zorder", "video plane zorder",
+                         "video plane zorder",
+                         G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
+
     g_signals[SIGNAL_FIRSTFRAME]= g_signal_new( "first-video-frame-callback",
                                                G_TYPE_FROM_CLASS(GST_ELEMENT_CLASS(klass)),
                                                (GSignalFlags) (G_SIGNAL_RUN_LAST),
@@ -467,7 +474,7 @@
     sink->queued = 0;
     sink->dequeued = 0;
     sink->rendered = 0;
-    sink->droped = 0;
+    sink->dropped = 0;
     sink->avsync_mode = GST_DEFAULT_AVSYNC_MODE;
     sink->default_sync = FALSE;
     sink->immediately_render = 0;
@@ -484,6 +491,8 @@
     sink->pixel_aspect_ratio = 1.0;
     sink->keep_last_frame_on_flush = TRUE;
     //sink->enable_decoded_buffer_signal = FALSE;
+    sink->zorder = 0;
+    sink->update_zorder = FALSE;
     g_mutex_init(&sink->eos_lock);
     g_cond_init(&sink->eos_cond);
 
@@ -530,9 +539,9 @@
         break;
     case PROP_VIDEO_FRAME_DROP_NUM:
         GST_OBJECT_LOCK(sink);
-        GST_DEBUG_OBJECT(sink, "app get frame drop num | queued:%d, dequeued:%d, droped:%d, rendered:%d",
-                         sink->queued, sink->dequeued, sink->droped, sink->rendered);
-        g_value_set_int(value, sink->droped);
+        GST_DEBUG_OBJECT(sink, "app get frame drop num | queued:%d, dequeued:%d, dropped:%d, rendered:%d",
+                         sink->queued, sink->dequeued, sink->dropped, sink->rendered);
+        g_value_set_int(value, sink->dropped);
         GST_OBJECT_UNLOCK(sink);
         break;
     case PROP_VIDEO_PTS:
@@ -572,7 +581,13 @@
         GST_OBJECT_UNLOCK(sink);
         break;
     }
-
+    case PROP_ZORDER:
+    {
+        GST_OBJECT_LOCK(sink);
+        g_value_set_int(value, sink->zorder);
+        GST_OBJECT_UNLOCK(sink);
+        break;
+    }
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_CURRENT_PTS:
     {
@@ -728,7 +743,20 @@
     {
         sink->enable_decoded_buffer_signal = g_value_get_boolean(value);
         GST_DEBUG("set enable decoded buffer signal %d", sink->enable_decoded_buffer_signal);
-    }
+    } break;
+    case PROP_ZORDER:
+    {
+        GST_OBJECT_LOCK(sink);
+        sink->zorder = g_value_get_int(value);
+        sink->update_zorder = TRUE;
+        GST_DEBUG_OBJECT(sink, "set video plane zorder:%d",sink->zorder);
+        GST_OBJECT_UNLOCK(sink);
+        if (sink_priv->render_device_handle)
+        {
+            sink->update_zorder = FALSE;
+            render_set_value(sink_priv->render_device_handle, KEY_ZORDER, &sink->zorder);
+        }
+    } break;
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_RESOURCE_INFO:
     {
@@ -888,12 +916,6 @@
             goto error;
         }
 
-        if (render_set_value(sink_priv->render_device_handle, KEY_IMMEDIATELY_OUTPUT, &sink->default_sync) == -1)
-        {
-            GST_ERROR_OBJECT(sink, "render lib set immediately output error");
-            goto error;
-        }
-
         if (render_set_value(sink_priv->render_device_handle, KEY_IMMEDIATELY_OUTPUT, &sink->immediately_render) == -1)
         {
             GST_ERROR_OBJECT(sink, "render lib set immediately output error");
@@ -973,8 +995,8 @@
         GST_DEBUG_OBJECT(sink, "before disconnect rlib");
         render_disconnect(sink_priv->render_device_handle);
         GST_DEBUG_OBJECT(sink, "after disconnect rlib");
-        GST_DEBUG_OBJECT(sink, "buf stat | queued:%d, dequeued:%d, droped:%d, rendered:%d",
-                         sink->queued, sink->dequeued, sink->droped, sink->rendered);
+        GST_DEBUG_OBJECT(sink, "buf stat | queued:%d, dequeued:%d, dropped:%d, rendered:%d",
+                         sink->queued, sink->dequeued, sink->dropped, sink->rendered);
         break;
     }
     case GST_STATE_CHANGE_READY_TO_NULL:
@@ -1377,8 +1399,10 @@
         sink->pixel_aspect_ratio_changed = FALSE;
         render_set_value(sink_priv->render_device_handle, KEY_PIXEL_ASPECT_RATIO, &sink->pixel_aspect_ratio);
     }
-
-
+    if (sink->update_zorder) {
+        sink->update_zorder = FALSE;
+        render_set_value(sink_priv->render_device_handle, KEY_ZORDER, &sink->zorder);
+    }
 
     tunnel_lib_buf_wrap = render_allocate_render_buffer_wrap(sink_priv->render_device_handle, BUFFER_FLAG_DMA_BUFFER);
     if (!tunnel_lib_buf_wrap)
@@ -1466,17 +1490,17 @@
     case GST_EVENT_FLUSH_STOP:
     {
         GST_INFO_OBJECT(sink, "flush stop");
-        GST_DEBUG_OBJECT(sink, "flushing need waitting display render all buf, queued:%d, rendered:%d, droped:%d",
+        GST_DEBUG_OBJECT(sink, "flushing need waitting display render all buf, queued:%d, rendered:%d, dropped:%d",
                          sink->queued,
                          sink->rendered,
-                         sink->droped);
+                         sink->dropped);
 
         GST_OBJECT_LOCK(sink);
         GST_INFO_OBJECT(sink, "flush all count num to zero");
         sink->queued = 0;
         sink->dequeued = 0;
         sink->rendered = 0;
-        sink->droped = 0;
+        sink->dropped = 0;
         sink_priv->got_eos = FALSE;
         sink_priv->is_flushing = FALSE;
         GST_INFO_OBJECT(sink, "flush stop done");
@@ -1514,12 +1538,12 @@
         GST_OBJECT_UNLOCK(sink);
 
         //some frames aren't displayed,so don't pass this event to basesink
-        if (sink->queued > sink->rendered + sink->droped)
+        if (sink->queued > (sink->rendered + sink->dropped))
         {
-            GST_DEBUG_OBJECT(sink, "display render all buf, queued:%d, rendered:%d, droped:%d",
+            GST_DEBUG_OBJECT(sink, "display render all buf, queued:%d, rendered:%d, dropped:%d",
                              sink->queued,
                              sink->rendered,
-                             sink->droped);
+                             sink->dropped);
             gst_event_unref(event);
             return result;
         }
@@ -1761,7 +1785,7 @@
             if (type == MSG_DROPED_BUFFER)
             {
                 GST_LOG_OBJECT(sink, "get message: MSG_DROPED_BUFFER from tunnel lib");
-                sink->droped++;
+                sink->dropped++;
             }
             else if (type == MSG_DISPLAYED_BUFFER)
             {
@@ -1769,10 +1793,10 @@
                 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",
+            GST_DEBUG_OBJECT(sink, "buf:%p planeCnt:%d, plane[0].fd:%d, plane[1].fd:%d pts:%lld, buf stat | queued:%d, dequeued:%d, dropped:%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 ? GST_BUFFER_PTS(buffer) : -1, sink->queued, sink->dequeued, sink->dropped, sink->rendered);
             //gst_aml_video_sink_dump_stat(sink, GST_DUMP_STAT_FILENAME);
         }
         else
@@ -1815,7 +1839,7 @@
     } break;
     default:
     {
-        GST_ERROR_OBJECT(sink, "tunnel lib: error message type");
+        GST_ERROR_OBJECT(sink, "tunnel lib: error message type %d",type);
     }
     }
     return;
@@ -2114,7 +2138,7 @@
         }
         if (sink->video_playing && sink_priv->got_eos)
         {
-            if (sink->queued == sink->rendered + sink->droped)
+            if (sink->queued == sink->rendered + sink->dropped)
             {
                 --eosCountDown;
                 if ( eosCountDown == 0 )
@@ -2191,7 +2215,7 @@
     if ((out = fopen(full_file_name, "w")))
     {
         gchar *stat_info;
-        stat_info = g_strdup_printf("Stat:%d | Q:%d,  Dq:%d,  Render:%d,  Drop:%d\n", GST_STATE(sink), sink->queued, sink->dequeued, sink->rendered, sink->droped);
+        stat_info = g_strdup_printf("Stat:%d | Q:%d,  Dq:%d,  Render:%d,  Drop:%d\n", GST_STATE(sink), sink->queued, sink->dequeued, sink->rendered, sink->dropped);
         fputs(stat_info, out);
         g_free(stat_info);
         fclose(out);
diff --git a/src/gstamlvideosink.h b/src/gstamlvideosink.h
index d793c47..10be9cc 100644
--- a/src/gstamlvideosink.h
+++ b/src/gstamlvideosink.h
@@ -55,7 +55,7 @@
   gint queued;
   gint dequeued;
   gint rendered;
-  gint droped;
+  gint dropped;
   gboolean default_sync;
   gint immediately_render;
   gint avsync_mode;
@@ -76,6 +76,8 @@
   double pixel_aspect_ratio;
   gboolean keep_last_frame_on_flush;
   gboolean enable_decoded_buffer_signal;
+  gint zorder;
+  gboolean update_zorder;
 
   GstAmlVideoSinkPrivate *priv;
 };