aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2024-06-18 17:23:28 +0200
committerNiklas Haas <git@haasn.dev>2024-08-16 11:48:02 +0200
commitae3a78593df2b41f4163496f0bdf73c01d73c9a6 (patch)
treee493e9e30ee942f40efa15c3cbda34607f651021
parentb3bc8f8e1e58a2ff794158048226fd30969e28c0 (diff)
downloadffmpeg-ae3a78593df2b41f4163496f0bdf73c01d73c9a6.tar.gz
avcodec/dovi_rpuenc: add a flag to enable compression
Keyframes must reset the metadata compression state, so we need to also signal this at rpu generation time. Default to uncompressed, because encoders cannot generally know if a given frame will be a keyframe before they finish encoding, but also cannot retroactively attach the RPU. (Within the confines of current APIs)
-rw-r--r--libavcodec/dovi_rpu.h1
-rw-r--r--libavcodec/dovi_rpuenc.c6
2 files changed, 6 insertions, 1 deletions
diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h
index 226a769bff..e2e7635cfb 100644
--- a/libavcodec/dovi_rpu.h
+++ b/libavcodec/dovi_rpu.h
@@ -126,6 +126,7 @@ int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx);
enum {
FF_DOVI_WRAP_NAL = 1 << 0, ///< wrap inside NAL RBSP
FF_DOVI_WRAP_T35 = 1 << 1, ///< wrap inside T.35+EMDF
+ FF_DOVI_COMPRESS_RPU = 1 << 2, ///< enable compression for this RPU
};
/**
diff --git a/libavcodec/dovi_rpuenc.c b/libavcodec/dovi_rpuenc.c
index 73db9437a0..0d4e613a72 100644
--- a/libavcodec/dovi_rpuenc.c
+++ b/libavcodec/dovi_rpuenc.c
@@ -444,6 +444,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata,
int vdr_dm_metadata_present, vdr_rpu_id, use_prev_vdr_rpu, profile,
buffer_size, rpu_size, pad, zero_run;
int num_ext_blocks_v1, num_ext_blocks_v2;
+ int dv_md_compression = s->cfg.dv_md_compression;
uint32_t crc;
uint8_t *dst;
if (!metadata) {
@@ -463,6 +464,9 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata,
return AVERROR_INVALIDDATA;
}
+ if (!(flags & FF_DOVI_COMPRESS_RPU))
+ dv_md_compression = AV_DOVI_COMPRESSION_NONE;
+
vdr_rpu_id = mapping->vdr_rpu_id;
use_prev_vdr_rpu = 0;
@@ -472,7 +476,7 @@ int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata,
return AVERROR(ENOMEM);
}
- switch (s->cfg.dv_md_compression) {
+ switch (dv_md_compression) {
case AV_DOVI_COMPRESSION_LIMITED:
/* Limited metadata compression requires vdr_rpi_id == 0 */
if (vdr_rpu_id != 0)