mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-06-04 14:40:26 +00:00
avcodec/libdav1d: use the ITU-T T35 parsing helpers
Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
19b3d47007
commit
e40dd45f0d
2 changed files with 10 additions and 125 deletions
2
configure
vendored
2
configure
vendored
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue