summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/out/gl_common.c11
-rw-r--r--video/out/gl_common.h1
-rw-r--r--video/out/gl_header_fixes.h12
-rw-r--r--video/out/gl_video.c25
4 files changed, 47 insertions, 2 deletions
diff --git a/video/out/gl_common.c b/video/out/gl_common.c
index 8ab2c8ec10..e868b07559 100644
--- a/video/out/gl_common.c
+++ b/video/out/gl_common.c
@@ -462,6 +462,16 @@ struct gl_functions gl_functions[] = {
{0}
},
},
+ // Apple Packed YUV Formats
+ // For gl_hwdec_vda.c
+ // http://www.opengl.org/registry/specs/APPLE/rgb_422.txt
+ {
+ .extension = "GL_APPLE_rgb_422",
+ .provides = MPGL_CAP_APPLE_RGB_422,
+ .functions = (struct gl_function[]) {
+ {0}
+ },
+ },
};
#undef FN_OFFS
@@ -659,6 +669,7 @@ int glFmt2bpp(GLenum format, GLenum type)
case GL_ALPHA:
return component_size;
case GL_YCBCR_MESA:
+ case GL_RGB_422_APPLE:
return 2;
case GL_RGB:
case GL_BGR:
diff --git a/video/out/gl_common.h b/video/out/gl_common.h
index c19ec7f73d..3c8d1aaa98 100644
--- a/video/out/gl_common.h
+++ b/video/out/gl_common.h
@@ -88,6 +88,7 @@ enum {
MPGL_CAP_FLOAT_TEX = (1 << 9),
MPGL_CAP_TEX_RG = (1 << 10), // GL_ARB_texture_rg / GL 3.x
MPGL_CAP_VDPAU = (1 << 11), // GL_NV_vdpau_interop
+ MPGL_CAP_APPLE_RGB_422 = (1 << 12), // GL_APPLE_rgb_422
MPGL_CAP_NO_SW = (1 << 30), // used to block sw. renderers
};
diff --git a/video/out/gl_header_fixes.h b/video/out/gl_header_fixes.h
index 88e8dd5e58..902116ace4 100644
--- a/video/out/gl_header_fixes.h
+++ b/video/out/gl_header_fixes.h
@@ -249,6 +249,18 @@
#endif
#endif
+#ifndef GL_RGB_422_APPLE
+#define GL_RGB_422_APPLE 0x8A1F
+#endif
+
+#ifndef UNSIGNED_SHORT_8_8_APPLE
+#define UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#endif
+
+#ifndef UNSIGNED_SHORT_8_8_APPLE
+#define UNSIGNED_SHORT_8_8_APPLE 0x85BB
+#endif
+
#ifndef GL_NV_vdpau_interop
#define GLvdpauSurfaceNV GLintptr
#endif
diff --git a/video/out/gl_video.c b/video/out/gl_video.c
index 4c901965fa..57dec29759 100644
--- a/video/out/gl_video.c
+++ b/video/out/gl_video.c
@@ -170,7 +170,7 @@ struct gl_video {
struct mp_imgfmt_desc image_desc;
- bool is_yuv, is_rgb;
+ bool is_yuv, is_rgb, is_packed_yuv;
bool is_linear_rgb;
bool has_alpha;
char color_swizzle[5];
@@ -238,6 +238,12 @@ static const struct fmt_entry gl_byte_formats[] = {
{0, GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT}, // 4 x 16
};
+static const struct fmt_entry gl_apple_formats[] = {
+ {IMGFMT_UYVY, GL_RGB, GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE},
+ {IMGFMT_YUYV, GL_RGB, GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE},
+ {0}
+};
+
struct packed_fmt_entry {
int fmt;
int8_t component_size;
@@ -872,7 +878,8 @@ static void compile_shaders(struct gl_video *p)
if (p->color_swizzle[0])
shader_def(&header_conv, "USE_COLOR_SWIZZLE", p->color_swizzle);
shader_def_opt(&header_conv, "USE_SWAP_UV", p->image_format == IMGFMT_NV21);
- shader_def_opt(&header_conv, "USE_YGRAY", p->is_yuv && p->plane_count == 1);
+ shader_def_opt(&header_conv, "USE_YGRAY", p->is_yuv && !p->is_packed_yuv
+ && p->plane_count == 1);
shader_def_opt(&header_conv, "USE_INPUT_GAMMA", convert_input_gamma);
shader_def_opt(&header_conv, "USE_COLORMATRIX", !p->is_rgb);
shader_def_opt(&header_conv, "USE_CONV_GAMMA", convert_input_to_linear);
@@ -2058,6 +2065,20 @@ static bool init_format(int fmt, struct gl_video *init)
}
}
+ // Packed YUV Apple formats
+ if (init->gl->mpgl_caps & MPGL_CAP_APPLE_RGB_422) {
+ for (const struct fmt_entry *e = gl_apple_formats; e->mp_format; e++) {
+ if (e->mp_format == fmt) {
+ init->is_packed_yuv = true;
+ supported = true;
+ snprintf(init->color_swizzle, sizeof(init->color_swizzle),
+ "gbra");
+ plane_format[0] = e;
+ break;
+ }
+ }
+ }
+
if (!supported)
return false;