[FFmpeg-devel] [PATCH 1/3] avcodec/libdav1d: move itut-t35 parsing to a separate function
Maryla Ustarroz-Calonge
maryla at google.com
Tue Aug 5 13:12:39 EEST 2025
This is in preparation to change the switch statement to if/else.
Signed-off-by: Maryla Ustarroz-Calonge <maryla at google.com>
---
libavcodec/libdav1d.c | 165 ++++++++++++++++++++++--------------------
1 file changed, 88 insertions(+), 77 deletions(-)
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index f4cbc927b5..51cc8837b0 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -386,6 +386,91 @@ static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
return res;
}
+static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p,
+ const Dav1dITUTT35 *itut_t35, AVCodecContext *c,
+ AVFrame *frame) {
+ GetByteContext gb;
+ int provider_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: {
+ uint32_t user_identifier = bytestream2_get_be32(&gb);
+ switch (user_identifier) {
+ case MKBETAG('G', 'A', '9', '4'): { // closed captions
+ AVBufferRef *buf = NULL;
+
+ res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
+ if (res < 0)
+ return res;
+ if (!res)
+ break;
+
+ res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf);
+ if (res < 0)
+ return res;
+
+#if FF_API_CODEC_PROPS
+FF_DISABLE_DEPRECATION_WARNINGS
+ c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+ break;
+ }
+ default: // ignore unsupported identifiers
+ break;
+ }
+ break;
+ }
+ case 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;
+
+ hdrplus = av_dynamic_hdr_plus_create_side_data(frame);
+ if (!hdrplus) {
+ res = AVERROR(ENOMEM);
+ return res;
+ }
+
+ 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: {
+ int provider_oriented_code = bytestream2_get_be32(&gb);
+ if (itut_t35->country_code != ITU_T_T35_COUNTRY_CODE_US ||
+ provider_oriented_code != 0x800)
+ break;
+
+ 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
+ }
+
+ res = ff_dovi_attach_side_data(&dav1d->dovi, frame);
+ if (res < 0)
+ return res;
+ break;
+ }
+ default: // ignore unsupported provider codes
+ break;
+ }
+
+ return 0;
+}
+
static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
{
Libdav1dContext *dav1d = c->priv_data;
@@ -514,83 +599,9 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
#else
const Dav1dITUTT35 *itut_t35 = p->itut_t35;
#endif
- GetByteContext gb;
- int provider_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: {
- uint32_t user_identifier = bytestream2_get_be32(&gb);
- switch (user_identifier) {
- case MKBETAG('G', 'A', '9', '4'): { // closed captions
- AVBufferRef *buf = NULL;
-
- res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
- if (res < 0)
- goto fail;
- if (!res)
- break;
-
- res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf);
- if (res < 0)
- goto fail;
-
-#if FF_API_CODEC_PROPS
-FF_DISABLE_DEPRECATION_WARNINGS
- c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif
- break;
- }
- default: // ignore unsupported identifiers
- break;
- }
- break;
- }
- case 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;
-
- hdrplus = av_dynamic_hdr_plus_create_side_data(frame);
- if (!hdrplus) {
- res = AVERROR(ENOMEM);
- goto fail;
- }
-
- res = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer,
- bytestream2_get_bytes_left(&gb));
- if (res < 0)
- goto fail;
- break;
- }
- case 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;
-
- 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
- }
-
- res = ff_dovi_attach_side_data(&dav1d->dovi, frame);
- if (res < 0)
- goto fail;
- break;
- }
- default: // ignore unsupported provider codes
- break;
- }
+ res = parse_itut_t35_metadata(dav1d, p, itut_t35, c, frame);
+ if (res < 0)
+ goto fail;
#if FF_DAV1D_VERSION_AT_LEAST(6,9)
}
#endif
--
2.50.1.565.gc32cd1483b-goog
More information about the ffmpeg-devel
mailing list