mirror of
https://github.com/mpv-player/mpv
synced 2025-03-25 04:38:01 +00:00
vd_lavc: fix device leak with copy-mode hwaccels
Apparently this was broken by the "ctx->hwdec" check in the if condition guarding the destroy call, and "ctx->hwdec = NULL;" was moved up earlier, making this always dead code. This should probably be refcounted or so, although that could make it worse as well. For now, add a flag whether the device should be destroyed. Fixes #4735.
This commit is contained in:
parent
7397e8ab42
commit
de6d3f8ca1
@ -61,6 +61,7 @@ typedef struct lavc_ctx {
|
||||
|
||||
// Set by generic hwaccels.
|
||||
struct mp_hwdec_ctx *hwdec_dev;
|
||||
bool owns_hwdec_dev;
|
||||
|
||||
int hwdec_fmt;
|
||||
int hwdec_w;
|
||||
|
@ -592,6 +592,7 @@ static void init_avctx(struct dec_video *vd, const char *decoder,
|
||||
ctx->hwdec_dev = hwdec_create_dev(vd, ctx->hwdec, false);
|
||||
if (!ctx->hwdec_dev)
|
||||
goto error;
|
||||
ctx->owns_hwdec_dev = !!ctx->hwdec->create_dev;
|
||||
if (ctx->hwdec_dev->restore_device)
|
||||
ctx->hwdec_dev->restore_device(ctx->hwdec_dev);
|
||||
if (!ctx->hwdec->set_hwframes) {
|
||||
@ -688,10 +689,10 @@ static void uninit_avctx(struct dec_video *vd)
|
||||
|
||||
avcodec_free_context(&ctx->avctx);
|
||||
|
||||
if (ctx->hwdec_dev && ctx->hwdec && ctx->hwdec->generic_hwaccel &&
|
||||
ctx->hwdec_dev->destroy)
|
||||
if (ctx->hwdec_dev && ctx->owns_hwdec_dev && ctx->hwdec_dev->destroy)
|
||||
ctx->hwdec_dev->destroy(ctx->hwdec_dev);
|
||||
ctx->hwdec_dev = NULL;
|
||||
ctx->owns_hwdec_dev = false;
|
||||
|
||||
ctx->hwdec_failed = false;
|
||||
ctx->hwdec_fail_count = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user