diff options
author | wm4 <wm4@nowhere> | 2019-12-18 01:56:29 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-12-18 01:56:50 +0100 |
commit | bd96b97170c3332d84381c88e92bbe2a169fae35 (patch) | |
tree | 9c17054db8b537002b6cae0d1a2e401d84160166 /video/decode/vd_lavc.c | |
parent | 06c9c3819959d6dc41602fb16063c019a37eaa72 (diff) | |
download | mpv-bd96b97170c3332d84381c88e92bbe2a169fae35.tar.bz2 mpv-bd96b97170c3332d84381c88e92bbe2a169fae35.tar.xz |
vd_lavc: add gross workaround for nvdec/libavcodec broken API issue
libavcodec's nvdec wrapper can return invalid frames, that do not have
any data fields set. This is not allowed by the API, but why would they
follow their own API?
Add a workaround to specifically detect this situation. In practice,
this should fall back to software decoding if it happens too often in a
row. (But single errors are still tolerated, because I don't know why.)
Untested due to lack of hardware from the regrettable graphics company.
Better do this here than deal with the moronic project we unfortunately
depend on.
See: #7185
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r-- | video/decode/vd_lavc.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 2acfa9a9c0..3f0eedc47c 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -1055,15 +1055,21 @@ static int decode_frame(struct mp_filter *vd) // data. assert(ctx->pic->buf[0]); - ctx->hwdec_fail_count = 0; - struct mp_image *mpi = mp_image_from_av_frame(ctx->pic); if (!mpi) { av_frame_unref(ctx->pic); return ret; } - if (mpi->imgfmt == IMGFMT_CUDA) - assert(mpi->planes[0]); + + if (mpi->imgfmt == IMGFMT_CUDA && !mpi->planes[0]) { + MP_ERR(vd, "CUDA frame without data. This is a FFmpeg bug.\n"); + talloc_free(mpi); + handle_err(vd); + return AVERROR_BUG; + } + + ctx->hwdec_fail_count = 0; + mpi->pts = mp_pts_from_av(ctx->pic->pts, &ctx->codec_timebase); mpi->dts = mp_pts_from_av(ctx->pic->pkt_dts, &ctx->codec_timebase); |