summaryrefslogtreecommitdiff
path: root/libavcodec/cuviddec.c
diff options
context:
space:
mode:
authorZhao Zhili <zhilizhao@tencent.com>2022-06-24 12:04:04 +0800
committerTimo Rothenpieler <timo@rothenpieler.org>2022-06-26 21:41:31 +0200
commitffc91940a4262f605cb650c93e52a657090ae148 (patch)
treec2ca554f7701c62c1b9dfa653311dd62215aa51a /libavcodec/cuviddec.c
parent75638fe9402f70645bdde4d95672fa640a327300 (diff)
avcodec/cuviddec: fix AV1 decoding error
cuvidParseVideoData only supports pure OBUs, it reports an unknown error with AV1CodecConfigurationRecord. Check whether extradata is AV1CodecConfigurationRecord and skip the first 4 bytes to fix the issue. The bug is revealed in ffmpeg cmd since 45e3b6a68 and ffd1316e. Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
Diffstat (limited to 'libavcodec/cuviddec.c')
-rw-r--r--libavcodec/cuviddec.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index cb3cda7e24..5f265b1c70 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -953,6 +953,16 @@ static av_cold int cuvid_decode_init(AVCodecContext *avctx)
extradata_size = avctx->extradata_size;
}
+ // Check first bit to determine whether it's AV1CodecConfigurationRecord.
+ // Skip first 4 bytes of AV1CodecConfigurationRecord to keep configOBUs
+ // only, otherwise cuvidParseVideoData report unknown error.
+ if (avctx->codec->id == AV_CODEC_ID_AV1 &&
+ extradata_size > 4 &&
+ extradata[0] & 0x80) {
+ extradata += 4;
+ extradata_size -= 4;
+ }
+
ctx->cuparse_ext = av_mallocz(sizeof(*ctx->cuparse_ext)
+ FFMAX(extradata_size - (int)sizeof(ctx->cuparse_ext->raw_seqhdr_data), 0));
if (!ctx->cuparse_ext) {