diff options
author | Jan Ekström <jeebjp@gmail.com> | 2020-11-23 19:37:38 +0200 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2020-11-24 10:13:55 +0200 |
commit | a66d1779bb1b33cc54b359b142dcbcd2827fa282 (patch) | |
tree | 249de86cbbe1c3a67cec26cda972a5970659e110 | |
parent | 7bacf60ae5df75954a538563d19f6001aa598b3f (diff) | |
download | ffmpeg-a66d1779bb1b33cc54b359b142dcbcd2827fa282.tar.gz |
avcodec/cbs_av1: add support for standard MP4/Matroska extradata
This way API clients can just pass the AV1CodecConfigurationRecord
as extradata as-is without further filtering.
-rw-r--r-- | libavcodec/cbs_av1.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index 9badfe31e4..9ae2f59872 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -758,6 +758,39 @@ static int cbs_av1_split_fragment(CodedBitstreamContext *ctx, goto fail; } + if (header && size && data[0] & 0x80) { + // first bit is nonzero, the extradata does not consist purely of + // OBUs. Expect MP4/Matroska AV1CodecConfigurationRecord + int config_record_version = data[0] & 0x7f; + + if (config_record_version != 1) { + av_log(ctx->log_ctx, AV_LOG_ERROR, + "Unknown version %d of AV1CodecConfigurationRecord " + "found!\n", + config_record_version); + err = AVERROR_INVALIDDATA; + goto fail; + } + + if (size <= 4) { + if (size < 4) { + av_log(ctx->log_ctx, AV_LOG_WARNING, + "Undersized AV1CodecConfigurationRecord v%d found!\n", + config_record_version); + err = AVERROR_INVALIDDATA; + goto fail; + } + + goto success; + } + + // In AV1CodecConfigurationRecord v1, actual OBUs start after + // four bytes. Thus set the offset as required for properly + // parsing them. + data += 4; + size -= 4; + } + while (size > 0) { AV1RawOBUHeader header; uint64_t obu_size; @@ -803,6 +836,7 @@ static int cbs_av1_split_fragment(CodedBitstreamContext *ctx, size -= obu_length; } +success: err = 0; fail: ctx->trace_enable = trace; |