[FFmpeg-cvslog] avcodec/av1dec: parse DV profile 10 T.35 OBU
Niklas Haas
git at videolan.org
Mon Mar 11 12:42:47 EET 2024
ffmpeg | branch: master | Niklas Haas <git at haasn.dev> | Fri Feb 23 21:24:32 2024 +0100| [da39a19aadcaa07553554e74309feb0528339c73] | committer: Niklas Haas
avcodec/av1dec: parse DV profile 10 T.35 OBU
See previous commit.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=da39a19aadcaa07553554e74309feb0528339c73
---
libavcodec/av1dec.c | 25 +++++++++++++++++++++++++
libavcodec/av1dec.h | 2 ++
2 files changed, 27 insertions(+)
diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index bbb5634773..e6346b51db 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -734,6 +734,7 @@ static av_cold int av1_decode_free(AVCodecContext *avctx)
ff_cbs_fragment_free(&s->current_obu);
ff_cbs_close(&s->cbc);
+ ff_dovi_ctx_unref(&s->dovi);
return 0;
}
@@ -828,6 +829,7 @@ static av_cold int av1_decode_init(AVCodecContext *avctx)
{
AV1DecContext *s = avctx->priv_data;
AV1RawSequenceHeader *seq;
+ const AVPacketSideData *sd;
int ret;
s->avctx = avctx;
@@ -883,6 +885,12 @@ static av_cold int av1_decode_init(AVCodecContext *avctx)
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;
}
@@ -936,6 +944,7 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame,
const AV1RawMetadataITUTT35 *itut_t35)
{
GetByteContext gb;
+ AV1DecContext *s = avctx->priv_data;
int ret, provider_code;
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;
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
break;
}
diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h
index a6ad80c12a..336eb61359 100644
--- a/libavcodec/av1dec.h
+++ b/libavcodec/av1dec.h
@@ -31,6 +31,7 @@
#include "packet.h"
#include "cbs.h"
#include "cbs_av1.h"
+#include "dovi_rpu.h"
typedef struct AV1Frame {
AVFrame *f;
@@ -81,6 +82,7 @@ typedef struct AV1DecContext {
AV1RawMetadataHDRCLL *cll;
AV1RawOBU *mdcv_ref; ///< RefStruct reference backing mdcv
AV1RawMetadataHDRMDCV *mdcv;
+ DOVIContext dovi;
AVFifo *itut_t35_fifo;
uint16_t tile_num;
More information about the ffmpeg-cvslog
mailing list