eglglessink: Add support for AYUV
This commit is contained in:
parent
c4643491c4
commit
d42d5e1139
@ -137,13 +137,15 @@ static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC my_glEGLImageTargetTexture2DOES;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
static const char *vert_prog = {
|
static const char *vert_prog = {
|
||||||
"attribute vec3 position;"
|
"attribute vec3 position;"
|
||||||
"varying vec2 opos;"
|
"varying vec2 opos;"
|
||||||
"void main(void)"
|
"void main(void)"
|
||||||
"{"
|
"{"
|
||||||
" opos = vec2((position.x + 1.0)/2.0, ((-1.0 * position.y) + 1.0)/2.0);"
|
" opos = vec2((position.x + 1.0)/2.0, ((-1.0 * position.y) + 1.0)/2.0);"
|
||||||
" gl_Position = vec4(position, 1.0);" "}"
|
" gl_Position = vec4(position, 1.0);"
|
||||||
|
"}"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *frag_prog = {
|
static const char *frag_prog = {
|
||||||
@ -152,9 +154,32 @@ static const char *frag_prog = {
|
|||||||
"uniform sampler2D tex;"
|
"uniform sampler2D tex;"
|
||||||
"void main(void)"
|
"void main(void)"
|
||||||
"{"
|
"{"
|
||||||
" vec4 t = texture2D(tex, opos);" " gl_FragColor = vec4(t.xyz, 1.0);" "}"
|
" vec4 t = texture2D(tex, opos);"
|
||||||
|
" gl_FragColor = vec4(t.xyz, 1.0);"
|
||||||
|
"}"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* From gst-plugins-gl */
|
||||||
|
static const char *frag_AYUV_prog = {
|
||||||
|
"precision mediump float;"
|
||||||
|
"varying vec2 opos;"
|
||||||
|
"uniform sampler2D tex;"
|
||||||
|
"void main(void) {"
|
||||||
|
" float r,g,b,y,u,v;"
|
||||||
|
" vec2 nxy = opos.xy;"
|
||||||
|
" y=texture2D(tex,nxy).g;"
|
||||||
|
" u=texture2D(tex,nxy).b;"
|
||||||
|
" v=texture2D(tex,nxy).a;"
|
||||||
|
" y=1.1643*(y-0.0625);"
|
||||||
|
" u=u-0.5;"
|
||||||
|
" v=v-0.5;"
|
||||||
|
" r=y+1.5958*v;"
|
||||||
|
" g=y-0.39173*u-0.81290*v;"
|
||||||
|
" b=y+2.017*u;"
|
||||||
|
" gl_FragColor=vec4(r,g,b,1.0);"
|
||||||
|
"}" };
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
/* Input capabilities.
|
/* Input capabilities.
|
||||||
*
|
*
|
||||||
* OpenGL ES Standard does not mandate YUV support
|
* OpenGL ES Standard does not mandate YUV support
|
||||||
@ -164,7 +189,9 @@ static GstStaticPadTemplate gst_eglglessink_sink_template_factory =
|
|||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_RGBx ";"
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBA ";"
|
||||||
|
GST_VIDEO_CAPS_RGBx ";"
|
||||||
|
GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGB_16));
|
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_RGB_16));
|
||||||
|
|
||||||
/* Filter signals and args */
|
/* Filter signals and args */
|
||||||
@ -793,6 +820,8 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
|
|||||||
format->caps = gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBA);
|
format->caps = gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBA);
|
||||||
gst_caps_append (format->caps,
|
gst_caps_append (format->caps,
|
||||||
gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBx));
|
gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBx));
|
||||||
|
gst_caps_append (format->caps,
|
||||||
|
gst_video_format_new_template_caps (GST_VIDEO_FORMAT_AYUV));
|
||||||
eglglessink->supported_fmts =
|
eglglessink->supported_fmts =
|
||||||
g_list_append (eglglessink->supported_fmts, format);
|
g_list_append (eglglessink->supported_fmts, format);
|
||||||
ret++;
|
ret++;
|
||||||
@ -1248,7 +1277,11 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fraghandle = glCreateShader (GL_FRAGMENT_SHADER);
|
fraghandle = glCreateShader (GL_FRAGMENT_SHADER);
|
||||||
glShaderSource (fraghandle, 1, &frag_prog, NULL);
|
if (eglglessink->format == GST_VIDEO_FORMAT_AYUV)
|
||||||
|
glShaderSource (fraghandle, 1, &frag_AYUV_prog, NULL);
|
||||||
|
else
|
||||||
|
glShaderSource (fraghandle, 1, &frag_prog, NULL);
|
||||||
|
|
||||||
if (got_gl_error ("glShaderSource fragment"))
|
if (got_gl_error ("glShaderSource fragment"))
|
||||||
goto HANDLE_ERROR;
|
goto HANDLE_ERROR;
|
||||||
|
|
||||||
@ -1521,6 +1554,10 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
|||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
break;
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user