diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 8ff1bf394c..551f79fd7a 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -965,13 +965,13 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, { GetByteContext gb; AV1DecContext *s = avctx->priv_data; - int ret, provider_code; + int ret, provider_code, country_code; bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size); provider_code = bytestream2_get_be16(&gb); - switch (provider_code) { - case ITU_T_T35_PROVIDER_CODE_ATSC: { + country_code = itut_t35->itu_t_t35_country_code ; + if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_ATSC) { uint32_t user_identifier = bytestream2_get_be32(&gb); switch (user_identifier) { case MKBETAG('G', 'A', '9', '4'): { // closed captions @@ -997,16 +997,13 @@ FF_ENABLE_DEPRECATION_WARNINGS default: // ignore unsupported identifiers break; } - break; - } - case ITU_T_T35_PROVIDER_CODE_SMTPE: { + } else if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_SMTPE) { AVDynamicHDRPlus *hdrplus; int provider_oriented_code = bytestream2_get_be16(&gb); int application_identifier = bytestream2_get_byte(&gb); - if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US || - provider_oriented_code != 1 || application_identifier != 4) - break; + if (provider_oriented_code != 1 || application_identifier != 4) + return 0; // ignore hdrplus = av_dynamic_hdr_plus_create_side_data(frame); if (!hdrplus) @@ -1016,28 +1013,23 @@ FF_ENABLE_DEPRECATION_WARNINGS bytestream2_get_bytes_left(&gb)); if (ret < 0) return ret; - break; - } - case ITU_T_T35_PROVIDER_CODE_DOLBY: { + } else if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_DOLBY) { int provider_oriented_code = bytestream2_get_be32(&gb); - if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US || - provider_oriented_code != 0x800) - break; + if (provider_oriented_code != 0x800) + return 0; // ignore ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer, avctx->err_recognition); if (ret < 0) { av_log(avctx, AV_LOG_WARNING, "Error parsing DOVI OBU.\n"); - break; // ignore + return 0; // ignore } ret = ff_dovi_attach_side_data(&s->dovi, frame); if (ret < 0) return ret; - break; - } - default: // ignore unsupported provider codes - break; + } else { + // ignore unsupported provider codes } return 0; diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c index d17c4fb5f9..fe567e1a53 100644 --- a/libavcodec/h2645_sei.c +++ b/libavcodec/h2645_sei.c @@ -158,20 +158,10 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, bytestream2_skipu(gb, 1); // itu_t_t35_country_code_extension_byte } - if (country_code != ITU_T_T35_COUNTRY_CODE_US && - country_code != ITU_T_T35_COUNTRY_CODE_UK && - country_code != ITU_T_T35_COUNTRY_CODE_CN) { - av_log(logctx, AV_LOG_VERBOSE, - "Unsupported User Data Registered ITU-T T35 SEI message (country_code = %d)\n", - country_code); - return 0; - } - /* itu_t_t35_payload_byte follows */ provider_code = bytestream2_get_be16u(gb); - switch (provider_code) { - case ITU_T_T35_PROVIDER_CODE_ATSC: { + if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_ATSC) { uint32_t user_identifier; if (bytestream2_get_bytes_left(gb) < 4) @@ -189,9 +179,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, user_identifier); break; } - break; - } - case ITU_T_T35_PROVIDER_CODE_LCEVC: { + } else if (country_code == ITU_T_T35_COUNTRY_CODE_UK && provider_code == ITU_T_T35_PROVIDER_CODE_LCEVC) { if (bytestream2_get_bytes_left(gb) < 2) return AVERROR_INVALIDDATA; @@ -199,7 +187,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, return decode_registered_user_data_lcevc(&h->lcevc, gb); } #if CONFIG_HEVC_SEI - case ITU_T_T35_PROVIDER_CODE_CUVA: { + else if (country_code == ITU_T_T35_COUNTRY_CODE_CN && provider_code == ITU_T_T35_PROVIDER_CODE_CUVA) { const uint16_t cuva_provider_oriented_code = 0x0005; uint16_t provider_oriented_code; @@ -213,9 +201,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, if (provider_oriented_code == cuva_provider_oriented_code) { return decode_registered_user_data_dynamic_hdr_vivid(&h->dynamic_hdr_vivid, gb); } - break; - } - case ITU_T_T35_PROVIDER_CODE_SMTPE: { + } else if(country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_SMTPE) { // A/341 Amendment - 2094-40 const uint16_t smpte2094_40_provider_oriented_code = 0x0001; const uint8_t smpte2094_40_application_identifier = 0x04; @@ -234,9 +220,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, application_identifier == smpte2094_40_application_identifier) { return decode_registered_user_data_dynamic_hdr_plus(&h->dynamic_hdr_plus, gb); } - break; - } - case 0x5890: { // aom_provider_code + } else if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_AOM) { const uint16_t aom_grain_provider_oriented_code = 0x0001; uint16_t provider_oriented_code; @@ -252,15 +236,13 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, gb->buffer, bytestream2_get_bytes_left(gb)); } - break; } - unsupported_provider_code: #endif - default: + else { + unsupported_provider_code: av_log(logctx, AV_LOG_VERBOSE, - "Unsupported User Data Registered ITU-T T35 SEI message (provider_code = %d)\n", - provider_code); - break; + "Unsupported User Data Registered ITU-T T35 SEI message (country_code = %d, provider_code = %d)\n", + country_code, provider_code); } return 0; diff --git a/libavcodec/itut35.h b/libavcodec/itut35.h index a75ef37929..414c76a4fa 100644 --- a/libavcodec/itut35.h +++ b/libavcodec/itut35.h @@ -23,10 +23,21 @@ #define ITU_T_T35_COUNTRY_CODE_UK 0xB4 #define ITU_T_T35_COUNTRY_CODE_US 0xB5 -#define ITU_T_T35_PROVIDER_CODE_ATSC 0x31 -#define ITU_T_T35_PROVIDER_CODE_CUVA 0x04 -#define ITU_T_T35_PROVIDER_CODE_DOLBY 0x3B -#define ITU_T_T35_PROVIDER_CODE_LCEVC 0x50 -#define ITU_T_T35_PROVIDER_CODE_SMTPE 0x3C +// The Terminal Provider Code (or "Manufacturer Code") identifies the +// manufacturer within a country. An Assignment Authority appointed by the +// national body assigns this code nationally. The manufacturer code is always +// used in conjunction with a country code. +// - CN providers +#define ITU_T_T35_PROVIDER_CODE_CUVA 0x0004 +// - UK providers +// V-Nova should be 0x5000 according to UK Register of Manufacturer Codes +// https://www.cix.co.uk/~bpechey/H221/h221code.htm +// but FFmpeg has been using 0x0050 +#define ITU_T_T35_PROVIDER_CODE_LCEVC 0x0050 +// - US providers +#define ITU_T_T35_PROVIDER_CODE_ATSC 0x0031 +#define ITU_T_T35_PROVIDER_CODE_DOLBY 0x003B +#define ITU_T_T35_PROVIDER_CODE_AOM 0x5890 +#define ITU_T_T35_PROVIDER_CODE_SMTPE 0x003C #endif /* AVCODEC_ITUT35_H */ diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 51cc8837b0..4ade3701bf 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -390,14 +390,14 @@ static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p, const Dav1dITUTT35 *itut_t35, AVCodecContext *c, AVFrame *frame) { GetByteContext gb; - int provider_code; + int provider_code, country_code; int res; bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size); provider_code = bytestream2_get_be16(&gb); - switch (provider_code) { - case ITU_T_T35_PROVIDER_CODE_ATSC: { + country_code = itut_t35->country_code; + if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_ATSC) { uint32_t user_identifier = bytestream2_get_be32(&gb); switch (user_identifier) { case MKBETAG('G', 'A', '9', '4'): { // closed captions @@ -407,7 +407,7 @@ static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p, if (res < 0) return res; if (!res) - break; + return 0; // no cc found, ignore res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf); if (res < 0) @@ -423,51 +423,40 @@ FF_ENABLE_DEPRECATION_WARNINGS default: // ignore unsupported identifiers break; } - break; - } - case ITU_T_T35_PROVIDER_CODE_SMTPE: { + } else if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_SMTPE) { AVDynamicHDRPlus *hdrplus; int provider_oriented_code = bytestream2_get_be16(&gb); int application_identifier = bytestream2_get_byte(&gb); - if (itut_t35->country_code != ITU_T_T35_COUNTRY_CODE_US || - provider_oriented_code != 1 || application_identifier != 4) - break; + if (provider_oriented_code != 1 || application_identifier != 4) + return 0; // ignore hdrplus = av_dynamic_hdr_plus_create_side_data(frame); - if (!hdrplus) { - res = AVERROR(ENOMEM); - return res; - } + if (!hdrplus) + return AVERROR(ENOMEM); res = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer, bytestream2_get_bytes_left(&gb)); if (res < 0) return res; - break; - } - case ITU_T_T35_PROVIDER_CODE_DOLBY: { + } else if (country_code == ITU_T_T35_COUNTRY_CODE_US && provider_code == ITU_T_T35_PROVIDER_CODE_DOLBY) { int provider_oriented_code = bytestream2_get_be32(&gb); - if (itut_t35->country_code != ITU_T_T35_COUNTRY_CODE_US || - provider_oriented_code != 0x800) - break; + if (provider_oriented_code != 0x800) + return 0; // ignore res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, gb.buffer_end - gb.buffer, c->err_recognition); if (res < 0) { av_log(c, AV_LOG_WARNING, "Error parsing DOVI OBU.\n"); - break; // ignore + return 0; // ignore } res = ff_dovi_attach_side_data(&dav1d->dovi, frame); if (res < 0) return res; - break; + } else { + // ignore unsupported provider codes } - default: // ignore unsupported provider codes - break; - } - return 0; }