From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id C73E04C787 for ; Tue, 5 Aug 2025 10:13:06 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id AB08468C1FB; Tue, 5 Aug 2025 13:12:52 +0300 (EEST) Received: from mail-ed1-f73.google.com (mail-ed1-f73.google.com [209.85.208.73]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id E642B68C0DD for ; Tue, 5 Aug 2025 13:12:43 +0300 (EEST) Received: by mail-ed1-f73.google.com with SMTP id 4fb4d7f45d1cf-6155a2c8365so3792985a12.0 for ; Tue, 05 Aug 2025 03:12:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754388763; x=1754993563; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tGN+X9h4jZ5lEpe/t24AMiqarUuju8sZS1aP3qO2bGw=; b=VbnXnDh3Kf7chB4AE8eW0IOg1A2m0ZIf9/8DbsKQcmVAlt3uF/oJX1UnUtOPkzOxiO 64dnBSzvP1wTmHxvCNiT0cRlUIVjfPGjNA30B2GSZrE8P9EqEzjpYPlUicgnK4XgRWlz PAW9LmJleFzH/bVFCiRpKIc2vgp2EjXlXTk54Cicm6hV9QEYcEULbx5VunKeayiJmMhf 9rKFGzf4snaoPqLM7O9uKlf1mOUvmSwTZ+J2J0WRIpzMOntIcU8iVPIqLYimV/wSkRv0 +IsxehYP2rAfkn292OC/gYattTGTU87tNlB6vcPqckyULbsWWACsRR4EbXHLJlETdZZa CXrg== X-Gm-Message-State: AOJu0YyzU+WiBjWTxAL7W+kvZx75m6FmfnS6IHfdhtwJzpF1iXCY7m5h wY15SdR0Q93OOGSjIBvq0xB+RD/UD/oqQazBQ0colOoK19Xd/2PnuawZvJUwnGCgwroZRjIUORn qHnzDa2+xrxQaRL0zDSsnsbVGer8x/zLGj2J/t9KSixG/rvVXnN+NDRqxZpv4TpcGUpk772QW6A 5EHKOGUnep6Lf6VdYDEJOsO1wRj2rCZ+rz1uAAFQ== X-Google-Smtp-Source: AGHT+IExn/4/OhpCxvLMwgAXyBUNcfaaZNBnjNBLBgjTsqP4jTyK1jWUgDnE6fVlRkJtA/W7IH6yW2XbLh8= X-Received: from edb21.prod.google.com ([2002:a05:6402:2395:b0:609:8b2:ddbc]) (user=maryla job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:2353:b0:615:4ab8:deb with SMTP id 4fb4d7f45d1cf-615e6eb5aa9mr13084488a12.6.1754388763110; Tue, 05 Aug 2025 03:12:43 -0700 (PDT) Date: Tue, 5 Aug 2025 12:12:40 +0200 In-Reply-To: <20250805101241.947452-1-maryla@google.com> Mime-Version: 1.0 References: <20250805101241.947452-1-maryla@google.com> X-Mailer: git-send-email 2.50.1.565.gc32cd1483b-goog Message-ID: <20250805101241.947452-2-maryla@google.com> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/itut35: always check the provider code and country code together X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Maryla Ustarroz-Calonge via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: Maryla Ustarroz-Calonge Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: ITU-T T.35 provider codes are attributed by national bodies and it's possible to have collisions across countries. This is why the country code must always be checked as well. Use if statements rather than nested switches which would be unreadable. Signed-off-by: Maryla Ustarroz-Calonge --- libavcodec/av1dec.c | 32 ++++++++++++-------------------- libavcodec/h2645_sei.c | 36 +++++++++--------------------------- libavcodec/itut35.h | 21 ++++++++++++++++----- libavcodec/libdav1d.c | 41 +++++++++++++++-------------------------- 4 files changed, 52 insertions(+), 78 deletions(-) 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; } -- 2.50.1.565.gc32cd1483b-goog _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".