mirror of https://github.com/mpv-player/mpv
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.
This commit is contained in:
parent
30f2db5930
commit
0da9638576
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue