diff --git a/configure b/configure index fa170f6056..4ac57f299a 100755 --- a/configure +++ b/configure @@ -3829,7 +3829,7 @@ libaribcaption_decoder_deps="libaribcaption" libcodec2_decoder_deps="libcodec2" libcodec2_encoder_deps="libcodec2" libdav1d_decoder_deps="libdav1d" -libdav1d_decoder_select="atsc_a53 dovi_rpudec" +libdav1d_decoder_select="itut_t35" libdavs2_decoder_deps="libdavs2" libdavs2_decoder_select="avs2_parser" libfdk_aac_decoder_deps="libfdk_aac" diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index 2eaeefc71a..77b4c5521b 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -364,134 +364,19 @@ static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p) static int parse_itut_t35_metadata(Libdav1dContext *dav1d, Dav1dPicture *p, const Dav1dITUTT35 *itut_t35, AVCodecContext *c, AVFrame *frame) { - GetByteContext gb; - int provider_code, country_code; + FFITUTT35 itut35 = { .country_code = itut_t35->country_code }; + FFITUTT35Aux aux = { .dovi = &dav1d->dovi }; int res; - bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size); + res = ff_itut_t35_parse_buffer(&itut35, itut_t35->payload, itut_t35->payload_size, + FF_ITUT_T35_FLAG_COUNTRY_CODE); + if (res <= 0) + return res; - country_code = itut_t35->country_code; - switch (country_code) { - case ITU_T_T35_COUNTRY_CODE_US: - if (bytestream2_get_bytes_left(&gb) < 2) - return AVERROR_INVALIDDATA; - provider_code = bytestream2_get_be16u(&gb); + res = ff_itut_t35_parse_payload_to_frame(&itut35, &aux, c, frame); + if (res < 0) + return res; - 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) - 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) - 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_SAMSUNG: { - AVDynamicHDRPlus *hdrplus; - int provider_oriented_code = bytestream2_get_be16(&gb); - int application_identifier = bytestream2_get_byte(&gb); - - if (provider_oriented_code != 1 || application_identifier != 4) - return 0; // ignore - - hdrplus = av_dynamic_hdr_plus_create_side_data(frame); - 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: { - int provider_oriented_code = bytestream2_get_be32(&gb); - if (provider_oriented_code != 0x800) - return 0; // ignore - - res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, bytestream2_get_bytes_left(&gb), - c->err_recognition); - if (res < 0) { - av_log(c, AV_LOG_WARNING, "Error parsing DOVI OBU.\n"); - return 0; // ignore - } - - res = ff_dovi_attach_side_data(&dav1d->dovi, frame); - if (res < 0) - return res; - break; - } - case ITU_T_T35_PROVIDER_CODE_SMPTE: { - AVDynamicHDRSmpte2094App5 *hdr_smpte2094_app5; - int provider_oriented_code = bytestream2_get_be16(&gb); - if (provider_oriented_code != 1) - return 0; // ignore - - hdr_smpte2094_app5 = av_dynamic_hdr_smpte2094_app5_create_side_data(frame); - if (!hdr_smpte2094_app5) - return AVERROR(ENOMEM); - - res = av_dynamic_hdr_smpte2094_app5_from_t35(hdr_smpte2094_app5, gb.buffer, - bytestream2_get_bytes_left(&gb)); - if (res < 0) - return res; - break; - } - default: - break; - } - break; - case ITU_T_T35_COUNTRY_CODE_UK: - bytestream2_skipu(&gb, 1); // t35_uk_country_code_second_octet - if (bytestream2_get_bytes_left(&gb) < 2) - return AVERROR_INVALIDDATA; - - provider_code = bytestream2_get_be16u(&gb); - switch (provider_code) { - case ITU_T_T35_PROVIDER_CODE_VNOVA: { - AVFrameSideData *sd; - if (bytestream2_get_bytes_left(&gb) < 2) - return AVERROR_INVALIDDATA; - - res = ff_frame_new_side_data(c, frame, AV_FRAME_DATA_LCEVC, - bytestream2_get_bytes_left(&gb), &sd); - if (res < 0) - return res; - if (!sd) - break; - - bytestream2_get_bufferu(&gb, sd->data, sd->size); - break; - } - default: - break; - } - break; - - default: - // ignore unsupported provider codes - break; - } return 0; }