summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-08-15 18:20:15 +0200
committerwm4 <wm4@nowhere>2013-08-15 23:40:02 +0200
commit0da96385765840c418a789d06ec66c918b59d7ce (patch)
treed7ae53619256e17f9a7c901046af9dffc52786a6
parent30f2db5930993184e125aa5ee46c73002f5de745 (diff)
downloadmpv-0da96385765840c418a789d06ec66c918b59d7ce.tar.bz2
mpv-0da96385765840c418a789d06ec66c918b59d7ce.tar.xz
video/decode: pass parameters directly to hwdec allocate_image callback
Instead of passing AVFrame. This also moves the mysterious logic about the size of the allocated image to common code, instead of duplicating it everywhere.
-rw-r--r--video/decode/lavc.h3
-rw-r--r--video/decode/vaapi.c8
-rw-r--r--video/decode/vd_lavc.c6
-rw-r--r--video/decode/vdpau.c9
-rw-r--r--video/decode/vdpau_old.c8
5 files changed, 14 insertions, 20 deletions
diff --git a/video/decode/lavc.h b/video/decode/lavc.h
index 4252034b2c..f2ac5691d2 100644
--- a/video/decode/lavc.h
+++ b/video/decode/lavc.h
@@ -61,7 +61,8 @@ struct vd_lavc_hwdec {
const char *decoder);
int (*init)(struct lavc_ctx *ctx);
void (*uninit)(struct lavc_ctx *ctx);
- struct mp_image *(*allocate_image)(struct lavc_ctx *ctx, AVFrame *frame);
+ struct mp_image *(*allocate_image)(struct lavc_ctx *ctx, int fmt,
+ int w, int h);
void (*fix_image)(struct lavc_ctx *ctx, struct mp_image *img);
};
diff --git a/video/decode/vaapi.c b/video/decode/vaapi.c
index baa13588c9..7294046bf4 100644
--- a/video/decode/vaapi.c
+++ b/video/decode/vaapi.c
@@ -324,18 +324,14 @@ error:
return res;
}
-static struct mp_image *allocate_image(struct lavc_ctx *ctx, AVFrame *frame)
+static struct mp_image *allocate_image(struct lavc_ctx *ctx, int format,
+ int w, int h)
{
struct priv *p = ctx->hwdec_priv;
- int format = pixfmt2imgfmt(frame->format);
if (!IMGFMT_IS_VAAPI(format))
return NULL;
- // frame->width/height lie. Using them breaks with non-mod 16 video.
- int w = ctx->avctx->width;
- int h = ctx->avctx->height;
-
if (format != p->format || w != p->w || h != p->h ||
p->va_context->context_id == VA_INVALID_ID)
{
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 639e46ebcc..c899e53206 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -565,7 +565,11 @@ static struct mp_image *get_surface_hwdec(struct sh_video *sh, AVFrame *pic)
if (!IMGFMT_IS_HWACCEL(imgfmt))
return NULL;
- struct mp_image *mpi = ctx->hwdec->allocate_image(ctx, pic);
+ // frame->width/height lie. Using them breaks with non-mod 16 video.
+ int w = ctx->avctx->width;
+ int h = ctx->avctx->height;
+
+ struct mp_image *mpi = ctx->hwdec->allocate_image(ctx, imgfmt, w, h);
if (mpi) {
for (int i = 0; i < 4; i++)
diff --git a/video/decode/vdpau.c b/video/decode/vdpau.c
index e20abdafca..e0d3241803 100644
--- a/video/decode/vdpau.c
+++ b/video/decode/vdpau.c
@@ -157,17 +157,14 @@ fail:
return false;
}
-static struct mp_image *allocate_image(struct lavc_ctx *ctx, AVFrame *frame)
+static struct mp_image *allocate_image(struct lavc_ctx *ctx, int fmt,
+ int w, int h)
{
struct priv *p = ctx->hwdec_priv;
- if (frame->format != AV_PIX_FMT_VDPAU)
+ if (fmt != IMGFMT_VDPAU)
return NULL;
- // frame->width/height lie. Using them breaks with non-mod 16 video.
- int w = ctx->avctx->width;
- int h = ctx->avctx->height;
-
handle_preemption(ctx);
if (w != p->vid_width || h != p->vid_height ||
diff --git a/video/decode/vdpau_old.c b/video/decode/vdpau_old.c
index 4abdafa9c0..b5674dcec0 100644
--- a/video/decode/vdpau_old.c
+++ b/video/decode/vdpau_old.c
@@ -162,18 +162,14 @@ static void release_surface(void *ptr)
talloc_free(state);
}
-static struct mp_image *allocate_image(struct lavc_ctx *ctx, AVFrame *frame)
+static struct mp_image *allocate_image(struct lavc_ctx *ctx, int imgfmt,
+ int w, int h)
{
struct priv *p = ctx->hwdec_priv;
- int imgfmt = pixfmt2imgfmt(frame->format);
if (!IMGFMT_IS_VDPAU(imgfmt))
return NULL;
- // frame->width/height lie. Using them breaks with non-mod 16 video.
- int w = ctx->avctx->width;
- int h = ctx->avctx->height;
-
if (w != p->vid_width || h != p->vid_height || imgfmt != p->image_format) {
p->vid_width = w;
p->vid_height = h;