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