From 2fb30428c888cbb8bd5d99934d46b0e169c95410 Mon Sep 17 00:00:00 2001 From: Hyunil Park Date: Tue, 17 Feb 2015 12:18:44 +0900 Subject: [PATCH] [xvimagesink] Merge Tizen 2.4 code with Tizen 3.0 code Change-Id: I421a4f9a0bc1b0a22781f7fbce06c58d2c75e10b Signed-off-by: Hyunil Park --- packaging/gst-plugins-base.spec | 2 +- sys/xvimage/Makefile.am | 2 +- sys/xvimage/xvcontext.c | 6 ++-- sys/xvimage/xvimageallocator.c | 7 ----- sys/xvimage/xvimagepool.c | 2 +- sys/xvimage/xvimagesink.c | 61 +++++++++++++++++++++++++---------------- 6 files changed, 44 insertions(+), 36 deletions(-) diff --git a/packaging/gst-plugins-base.spec b/packaging/gst-plugins-base.spec index 7393df4..2b4a2e7 100644 --- a/packaging/gst-plugins-base.spec +++ b/packaging/gst-plugins-base.spec @@ -4,7 +4,7 @@ Name: gst-plugins-base Version: 1.4.1 -Release: 2 +Release: 3 License: LGPL-2.1+ and GPL-2.0+ Summary: GStreamer Streaming-Media Framework Plug-Ins Url: http://gstreamer.freedesktop.org/ diff --git a/sys/xvimage/Makefile.am b/sys/xvimage/Makefile.am index e8e16f5..db23187 100644 --- a/sys/xvimage/Makefile.am +++ b/sys/xvimage/Makefile.am @@ -1,7 +1,7 @@ plugin_LTLIBRARIES = libgstxvimagesink.la libgstxvimagesink_la_SOURCES = xvimagesink.c xvimage.c xvimagepool.c xvimageallocator.c xvcontext.c -libgstxvimagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(XFIXES_CFLAGS) $(DRI2PROTO_CFLAGS) $(DRI2_CFLAGS) $(TBM_CFLAGS) $(MMTA_CFLAGS) +libgstxvimagesink_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(X_CFLAGS) $(XFIXES_CFLAGS) $(DRI2PROTO_CFLAGS) $(DRI2_CFLAGS) $(TBM_CFLAGS) libgstxvimagesink_la_LIBADD = \ $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_API_VERSION).la \ $(GST_BASE_LIBS) \ diff --git a/sys/xvimage/xvcontext.c b/sys/xvimage/xvcontext.c index 8d171f0..cf89073 100644 --- a/sys/xvimage/xvcontext.c +++ b/sys/xvimage/xvcontext.c @@ -38,7 +38,7 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); #define GST_CAT_DEFAULT gst_debug_xvcontext #ifdef GST_EXT_XV_ENHANCEMENT -#define _BUFFER_WAIT_TIMEOUT 2000000 +#define _BUFFER_WAIT_TIMEOUT 200000 #define _CHECK_DISPLAYED_BUFFER_COUNT 30 /* headers for drm */ @@ -833,8 +833,8 @@ gst_xvcontext_new (GstXvContextConfig * config, GError ** error) channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); channel->label = g_strdup (channels[i]); - channel->min_value = matching_attr->min_value; - channel->max_value = matching_attr->max_value; + channel->min_value = matching_attr ? matching_attr->min_value : -1000; + channel->max_value = matching_attr ? matching_attr->max_value : 1000; context->channels_list = g_list_append (context->channels_list, channel); diff --git a/sys/xvimage/xvimageallocator.c b/sys/xvimage/xvimageallocator.c index 818f4ef..04ac79c 100644 --- a/sys/xvimage/xvimageallocator.c +++ b/sys/xvimage/xvimageallocator.c @@ -669,13 +669,6 @@ gst_xvimage_memory_render (GstXvImageMemory * mem, GstVideoRectangle * src_crop, dst_crop->x, dst_crop->y, dst_crop->w, dst_crop->h); } - /* store buffer */ - img_data = (XV_DATA_PTR) gst_xvimage_memory_get_xvimage(mem)->data; - if (img_data->BufType == XV_BUF_TYPE_DMABUF) { - gst_xvcontext_add_displaying_buffer(context, img_data, gst_xvimage_memory_get_buffer(mem)); - gst_xvimage_memory_set_buffer(mem, NULL); - } - g_mutex_lock(context->display_buffer_lock); if (context->displaying_buffer_count > 3) { g_mutex_unlock(context->display_buffer_lock); diff --git a/sys/xvimage/xvimagepool.c b/sys/xvimage/xvimagepool.c index 244a51a..6928d2b 100644 --- a/sys/xvimage/xvimagepool.c +++ b/sys/xvimage/xvimagepool.c @@ -118,7 +118,7 @@ xvimage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) gst_buffer_pool_config_get_video_alignment (config, &priv->align); GST_LOG_OBJECT (pool, "padding %u-%ux%u-%u", priv->align.padding_top, - priv->align.padding_left, priv->align.padding_left, + priv->align.padding_left, priv->align.padding_right, priv->align.padding_bottom); /* do padding and alignment */ diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index db95f36..41c848b 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -137,7 +137,7 @@ #include "xv_types.h" /* for performance checking */ -#include +//#include typedef enum { BUF_SHARE_METHOD_PADDR = 0, @@ -765,6 +765,11 @@ gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GstBuffer * xvimage) break; } + /*fix top and left green pixel of video*/ + gst_xvimage_memory_get_crop (mem, &mem_crop); + src_input.x += mem_crop.x; + src_input.y += mem_crop.y; + /* Trim as proper size */ if (src_input.w % 2 == 1) { src_input.w += 1; @@ -773,16 +778,14 @@ gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GstBuffer * xvimage) src_input.h += 1; } - GST_LOG_OBJECT( xvimagesink, "window[%dx%d],method[%d],rotate[%d],zoom[%d],dp_mode[%d],src[%dx%d],dst[%d,%d,%dx%d],input[%d,%d,%dx%d],result[%d,%d,%dx%d]", + GST_LOG_OBJECT( xvimagesink, "window[%dx%d],method[%d],rotate[%d],zoom[%lf],dp_mode[%d],src[%d,%d,%dx%d],dst[%d,%d,%dx%d],input[%d,%d,%dx%d],result[%d,%d,%dx%d]", xwindow->width, xwindow->height, xvimagesink->display_geometry_method, rotate, xvimagesink->zoom, xvimagesink->config.display_mode, - src_origin.w, src_origin.h, + src_origin.x, src_origin.y, src_origin.w, src_origin.h, dst.x, dst.y, dst.w, dst.h, src_input.x, src_input.y, src_input.w, src_input.h, result.x, result.y, result.w, result.h ); - memcpy (&src, &src_input, sizeof (src_input)); - #ifdef HAVE_XSHM /* set display rotation */ if (atom_rotation == None) { @@ -840,6 +843,8 @@ gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GstBuffer * xvimage) ret, xvimagesink->context->disp, xvimagesink->context->xv_port_id, atom_vflip, set_vflip); } #endif /* HAVE_XSHM */ + gst_xvimage_memory_render (mem, &src_input, xwindow, &result, draw_border); + #else /* GST_EXT_XV_ENHANCEMENT */ gst_xvimage_memory_get_crop (mem, &mem_crop); @@ -873,10 +878,8 @@ gst_xvimagesink_xvimage_put (GstXvImageSink * xvimagesink, GstBuffer * xvimage) } else { memcpy (&result, &xwindow->render_rect, sizeof (GstVideoRectangle)); } -#endif /* GST_EXT_XV_ENHANCEMENT */ - gst_xvimage_memory_render (mem, &src, xwindow, &result, draw_border); - +#endif /* GST_EXT_XV_ENHANCEMENT */ g_mutex_unlock (&xvimagesink->flow_lock); return TRUE; @@ -1552,7 +1555,7 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf) { GstFlowReturn res; GstXvImageSink *xvimagesink; - GstBuffer *to_put = NULL; + GstBuffer *to_put; GstMemory *mem; gboolean ret = FALSE; #ifdef GST_EXT_XV_ENHANCEMENT @@ -1611,8 +1614,7 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf) GST_LOG("Samsung EXT format - name:%s, display mode:%d, Rotate angle:%d", GST_VIDEO_INFO_NAME(&xvimagesink->info), xvimagesink->config.display_mode, xvimagesink->rotate_angle); - img_mem = (GstXvImageMemory*)gst_buffer_peek_memory(to_put, 0); - img_data = (XV_DATA_PTR) gst_xvimage_memory_get_xvimage(img_mem)->data; + img_data = (XV_DATA_PTR) gst_xvimage_memory_get_xvimage((GstXvImageMemory*)gst_buffer_peek_memory(to_put, 0))->data; if (img_data) { memset(img_data, 0x0, sizeof(XV_DATA)); XV_INIT_DATA(img_data); @@ -1627,12 +1629,16 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf) return GST_FLOW_OK; } + /* store buffer */ + img_mem = (GstXvImageMemory*)gst_buffer_peek_memory(to_put, 0); + img_data = (XV_DATA_PTR) gst_xvimage_memory_get_xvimage(img_mem)->data; + if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_PADDR) { img_data->YBuf = (unsigned int)scmn_imgb->p[0]; img_data->CbBuf = (unsigned int)scmn_imgb->p[1]; img_data->CrBuf = (unsigned int)scmn_imgb->p[2]; img_data->BufType = XV_BUF_TYPE_LEGACY; - } else if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_FD) { + } else if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_FD || scmn_imgb->buf_share_method == BUF_SHARE_METHOD_TIZEN_BUFFER) { /* open drm to use gem */ if (xvimagesink->context->drm_fd < 0) { gst_xvcontext_drm_init(xvimagesink->context); @@ -1672,9 +1678,12 @@ gst_xvimagesink_show_frame (GstVideoSink * vsink, GstBuffer * buf) xvimagesink->is_secure_path = TRUE; } } - /* set current buffer */ - gst_xvimage_memory_set_buffer(img_mem, buf); + gst_xvimage_memory_set_buffer((GstXvImageMemory*)gst_buffer_peek_memory(to_put, 0), buf); + + if (img_data && img_data->BufType == XV_BUF_TYPE_DMABUF) + gst_xvcontext_add_displaying_buffer(xvimagesink->context, img_data, gst_xvimage_memory_get_buffer(img_mem)); + } else { GST_WARNING("unknown buf_share_method type [%d]. skip xvimage put...", scmn_imgb->buf_share_method); @@ -2466,12 +2475,12 @@ gst_xvimagesink_set_property (GObject * object, guint prop_id, break; case PROP_VISIBLE: g_mutex_lock( &xvimagesink->flow_lock ); - g_mutex_lock( &xvimagesink->context->lock ); GST_WARNING_OBJECT(xvimagesink, "set visible %d", g_value_get_boolean(value)); if (xvimagesink->visible && (g_value_get_boolean(value) == FALSE)) { if (xvimagesink->context) { + g_mutex_lock( &xvimagesink->context->lock ); #if 0 Atom atom_stream = XInternAtom( xvimagesink->context->disp, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False ); @@ -2485,33 +2494,29 @@ gst_xvimagesink_set_property (GObject * object, guint prop_id, } #endif xvimagesink->visible = g_value_get_boolean (value); - XvStopVideo(xvimagesink->context->disp, xvimagesink->context->xv_port_id, xvimagesink->xwindow->win); + + if (GST_STATE (xvimagesink) > GST_STATE_READY) + XvStopVideo(xvimagesink->context->disp, xvimagesink->context->xv_port_id, xvimagesink->xwindow->win); XSync( xvimagesink->context->disp, FALSE ); + g_mutex_unlock( &xvimagesink->context->lock ); } else { GST_WARNING_OBJECT( xvimagesink, "xcontext is null"); xvimagesink->visible = g_value_get_boolean (value); } } else if (!xvimagesink->visible && (g_value_get_boolean(value) == TRUE)) { - g_mutex_unlock( &xvimagesink->context->lock ); g_mutex_unlock( &xvimagesink->flow_lock ); xvimagesink->visible = g_value_get_boolean (value); - gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->cur_image); g_mutex_lock( &xvimagesink->flow_lock ); - g_mutex_lock( &xvimagesink->context->lock ); } GST_INFO("set visible(%d) done", xvimagesink->visible); - g_mutex_unlock( &xvimagesink->context->lock ); g_mutex_unlock( &xvimagesink->flow_lock ); break; case PROP_ZOOM: xvimagesink->zoom = g_value_get_float (value); - if (GST_STATE(xvimagesink) == GST_STATE_PAUSED) { - gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->cur_image); - } break; case PROP_ZOOM_POS_X: xvimagesink->zoom_pos_x = g_value_get_int (value); @@ -2856,6 +2861,10 @@ gst_xvimagesink_init (GstXvImageSink * xvimagesink) xvimagesink->is_zero_copy_format = FALSE; xvimagesink->is_secure_path = FALSE; + /*X can't gurarantee thread safe: sometimes, X can't render Video. + Add XInitThread() before XOpenDisplay()*/ + if(!XInitThreads()) + GST_WARNING("FAIL to call XInitThreads()"); #endif /* GST_EXT_XV_ENHANCEMENT */ } @@ -2924,6 +2933,8 @@ gst_xvimagesink_class_init (GstXvImageSinkClass * klass) * * When enabled, the current frame will always be drawn in response to X * Expose. + * + * Since: 0.10.14 */ g_object_class_install_property (gobject_class, PROP_HANDLE_EXPOSE, g_param_spec_boolean ("handle-expose", "Handle expose", @@ -2935,6 +2946,8 @@ gst_xvimagesink_class_init (GstXvImageSinkClass * klass) * GstXvImageSink:double-buffer * * Whether to double-buffer the output. + * + * Since: 0.10.14 */ g_object_class_install_property (gobject_class, PROP_DOUBLE_BUFFER, g_param_spec_boolean ("double-buffer", "Double-buffer", @@ -2953,6 +2966,8 @@ gst_xvimagesink_class_init (GstXvImageSinkClass * klass) * GstXvImageSink:colorkey * * Color to use for the overlay mask. + * + * Since: 0.10.21 */ g_object_class_install_property (gobject_class, PROP_COLORKEY, g_param_spec_int ("colorkey", "Colorkey", -- 2.7.4