You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
cbs_av1: Don't reject unknown metadata
Accept it and pass it through unchanged. The standard requires that decoders ignore unknown metadata, and indeed this is tested by some of the Argon coverage streams.
This commit is contained in:
@@ -1306,9 +1306,16 @@ static void cbs_av1_free_metadata(void *unit, uint8_t *content)
|
|||||||
md = &obu->obu.metadata;
|
md = &obu->obu.metadata;
|
||||||
|
|
||||||
switch (md->metadata_type) {
|
switch (md->metadata_type) {
|
||||||
|
case AV1_METADATA_TYPE_HDR_CLL:
|
||||||
|
case AV1_METADATA_TYPE_HDR_MDCV:
|
||||||
|
case AV1_METADATA_TYPE_SCALABILITY:
|
||||||
|
case AV1_METADATA_TYPE_TIMECODE:
|
||||||
|
break;
|
||||||
case AV1_METADATA_TYPE_ITUT_T35:
|
case AV1_METADATA_TYPE_ITUT_T35:
|
||||||
av_buffer_unref(&md->metadata.itut_t35.payload_ref);
|
av_buffer_unref(&md->metadata.itut_t35.payload_ref);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
av_buffer_unref(&md->metadata.unknown.payload_ref);
|
||||||
}
|
}
|
||||||
av_free(content);
|
av_free(content);
|
||||||
}
|
}
|
||||||
|
@@ -370,6 +370,12 @@ typedef struct AV1RawMetadataTimecode {
|
|||||||
uint32_t time_offset_value;
|
uint32_t time_offset_value;
|
||||||
} AV1RawMetadataTimecode;
|
} AV1RawMetadataTimecode;
|
||||||
|
|
||||||
|
typedef struct AV1RawMetadataUnknown {
|
||||||
|
uint8_t *payload;
|
||||||
|
AVBufferRef *payload_ref;
|
||||||
|
size_t payload_size;
|
||||||
|
} AV1RawMetadataUnknown;
|
||||||
|
|
||||||
typedef struct AV1RawMetadata {
|
typedef struct AV1RawMetadata {
|
||||||
uint64_t metadata_type;
|
uint64_t metadata_type;
|
||||||
union {
|
union {
|
||||||
@@ -378,6 +384,7 @@ typedef struct AV1RawMetadata {
|
|||||||
AV1RawMetadataScalability scalability;
|
AV1RawMetadataScalability scalability;
|
||||||
AV1RawMetadataITUTT35 itut_t35;
|
AV1RawMetadataITUTT35 itut_t35;
|
||||||
AV1RawMetadataTimecode timecode;
|
AV1RawMetadataTimecode timecode;
|
||||||
|
AV1RawMetadataUnknown unknown;
|
||||||
} metadata;
|
} metadata;
|
||||||
} AV1RawMetadata;
|
} AV1RawMetadata;
|
||||||
|
|
||||||
|
@@ -2004,6 +2004,29 @@ static int FUNC(metadata_timecode)(CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int FUNC(metadata_unknown)(CodedBitstreamContext *ctx, RWContext *rw,
|
||||||
|
AV1RawMetadataUnknown *current)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
HEADER("Unknown Metadata");
|
||||||
|
|
||||||
|
#ifdef READ
|
||||||
|
current->payload_size = cbs_av1_get_payload_bytes_left(rw);
|
||||||
|
|
||||||
|
current->payload_ref = av_buffer_alloc(current->payload_size);
|
||||||
|
if (!current->payload_ref)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
current->payload = current->payload_ref->data;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0; i < current->payload_size; i++)
|
||||||
|
fbs(8, payload[i], 1, i);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw,
|
static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw,
|
||||||
AV1RawMetadata *current)
|
AV1RawMetadata *current)
|
||||||
{
|
{
|
||||||
@@ -2028,8 +2051,7 @@ static int FUNC(metadata_obu)(CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
CHECK(FUNC(metadata_timecode)(ctx, rw, ¤t->metadata.timecode));
|
CHECK(FUNC(metadata_timecode)(ctx, rw, ¤t->metadata.timecode));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Unknown metadata type.
|
CHECK(FUNC(metadata_unknown)(ctx, rw, ¤t->metadata.unknown));
|
||||||
return AVERROR_PATCHWELCOME;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user