mirror of
https://github.com/mpv-player/mpv
synced 2025-02-17 21:27:08 +00:00
videotoolbox: support new libavcodec API
The new API has literally no advantages (other than that we can drop mp_vt_download_image and other things later), but it's sort-of uniform with the other hwaccels. "--videotoolbox-format=no" is not supported with the new API, because it doesn't "fit in". Probably could be added later again. The iOS code change is untested (no way to test).
This commit is contained in:
parent
2426f95e0f
commit
83a9b0bc48
@ -17,6 +17,10 @@
|
||||
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if !HAVE_VIDEOTOOLBOX_HWACCEL_NEW
|
||||
|
||||
#include <libavcodec/version.h>
|
||||
#include <libavcodec/videotoolbox.h>
|
||||
|
||||
@ -183,3 +187,60 @@ const struct vd_lavc_hwdec mp_vd_lavc_videotoolbox_copy = {
|
||||
.process_image = copy_image,
|
||||
.delay_queue = HWDEC_DELAY_QUEUE_COUNT,
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
#include <libavutil/hwcontext.h>
|
||||
|
||||
#include "video/decode/lavc.h"
|
||||
|
||||
static void vt_dummy_destroy(struct mp_hwdec_ctx *ctx)
|
||||
{
|
||||
av_buffer_unref(&ctx->av_device_ref);
|
||||
talloc_free(ctx);
|
||||
}
|
||||
|
||||
static struct mp_hwdec_ctx *vt_create_dummy(struct mpv_global *global,
|
||||
struct mp_log *plog, bool probing)
|
||||
{
|
||||
struct mp_hwdec_ctx *ctx = talloc_ptrtype(NULL, ctx);
|
||||
*ctx = (struct mp_hwdec_ctx) {
|
||||
.type = HWDEC_VIDEOTOOLBOX_COPY,
|
||||
.ctx = "dummy",
|
||||
.destroy = vt_dummy_destroy,
|
||||
};
|
||||
|
||||
if (av_hwdevice_ctx_create(&ctx->av_device_ref, AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
|
||||
NULL, NULL, 0) < 0)
|
||||
{
|
||||
vt_dummy_destroy(ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
const struct vd_lavc_hwdec mp_vd_lavc_videotoolbox = {
|
||||
.type = HWDEC_VIDEOTOOLBOX,
|
||||
.image_format = IMGFMT_VIDEOTOOLBOX,
|
||||
.generic_hwaccel = true,
|
||||
.set_hwframes = true,
|
||||
.pixfmt_map = (const enum AVPixelFormat[][2]) {
|
||||
{AV_PIX_FMT_NONE}
|
||||
},
|
||||
};
|
||||
|
||||
const struct vd_lavc_hwdec mp_vd_lavc_videotoolbox_copy = {
|
||||
.type = HWDEC_VIDEOTOOLBOX_COPY,
|
||||
.copying = true,
|
||||
.image_format = IMGFMT_VIDEOTOOLBOX,
|
||||
.generic_hwaccel = true,
|
||||
.create_dev = vt_create_dummy,
|
||||
.set_hwframes = true,
|
||||
.pixfmt_map = (const enum AVPixelFormat[][2]) {
|
||||
{AV_PIX_FMT_NONE}
|
||||
},
|
||||
.delay_queue = HWDEC_DELAY_QUEUE_COUNT,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -819,6 +819,9 @@ static int init_generic_hwaccel(struct dec_video *vd)
|
||||
}
|
||||
}
|
||||
|
||||
if (hwdec->image_format == IMGFMT_VIDEOTOOLBOX)
|
||||
av_sw_format = imgfmt2pixfmt(vd->opts->videotoolbox_format);
|
||||
|
||||
if (av_sw_format == AV_PIX_FMT_NONE) {
|
||||
MP_VERBOSE(ctx, "Unsupported hw decoding format: %s\n",
|
||||
mp_imgfmt_to_name(pixfmt2imgfmt(ctx->avctx->sw_pix_fmt)));
|
||||
|
@ -23,6 +23,10 @@
|
||||
#include <CoreVideo/CoreVideo.h>
|
||||
#include <OpenGLES/EAGL.h>
|
||||
|
||||
#include <libavutil/hwcontext.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "video/mp_image_pool.h"
|
||||
#include "video/vt.h"
|
||||
#include "formats.h"
|
||||
@ -77,6 +81,12 @@ static int create_hwdec(struct gl_hwdec *hw)
|
||||
.download_image = mp_vt_download_image,
|
||||
.ctx = &p->hwctx,
|
||||
};
|
||||
|
||||
#if HAVE_VIDEOTOOLBOX_HWACCEL_NEW
|
||||
av_hwdevice_ctx_create(&p->hwctx.av_device_ref, AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
|
||||
NULL, NULL, 0);
|
||||
#endif
|
||||
|
||||
hwdec_devices_add(hw->devs, &p->hwctx);
|
||||
|
||||
return 0;
|
||||
@ -200,6 +210,8 @@ static void destroy(struct gl_hwdec *hw)
|
||||
CFRelease(p->gl_texture_cache);
|
||||
p->gl_texture_cache = NULL;
|
||||
|
||||
av_buffer_unref(&p->hwctx.av_device_ref);
|
||||
|
||||
hwdec_devices_remove(hw->devs, &p->hwctx);
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,10 @@
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <OpenGL/CGLIOSurface.h>
|
||||
|
||||
#include <libavutil/hwcontext.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "video/mp_image_pool.h"
|
||||
#include "video/vt.h"
|
||||
#include "formats.h"
|
||||
@ -68,6 +72,12 @@ static int create(struct gl_hwdec *hw)
|
||||
.download_image = mp_vt_download_image,
|
||||
.ctx = &p->hwctx,
|
||||
};
|
||||
|
||||
#if HAVE_VIDEOTOOLBOX_HWACCEL_NEW
|
||||
av_hwdevice_ctx_create(&p->hwctx.av_device_ref, AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
|
||||
NULL, NULL, 0);
|
||||
#endif
|
||||
|
||||
hwdec_devices_add(hw->devs, &p->hwctx);
|
||||
|
||||
return 0;
|
||||
@ -155,6 +165,8 @@ static void destroy(struct gl_hwdec *hw)
|
||||
CVPixelBufferRelease(p->pbuf);
|
||||
gl->DeleteTextures(MP_MAX_PLANES, p->gl_planes);
|
||||
|
||||
av_buffer_unref(&p->hwctx.av_device_ref);
|
||||
|
||||
hwdec_devices_remove(hw->devs, &p->hwctx);
|
||||
}
|
||||
|
||||
|
22
wscript
22
wscript
@ -769,14 +769,30 @@ hwaccel_features = [
|
||||
' ? 1 : -1]',
|
||||
use='libav'),
|
||||
}, {
|
||||
'name': '--videotoolbox-hwaccel',
|
||||
'desc': 'libavcodec videotoolbox hwaccel',
|
||||
'name': '--videotoolbox-hwaccel-new',
|
||||
'desc': 'libavcodec videotoolbox hwaccel (new API)',
|
||||
'deps': [ 'gl-cocoa' ],
|
||||
'func': check_statement('libavcodec/version.h',
|
||||
'int x[(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 96, 100) && '
|
||||
' LIBAVCODEC_VERSION_MICRO >= 100)'
|
||||
' ? 1 : -1]',
|
||||
use='libav'),
|
||||
}, {
|
||||
'name': '--videotoolbox-hwaccel-old',
|
||||
'desc': 'libavcodec videotoolbox hwaccel (old API)',
|
||||
'deps': [ 'gl-cocoa' ],
|
||||
'deps_neg': [ 'videotoolbox-hwaccel-new' ],
|
||||
'func': compose_checks(
|
||||
check_headers('VideoToolbox/VideoToolbox.h'),
|
||||
check_statement('libavcodec/videotoolbox.h',
|
||||
'av_videotoolbox_alloc_context()',
|
||||
use='libav')),
|
||||
} , {
|
||||
}, {
|
||||
'name': 'videotoolbox-hwaccel',
|
||||
'desc': 'libavcodec videotoolbox hwaccel',
|
||||
'deps_any': [ 'videotoolbox-hwaccel-new', 'videotoolbox-hwaccel-old' ],
|
||||
'func': check_true,
|
||||
}, {
|
||||
'name': '--videotoolbox-gl',
|
||||
'desc': 'Videotoolbox with OpenGL',
|
||||
'deps': [ 'gl-cocoa', 'videotoolbox-hwaccel' ],
|
||||
|
Loading…
Reference in New Issue
Block a user