FFmpeg
Loading...
Searching...
No Matches
dovi_rpu.h
Go to the documentation of this file.
1/*
2 * Dolby Vision RPU decoder
3 *
4 * Copyright (C) 2021 Jan Ekström
5 * Copyright (C) 2021 Niklas Haas
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#ifndef AVCODEC_DOVI_RPU_H
25#define AVCODEC_DOVI_RPU_H
26
27#include "libavutil/dovi_meta.h"
28#include "libavutil/frame.h"
29
30#include "avcodec.h"
31#include "codec_par.h"
32
33#define DOVI_MAX_DM_ID 15
34
35typedef struct DOVIExt {
36 AVDOVIDmData dm_static[7]; ///< static extension blocks
37 AVDOVIDmData dm_dynamic[25]; ///< dynamic extension blocks
40} DOVIExt;
41
42typedef struct DOVIContext {
43 void *logctx;
44
45 /**
46 * Enable tri-state. For encoding only. FF_DOVI_AUTOMATIC enables Dolby
47 * Vision only if avctx->decoded_side_data contains an AVDOVIMetadata.
48 */
49#define FF_DOVI_AUTOMATIC -1
50 int enable;
51
52 /**
53 * Currently active dolby vision configuration, or {0} for none.
54 * Set by the user when decoding. Generated by ff_dovi_configure()
55 * when encoding.
56 *
57 * Note: sizeof(cfg) is not part of the libavutil ABI, so users should
58 * never pass &cfg to any other library calls. This is included merely as
59 * a way to look up the values of fields known at compile time.
60 */
62
63 /**
64 * Currently active RPU data header, updates on every ff_dovi_rpu_parse()
65 * or ff_dovi_rpu_generate().
66 */
68
69 /**
70 * Currently active data mappings, or NULL. Points into memory owned by the
71 * corresponding rpu/vdr_ref, which becomes invalid on the next call to
72 * ff_dovi_rpu_parse() or ff_dovi_rpu_generate().
73 */
76
77 /**
78 * Currently active extension blocks, updates on every ff_dovi_rpu_parse()
79 * or ff_dovi_rpu_generate().
80 */
81 DOVIExt *ext_blocks; ///< RefStruct, or NULL if no extension blocks
82
83 /**
84 * Private fields internal to dovi_rpu.c
85 */
86 AVDOVIColorMetadata *dm; ///< RefStruct
87 AVDOVIDataMapping *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references
88 uint8_t *rpu_buf; ///< temporary buffer
89 unsigned rpu_buf_sz;
90
92
94
95/**
96 * Completely reset a DOVIContext, preserving only logctx.
97 */
99
100/**
101 * Partially reset the internal state. Resets per-frame state, but preserves
102 * the stream-wide configuration record.
103 */
105
106/**
107 * Parse the contents of a Dolby Vision RPU and update the parsed values in the
108 * DOVIContext struct. This function should receive the decoded unit payload,
109 * without any T.35 or NAL unit headers.
110 *
111 * Returns 0 or an error code.
112 *
113 * Note: `DOVIContext.cfg` should be initialized before calling into this
114 * function. If not done, the profile will be guessed according to HEVC
115 * semantics.
116 */
117int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size,
118 int err_recognition);
119
120/**
121 * Get the decoded AVDOVIMetadata. Ownership passes to the caller.
122 *
123 * Returns the size of *out_metadata, a negative error code, or 0 if no
124 * metadata is available to return.
125 */
127
128/**
129 * Attach the decoded AVDOVIMetadata as side data to an AVFrame.
130 * Returns 0 or a negative error code.
131 */
133
134/**
135 * Configure the encoder for Dolby Vision encoding. Generates a configuration
136 * record in s->cfg, and attaches it to codecpar->coded_side_data. Sets the
137 * correct profile and compatibility ID based on the tagged AVCodecParameters
138 * colorspace metadata, and the correct level based on the resolution and
139 * tagged framerate.
140 *
141 * `metadata` should point to the first frame's RPU, if available. If absent,
142 * auto-detection will be performed, but this can sometimes lead to inaccurate
143 * results (in particular for HEVC streams with enhancement layers).
144 *
145 * Returns 0 or a negative error code.
146 */
149 enum AVDOVICompression compression,
150 int strict_std_compliance);
151
152/**
153 * Variant of `ff_dovi_configure_from_codedpar` which infers the codec
154 * parameters from an AVCodecContext.
155 */
157
158enum {
159 FF_DOVI_WRAP_NAL = 1 << 0, ///< wrap inside NAL RBSP
160 FF_DOVI_WRAP_T35 = 1 << 1, ///< wrap inside T.35+EMDF
161 FF_DOVI_COMPRESS_RPU = 1 << 2, ///< enable compression for this RPU
162};
163
164/**
165 * Synthesize a Dolby Vision RPU reflecting the current state. By default, the
166 * RPU is not encapsulated (see `flags` for more options). Note that this
167 * assumes all previous calls to `ff_dovi_rpu_generate` have been
168 * appropriately signalled, i.e. it will not re-send already transmitted
169 * redundant data.
170 *
171 * Mutates the internal state of DOVIContext to reflect the change.
172 * Returns 0 or a negative error code.
173 */
175 int flags, uint8_t **out_rpu, int *out_size);
176
177
178/***************************************************
179 * The following section is for internal use only. *
180 ***************************************************/
181
182enum {
185};
186
187/**
188 * Internal helper function to guess the correct DV profile for HEVC.
189 *
190 * Returns the profile number or 0 if unknown.
191 */
193
194/* Default values for AVDOVIColorMetadata */
196
198{
199 switch (level) {
200 case 6:
201 case 10:
202 case 32: /* reserved as static by spec */
203 case 254:
204 case 255:
205 return 1;
206 default:
207 return 0;
208 }
209}
210
211#endif /* AVCODEC_DOVI_RPU_H */
static int out_size
Libavcodec external API header.
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define s(width, name)
Definition cbs_vp9.c:198
static AVFrame * frame
DOVI configuration.
AVDOVICompression
Definition dovi_meta.h:67
const AVDOVIColorMetadata ff_dovi_color_default
Definition dovi_rpu.c:94
int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition)
Parse the contents of a Dolby Vision RPU and update the parsed values in the DOVIContext struct.
int ff_dovi_rpu_generate(DOVIContext *s, const AVDOVIMetadata *metadata, int flags, uint8_t **out_rpu, int *out_size)
Synthesize a Dolby Vision RPU reflecting the current state.
void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0)
Definition dovi_rpu.c:59
@ FF_DOVI_WRAP_NAL
wrap inside NAL RBSP
Definition dovi_rpu.h:159
@ FF_DOVI_WRAP_T35
wrap inside T.35+EMDF
Definition dovi_rpu.h:160
@ FF_DOVI_COMPRESS_RPU
enable compression for this RPU
Definition dovi_rpu.h:161
int ff_dovi_configure_from_codedpar(DOVIContext *s, AVCodecParameters *codecpar, const AVDOVIMetadata *metadata, enum AVDOVICompression compression, int strict_std_compliance)
Configure the encoder for Dolby Vision encoding.
int ff_dovi_guess_profile_hevc(const AVDOVIRpuDataHeader *hdr)
Internal helper function to guess the correct DV profile for HEVC.
Definition dovi_rpu.c:72
@ RPU_COEFF_FIXED
Definition dovi_rpu.h:183
@ RPU_COEFF_FLOAT
Definition dovi_rpu.h:184
static int ff_dovi_rpu_extension_is_static(int level)
Definition dovi_rpu.h:197
void ff_dovi_ctx_flush(DOVIContext *s)
Partially reset the internal state.
Definition dovi_rpu.c:43
int ff_dovi_configure(DOVIContext *s, AVCodecContext *avctx)
Variant of ff_dovi_configure_from_codedpar which infers the codec parameters from an AVCodecContext.
#define DOVI_MAX_DM_ID
Definition dovi_rpu.h:33
int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata)
Get the decoded AVDOVIMetadata.
Definition dovi_rpudec.c:33
int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
Attach the decoded AVDOVIMetadata as side data to an AVFrame.
Definition dovi_rpudec.c:64
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition dovi_rpu.c:30
reference-counted frame API
main external API structure.
Definition avcodec.h:443
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
Dolby Vision RPU colorspace metadata parameters.
Definition dovi_meta.h:171
Dolby Vision RPU data mapping parameters.
Definition dovi_meta.h:152
Dolby Vision metadata extension block.
Definition dovi_meta.h:318
Combined struct representing a combination of header, mapping and color metadata, for attaching to fr...
Definition dovi_meta.h:345
Dolby Vision RPU data header.
Definition dovi_meta.h:87
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVDOVIDecoderConfigurationRecord cfg
Currently active dolby vision configuration, or {0} for none.
Definition dovi_rpu.h:61
AVDOVIColorMetadata * dm
Private fields internal to dovi_rpu.c.
Definition dovi_rpu.h:86
uint8_t * rpu_buf
temporary buffer
Definition dovi_rpu.h:88
const AVDOVIDataMapping * mapping
Currently active data mappings, or NULL.
Definition dovi_rpu.h:74
void * logctx
Definition dovi_rpu.h:43
const AVDOVIColorMetadata * color
Definition dovi_rpu.h:75
unsigned rpu_buf_sz
Definition dovi_rpu.h:89
AVDOVIRpuDataHeader header
Currently active RPU data header, updates on every ff_dovi_rpu_parse() or ff_dovi_rpu_generate().
Definition dovi_rpu.h:67
AVDOVIDataMapping * vdr[DOVI_MAX_DM_ID+1]
RefStruct references.
Definition dovi_rpu.h:87
DOVIExt * ext_blocks
Currently active extension blocks, updates on every ff_dovi_rpu_parse() or ff_dovi_rpu_generate().
Definition dovi_rpu.h:81
int num_dynamic
Definition dovi_rpu.h:39
AVDOVIDmData dm_static[7]
static extension blocks
Definition dovi_rpu.h:36
int num_static
Definition dovi_rpu.h:38
AVDOVIDmData dm_dynamic[25]
dynamic extension blocks
Definition dovi_rpu.h:37
uint8_t level
Definition svq3.c:208