summaryrefslogtreecommitdiffstats
path: root/video/decode/vd_lavc.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-12 13:15:45 +0100
committerwm4 <wm4@nowhere>2017-01-12 14:00:19 +0100
commite618b1b3522c53036b8ffd95d352b6747603edc4 (patch)
tree5be78cb7beaf32a4ea5e1757d6ef5825d89cf355 /video/decode/vd_lavc.c
parentfb4ae3c06ca6598ecf31d9e39276f87091e5037d (diff)
downloadmpv-e618b1b3522c53036b8ffd95d352b6747603edc4.tar.bz2
mpv-e618b1b3522c53036b8ffd95d352b6747603edc4.tar.xz
vaapi: handle image copying for vaapi-copy in common code
Other hwdecs will also be able to use this (as soon as they are switched to use AVHWFramesContext). As an additional feature, failing to copy back the frame counts as hardware decoding failure and can trigger fallback. This can be done easily now, because it needs no way to communicate this from the hwaccel glue code to the common code. The old code is still required for the old decode API, until we either drop or rewrite it. vo_vaapi.c's OSD code (fuck...) also uses these surface functions to a higher degree.
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r--video/decode/vd_lavc.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 8a2070df79..d53513ad55 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -452,6 +452,7 @@ static int init(struct dec_video *vd, const char *decoder)
ctx->opts = vd->opts;
ctx->decoder = talloc_strdup(ctx, decoder);
ctx->hwdec_devs = vd->hwdec_devs;
+ ctx->hwdec_swpool = talloc_steal(ctx, mp_image_pool_new(17));
reinit(vd);
@@ -920,6 +921,18 @@ static bool receive_frame(struct dec_video *vd, struct mp_image **out_image)
if (!res)
return progress;
+ if (ctx->hwdec && ctx->hwdec->copying && (res->fmt.flags & MP_IMGFLAG_HWACCEL))
+ {
+ struct mp_image *sw = mp_image_hw_download(res, ctx->hwdec_swpool);
+ mp_image_unrefp(&res);
+ res = sw;
+ if (!res) {
+ MP_ERR(vd, "Could not copy back hardware decoded frame.\n");
+ handle_err(vd);
+ return NULL;
+ }
+ }
+
if (!ctx->hwdec_notified && vd->opts->hwdec_api != HWDEC_NONE) {
if (ctx->hwdec) {
MP_INFO(vd, "Using hardware decoding (%s).\n",