diff mbox series

[FFmpeg-devel,v2,3/3] avcodec/av1dec: parse DV profile 10 T.35 OBU

Message ID 20240310140112.41366-4-ffmpeg@haasn.xyz
State New
Headers show
Series [FFmpeg-devel,v2,1/3] avcodec/dovi_rpu: implement support for profile 10 | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Niklas Haas March 10, 2024, 2:01 p.m. UTC
From: Niklas Haas <git@haasn.dev>

See previous commit.
---
 libavcodec/av1dec.c | 25 +++++++++++++++++++++++++
 libavcodec/av1dec.h |  2 ++
 2 files changed, 27 insertions(+)
diff mbox series

Patch

diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index bbb5634773f..e6346b51dbe 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 a6ad80c12ab..336eb613597 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;