From: Haihao Xiang Date: Wed, 20 Mar 2019 07:52:53 +0000 (+0800) Subject: glimagesink: add support for VUYA format X-Git-Tag: 1.16.2~136 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f0cbb787708e3352f379776ae0f2da26d261b93d;p=platform%2Fupstream%2Fgst-plugins-base.git glimagesink: add support for VUYA format --- diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c index 351d859..644c233 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.c +++ b/gst-libs/gst/gl/gstglcolorconvert.c @@ -228,6 +228,34 @@ static const struct shader_templ templ_RGB_to_AYUV = GST_GL_TEXTURE_TARGET_2D }; +static const gchar templ_VUYA_to_RGB_BODY[] = + "vec4 texel, rgba;\n" + "texel = texture2D(tex, texcoord * tex_scale0);\n" + "rgba.rgb = yuv_to_rgb (texel.zyx, offset, coeff1, coeff2, coeff3);\n" + "rgba.a = texel.w;\n" + "gl_FragColor=vec4(rgba.%c,rgba.%c,rgba.%c,rgba.%c);\n"; + +static const struct shader_templ templ_VUYA_to_RGB = + { NULL, + DEFAULT_UNIFORMS YUV_TO_RGB_COEFFICIENTS "uniform sampler2D tex;\n", + { glsl_func_yuv_to_rgb, NULL, }, + GST_GL_TEXTURE_TARGET_2D + }; + +static const gchar templ_RGB_to_VUYA_BODY[] = + "vec4 texel, ayuv;\n" + "texel = texture2D(tex, texcoord).%c%c%c%c;\n" + "ayuv.zyx = rgb_to_yuv (texel.rgb, offset, coeff1, coeff2, coeff3);\n" + "ayuv.w = %s;\n" + "gl_FragColor = ayuv;\n"; + +static const struct shader_templ templ_RGB_to_VUYA = + { NULL, + DEFAULT_UNIFORMS RGB_TO_YUV_COEFFICIENTS "uniform sampler2D tex;\n", + { glsl_func_rgb_to_yuv, NULL, }, + GST_GL_TEXTURE_TARGET_2D + }; + /* YUV to RGB conversion */ static const gchar templ_PLANAR_YUV_to_RGB_BODY[] = "vec4 texel, rgba;\n" @@ -906,7 +934,7 @@ _init_supported_formats (GstGLContext * context, gboolean output, /* Always supported input and output formats */ _init_value_string_list (supported_formats, "RGBA", "RGB", "RGBx", "BGR", "BGRx", "BGRA", "xRGB", "xBGR", "ARGB", "ABGR", "GRAY8", "GRAY16_LE", - "GRAY16_BE", "AYUV", "YUY2", "UYVY", NULL); + "GRAY16_BE", "AYUV", "VUYA", "YUY2", "UYVY", NULL); /* Always supported input formats or output with multiple draw buffers */ if (!output || (!context || context->gl_vtable->DrawBuffers)) @@ -1482,6 +1510,7 @@ _get_n_textures (GstVideoFormat v_format) case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_VUYA: case GST_VIDEO_FORMAT_GRAY8: case GST_VIDEO_FORMAT_GRAY16_LE: case GST_VIDEO_FORMAT_GRAY16_BE: @@ -1580,6 +1609,12 @@ _YUV_to_RGB (GstGLColorConvert * convert) pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]); info->shader_tex_names[0] = "tex"; break; + case GST_VIDEO_FORMAT_VUYA: + info->templ = &templ_VUYA_to_RGB; + info->frag_body = g_strdup_printf (templ_VUYA_to_RGB_BODY, + pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]); + info->shader_tex_names[0] = "tex"; + break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_Y42B: @@ -1689,6 +1724,13 @@ _RGB_to_YUV (GstGLColorConvert * convert) pixel_order[1], pixel_order[2], pixel_order[3], alpha); info->out_n_textures = 1; break; + case GST_VIDEO_FORMAT_VUYA: + alpha = _is_RGBx (in_format) ? "1.0" : "texel.a"; + info->templ = &templ_RGB_to_VUYA; + info->frag_body = g_strdup_printf (templ_RGB_to_VUYA_BODY, pixel_order[0], + pixel_order[1], pixel_order[2], pixel_order[3], alpha); + info->out_n_textures = 1; + break; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y444: diff --git a/gst-libs/gst/gl/gstglcolorconvert.h b/gst-libs/gst/gl/gstglcolorconvert.h index 31e576d..c69375b 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.h +++ b/gst-libs/gst/gl/gstglcolorconvert.h @@ -89,7 +89,7 @@ struct _GstGLColorConvertClass */ #define GST_GL_COLOR_CONVERT_FORMATS "{ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, " \ "xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, " \ - "Y41B, NV12, NV21, YUY2, UYVY, AYUV, " \ + "Y41B, NV12, NV21, YUY2, UYVY, AYUV, VUYA, " \ "GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16, ARGB64 }" /** diff --git a/gst-libs/gst/gl/gstglformat.c b/gst-libs/gst/gl/gstglformat.c index bc15743..422ef9e 100644 --- a/gst-libs/gst/gl/gstglformat.c +++ b/gst-libs/gst/gl/gstglformat.c @@ -159,6 +159,7 @@ gst_gl_format_from_video_info (GstGLContext * context, GstVideoInfo * vinfo, case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_AYUV: + case GST_VIDEO_FORMAT_VUYA: n_plane_components = 4; break; case GST_VIDEO_FORMAT_ARGB64: diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h index e7e14f6..8be8db5 100644 --- a/gst-libs/gst/gl/gstglmemory.h +++ b/gst-libs/gst/gl/gstglmemory.h @@ -52,7 +52,7 @@ GType gst_gl_memory_allocator_get_type(void); */ #define GST_GL_MEMORY_VIDEO_FORMATS_STR \ "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, " \ - "AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \ + "AYUV, VUYA, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \ "GRAY8, GRAY16_LE, GRAY16_BE, ARGB64 }" /**