1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/av1dec: parse DV profile 10 T.35 OBU

See previous commit.
This commit is contained in:
Niklas Haas 2024-02-23 21:24:32 +01:00
parent a5d1e69b3b
commit da39a19aad
2 changed files with 27 additions and 0 deletions

View File

@ -734,6 +734,7 @@ static av_cold int av1_decode_free(AVCodecContext *avctx)
ff_cbs_fragment_free(&s->current_obu); ff_cbs_fragment_free(&s->current_obu);
ff_cbs_close(&s->cbc); ff_cbs_close(&s->cbc);
ff_dovi_ctx_unref(&s->dovi);
return 0; return 0;
} }
@ -828,6 +829,7 @@ static av_cold int av1_decode_init(AVCodecContext *avctx)
{ {
AV1DecContext *s = avctx->priv_data; AV1DecContext *s = avctx->priv_data;
AV1RawSequenceHeader *seq; AV1RawSequenceHeader *seq;
const AVPacketSideData *sd;
int ret; int ret;
s->avctx = avctx; s->avctx = avctx;
@ -883,6 +885,12 @@ static av_cold int av1_decode_init(AVCodecContext *avctx)
ff_cbs_fragment_reset(&s->current_obu); ff_cbs_fragment_reset(&s->current_obu);
} }
s->dovi.logctx = avctx;
s->dovi.dv_profile = 10; // default for AV1
sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF);
if (sd && sd->size > 0)
ff_dovi_update_cfg(&s->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data);
return ret; return ret;
} }
@ -936,6 +944,7 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame,
const AV1RawMetadataITUTT35 *itut_t35) const AV1RawMetadataITUTT35 *itut_t35)
{ {
GetByteContext gb; GetByteContext gb;
AV1DecContext *s = avctx->priv_data;
int ret, provider_code; int ret, provider_code;
bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size); bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size);
@ -985,6 +994,22 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame,
return ret; return ret;
break; break;
} }
case 0x3B: { // dolby_provider_code
int provider_oriented_code = bytestream2_get_be32(&gb);
if (itut_t35->itu_t_t35_country_code != 0xB5 || provider_oriented_code != 0x800)
break;
ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer);
if (ret < 0) {
av_log(avctx, AV_LOG_WARNING, "Error parsing DOVI OBU.\n");
break; // ignore
}
ret = ff_dovi_attach_side_data(&s->dovi, frame);
if (ret < 0)
return ret;
break;
}
default: // ignore unsupported provider codes default: // ignore unsupported provider codes
break; break;
} }

View File

@ -31,6 +31,7 @@
#include "packet.h" #include "packet.h"
#include "cbs.h" #include "cbs.h"
#include "cbs_av1.h" #include "cbs_av1.h"
#include "dovi_rpu.h"
typedef struct AV1Frame { typedef struct AV1Frame {
AVFrame *f; AVFrame *f;
@ -81,6 +82,7 @@ typedef struct AV1DecContext {
AV1RawMetadataHDRCLL *cll; AV1RawMetadataHDRCLL *cll;
AV1RawOBU *mdcv_ref; ///< RefStruct reference backing mdcv AV1RawOBU *mdcv_ref; ///< RefStruct reference backing mdcv
AV1RawMetadataHDRMDCV *mdcv; AV1RawMetadataHDRMDCV *mdcv;
DOVIContext dovi;
AVFifo *itut_t35_fifo; AVFifo *itut_t35_fifo;
uint16_t tile_num; uint16_t tile_num;