summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
Diffstat (limited to 'video')
-rw-r--r--video/decode/lavc.h3
-rw-r--r--video/decode/vaapi.c13
-rw-r--r--video/decode/vd_lavc.c13
3 files changed, 16 insertions, 13 deletions
diff --git a/video/decode/lavc.h b/video/decode/lavc.h
index 3c38e6878d..fe7f9937f4 100644
--- a/video/decode/lavc.h
+++ b/video/decode/lavc.h
@@ -7,6 +7,7 @@
#include "demux/stheader.h"
#include "video/mp_image.h"
+#include "video/mp_image_pool.h"
#include "video/hwdec.h"
#define HWDEC_DELAY_QUEUE_COUNT 2
@@ -61,6 +62,8 @@ typedef struct lavc_ctx {
bool hwdec_request_reinit;
int hwdec_fail_count;
+
+ struct mp_image_pool *hwdec_swpool;
} vd_ffmpeg_ctx;
struct vd_lavc_hwdec {
diff --git a/video/decode/vaapi.c b/video/decode/vaapi.c
index bd84fcc253..aeadeb488e 100644
--- a/video/decode/vaapi.c
+++ b/video/decode/vaapi.c
@@ -43,8 +43,6 @@ struct priv {
AVBufferRef *device_ref;
AVBufferRef *frames_ref;
-
- struct mp_image_pool *sw_pool;
};
@@ -123,7 +121,6 @@ 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"),
- .sw_pool = talloc_steal(p, mp_image_pool_new(17)),
};
if (direct) {
@@ -185,15 +182,6 @@ 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);
- talloc_free(img);
- return simg;
-}
-
static void intel_shit_lock(struct lavc_ctx *ctx)
{
struct priv *p = ctx->hwdec_priv;
@@ -227,6 +215,5 @@ const struct vd_lavc_hwdec mp_vd_lavc_vaapi_copy = {
.init = init_copy,
.uninit = uninit,
.init_decoder = init_decoder,
- .process_image = copy_image,
.delay_queue = HWDEC_DELAY_QUEUE_COUNT,
};
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",