FFmpeg
av1_metadata.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/common.h"
20 #include "libavutil/opt.h"
21 
22 #include "bsf.h"
23 #include "bsf_internal.h"
24 #include "cbs.h"
25 #include "cbs_bsf.h"
26 #include "cbs_av1.h"
27 
28 typedef struct AV1MetadataContext {
30 
31  int td;
33 
37 
40 
43 
46 
47 
50 {
52  AV1RawColorConfig *clc = &seq->color_config;
53  AV1RawTimingInfo *tim = &seq->timing_info;
54 
55  if (ctx->color_primaries >= 0 ||
56  ctx->transfer_characteristics >= 0 ||
57  ctx->matrix_coefficients >= 0) {
59 
60  if (ctx->color_primaries >= 0)
61  clc->color_primaries = ctx->color_primaries;
62  if (ctx->transfer_characteristics >= 0)
63  clc->transfer_characteristics = ctx->transfer_characteristics;
64  if (ctx->matrix_coefficients >= 0)
65  clc->matrix_coefficients = ctx->matrix_coefficients;
66  }
67 
68  if (ctx->color_range >= 0) {
69  if (clc->color_primaries == AVCOL_PRI_BT709 &&
72  av_log(bsf, AV_LOG_WARNING, "Warning: color_range cannot be set "
73  "on RGB streams encoded in BT.709 sRGB.\n");
74  } else {
75  clc->color_range = ctx->color_range;
76  }
77  }
78 
79  if (ctx->chroma_sample_position >= 0) {
80  if (clc->mono_chrome || !clc->subsampling_x || !clc->subsampling_y) {
81  av_log(bsf, AV_LOG_WARNING, "Warning: chroma_sample_position "
82  "can only be set for 4:2:0 streams.\n");
83  } else {
84  clc->chroma_sample_position = ctx->chroma_sample_position;
85  }
86  }
87 
88  if (ctx->tick_rate.num && ctx->tick_rate.den) {
89  int num, den;
90 
91  av_reduce(&num, &den, ctx->tick_rate.num, ctx->tick_rate.den,
92  UINT32_MAX > INT_MAX ? UINT32_MAX : INT_MAX);
93 
94  tim->time_scale = num;
95  tim->num_units_in_display_tick = den;
96  seq->timing_info_present_flag = 1;
97 
98  if (ctx->num_ticks_per_picture > 0) {
99  tim->equal_picture_interval = 1;
101  ctx->num_ticks_per_picture - 1;
102  }
103  }
104 
105  return 0;
106 }
107 
110 {
112  int err, i;
113 
114  for (i = 0; i < frag->nb_units; i++) {
115  if (frag->units[i].type == AV1_OBU_SEQUENCE_HEADER) {
116  AV1RawOBU *obu = frag->units[i].content;
118  if (err < 0)
119  return err;
120  }
121  }
122 
123  // If a Temporal Delimiter is present, it must be the first OBU.
124  if (frag->nb_units && frag->units[0].type == AV1_OBU_TEMPORAL_DELIMITER) {
125  if (ctx->td == BSF_ELEMENT_REMOVE)
126  ff_cbs_delete_unit(frag, 0);
127  } else if (pkt && ctx->td == BSF_ELEMENT_INSERT) {
129  &ctx->td_obu, NULL);
130  if (err < 0) {
131  av_log(bsf, AV_LOG_ERROR, "Failed to insert Temporal Delimiter.\n");
132  return err;
133  }
134  }
135 
136  if (ctx->delete_padding) {
137  for (i = frag->nb_units - 1; i >= 0; i--) {
138  if (frag->units[i].type == AV1_OBU_PADDING)
139  ff_cbs_delete_unit(frag, i);
140  }
141  }
142 
143  return 0;
144 }
145 
148  .fragment_name = "temporal unit",
149  .unit_name = "OBU",
150  .update_fragment = &av1_metadata_update_fragment,
151 };
152 
154 {
156 
157  ctx->td_obu = (AV1RawOBU) {
158  .header.obu_type = AV1_OBU_TEMPORAL_DELIMITER,
159  };
160 
162 }
163 
164 #define OFFSET(x) offsetof(AV1MetadataContext, x)
165 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
166 static const AVOption av1_metadata_options[] = {
167  BSF_ELEMENT_OPTIONS_PIR("td", "Temporal Delimiter OBU",
168  td, FLAGS),
169 
170  { "color_primaries", "Set color primaries (section 6.4.2)",
172  { .i64 = -1 }, -1, 255, FLAGS },
173  { "transfer_characteristics", "Set transfer characteristics (section 6.4.2)",
175  { .i64 = -1 }, -1, 255, FLAGS },
176  { "matrix_coefficients", "Set matrix coefficients (section 6.4.2)",
177  OFFSET(matrix_coefficients), AV_OPT_TYPE_INT,
178  { .i64 = -1 }, -1, 255, FLAGS },
179 
180  { "color_range", "Set color range flag (section 6.4.2)",
182  { .i64 = -1 }, -1, 1, FLAGS, .unit = "cr" },
183  { "tv", "TV (limited) range", 0, AV_OPT_TYPE_CONST,
184  { .i64 = 0 }, .flags = FLAGS, .unit = "cr" },
185  { "pc", "PC (full) range", 0, AV_OPT_TYPE_CONST,
186  { .i64 = 1 }, .flags = FLAGS, .unit = "cr" },
187 
188  { "chroma_sample_position", "Set chroma sample position (section 6.4.2)",
189  OFFSET(chroma_sample_position), AV_OPT_TYPE_INT,
190  { .i64 = -1 }, -1, 3, FLAGS, .unit = "csp" },
191  { "unknown", "Unknown chroma sample position", 0, AV_OPT_TYPE_CONST,
192  { .i64 = AV1_CSP_UNKNOWN }, .flags = FLAGS, .unit = "csp" },
193  { "vertical", "Left chroma sample position", 0, AV_OPT_TYPE_CONST,
194  { .i64 = AV1_CSP_VERTICAL }, .flags = FLAGS, .unit = "csp" },
195  { "colocated", "Top-left chroma sample position", 0, AV_OPT_TYPE_CONST,
196  { .i64 = AV1_CSP_COLOCATED }, .flags = FLAGS, .unit = "csp" },
197 
198  { "tick_rate", "Set display tick rate (time_scale / num_units_in_display_tick)",
199  OFFSET(tick_rate), AV_OPT_TYPE_RATIONAL,
200  { .dbl = 0.0 }, 0, UINT_MAX, FLAGS },
201  { "num_ticks_per_picture", "Set display ticks per picture for CFR streams",
202  OFFSET(num_ticks_per_picture), AV_OPT_TYPE_INT,
203  { .i64 = -1 }, -1, INT_MAX, FLAGS },
204 
205  { "delete_padding", "Delete all Padding OBUs",
206  OFFSET(delete_padding), AV_OPT_TYPE_BOOL,
207  { .i64 = 0 }, 0, 1, FLAGS},
208 
209  { NULL }
210 };
211 
212 static const AVClass av1_metadata_class = {
213  .class_name = "av1_metadata_bsf",
214  .item_name = av_default_item_name,
215  .option = av1_metadata_options,
216  .version = LIBAVUTIL_VERSION_INT,
217 };
218 
219 static const enum AVCodecID av1_metadata_codec_ids[] = {
221 };
222 
224  .p.name = "av1_metadata",
225  .p.codec_ids = av1_metadata_codec_ids,
226  .p.priv_class = &av1_metadata_class,
227  .priv_data_size = sizeof(AV1MetadataContext),
229  .close = &ff_cbs_bsf_generic_close,
231 };
AV1RawTimingInfo::num_units_in_display_tick
uint32_t num_units_in_display_tick
Definition: cbs_av1.h:59
AV1RawTimingInfo::time_scale
uint32_t time_scale
Definition: cbs_av1.h:60
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AV1RawOBU::obu
union AV1RawOBU::@65 obu
AV1RawColorConfig::color_primaries
uint8_t color_primaries
Definition: cbs_av1.h:47
av1_metadata_codec_ids
static enum AVCodecID av1_metadata_codec_ids[]
Definition: av1_metadata.c:219
ff_cbs_bsf_generic_init
int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition: cbs_bsf.c:110
bsf_internal.h
opt.h
AV1RawSequenceHeader::timing_info_present_flag
uint8_t timing_info_present_flag
Definition: cbs_av1.h:78
AV1RawSequenceHeader
Definition: cbs_av1.h:73
OFFSET
#define OFFSET(x)
Definition: av1_metadata.c:164
CBSBSFType::codec_id
enum AVCodecID codec_id
Definition: cbs_bsf.h:32
AV1RawColorConfig::color_range
uint8_t color_range
Definition: cbs_av1.h:51
AV1MetadataContext::td
int td
Definition: av1_metadata.c:31
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:107
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
ff_cbs_insert_unit_content
int ff_cbs_insert_unit_content(CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, void *content, void *content_ref)
Insert a new unit into a fragment with the given content.
Definition: cbs.c:783
AVOption
AVOption.
Definition: opt.h:357
AV1RawSequenceHeader::timing_info
AV1RawTimingInfo timing_info
Definition: cbs_av1.h:83
CBSBSFContext
Definition: cbs_bsf.h:53
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:610
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:74
cbs.h
AV1_OBU_TEMPORAL_DELIMITER
@ AV1_OBU_TEMPORAL_DELIMITER
Definition: av1.h:31
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Definition: opt.h:250
AV1MetadataContext::delete_padding
int delete_padding
Definition: av1_metadata.c:44
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
AV1RawColorConfig::subsampling_y
uint8_t subsampling_y
Definition: cbs_av1.h:53
AV1MetadataContext::color_primaries
int color_primaries
Definition: av1_metadata.c:34
AV1RawColorConfig
Definition: cbs_av1.h:41
AVCOL_TRC_IEC61966_2_1
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition: pixfmt.h:594
bsf.h
cbs_bsf.h
AV1_CSP_UNKNOWN
@ AV1_CSP_UNKNOWN
Definition: av1.h:133
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:168
cbs_av1.h
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FLAGS
#define FLAGS
Definition: av1_metadata.c:165
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:122
av1_metadata_update_fragment
static int av1_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *frag)
Definition: av1_metadata.c:108
ctx
AVFormatContext * ctx
Definition: movenc.c:49
ff_av1_metadata_bsf
const FFBitStreamFilter ff_av1_metadata_bsf
Definition: av1_metadata.c:223
AV1RawColorConfig::transfer_characteristics
uint8_t transfer_characteristics
Definition: cbs_av1.h:48
color_range
color_range
Definition: vf_selectivecolor.c:43
AV1MetadataContext::common
CBSBSFContext common
Definition: av1_metadata.c:29
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AV1RawOBU
Definition: cbs_av1.h:400
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AV1RawTimingInfo
Definition: cbs_av1.h:58
FFBitStreamFilter
Definition: bsf_internal.h:27
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:280
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV1_CSP_VERTICAL
@ AV1_CSP_VERTICAL
Definition: av1.h:134
AVCOL_PRI_BT709
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition: pixfmt.h:557
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AV1RawColorConfig::chroma_sample_position
uint8_t chroma_sample_position
Definition: cbs_av1.h:54
BSF_ELEMENT_REMOVE
@ BSF_ELEMENT_REMOVE
Definition: cbs_bsf.h:106
AV1MetadataContext::transfer_characteristics
int transfer_characteristics
Definition: av1_metadata.c:35
av1_metadata_update_sequence_header
static int av1_metadata_update_sequence_header(AVBSFContext *bsf, AV1RawSequenceHeader *seq)
Definition: av1_metadata.c:48
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
av1_metadata_options
static const AVOption av1_metadata_options[]
Definition: av1_metadata.c:166
color_primaries
static const AVColorPrimariesDesc color_primaries[AVCOL_PRI_NB]
Definition: csp.c:76
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
AV1MetadataContext::chroma_sample_position
int chroma_sample_position
Definition: av1_metadata.c:39
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:366
AV1RawTimingInfo::num_ticks_per_picture_minus_1
uint32_t num_ticks_per_picture_minus_1
Definition: cbs_av1.h:63
CBSBSFType
Definition: cbs_bsf.h:31
AV1RawOBU::sequence_header
AV1RawSequenceHeader sequence_header
Definition: cbs_av1.h:406
ff_cbs_bsf_generic_close
void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition: cbs_bsf.c:155
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_NB]
Definition: vf_colorspace.c:166
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
AV1RawColorConfig::color_description_present_flag
uint8_t color_description_present_flag
Definition: cbs_av1.h:46
av1_metadata_init
static int av1_metadata_init(AVBSFContext *bsf)
Definition: av1_metadata.c:153
av1_metadata_class
static const AVClass av1_metadata_class
Definition: av1_metadata.c:212
AV1_OBU_PADDING
@ AV1_OBU_PADDING
Definition: av1.h:39
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
common.h
AV1RawTimingInfo::equal_picture_interval
uint8_t equal_picture_interval
Definition: cbs_av1.h:62
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:128
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:83
ff_cbs_bsf_generic_filter
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition: cbs_bsf.c:61
AV1RawColorConfig::subsampling_x
uint8_t subsampling_x
Definition: cbs_av1.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
av1_metadata_type
static const CBSBSFType av1_metadata_type
Definition: av1_metadata.c:146
AV1MetadataContext::tick_rate
AVRational tick_rate
Definition: av1_metadata.c:41
BSF_ELEMENT_OPTIONS_PIR
#define BSF_ELEMENT_OPTIONS_PIR(name, help, field, opt_flags)
Definition: cbs_bsf.h:112
AV1MetadataContext::matrix_coefficients
int matrix_coefficients
Definition: av1_metadata.c:36
AV1MetadataContext::td_obu
AV1RawOBU td_obu
Definition: av1_metadata.c:32
AV1MetadataContext::color_range
int color_range
Definition: av1_metadata.c:38
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:245
AV1RawColorConfig::mono_chrome
uint8_t mono_chrome
Definition: cbs_av1.h:44
AV1RawColorConfig::matrix_coefficients
uint8_t matrix_coefficients
Definition: cbs_av1.h:49
AV1_CSP_COLOCATED
@ AV1_CSP_COLOCATED
Definition: av1.h:135
AVPacket
This structure stores compressed data.
Definition: packet.h:510
BSF_ELEMENT_INSERT
@ BSF_ELEMENT_INSERT
Definition: cbs_bsf.h:104
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:261
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV1MetadataContext
Definition: av1_metadata.c:28
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:254
AV1MetadataContext::num_ticks_per_picture
int num_ticks_per_picture
Definition: av1_metadata.c:42
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:153
ff_cbs_delete_unit
void ff_cbs_delete_unit(CodedBitstreamFragment *frag, int position)
Delete a unit from a fragment and free all memory it uses.
Definition: cbs.c:860