diff options
author | Sebastien Zwickert <dilaroga@gmail.com> | 2015-07-11 17:21:39 +0200 |
---|---|---|
committer | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2015-08-05 17:47:30 +0200 |
commit | 31b5a211f4421cd593ef7eacda9efb9ee57a59d6 (patch) | |
tree | 4829f9d33e1ec7c604cbf0e3a38d7c26fdd09e3f /video/out | |
parent | 417e256c215e555198db1796edec3cfafd044459 (diff) | |
download | mpv-31b5a211f4421cd593ef7eacda9efb9ee57a59d6.tar.bz2 mpv-31b5a211f4421cd593ef7eacda9efb9ee57a59d6.tar.xz |
hwdec: add VideoToolbox support
VDA is being deprecated in OS X 10.11 so this is needed to keep hwdec working.
The code needs libavcodec support which was added recently (to FFmpeg git,
libav doesn't support it).
Signed-off-by: Stefano Pigozzi <stefano.pigozzi@gmail.com>
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/gl_hwdec.c | 4 | ||||
-rw-r--r-- | video/out/gl_hwdec_vda.c | 58 |
2 files changed, 51 insertions, 11 deletions
diff --git a/video/out/gl_hwdec.c b/video/out/gl_hwdec.c index c32f36a699..17a7c7bb67 100644 --- a/video/out/gl_hwdec.c +++ b/video/out/gl_hwdec.c @@ -31,6 +31,7 @@ extern const struct gl_hwdec_driver gl_hwdec_vaglx; extern const struct gl_hwdec_driver gl_hwdec_vda; +extern const struct gl_hwdec_driver gl_hwdec_videotoolbox; extern const struct gl_hwdec_driver gl_hwdec_vdpau; extern const struct gl_hwdec_driver gl_hwdec_dxva2; @@ -47,6 +48,9 @@ static const struct gl_hwdec_driver *const mpgl_hwdec_drivers[] = { #if HAVE_DXVA2_HWACCEL &gl_hwdec_dxva2, #endif +#if HAVE_VIDEOTOOLBOX_GL + &gl_hwdec_videotoolbox, +#endif NULL }; diff --git a/video/out/gl_hwdec_vda.c b/video/out/gl_hwdec_vda.c index 0b7cda2c3e..a94cdbc594 100644 --- a/video/out/gl_hwdec_vda.c +++ b/video/out/gl_hwdec_vda.c @@ -85,7 +85,7 @@ static struct mp_image *download_image(struct mp_hwdec_ctx *ctx, struct mp_image *hw_image, struct mp_image_pool *swpool) { - if (hw_image->imgfmt != IMGFMT_VDA) + if (hw_image->imgfmt != IMGFMT_VDA || hw_image->imgfmt != IMGFMT_VIDEOTOOLBOX) return NULL; CVPixelBufferRef pbuf = (CVPixelBufferRef)hw_image->planes[3]; @@ -129,26 +129,19 @@ static bool check_hwdec(struct gl_hwdec *hw) return true; } -static int create(struct gl_hwdec *hw) +static int create_common(struct gl_hwdec *hw, struct vda_format *format) { struct priv *p = talloc_zero(hw, struct priv); hw->priv = p; hw->gl_texture_target = GL_TEXTURE_RECTANGLE; -#if HAVE_VDA_DEFAULT_INIT2 - struct vda_format *f = vda_get_gl_format_from_imgfmt(IMGFMT_NV12); -#else - struct vda_format *f = vda_get_gl_format_from_imgfmt(IMGFMT_UYVY); -#endif - - hw->converted_imgfmt = f->imgfmt; + hw->converted_imgfmt = format->imgfmt; if (!check_hwdec(hw)) return -1; hw->hwctx = &p->hwctx; - hw->hwctx->type = HWDEC_VDA; hw->hwctx->download_image = download_image; GL *gl = hw->gl; @@ -157,6 +150,36 @@ static int create(struct gl_hwdec *hw) return 0; } +#if HAVE_VDA_GL +static int create_vda(struct gl_hwdec *hw) +{ +#if HAVE_VDA_DEFAULT_INIT2 + struct vda_format *f = vda_get_gl_format_from_imgfmt(IMGFMT_NV12); +#else + struct vda_format *f = vda_get_gl_format_from_imgfmt(IMGFMT_UYVY); +#endif + if (create_common(hw, f)) + return -1; + + hw->hwctx->type = HWDEC_VDA; + + return 0; +} +#endif + +#if HAVE_VIDEOTOOLBOX_GL +static int create_videotoolbox(struct gl_hwdec *hw) +{ + struct vda_format *f = vda_get_gl_format_from_imgfmt(IMGFMT_NV12); + if (create_common(hw, f)) + return -1; + + hw->hwctx->type = HWDEC_VIDEOTOOLBOX; + + return 0; +} +#endif + static int reinit(struct gl_hwdec *hw, struct mp_image_params *params) { params->imgfmt = hw->driver->imgfmt; @@ -219,11 +242,24 @@ static void destroy(struct gl_hwdec *hw) gl->DeleteTextures(MP_MAX_PLANES, p->gl_planes); } +#if HAVE_VDA_GL const struct gl_hwdec_driver gl_hwdec_vda = { .api_name = "vda", .imgfmt = IMGFMT_VDA, - .create = create, + .create = create_vda, .reinit = reinit, .map_image = map_image, .destroy = destroy, }; +#endif + +#if HAVE_VIDEOTOOLBOX_GL +const struct gl_hwdec_driver gl_hwdec_videotoolbox = { + .api_name = "videotoolbox", + .imgfmt = IMGFMT_VIDEOTOOLBOX, + .create = create_videotoolbox, + .reinit = reinit, + .map_image = map_image, + .destroy = destroy, +}; +#endif |