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;
};