amlvideosink: CF2 add force aspect ratio [1/1]

PD#SWPL-189506

Problem:
new feature for force video aspect ratio

Solution:
new feature for force video aspect ratio

Verify:
ah212

Change-Id: I28ce12e743fff0fa987d523997939a617e33acdd
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index 77d440c..8885ac8 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -116,6 +116,7 @@
     PROP_ZORDER,
     PROP_FRAME_STEP_ON_PREROLL,
     PRO_VIDEO_LATENCY,
+    PROP_FORCE_ASPECT_RATIO,
 #if GST_IMPORT_LGE_PROP
     PROP_LGE_RESOURCE_INFO,
     PROP_LGE_CURRENT_PTS,
@@ -228,6 +229,7 @@
     gint              fps_d;
     gint              video_latency;
     gboolean          set_video_latency;
+    gboolean          force_aspect_ratio;
 
     /* rotation and ge2d */
     aml_ge2d_info_t *pge2dinfo;
@@ -443,6 +445,12 @@
                            "allow frame stepping on preroll into pause",
                            FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+    g_object_class_install_property (
+        G_OBJECT_CLASS(klass), PROP_FORCE_ASPECT_RATIO,
+        g_param_spec_boolean ("force-aspect-ratio",
+                           "force aspect ratio",
+                           "When enabled scaling respects source aspect ratio", FALSE, 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),
@@ -706,6 +714,11 @@
         GST_OBJECT_UNLOCK(sink);
         break;
     }
+    case PROP_FORCE_ASPECT_RATIO:
+    {
+        g_value_set_boolean(value, sink_priv->force_aspect_ratio);
+        break;
+    }
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_CURRENT_PTS:
     {
@@ -912,6 +925,16 @@
         GST_DEBUG_OBJECT(sink, "set video latency:%d us",sink_priv->video_latency);
         GST_OBJECT_UNLOCK(sink);
     } break;
+    case PROP_FORCE_ASPECT_RATIO:
+    {
+        sink_priv->force_aspect_ratio = g_value_get_boolean(value);
+        GST_DEBUG_OBJECT(sink, "set force aspect ratio:%d",sink_priv->force_aspect_ratio);
+        if (sink_priv->render_device_handle)
+        {
+            int force = sink_priv->force_aspect_ratio? 1: 0;
+            render_set_value(sink_priv->render_device_handle, KEY_FORCE_ASPECT_RATIO, &force);
+        }
+    } break;
 #if GST_IMPORT_LGE_PROP
     case PROP_LGE_RESOURCE_INFO:
     {
@@ -1094,6 +1117,11 @@
             GST_ERROR_OBJECT(sink, "render lib set immediately output error");
             goto error;
         }
+        if (sink_priv->force_aspect_ratio)
+        {
+            int force = 1;
+            render_set_value(sink_priv->render_device_handle, KEY_FORCE_ASPECT_RATIO, &force);
+        }
 
         if (render_pause(sink_priv->render_device_handle) == -1)
         {
@@ -1111,6 +1139,10 @@
             GST_ERROR_OBJECT(sink, "render lib resume device fail");
             goto error;
         }
+        //drop all frames thoes donot rendered
+        if (sink_priv->got_eos) {
+            sink->rendered = sink->queued - sink->dropped;
+        }
         break;
     }
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
@@ -2118,6 +2150,7 @@
     sink_priv->rot_degree = WST_ROTATION_0;
     sink_priv->rot_changed = FALSE;
     sink_priv->rot_enable_property = FALSE;
+    sink_priv->force_aspect_ratio = FALSE;
 }
 
 static void gst_set_report_info(void *userData, RenderMsgType type, int64_t pts, int64_t duration)
@@ -2667,7 +2700,7 @@
         g_mutex_unlock(&sink->report_info_lock);
         if (sink->video_playing && sink_priv->got_eos)
         {
-            if (sink->queued == sink->rendered + sink->dropped)
+            if (sink->queued <= sink->rendered + sink->dropped)
             {
                 --eosCountDown;
                 if ( eosCountDown == 0 )