summaryrefslogtreecommitdiffstats
path: root/video/out/opengl/hwdec_vdpau.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/out/opengl/hwdec_vdpau.c')
-rw-r--r--video/out/opengl/hwdec_vdpau.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/video/out/opengl/hwdec_vdpau.c b/video/out/opengl/hwdec_vdpau.c
index 603a70eb93..f865978f5b 100644
--- a/video/out/opengl/hwdec_vdpau.c
+++ b/video/out/opengl/hwdec_vdpau.c
@@ -42,6 +42,7 @@ struct priv {
GLvdpauSurfaceNV vdpgl_surface;
VdpOutputSurface vdp_surface;
struct mp_vdpau_mixer *mixer;
+ struct ra_imgfmt_desc direct_desc;
bool direct_mode;
bool mapped;
};
@@ -162,13 +163,21 @@ static int mapper_init(struct ra_hwdec_mapper *mapper)
p->vdpgl_initialized = true;
p->direct_mode = mapper->dst_params.hw_subfmt == IMGFMT_NV12 ||
- mapper->dst_params.hw_subfmt == IMGFMT_420P;
+ mapper->dst_params.hw_subfmt == IMGFMT_NV24 ||
+ mapper->dst_params.hw_subfmt == IMGFMT_420P ||
+ mapper->dst_params.hw_subfmt == IMGFMT_444P;
mapper->vdpau_fields = p->direct_mode;
gl->GenTextures(4, p->gl_textures);
if (p->direct_mode) {
- mapper->dst_params.imgfmt = IMGFMT_NV12;
+ int imgfmt = mapper->dst_params.hw_subfmt;
+ if (!ra_get_imgfmt_desc(mapper->ra, imgfmt, &p->direct_desc)) {
+ MP_ERR(mapper, "Unsupported format: %s\n", mp_imgfmt_to_name(imgfmt));
+ return -1;
+ }
+ mapper->dst_params.imgfmt = p->direct_desc.chroma_w == 1 ?
+ IMGFMT_NV24 : IMGFMT_NV12;
mapper->dst_params.hw_subfmt = 0;
for (int n = 0; n < 4; n++) {
@@ -250,11 +259,13 @@ static int mapper_map(struct ra_hwdec_mapper *mapper)
for (int n = 0; n < 4; n++) {
bool chroma = n >= 2;
+ int w_scale = chroma ? p->direct_desc.chroma_w : 1;
+ int h_scale = chroma ? p->direct_desc.chroma_h * 2 : 2;
struct ra_tex_params params = {
.dimensions = 2,
- .w = s_w / (chroma ? 2 : 1),
- .h = s_h / (chroma ? 4 : 2),
+ .w = s_w / w_scale,
+ .h = s_h / h_scale,
.d = 1,
.format = ra_find_unorm_format(mapper->ra, 1, chroma ? 2 : 1),
.render_src = true,