From 9a325f4a0993e54694d93cd1a064c9bb477235f7 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sat, 25 Jun 2016 00:05:37 +1000 Subject: [PATCH] vtdec: add support for zerocopy decoding with GLES 3.x It seems that Red/RG textures aren't supported anymore for zerocopy decoding with GLES 3.x. Instead use Luminance/Luminance Alpha textures which are. --- sys/applemedia/videotexturecache.m | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sys/applemedia/videotexturecache.m b/sys/applemedia/videotexturecache.m index 13ff5884b0..331bd9ba71 100644 --- a/sys/applemedia/videotexturecache.m +++ b/sys/applemedia/videotexturecache.m @@ -182,8 +182,15 @@ _do_get_gl_buffer (GstGLContext * context, ContextThreadData * data) case GST_VIDEO_FORMAT_NV12: { GstVideoGLTextureType textype; GLenum texifmt, texfmt; + gint gl_major; - textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0); + gst_gl_context_get_gl_version (context, &gl_major, NULL); + if (gl_major >= 3) { + /* apple went backwards when choosing a pixel format for this */ + textype = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE; + } else { + textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0); + } texifmt = gst_gl_format_from_gl_texture_type (textype); texfmt = gst_gl_sized_gl_format_from_gl_format_type (cache->ctx, texifmt, GL_UNSIGNED_BYTE); @@ -206,7 +213,12 @@ _do_get_gl_buffer (GstGLContext * context, ContextThreadData * data) (GstGLAllocationParams *) params)); gst_gl_allocation_params_free ((GstGLAllocationParams *) params); - textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 1); + if (gl_major >= 3) { + /* apple went backwards when choosing a pixel format for this */ + textype = GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA; + } else { + textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0); + } texifmt = gst_gl_format_from_gl_texture_type (textype); texfmt = gst_gl_sized_gl_format_from_gl_format_type (cache->ctx, texifmt, GL_UNSIGNED_BYTE);