summaryrefslogtreecommitdiff
path: root/libavcodec/cbs_av1.c
diff options
context:
space:
mode:
authorJan Ekström <jeebjp@gmail.com>2020-11-23 19:37:38 +0200
committerJan Ekström <jeebjp@gmail.com>2020-11-24 10:13:55 +0200
commita66d1779bb1b33cc54b359b142dcbcd2827fa282 (patch)
tree249de86cbbe1c3a67cec26cda972a5970659e110 /libavcodec/cbs_av1.c
parent7bacf60ae5df75954a538563d19f6001aa598b3f (diff)
downloadffmpeg-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.
Diffstat (limited to 'libavcodec/cbs_av1.c')
-rw-r--r--libavcodec/cbs_av1.c34
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;