From 1e9f7b6303f100cb53d11a3d953db8881388dd80 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 2 Jun 2015 16:32:03 +1000 Subject: [PATCH] gl: consolidate internal_rgba_format into glmemory Expose some useful value format conversion functions available in GstGLMemory. --- ext/gl/gstgleffects.c | 10 +++- ext/gl/gstglfiltershader.c | 9 ++- gst-libs/gst/gl/gstglcolorconvert.c | 7 ++- gst-libs/gst/gl/gstglframebuffer.c | 7 ++- gst-libs/gst/gl/gstglmemory.c | 53 +++++++++--------- gst-libs/gst/gl/gstglmemory.h | 8 ++- gst-libs/gst/gl/gstglutils.c | 85 ++++++----------------------- gst-libs/gst/gl/gstglutils.h | 4 +- 8 files changed, 79 insertions(+), 104 deletions(-) diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c index 7106bdabcf..1ade04f2c7 100644 --- a/ext/gl/gstgleffects.c +++ b/ext/gl/gstgleffects.c @@ -273,7 +273,9 @@ static void gst_gl_effects_init_gl_resources (GstGLFilter * filter) { GstGLEffects *effects = GST_GL_EFFECTS (filter); - GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; + GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; + GstGLFuncs *gl = context->gl_vtable; + guint internal_format; gint i = 0; for (i = 0; i < NEEDED_TEXTURES; i++) { @@ -285,8 +287,10 @@ gst_gl_effects_init_gl_resources (GstGLFilter * filter) gl->GenTextures (1, &effects->midtexture[i]); gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[i]); - gl->TexImage2D (GL_TEXTURE_2D, 0, - gst_gl_internal_format_rgba (GST_GL_BASE_FILTER (filter)->context), + internal_format = + gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA, + GL_UNSIGNED_BYTE); + gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); diff --git a/ext/gl/gstglfiltershader.c b/ext/gl/gstglfiltershader.c index aa0af3c096..e201f7492c 100644 --- a/ext/gl/gstglfiltershader.c +++ b/ext/gl/gstglfiltershader.c @@ -93,8 +93,13 @@ static void gst_gl_filtershader_hcallback (gint width, gint height, static void gst_gl_filtershader_init_resources (GstGLFilter * filter) { - glTexImage2D (GL_TEXTURE_2D, 0, - gst_gl_internal_format_rgba (GST_GL_BASE_FILTER (filter)->context), + GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; + guint internal_format; + + internal_format = + gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA, + GL_UNSIGNED_BYTE); + glTexImage2D (GL_TEXTURE_2D, 0, internal_format, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c index 05cdfe56ab..62e938c0f5 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.c +++ b/gst-libs/gst/gl/gstglcolorconvert.c @@ -1432,6 +1432,7 @@ _init_convert_fbo (GstGLColorConvert * convert) GstGLFuncs *gl; guint out_width, out_height; GLuint fake_texture = 0; /* a FBO must hava texture to init */ + GLenum internal_format; gl = convert->context->gl_vtable; @@ -1466,8 +1467,10 @@ _init_convert_fbo (GstGLColorConvert * convert) /* a fake texture is attached to the convert FBO (cannot init without it) */ gl->GenTextures (1, &fake_texture); gl->BindTexture (GL_TEXTURE_2D, fake_texture); - gl->TexImage2D (GL_TEXTURE_2D, 0, - gst_gl_internal_format_rgba (convert->context), out_width, out_height, 0, + internal_format = + gst_gl_sized_gl_format_from_gl_format_type (convert->context, GL_RGBA, + GL_UNSIGNED_BYTE); + gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, out_width, out_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/gst-libs/gst/gl/gstglframebuffer.c b/gst-libs/gst/gl/gstglframebuffer.c index 945d418cc0..7e958ca1dd 100644 --- a/gst-libs/gst/gl/gstglframebuffer.c +++ b/gst-libs/gst/gl/gstglframebuffer.c @@ -90,6 +90,7 @@ gst_gl_framebuffer_generate (GstGLFramebuffer * frame, gint width, gint height, { GLuint fake_texture = 0; const GstGLFuncs *gl; + GLenum internal_format; g_return_val_if_fail (GST_IS_GL_FRAMEBUFFER (frame), FALSE); g_return_val_if_fail (fbo != NULL && depth != NULL, FALSE); @@ -125,8 +126,10 @@ gst_gl_framebuffer_generate (GstGLFramebuffer * frame, gint width, gint height, /* setup a texture to render to */ gl->GenTextures (1, &fake_texture); gl->BindTexture (GL_TEXTURE_2D, fake_texture); - gl->TexImage2D (GL_TEXTURE_2D, 0, - gst_gl_internal_format_rgba (frame->context), width, height, 0, GL_RGBA, + internal_format = + gst_gl_sized_gl_format_from_gl_format_type (frame->context, GL_RGBA, + GL_UNSIGNED_BYTE); + gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c index fd1ca31f62..0deb98a3bd 100644 --- a/gst-libs/gst/gl/gstglmemory.c +++ b/gst-libs/gst/gl/gstglmemory.c @@ -180,8 +180,21 @@ _gl_format_type_n_bytes (guint format, guint type) _gl_type_n_bytes (type); } -static inline GLenum -_gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format) +static inline guint +_gl_texture_type_n_bytes (GstVideoGLTextureType tex_format) +{ + guint format, type; + + format = gst_gl_format_from_gl_texture_type (tex_format); + type = GL_UNSIGNED_BYTE; + if (tex_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) + type = GL_UNSIGNED_SHORT_5_6_5; + + return _gl_format_type_n_bytes (format, type); +} + +guint +gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format) { switch (tex_format) { case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA: @@ -202,19 +215,6 @@ _gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format) } } -static inline guint -_gl_texture_type_n_bytes (GstVideoGLTextureType tex_format) -{ - guint format, type; - - format = _gst_gl_format_from_gl_texture_type (tex_format); - type = GL_UNSIGNED_BYTE; - if (tex_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) - type = GL_UNSIGNED_SHORT_5_6_5; - - return _gl_format_type_n_bytes (format, type); -} - GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext * context, GstVideoFormat v_format, guint plane) @@ -292,9 +292,9 @@ gst_gl_texture_type_from_format (GstGLContext * context, return GST_VIDEO_GL_TEXTURE_TYPE_RGBA; } -static inline GLenum -_sized_gl_format_from_gl_format_type (GstGLContext * context, GLenum format, - GLenum type) +guint +gst_gl_sized_gl_format_from_gl_format_type (GstGLContext * context, + guint format, guint type) { gboolean ext_texture_rg = gst_gl_context_check_feature (context, "GL_EXT_texture_rg"); @@ -303,7 +303,8 @@ _sized_gl_format_from_gl_format_type (GstGLContext * context, GLenum format, case GL_RGBA: switch (type) { case GL_UNSIGNED_BYTE: - return gst_gl_internal_format_rgba (context); + return USING_GLES2 (context) + && !USING_GLES3 (context) ? GL_RGBA : GL_RGBA8; break; } break; @@ -395,7 +396,7 @@ _generate_texture (GstGLContext * context, GenTexture * data) data->gl_format, data->gl_type, data->width, data->height); internal_format = - _sized_gl_format_from_gl_format_type (context, data->gl_format, + gst_gl_sized_gl_format_from_gl_format_type (context, data->gl_format, data->gl_type); gl->GenTextures (1, &data->result); @@ -449,7 +450,7 @@ _upload_memory (GstGLContext * context, GstGLMemory * gl_mem) if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) gl_type = GL_UNSIGNED_SHORT_5_6_5; - gl_format = _gst_gl_format_from_gl_texture_type (gl_mem->tex_type); + gl_format = gst_gl_format_from_gl_texture_type (gl_mem->tex_type); gl_target = gl_mem->tex_target; if (USING_OPENGL (context) || USING_GLES3 (context) @@ -595,7 +596,7 @@ _transfer_download (GstGLContext * context, GstGLMemory * gl_mem) size = gst_gl_get_plane_data_size (&gl_mem->info, &gl_mem->valign, gl_mem->plane); plane_start = _find_plane_frame_start (gl_mem); - format = _gst_gl_format_from_gl_texture_type (gl_mem->tex_type); + format = gst_gl_format_from_gl_texture_type (gl_mem->tex_type); type = GL_UNSIGNED_BYTE; if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) type = GL_UNSIGNED_SHORT_5_6_5; @@ -634,7 +635,7 @@ _download_memory (GstGLContext * context, GstGLMemory * gl_mem) GLuint fboId; gl = context->gl_vtable; - format = _gst_gl_format_from_gl_texture_type (gl_mem->tex_type); + format = gst_gl_format_from_gl_texture_type (gl_mem->tex_type); type = GL_UNSIGNED_BYTE; if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) type = GL_UNSIGNED_SHORT_5_6_5; @@ -772,7 +773,7 @@ _gl_mem_new (GstAllocator * allocator, GstMemory * parent, data.width = mem->tex_width; data.height = GL_MEM_HEIGHT (mem); - data.gl_format = _gst_gl_format_from_gl_texture_type (mem->tex_type); + data.gl_format = gst_gl_format_from_gl_texture_type (mem->tex_type); data.gl_type = GL_UNSIGNED_BYTE; data.gl_target = mem->tex_target; if (mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) @@ -920,11 +921,11 @@ _gl_mem_copy_thread (GstGLContext * context, gpointer data) out_stride = copy_params->out_stride; gl = src->context->gl_vtable; - out_gl_format = _gst_gl_format_from_gl_texture_type (copy_params->out_format); + out_gl_format = gst_gl_format_from_gl_texture_type (copy_params->out_format); out_gl_type = GL_UNSIGNED_BYTE; if (copy_params->out_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) out_gl_type = GL_UNSIGNED_SHORT_5_6_5; - in_gl_format = _gst_gl_format_from_gl_texture_type (src->tex_type); + in_gl_format = gst_gl_format_from_gl_texture_type (src->tex_type); in_gl_type = GL_UNSIGNED_BYTE; if (src->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16) in_gl_type = GL_UNSIGNED_SHORT_5_6_5; diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h index 28db0a45e0..68a4aeb2a9 100644 --- a/gst-libs/gst/gl/gstglmemory.h +++ b/gst-libs/gst/gl/gstglmemory.h @@ -182,7 +182,13 @@ gboolean gst_gl_memory_setup_wrapped (GstGLContext * context, GstVideoInfo gint gst_gl_memory_get_texture_width (GstGLMemory * gl_mem); gint gst_gl_memory_get_texture_height (GstGLMemory * gl_mem); -GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext *context, GstVideoFormat v_format, guint plane); +GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext *context, + GstVideoFormat v_format, + guint plane); +guint gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format); +guint gst_gl_sized_gl_format_from_gl_format_type (GstGLContext * context, + guint format, + guint type); void gst_gl_memory_download_transfer (GstGLMemory * gl_mem); diff --git a/gst-libs/gst/gl/gstglutils.c b/gst-libs/gst/gl/gstglutils.c index 5c751de0b4..0c0642acab 100644 --- a/gst-libs/gst/gl/gstglutils.c +++ b/gst-libs/gst/gl/gstglutils.c @@ -108,6 +108,7 @@ static void _gen_texture (GstGLContext * context, GenTexture * data) { const GstGLFuncs *gl = context->gl_vtable; + GLenum internal_format; GST_TRACE ("Generating texture format:%u dimensions:%ux%u", data->format, data->width, data->height); @@ -115,8 +116,11 @@ _gen_texture (GstGLContext * context, GenTexture * data) gl->GenTextures (1, &data->result); gl->BindTexture (GL_TEXTURE_2D, data->result); + internal_format = + gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA, + GL_UNSIGNED_BYTE); if (data->width > 0 && data->height > 0) - gl->TexImage2D (GL_TEXTURE_2D, 0, gst_gl_internal_format_rgba (context), + gl->TexImage2D (GL_TEXTURE_2D, 0, internal_format, data->width, data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -127,6 +131,7 @@ _gen_texture (GstGLContext * context, GenTexture * data) GST_LOG ("generated texture id:%d", data->result); } +/* deprecated. replaced by GstGLMemory */ void gst_gl_context_gen_texture (GstGLContext * context, GLuint * pTexture, GstVideoFormat v_format, GLint width, GLint height) @@ -145,6 +150,7 @@ _del_texture (GstGLContext * context, guint * texture) context->gl_vtable->DeleteTextures (1, texture); } +/* deprecated. replaced by GstGLMemory */ void gst_gl_context_del_texture (GstGLContext * context, GLuint * pTexture) { @@ -163,6 +169,8 @@ static void _gen_texture_full (GstGLContext * context, GenTextureFull * data) { const GstGLFuncs *gl = context->gl_vtable; + GstVideoGLTextureType tex_type; + GstVideoFormat v_format; GLint glinternalformat = 0; GLenum glformat = 0; GLenum gltype = 0; @@ -170,60 +178,14 @@ _gen_texture_full (GstGLContext * context, GenTextureFull * data) gl->GenTextures (1, &data->result); gl->BindTexture (GL_TEXTURE_2D, data->result); - switch (GST_VIDEO_INFO_FORMAT (data->info)) { - case GST_VIDEO_FORMAT_RGB: - case GST_VIDEO_FORMAT_BGR: - { - glinternalformat = GL_RGB8; - glformat = GL_RGB; - gltype = GL_UNSIGNED_BYTE; - break; - } - case GST_VIDEO_FORMAT_RGB16: - { - glinternalformat = GL_RGB16; - glformat = GL_RGB; - gltype = GL_UNSIGNED_SHORT_5_6_5; - break; - } - case GST_VIDEO_FORMAT_RGBA: - case GST_VIDEO_FORMAT_BGRA: - case GST_VIDEO_FORMAT_ARGB: - case GST_VIDEO_FORMAT_ABGR: - case GST_VIDEO_FORMAT_RGBx: - case GST_VIDEO_FORMAT_BGRx: - case GST_VIDEO_FORMAT_xRGB: - case GST_VIDEO_FORMAT_xBGR: - case GST_VIDEO_FORMAT_AYUV: - { - glinternalformat = gst_gl_internal_format_rgba (context); - glformat = GL_RGBA; - gltype = GL_UNSIGNED_BYTE; - break; - } - case GST_VIDEO_FORMAT_NV12: - case GST_VIDEO_FORMAT_NV21: - { - glinternalformat = GL_LUMINANCE; - glformat = data->comp == 0 ? GL_LUMINANCE : GL_LUMINANCE_ALPHA; - gltype = GL_UNSIGNED_BYTE; - break; - } - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_Y42B: - case GST_VIDEO_FORMAT_Y41B: - { - glformat = GL_LUMINANCE; - gltype = GL_UNSIGNED_BYTE; - break; - } - default: - GST_WARNING ("unsupported %s", - gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (data->info))); - break; - } + v_format = GST_VIDEO_INFO_FORMAT (data->info); + tex_type = gst_gl_texture_type_from_format (context, v_format, data->comp); + glformat = gst_gl_format_from_gl_texture_type (tex_type); + gltype = GL_UNSIGNED_BYTE; + if (v_format == GST_VIDEO_FORMAT_RGB16) + gltype = GL_UNSIGNED_SHORT_5_6_5; + glinternalformat = gst_gl_sized_gl_format_from_gl_format_type (context, + glformat, gltype); gl->TexImage2D (GL_TEXTURE_2D, 0, glinternalformat, GST_VIDEO_INFO_COMP_WIDTH (data->info, data->comp), @@ -236,6 +198,7 @@ _gen_texture_full (GstGLContext * context, GenTextureFull * data) gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } +/* deprecated. replaced by GstGLMemory */ void gst_gl_generate_texture_full (GstGLContext * context, const GstVideoInfo * info, const guint comp, gint stride[], gsize offset[], gsize size[], @@ -969,15 +932,3 @@ gst_gl_caps_replace_all_caps_features (const GstCaps * caps, return tmp; } - -GLint -gst_gl_internal_format_rgba (GstGLContext * context) -{ -#if GST_GL_HAVE_GLES2 && (GST_GL_HAVE_OPENGL || GST_GL_HAVE_GLES3) - return USING_GLES2 (context) ? GL_RGBA : GL_RGBA8; -#elif GST_GL_HAVE_OPENGL || GST_GL_HAVE_GLES3 - return GL_RGBA8; -#else - return GL_RGBA; -#endif -} diff --git a/gst-libs/gst/gl/gstglutils.h b/gst-libs/gst/gl/gstglutils.h index b4f3d48eb1..ee606e0614 100644 --- a/gst-libs/gst/gl/gstglutils.h +++ b/gst-libs/gst/gl/gstglutils.h @@ -67,10 +67,13 @@ typedef void (*GLCB) (gint, gint, guint, gpointer stuff); */ typedef void (*GLCB_V2) (gpointer stuff); +/* deprecated. replaced by GstGLMemory */ void gst_gl_context_gen_texture (GstGLContext * context, GLuint * pTexture, GstVideoFormat v_format, GLint width, GLint height); +/* deprecated. replaced by GstGLMemory */ void gst_gl_context_del_texture (GstGLContext * context, GLuint * pTexture); +/* deprecated. replaced by GstGLMemory */ void gst_gl_generate_texture_full (GstGLContext * context, const GstVideoInfo * info, const guint comp, gint stride[], gsize offset[], gsize size[], GLuint * pTexture); @@ -105,7 +108,6 @@ gsize gst_gl_get_plane_data_size (GstVideoInfo * info, GstVideoAlignment * align guint plane); GstCaps * gst_gl_caps_replace_all_caps_features (const GstCaps * caps, const gchar * feature_name); -GLint gst_gl_internal_format_rgba (GstGLContext * context); G_END_DECLS