summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md3
-rw-r--r--video/decode/hw_vaapi_old.c424
-rw-r--r--video/decode/hw_vdpau.c160
-rw-r--r--video/decode/vd_lavc.c16
-rw-r--r--video/out/opengl/hwdec_vaegl.c81
-rw-r--r--wscript30
-rw-r--r--wscript_build.py2
7 files changed, 43 insertions, 673 deletions
diff --git a/README.md b/README.md
index 4859916a5f..84c65d4bbd 100644
--- a/README.md
+++ b/README.md
@@ -95,6 +95,8 @@ Essential dependencies (incomplete list):
- FFmpeg libraries (libavutil libavcodec libavformat libswscale libavfilter
and either libswresample or libavresample)
At least FFmpeg 3.2.2 or Libav 12 is required.
+ For hardware decoding with vaapi and vdpau, FFmpeg 3.3 or Libav git is
+ required.
- zlib
- iconv (normally provided by the system libc)
- libass (OSD, OSC, text subtitles)
@@ -102,6 +104,7 @@ Essential dependencies (incomplete list):
- libjpeg (optional, used for screenshots only)
- uchardet (optional, for subtitle charset detection)
- vdpau and vaapi libraries for hardware decoding on Linux (optional)
+ (FFmpeg 3.3 or Libav git is also required.)
Libass dependencies:
diff --git a/video/decode/hw_vaapi_old.c b/video/decode/hw_vaapi_old.c
deleted file mode 100644
index 8ba4d444bf..0000000000
--- a/video/decode/hw_vaapi_old.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * This file is part of mpv.
- *
- * With some chunks from original MPlayer VAAPI patch:
- * Copyright (C) 2008-2009 Splitted-Desktop Systems
- *
- * mpv is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpv is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with mpv. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stddef.h>
-#include <assert.h>
-
-#include <libavcodec/avcodec.h>
-#include <libavcodec/vaapi.h>
-#include <libavutil/common.h>
-
-#include "config.h"
-
-#include "lavc.h"
-#include "common/common.h"
-#include "common/av_common.h"
-#include "video/fmt-conversion.h"
-#include "video/vaapi.h"
-#include "video/mp_image_pool.h"
-#include "video/hwdec.h"
-#include "video/filter/vf.h"
-
-/*
- * The VAAPI decoder can work only with surfaces passed to the decoder at
- * creation time. This means all surfaces have to be created in advance.
- * So, additionally to the maximum number of reference frames, we need
- * surfaces for all kinds of buffering between decoder and VO.
- * Note that redundant additional surfaces also might allow for some
- * buffering (i.e. not trying to reuse a surface while it's busy).
- */
-#define ADDTIONAL_SURFACES HWDEC_EXTRA_SURFACES
-
-// Some upper bound.
-#define MAX_SURFACES 25
-
-struct priv {
- struct mp_log *log;
- struct mp_vaapi_ctx *ctx;
- bool own_ctx;
- VADisplay display;
-
- // libavcodec shared struct
- struct vaapi_context *va_context;
- struct vaapi_context va_context_storage;
-
- struct mp_image_pool *pool;
- int rt_format;
-
- struct mp_image_pool *sw_pool;
-};
-
-#define HAS_HEVC VA_CHECK_VERSION(0, 38, 0)
-#define HAS_VP9 (VA_CHECK_VERSION(0, 38, 1) && defined(FF_PROFILE_VP9_0))
-
-#define PE(av_codec_id, ff_profile, vdp_profile) \
- {AV_CODEC_ID_ ## av_codec_id, FF_PROFILE_ ## ff_profile, \
- VAProfile ## vdp_profile}
-
-static const struct hwdec_profile_entry profiles[] = {
- PE(MPEG2VIDEO, MPEG2_MAIN, MPEG2Main),
- PE(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2Simple),
- PE(MPEG4, MPEG4_ADVANCED_SIMPLE, MPEG4AdvancedSimple),
- PE(MPEG4, MPEG4_MAIN, MPEG4Main),
- PE(MPEG4, MPEG4_SIMPLE, MPEG4Simple),
- PE(H264, H264_HIGH, H264High),
- PE(H264, H264_MAIN, H264Main),
- PE(H264, H264_BASELINE, H264Baseline),
- PE(VC1, VC1_ADVANCED, VC1Advanced),
- PE(VC1, VC1_MAIN, VC1Main),
- PE(VC1, VC1_SIMPLE, VC1Simple),
- PE(WMV3, VC1_ADVANCED, VC1Advanced),
- PE(WMV3, VC1_MAIN, VC1Main),
- PE(WMV3, VC1_SIMPLE, VC1Simple),
-#if HAS_HEVC
- PE(HEVC, HEVC_MAIN, HEVCMain),
- PE(HEVC, HEVC_MAIN_10, HEVCMain10),
-#endif
-#if HAS_VP9
- PE(VP9, VP9_0, VP9Profile0),
-#endif
- {0}
-};
-
-static const char *str_va_profile(VAProfile profile)
-{
- switch (profile) {
-#define PROFILE(profile) \
- case VAProfile##profile: return "VAProfile" #profile
- PROFILE(MPEG2Simple);
- PROFILE(MPEG2Main);
- PROFILE(MPEG4Simple);
- PROFILE(MPEG4AdvancedSimple);
- PROFILE(MPEG4Main);
- PROFILE(H264Baseline);
- PROFILE(H264Main);
- PROFILE(H264High);
- PROFILE(VC1Simple);
- PROFILE(VC1Main);
- PROFILE(VC1Advanced);
-#if HAS_HEVC
- PROFILE(HEVCMain);
- PROFILE(HEVCMain10);
-#endif
-#if HAS_VP9
- PROFILE(VP9Profile0);
-#endif
-#undef PROFILE
- }
- return "<unknown>";
-}
-
-static int find_entrypoint(int format, VAEntrypoint *ep, int num_ep)
-{
- int entrypoint = -1;
- switch (format) {
- case IMGFMT_VAAPI: entrypoint = VAEntrypointVLD; break;
- }
- for (int n = 0; n < num_ep; n++) {
- if (ep[n] == entrypoint)
- return entrypoint;
- }
- return -1;
-}
-
-// We must allocate only surfaces that were passed to the decoder on creation.
-// We achieve this by reserving surfaces in the pool as needed.
-// Releasing surfaces is necessary after filling the surface id list so
-// that reserved surfaces can be reused for decoding.
-static bool preallocate_surfaces(struct lavc_ctx *ctx, int num, int w, int h,
- VASurfaceID out_surfaces[MAX_SURFACES])
-{
- struct priv *p = ctx->hwdec_priv;
- struct mp_image *reserve[MAX_SURFACES] = {0};
- bool res = true;
-
- if (num > MAX_SURFACES)
- return false;
-
- for (int n = 0; n < num; n++) {
- reserve[n] = mp_image_pool_get(p->pool, IMGFMT_VAAPI, w, h);
- out_surfaces[n] = va_surface_id(reserve[n]);
- if (out_surfaces[n] == VA_INVALID_ID) {
- MP_ERR(p, "Could not allocate surfaces.\n");
- res = false;
- break;
- }
- }
- for (int i = 0; i < num; i++)
- talloc_free(reserve[i]);
- return res;
-}
-
-static void destroy_decoder(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (p->va_context->context_id != VA_INVALID_ID) {
- vaDestroyContext(p->display, p->va_context->context_id);
- p->va_context->context_id = VA_INVALID_ID;
- }
-
- if (p->va_context->config_id != VA_INVALID_ID) {
- vaDestroyConfig(p->display, p->va_context->config_id);
- p->va_context->config_id = VA_INVALID_ID;
- }
-
- mp_image_pool_clear(p->pool);
-}
-
-static bool has_profile(VAProfile *va_profiles, int num_profiles, VAProfile p)
-{
- for (int i = 0; i < num_profiles; i++) {
- if (va_profiles[i] == p)
- return true;
- }
- return false;
-}
-
-static int init_decoder(struct lavc_ctx *ctx, int w, int h)
-{
- void *tmp = talloc_new(NULL);
-
- struct priv *p = ctx->hwdec_priv;
- VAStatus status;
- int res = -1;
-
- destroy_decoder(ctx);
-
- const struct hwdec_profile_entry *pe = hwdec_find_profile(ctx, profiles);
- if (!pe) {
- MP_ERR(p, "Unsupported codec or profile.\n");
- goto error;
- }
-
- int num_profiles = vaMaxNumProfiles(p->display);
- VAProfile *va_profiles = talloc_zero_array(tmp, VAProfile, num_profiles);
- status = vaQueryConfigProfiles(p->display, va_profiles, &num_profiles);
- if (!CHECK_VA_STATUS(p, "vaQueryConfigProfiles()"))
- goto error;
- MP_DBG(p, "%d profiles available:\n", num_profiles);
- for (int i = 0; i < num_profiles; i++)
- MP_DBG(p, " %s\n", str_va_profile(va_profiles[i]));
-
- VAProfile va_profile = pe->hw_profile;
- if (!has_profile(va_profiles, num_profiles, va_profile)) {
- MP_ERR(p, "Decoder profile '%s' not available.\n",
- str_va_profile(va_profile));
- goto error;
- }
-
- MP_VERBOSE(p, "Using profile '%s'.\n", str_va_profile(va_profile));
-
- int num_surfaces = hwdec_get_max_refs(ctx) + ADDTIONAL_SURFACES;
- if (num_surfaces > MAX_SURFACES) {
- MP_ERR(p, "Internal error: too many surfaces.\n");
- goto error;
- }
-
- VASurfaceID surfaces[MAX_SURFACES];
- if (!preallocate_surfaces(ctx, num_surfaces, w, h, surfaces)) {
- MP_ERR(p, "Could not allocate surfaces.\n");
- goto error;
- }
-
- int num_ep = vaMaxNumEntrypoints(p->display);
- VAEntrypoint *ep = talloc_zero_array(tmp, VAEntrypoint, num_ep);
- status = vaQueryConfigEntrypoints(p->display, va_profile, ep, &num_ep);
- if (!CHECK_VA_STATUS(p, "vaQueryConfigEntrypoints()"))
- goto error;
-
- int entrypoint = find_entrypoint(IMGFMT_VAAPI, ep, num_ep);
- if (entrypoint < 0) {
- MP_ERR(p, "Could not find VA entrypoint.\n");
- goto error;
- }
-
- VAConfigAttrib attrib = {
- .type = VAConfigAttribRTFormat,
- };
- status = vaGetConfigAttributes(p->display, va_profile, entrypoint,
- &attrib, 1);
- if (!CHECK_VA_STATUS(p, "vaGetConfigAttributes()"))
- goto error;
- if ((attrib.value & p->rt_format) == 0) {
- MP_ERR(p, "Chroma format not supported.\n");
- goto error;
- }
-
- status = vaCreateConfig(p->display, va_profile, entrypoint, &attrib, 1,
- &p->va_context->config_id);
- if (!CHECK_VA_STATUS(p, "vaCreateConfig()"))
- goto error;
-
- status = vaCreateContext(p->display, p->va_context->config_id,
- w, h, VA_PROGRESSIVE,
- surfaces, num_surfaces,
- &p->va_context->context_id);
- if (!CHECK_VA_STATUS(p, "vaCreateContext()"))
- goto error;
-
- res = 0;
-error:
- talloc_free(tmp);
- return res;
-}
-
-static struct mp_image *allocate_image(struct lavc_ctx *ctx, int w, int h)
-{
- struct priv *p = ctx->hwdec_priv;
-
- struct mp_image *img = mp_image_pool_get(p->pool, IMGFMT_VAAPI, w, h);
- if (!img)
- MP_ERR(p, "Failed to allocate additional VAAPI surface.\n");
- return img;
-}
-
-static struct mp_image *update_format(struct lavc_ctx *ctx, struct mp_image *img)
-{
- va_surface_init_subformat(img);
- return img;
-}
-
-static void uninit(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (!p)
- return;
-
- destroy_decoder(ctx);
-
- talloc_free(p->pool);
- p->pool = NULL;
-
- if (p->own_ctx)
- va_destroy(p->ctx);
-
- talloc_free(p);
- ctx->hwdec_priv = NULL;
-}
-
-static int init(struct lavc_ctx *ctx, bool direct)
-{
- struct priv *p = talloc_ptrtype(NULL, p);
- *p = (struct priv) {
- .log = mp_log_new(p, ctx->log, "vaapi"),
- .va_context = &p->va_context_storage,
- .rt_format = VA_RT_FORMAT_YUV420
- };
-
- if (direct) {
- p->ctx = hwdec_devices_get(ctx->hwdec_devs, HWDEC_VAAPI)->ctx;
- } else {
- struct mp_hwdec_ctx *hwctx = va_create_standalone(NULL, ctx->log, false);
- if (!hwctx) {
- talloc_free(p);
- return -1;
- }
- p->ctx = hwctx->ctx;
- p->own_ctx = true;
- }
-
- p->display = p->ctx->display;
- p->pool = talloc_steal(p, mp_image_pool_new(MAX_SURFACES));
- va_pool_set_allocator(p->pool, p->ctx, p->rt_format);
- p->sw_pool = talloc_steal(p, mp_image_pool_new(17));
-
- p->va_context->display = p->display;
- p->va_context->config_id = VA_INVALID_ID;
- p->va_context->context_id = VA_INVALID_ID;
-
- ctx->avctx->hwaccel_context = p->va_context;
- ctx->hwdec_priv = p;
-
- return 0;
-}
-
-static int init_direct(struct lavc_ctx *ctx)
-{
- return init(ctx, true);
-}
-
-static int probe(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec,
- const char *codec)
-{
- if (!hwdec_devices_load(ctx->hwdec_devs, HWDEC_VAAPI))
- return HWDEC_ERR_NO_CTX;
- if (!hwdec_check_codec_support(codec, profiles))
- return HWDEC_ERR_NO_CODEC;
- return 0;
-}
-
-static int probe_copy(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec,
- const char *codec)
-{
- struct mp_hwdec_ctx *hwctx = va_create_standalone(NULL, ctx->log, true);
- if (!hwctx)
- return HWDEC_ERR_NO_CTX;
- struct mp_vaapi_ctx *dummy = hwctx->ctx;
- bool emulated = va_guess_if_emulated(dummy);
- va_destroy(dummy);
- if (!hwdec_check_codec_support(codec, profiles))
- return HWDEC_ERR_NO_CODEC;
- if (emulated)
- return HWDEC_ERR_EMULATED;
- return 0;
-}
-
-static int init_copy(struct lavc_ctx *ctx)
-{
- return init(ctx, false);
-}
-
-static struct mp_image *copy_image(struct lavc_ctx *ctx, struct mp_image *img)
-{
- struct priv *p = ctx->hwdec_priv;
-
- struct mp_image *simg = va_surface_download(img, p->sw_pool);
- if (simg) {
- talloc_free(img);
- return simg;
- }
- return img;
-}
-
-const struct vd_lavc_hwdec mp_vd_lavc_vaapi = {
- .type = HWDEC_VAAPI,
- .image_format = IMGFMT_VAAPI,
- .probe = probe,
- .init = init_direct,
- .uninit = uninit,
- .init_decoder = init_decoder,
- .allocate_image = allocate_image,
- .process_image = update_format,
-};
-
-const struct vd_lavc_hwdec mp_vd_lavc_vaapi_copy = {
- .type = HWDEC_VAAPI_COPY,
- .copying = true,
- .image_format = IMGFMT_VAAPI,
- .probe = probe_copy,
- .init = init_copy,
- .uninit = uninit,
- .init_decoder = init_decoder,
- .allocate_image = allocate_image,
- .process_image = copy_image,
- .delay_queue = HWDEC_DELAY_QUEUE_COUNT,
-};
diff --git a/video/decode/hw_vdpau.c b/video/decode/hw_vdpau.c
deleted file mode 100644
index e47893f19a..0000000000
--- a/video/decode/hw_vdpau.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * This file is part of mpv.
- *
- * mpv is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * mpv is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with mpv. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <libavcodec/avcodec.h>
-#include <libavcodec/vdpau.h>
-#include <libavutil/common.h>
-#include <libavutil/hwcontext.h>
-
-#include "lavc.h"
-#include "common/common.h"
-#include "video/mp_image_pool.h"
-#include "video/vdpau.h"
-#include "video/hwdec.h"
-
-struct priv {
- struct mp_log *log;
- struct mp_vdpau_ctx *mpvdp;
- uint64_t preemption_counter;
- // vdpau-copy
- Display *display;
-};
-
-static int init_decoder(struct lavc_ctx *ctx, int w, int h)
-{
- struct priv *p = ctx->hwdec_priv;
- int sw_format = ctx->avctx->sw_pix_fmt;
-
- if (sw_format != AV_PIX_FMT_YUV420P && sw_format != AV_PIX_FMT_NV12) {
- MP_VERBOSE(ctx, "Rejecting non 4:2:0 8 bit decoding.\n");
- return -1;
- }
-
- if (hwdec_setup_hw_frames_ctx(ctx, p->mpvdp->av_device_ref, sw_format, 0) < 0)
- return -1;
-
- // During preemption, pretend everything is ok.
- if (mp_vdpau_handle_preemption(p->mpvdp, &p->preemption_counter) < 0)
- return 0;
-
- int r = av_vdpau_bind_context(ctx->avctx, p->mpvdp->vdp_device,
- p->mpvdp->get_proc_address,
- AV_HWACCEL_FLAG_IGNORE_LEVEL |
- AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH);
- if (r >= 0 && ctx->avctx->codec_id == AV_CODEC_ID_HEVC)
- MP_WARN(ctx, "HEVC video output may be broken due to nVidia bugs.\n");
- return r;
-}
-
-static void uninit(struct lavc_ctx *ctx)
-{
- struct priv *p = ctx->hwdec_priv;
-
- if (p->display) {
- // for copy path: we own this stuff
- mp_vdpau_destroy(p->mpvdp);
- XCloseDisplay(p->display);
- }
-
- TA_FREEP(&ctx->hwdec_priv);
-
- if (ctx->avctx)
- av_freep(&ctx->avctx->hwaccel_context);
-}
-
-static int init(struct lavc_ctx *ctx)
-{
- struct priv *p = talloc_ptrtype(NULL, p);
- *p = (struct priv) {
- .log = mp_log_new(p, ctx->log, "vdpau"),
- .mpvdp = hwdec_devices_get(ctx->hwdec_devs, HWDEC_VDPAU)->ctx,
- };
- ctx->hwdec_priv = p;
-
- mp_vdpau_handle_preemption(p->mpvdp, &p->preemption_counter);
- return 0;
-}
-
-static int probe(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec,
- const char *codec)
-{
- if (!hwdec_devices_load(ctx->hwdec_devs, HWDEC_VDPAU))
- return HWDEC_ERR_NO_CTX;
- return 0;
-}
-
-static int init_copy(struct lavc_ctx *ctx)
-{
- struct priv *p = talloc_ptrtype(NULL, p);
- *p = (struct priv) {
- .log = mp_log_new(p, ctx->log, "vdpau"),
- };
-
- p->display = XOpenDisplay(NULL);
- if (!p->display)
- goto error;
-
- p->mpvdp = mp_vdpau_create_device_x11(p->log, p->display, true);
- if (!p->mpvdp)
- goto error;
-
- ctx->hwdec_priv = p;
-
- mp_vdpau_handle_preemption(p->mpvdp, &p->preemption_counter);
- return 0;
-
-error:
- if (p->display)
- XCloseDisplay(p->display);
- talloc_free(p);
- return -1;
-}
-
-static int probe_copy(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec,
- const char *codec)
-{
- assert(!ctx->hwdec_priv);
-
- int r = HWDEC_ERR_NO_CTX;
- if (init_copy(ctx) >=0 ) {
- struct priv *p = ctx->hwdec_priv;
- r = mp_vdpau_guess_if_emulated(p->mpvdp) ? HWDEC_ERR_EMULATED : 0;
- uninit(ctx);
- }
- return r;
-}
-
-const struct vd_lavc_hwdec mp_vd_lavc_vdpau = {
- .type = HWDEC_VDPAU,
- .image_format = IMGFMT_VDPAU,
- .probe = probe,
- .init = init,
- .uninit = uninit,
- .init_decoder = init_decoder,
- .volatile_context = true,
-};
-
-const struct vd_lavc_hwdec mp_vd_lavc_vdpau_copy = {
- .type = HWDEC_VDPAU_COPY,
- .copying = true,
- .image_format = IMGFMT_VDPAU,
- .probe = probe_copy,
- .init = init_copy,
- .uninit = uninit,
- .init_decoder = init_decoder,
- .volatile_context = true,
-};
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index e78b5812ec..503a3db38a 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -169,7 +169,6 @@ static const struct vd_lavc_hwdec mp_vd_lavc_crystalhd = {
};
#if HAVE_VAAPI_HWACCEL
-#if HAVE_VAAPI_HWACCEL_NEW
const struct vd_lavc_hwdec mp_vd_lavc_vaapi = {
.type = HWDEC_VAAPI,
.image_format = IMGFMT_VAAPI,
@@ -197,14 +196,9 @@ const struct vd_lavc_hwdec mp_vd_lavc_vaapi_copy = {
{AV_PIX_FMT_NONE}
},
};
-#else
-extern const struct vd_lavc_hwdec mp_vd_lavc_vaapi;
-extern const struct vd_lavc_hwdec mp_vd_lavc_vaapi_copy;
-#endif
#endif
#if HAVE_VDPAU_HWACCEL
-#if HAVE_VDPAU_HWACCEL_NEW
const struct vd_lavc_hwdec mp_vd_lavc_vdpau = {
.type = HWDEC_VDPAU,
.image_format = IMGFMT_VDPAU,
@@ -228,10 +222,6 @@ const struct vd_lavc_hwdec mp_vd_lavc_vdpau_copy = {
{AV_PIX_FMT_NONE}
},
};
-#else
-extern const struct vd_lavc_hwdec mp_vd_lavc_vdpau;
-extern const struct vd_lavc_hwdec mp_vd_lavc_vdpau_copy;
-#endif
#endif
static const struct vd_lavc_hwdec *const hwdec_list[] = {
@@ -239,7 +229,7 @@ static const struct vd_lavc_hwdec *const hwdec_list[] = {
&mp_vd_lavc_rpi,
&mp_vd_lavc_rpi_copy,
#endif
-#if HAVE_VDPAU_HWACCEL_OLD || HAVE_VDPAU_HWACCEL_NEW
+#if HAVE_VDPAU_HWACCEL
&mp_vd_lavc_vdpau,
&mp_vd_lavc_vdpau_copy,
#endif
@@ -247,7 +237,7 @@ static const struct vd_lavc_hwdec *const hwdec_list[] = {
&mp_vd_lavc_videotoolbox,
&mp_vd_lavc_videotoolbox_copy,
#endif
-#if HAVE_VAAPI_HWACCEL_OLD || HAVE_VAAPI_HWACCEL_NEW
+#if HAVE_VAAPI_HWACCEL
&mp_vd_lavc_vaapi,
&mp_vd_lavc_vaapi_copy,
#endif
@@ -584,7 +574,7 @@ static void init_avctx(struct dec_video *vd, const char *decoder,
if (ctx->hwdec) {
avctx->thread_count = 1;
-#if HAVE_VDPAU_HWACCEL_NEW
+#if HAVE_VDPAU_HWACCEL
avctx->hwaccel_flags |= AV_HWACCEL_FLAG_IGNORE_LEVEL;
#endif
if (ctx->hwdec->image_format)
diff --git a/video/out/opengl/hwdec_vaegl.c b/video/out/opengl/hwdec_vaegl.c
index 899d3ad388..dc2645bf05 100644
--- a/video/out/opengl/hwdec_vaegl.c
+++ b/video/out/opengl/hwdec_vaegl.c
@@ -414,55 +414,42 @@ static void determine_working_formats(struct gl_hwdec *hw)
p->probing_formats = true;
- if (HAVE_VAAPI_HWACCEL_OLD) {
- struct mp_image_pool *alloc = mp_image_pool_new(1);
- va_pool_set_allocator(alloc, p->ctx, VA_RT_FORMAT_YUV420);
- struct mp_image *s = mp_image_pool_get(alloc, IMGFMT_VAAPI, 64, 64);
- if (s) {
- va_surface_init_subformat(s);
- if (try_format(hw, s))
- MP_TARRAY_APPEND(p, formats, num_formats, IMGFMT_NV12);
- }
- talloc_free(s);
- talloc_free(alloc);
- } else {
- AVHWFramesConstraints *fc =
+ AVHWFramesConstraints *fc =
av_hwdevice_get_hwframe_constraints(p->ctx->av_device_ref, NULL);
- if (!fc) {
- MP_WARN(hw, "failed to retrieve libavutil frame constaints\n");
- goto done;
- }
- for (int n = 0; fc->valid_sw_formats[n] != AV_PIX_FMT_NONE; n++) {
- AVBufferRef *fref = NULL;
- struct mp_image *s = NULL;
- AVFrame *frame = NULL;
- fref = av_hwframe_ctx_alloc(p->ctx->av_device_ref);
- if (!fref)
- goto err;
- AVHWFramesContext *fctx = (void *)fref->data;
- fctx->format = AV_PIX_FMT_VAAPI;
- fctx->sw_format = fc->valid_sw_formats[n];
- fctx->width = 128;
- fctx->height = 128;
- if (av_hwframe_ctx_init(fref) < 0)
- goto err;
- frame = av_frame_alloc();
- if (!frame)
- goto err;
- if (av_hwframe_get_buffer(fref, frame, 0) < 0)
- goto err;
- s = mp_image_from_av_frame(frame);
- if (!s || !mp_image_params_valid(&s->params))
- goto err;
- if (try_format(hw, s))
- MP_TARRAY_APPEND(p, formats, num_formats, s->params.hw_subfmt);
- err:
- talloc_free(s);
- av_frame_free(&frame);
- av_buffer_unref(&fref);
- }
- av_hwframe_constraints_free(&fc);
+ if (!fc) {
+ MP_WARN(hw, "failed to retrieve libavutil frame constaints\n");
+ goto done;
+ }
+ for (int n = 0; fc->valid_sw_formats[n] != AV_PIX_FMT_NONE; n++) {
+ AVBufferRef *fref = NULL;
+ struct mp_image *s = NULL;
+ AVFrame *frame = NULL;
+ fref = av_hwframe_ctx_alloc(p->ctx->av_device_ref);
+ if (!fref)
+ goto err;
+ AVHWFramesContext *fctx = (void *)fref->data;
+ fctx->format = AV_PIX_FMT_VAAPI;
+ fctx->sw_format = fc->valid_sw_formats[n];
+ fctx->width = 128;
+ fctx->height = 128;
+ if (av_hwframe_ctx_init(fref) < 0)
+ goto err;
+ frame = av_frame_alloc();
+ if (!frame)
+ goto err;
+ if (av_hwframe_get_buffer(fref, frame, 0) < 0)
+ goto err;
+ s = mp_image_from_av_frame(frame);
+ if (!s || !mp_image_params_valid(&s->params))
+ goto err;
+ if (try_format(hw, s))
+ MP_TARRAY_APPEND(p, formats, num_formats, s->params.hw_subfmt);
+ err:
+ talloc_free(s);
+ av_frame_free(&frame);
+ av_buffer_unref(&fref);
}
+ av_hwframe_constraints_free(&fc);
done:
MP_TARRAY_APPEND(p, formats, num_formats, 0); // terminate it
diff --git a/wscript b/wscript
index 653562732e..7270bf4644 100644
--- a/wscript
+++ b/wscript
@@ -770,13 +770,8 @@ video_output_features = [
hwaccel_features = [
{
'name': '--vaapi-hwaccel',
- 'desc': 'libavcodec VAAPI hwaccel',
+ 'desc': 'libavcodec VAAPI hwaccel (FFmpeg 3.3 API)',
'deps': [ 'vaapi' ],
- 'func': check_true,
- }, {
- 'name': '--vaapi-hwaccel-new',
- 'desc': 'libavcodec VAAPI hwaccel (new)',
- 'deps': [ 'vaapi-hwaccel' ],
'func': check_statement('libavcodec/version.h',
'int x[(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 26, 0) && '
' LIBAVCODEC_VERSION_MICRO < 100) ||'
@@ -785,12 +780,6 @@ hwaccel_features = [
' ? 1 : -1]',
use='libav'),
}, {
- 'name': '--vaapi-hwaccel-old',
- 'desc': 'libavcodec VAAPI hwaccel (old)',
- 'deps': [ 'vaapi-hwaccel' ],
- 'deps_neg': [ 'vaapi-hwaccel-new' ],
- 'func': check_true,
- }, {
'name': '--videotoolbox-hwaccel',
'desc': 'libavcodec videotoolbox hwaccel',
'func': compose_checks(
@@ -805,13 +794,8 @@ hwaccel_features = [
'func': check_true
}, {
'name': '--vdpau-hwaccel',
- 'desc': 'libavcodec VDPAU hwaccel',
+ 'desc': 'libavcodec VDPAU hwaccel (FFmpeg 3.3 API)',
'deps': [ 'vdpau' ],
- 'func': check_true,
- }, {
- 'name': '--vdpau-hwaccel-new',
- 'desc': 'libavcodec VDPAU hwaccel (new)',
- 'deps': [ 'vdpau-hwaccel' ],
'func': check_statement('libavcodec/version.h',
'int x[(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 1) && '
' LIBAVCODEC_VERSION_MICRO < 100) ||'
@@ -820,14 +804,6 @@ hwaccel_features = [
' ? 1 : -1]',
use='libav'),
}, {
- 'name': '--vdpau-hwaccel-old',
- 'desc': 'libavcodec VDPAU hwaccel (old)',
- 'deps': [ 'vdpau' ],
- 'deps_neg': [ 'vdpau-hwaccel-new' ],
- 'func': check_statement('libavcodec/vdpau.h',
- 'av_vdpau_bind_context(0,0,0,AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH)',
- use='libav'),
- }, {
'name': '--d3d-hwaccel',
'desc': 'DXVA2 and D3D11VA hwaccel',
'deps': [ 'win32' ],
@@ -841,7 +817,7 @@ hwaccel_features = [
}, {
'name': 'sse4-intrinsics',
'desc': 'GCC SSE4 intrinsics for GPU memcpy',
- 'deps_any': [ 'd3d-hwaccel', 'vaapi-hwaccel-old' ],
+ 'deps_any': [ 'd3d-hwaccel' ],
'func': check_cc(fragment=load_fragment('sse.c')),
}
]
diff --git a/wscript_build.py b/wscript_build.py
index 9be4a59fbf..ec648807f3 100644
--- a/wscript_build.py
+++ b/wscript_build.py
@@ -310,8 +310,6 @@ def build(ctx):
( "video/decode/hw_cuda.c", "cuda-hwaccel" ),
( "video/decode/hw_dxva2.c", "d3d-hwaccel" ),
( "video/decode/hw_d3d11va.c", "d3d-hwaccel" ),
- ( "video/decode/hw_vaapi_old.c", "vaapi-hwaccel-old" ),
- ( "video/decode/hw_vdpau.c", "vdpau-hwaccel-old" ),
( "video/decode/hw_videotoolbox.c", "videotoolbox-hwaccel" ),
( "video/decode/vd_lavc.c" ),
( "video/filter/refqueue.c" ),