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 )