vtdec: add support for zerocopy decoding with GLES 3.x
authorMatthew Waters <matthew@centricular.com>
Fri, 24 Jun 2016 14:05:37 +0000 (00:05 +1000)
committerMatthew Waters <matthew@centricular.com>
Wed, 29 Jun 2016 08:04:28 +0000 (18:04 +1000)
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

index 13ff588..331bd9b 100644 (file)
@@ -182,8 +182,15 @@ _do_get_gl_buffer (GstGLContext * context, ContextThreadData * data)
       case GST_VIDEO_FORMAT_NV12: {
         GstVideoGLTextureType textype;
         GLenum texifmt, texfmt;
-
-        textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0);
+        gint gl_major;
+
+        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);