summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-04-23 15:56:45 +0200
committerwm4 <wm4@nowhere>2017-04-23 16:07:03 +0200
commitf59371de2170141fc28540d03c4e7ecc62844ebf (patch)
treef741cb2f05e218bd361f6a3b142cab152cf2902f
parent1d0a858447cee977c9b4faa65d163100f20d4047 (diff)
downloadmpv-f59371de2170141fc28540d03c4e7ecc62844ebf.tar.bz2
mpv-f59371de2170141fc28540d03c4e7ecc62844ebf.tar.xz
video: drop vaapi/vdpau hw decoding support with FFmpeg 3.2
This drops support for the old libavcodec APIs. Now FFmpeg 3.3 or FFmpeg git is required. Libav has no release with the new APIs yet, so for Libav git as of a few weeks or months ago or so is required if you want to use Libav. Not much actually changes in hwdec_vaegl.c - some code is removed, but the reindentation inflates the diff.
-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" ),