FFmpeg
h265_metadata_bsf.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 "cbs.h"
24 #include "cbs_bsf.h"
25 #include "cbs_h265.h"
26 #include "hevc.h"
27 #include "h265_profile_level.h"
28 
29 enum {
31  LEVEL_AUTO = -1,
32 };
33 
34 typedef struct H265MetadataContext {
36 
38 
39  int aud;
40 
42 
48 
50 
54 
55  int crop_left;
57  int crop_top;
59 
60  int level;
64 
65 
67  const CodedBitstreamFragment *au)
68 {
72  const H265RawHRDParameters *hrd = NULL;
73  int64_t bit_rate = 0;
74  int width = 0, height = 0;
75  int tile_cols = 0, tile_rows = 0;
76  int max_dec_pic_buffering = 0;
77  int i;
78 
79  for (i = 0; i < au->nb_units; i++) {
80  const CodedBitstreamUnit *unit = &au->units[i];
81 
82  if (unit->type == HEVC_NAL_VPS) {
83  const H265RawVPS *vps = unit->content;
84 
85  ptl = &vps->profile_tier_level;
86  max_dec_pic_buffering = vps->vps_max_dec_pic_buffering_minus1[0] + 1;
87 
88  if (vps->vps_num_hrd_parameters > 0)
89  hrd = &vps->hrd_parameters[0];
90 
91  } else if (unit->type == HEVC_NAL_SPS) {
92  const H265RawSPS *sps = unit->content;
93 
94  ptl = &sps->profile_tier_level;
95  max_dec_pic_buffering = sps->sps_max_dec_pic_buffering_minus1[0] + 1;
96 
97  width = sps->pic_width_in_luma_samples;
98  height = sps->pic_height_in_luma_samples;
99 
100  if (sps->vui.vui_hrd_parameters_present_flag)
101  hrd = &sps->vui.hrd_parameters;
102 
103  } else if (unit->type == HEVC_NAL_PPS) {
104  const H265RawPPS *pps = unit->content;
105 
106  if (pps->tiles_enabled_flag) {
107  tile_cols = pps->num_tile_columns_minus1 + 1;
108  tile_rows = pps->num_tile_rows_minus1 + 1;
109  }
110  }
111  }
112 
113  if (hrd) {
115  bit_rate = (hrd->nal_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
116  (INT64_C(1) << hrd->bit_rate_scale + 6);
117  } else if (hrd->vcl_hrd_parameters_present_flag) {
118  bit_rate = (hrd->vcl_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
119  (INT64_C(1) << hrd->bit_rate_scale + 6);
120  // Adjust for VCL vs. NAL limits.
121  bit_rate = bit_rate * 11 / 10;
122  }
123  }
124 
125  desc = ff_h265_guess_level(ptl, bit_rate, width, height,
126  0, tile_rows, tile_cols,
127  max_dec_pic_buffering);
128  if (desc) {
129  av_log(bsf, AV_LOG_DEBUG, "Stream appears to conform to "
130  "level %s.\n", desc->name);
131  ctx->level_guess = desc->level_idc;
132  }
133 }
134 
136  uint8_t *level_idc)
137 {
139 
140  if (ctx->level != LEVEL_UNSET) {
141  if (ctx->level == LEVEL_AUTO) {
142  if (ctx->level_guess) {
143  *level_idc = ctx->level_guess;
144  } else {
145  if (!ctx->level_warned) {
146  av_log(bsf, AV_LOG_WARNING, "Unable to determine level "
147  "of stream: using level 8.5.\n");
148  ctx->level_warned = 1;
149  }
150  *level_idc = 255;
151  }
152  } else {
153  *level_idc = ctx->level;
154  }
155  }
156 }
157 
159  H265RawVPS *vps)
160 {
162 
163  if (ctx->tick_rate.num && ctx->tick_rate.den) {
164  int num, den;
165 
166  av_reduce(&num, &den, ctx->tick_rate.num, ctx->tick_rate.den,
167  UINT32_MAX > INT_MAX ? UINT32_MAX : INT_MAX);
168 
169  vps->vps_time_scale = num;
170  vps->vps_num_units_in_tick = den;
171 
172  vps->vps_timing_info_present_flag = 1;
173 
174  if (ctx->num_ticks_poc_diff_one > 0) {
175  vps->vps_num_ticks_poc_diff_one_minus1 =
176  ctx->num_ticks_poc_diff_one - 1;
177  vps->vps_poc_proportional_to_timing_flag = 1;
178  } else if (ctx->num_ticks_poc_diff_one == 0) {
179  vps->vps_poc_proportional_to_timing_flag = 0;
180  }
181  }
182 
183  h265_metadata_update_level(bsf, &vps->profile_tier_level.general_level_idc);
184 
185  return 0;
186 }
187 
189  H265RawSPS *sps)
190 {
192  int need_vui = 0;
193  int crop_unit_x, crop_unit_y;
194 
195  if (ctx->sample_aspect_ratio.num && ctx->sample_aspect_ratio.den) {
196  // Table E-1.
197  static const AVRational sar_idc[] = {
198  { 0, 0 }, // Unspecified (never written here).
199  { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 },
200  { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 },
201  { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 },
202  { 160, 99 }, { 4, 3 }, { 3, 2 }, { 2, 1 },
203  };
204  int num, den, i;
205 
206  av_reduce(&num, &den, ctx->sample_aspect_ratio.num,
207  ctx->sample_aspect_ratio.den, 65535);
208 
209  for (i = 1; i < FF_ARRAY_ELEMS(sar_idc); i++) {
210  if (num == sar_idc[i].num &&
211  den == sar_idc[i].den)
212  break;
213  }
214  if (i == FF_ARRAY_ELEMS(sar_idc)) {
215  sps->vui.aspect_ratio_idc = 255;
216  sps->vui.sar_width = num;
217  sps->vui.sar_height = den;
218  } else {
219  sps->vui.aspect_ratio_idc = i;
220  }
221  sps->vui.aspect_ratio_info_present_flag = 1;
222  need_vui = 1;
223  }
224 
225 #define SET_OR_INFER(field, value, present_flag, infer) do { \
226  if (value >= 0) { \
227  field = value; \
228  need_vui = 1; \
229  } else if (!present_flag) \
230  field = infer; \
231  } while (0)
232 
233  if (ctx->video_format >= 0 ||
234  ctx->video_full_range_flag >= 0 ||
235  ctx->colour_primaries >= 0 ||
236  ctx->transfer_characteristics >= 0 ||
237  ctx->matrix_coefficients >= 0) {
238 
239  SET_OR_INFER(sps->vui.video_format, ctx->video_format,
240  sps->vui.video_signal_type_present_flag, 5);
241 
242  SET_OR_INFER(sps->vui.video_full_range_flag,
243  ctx->video_full_range_flag,
244  sps->vui.video_signal_type_present_flag, 0);
245 
246  if (ctx->colour_primaries >= 0 ||
247  ctx->transfer_characteristics >= 0 ||
248  ctx->matrix_coefficients >= 0) {
249 
250  SET_OR_INFER(sps->vui.colour_primaries,
251  ctx->colour_primaries,
252  sps->vui.colour_description_present_flag, 2);
253 
254  SET_OR_INFER(sps->vui.transfer_characteristics,
255  ctx->transfer_characteristics,
256  sps->vui.colour_description_present_flag, 2);
257 
258  SET_OR_INFER(sps->vui.matrix_coefficients,
259  ctx->matrix_coefficients,
260  sps->vui.colour_description_present_flag, 2);
261 
262  sps->vui.colour_description_present_flag = 1;
263  }
264  sps->vui.video_signal_type_present_flag = 1;
265  need_vui = 1;
266  }
267 
268  if (ctx->chroma_sample_loc_type >= 0) {
269  sps->vui.chroma_sample_loc_type_top_field =
270  ctx->chroma_sample_loc_type;
271  sps->vui.chroma_sample_loc_type_bottom_field =
272  ctx->chroma_sample_loc_type;
273  sps->vui.chroma_loc_info_present_flag = 1;
274  need_vui = 1;
275  }
276 
277  if (ctx->tick_rate.num && ctx->tick_rate.den) {
278  int num, den;
279 
280  av_reduce(&num, &den, ctx->tick_rate.num, ctx->tick_rate.den,
281  UINT32_MAX > INT_MAX ? UINT32_MAX : INT_MAX);
282 
283  sps->vui.vui_time_scale = num;
284  sps->vui.vui_num_units_in_tick = den;
285 
286  sps->vui.vui_timing_info_present_flag = 1;
287  need_vui = 1;
288 
289  if (ctx->num_ticks_poc_diff_one > 0) {
290  sps->vui.vui_num_ticks_poc_diff_one_minus1 =
291  ctx->num_ticks_poc_diff_one - 1;
292  sps->vui.vui_poc_proportional_to_timing_flag = 1;
293  } else if (ctx->num_ticks_poc_diff_one == 0) {
294  sps->vui.vui_poc_proportional_to_timing_flag = 0;
295  }
296  }
297 
298  if (sps->separate_colour_plane_flag || sps->chroma_format_idc == 0) {
299  crop_unit_x = 1;
300  crop_unit_y = 1;
301  } else {
302  crop_unit_x = 1 + (sps->chroma_format_idc < 3);
303  crop_unit_y = 1 + (sps->chroma_format_idc < 2);
304  }
305 #define CROP(border, unit) do { \
306  if (ctx->crop_ ## border >= 0) { \
307  if (ctx->crop_ ## border % unit != 0) { \
308  av_log(bsf, AV_LOG_ERROR, "Invalid value for crop_%s: " \
309  "must be a multiple of %d.\n", #border, unit); \
310  return AVERROR(EINVAL); \
311  } \
312  sps->conf_win_ ## border ## _offset = \
313  ctx->crop_ ## border / unit; \
314  sps->conformance_window_flag = 1; \
315  } \
316  } while (0)
317  CROP(left, crop_unit_x);
318  CROP(right, crop_unit_x);
319  CROP(top, crop_unit_y);
320  CROP(bottom, crop_unit_y);
321 #undef CROP
322 
323  if (need_vui)
324  sps->vui_parameters_present_flag = 1;
325 
326  h265_metadata_update_level(bsf, &sps->profile_tier_level.general_level_idc);
327 
328  return 0;
329 }
330 
333 {
335  int err, i;
336 
337  // If an AUD is present, it must be the first NAL unit.
338  if (au->nb_units && au->units[0].type == HEVC_NAL_AUD) {
339  if (ctx->aud == BSF_ELEMENT_REMOVE)
340  ff_cbs_delete_unit(au, 0);
341  } else {
342  if (pkt && ctx->aud == BSF_ELEMENT_INSERT) {
343  H265RawAUD *aud = &ctx->aud_nal;
344  int pic_type = 0, temporal_id = 8, layer_id = 0;
345 
346  for (i = 0; i < au->nb_units; i++) {
347  const H265RawNALUnitHeader *nal = au->units[i].content;
348  if (!nal)
349  continue;
350  if (nal->nuh_temporal_id_plus1 < temporal_id + 1)
351  temporal_id = nal->nuh_temporal_id_plus1 - 1;
352 
353  if (au->units[i].type <= HEVC_NAL_RSV_VCL31) {
354  const H265RawSlice *slice = au->units[i].content;
355  layer_id = nal->nuh_layer_id;
356  if (slice->header.slice_type == HEVC_SLICE_B &&
357  pic_type < 2)
358  pic_type = 2;
359  if (slice->header.slice_type == HEVC_SLICE_P &&
360  pic_type < 1)
361  pic_type = 1;
362  }
363  }
364 
365  aud->nal_unit_header = (H265RawNALUnitHeader) {
366  .nal_unit_type = HEVC_NAL_AUD,
367  .nuh_layer_id = layer_id,
368  .nuh_temporal_id_plus1 = temporal_id + 1,
369  };
370  aud->pic_type = pic_type;
371 
373  if (err < 0) {
374  av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n");
375  return err;
376  }
377  }
378  }
379 
380  if (ctx->level == LEVEL_AUTO && !ctx->level_guess)
381  h265_metadata_guess_level(bsf, au);
382 
383  for (i = 0; i < au->nb_units; i++) {
384  if (au->units[i].type == HEVC_NAL_VPS) {
385  err = h265_metadata_update_vps(bsf, au->units[i].content);
386  if (err < 0)
387  return err;
388  }
389  if (au->units[i].type == HEVC_NAL_SPS) {
390  err = h265_metadata_update_sps(bsf, au->units[i].content);
391  if (err < 0)
392  return err;
393  }
394  }
395 
396  return 0;
397 }
398 
401  .fragment_name = "access unit",
402  .unit_name = "NAL unit",
403  .update_fragment = &h265_metadata_update_fragment,
404 };
405 
407 {
409 }
410 
411 #define OFFSET(x) offsetof(H265MetadataContext, x)
412 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
413 static const AVOption h265_metadata_options[] = {
414  BSF_ELEMENT_OPTIONS_PIR("aud", "Access Unit Delimiter NAL units",
415  aud, FLAGS),
416 
417  { "sample_aspect_ratio", "Set sample aspect ratio (table E-1)",
418  OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL,
419  { .dbl = 0.0 }, 0, 65535, FLAGS },
420 
421  { "video_format", "Set video format (table E-2)",
422  OFFSET(video_format), AV_OPT_TYPE_INT,
423  { .i64 = -1 }, -1, 7, FLAGS },
424  { "video_full_range_flag", "Set video full range flag",
425  OFFSET(video_full_range_flag), AV_OPT_TYPE_INT,
426  { .i64 = -1 }, -1, 1, FLAGS },
427  { "colour_primaries", "Set colour primaries (table E-3)",
428  OFFSET(colour_primaries), AV_OPT_TYPE_INT,
429  { .i64 = -1 }, -1, 255, FLAGS },
430  { "transfer_characteristics", "Set transfer characteristics (table E-4)",
432  { .i64 = -1 }, -1, 255, FLAGS },
433  { "matrix_coefficients", "Set matrix coefficients (table E-5)",
434  OFFSET(matrix_coefficients), AV_OPT_TYPE_INT,
435  { .i64 = -1 }, -1, 255, FLAGS },
436 
437  { "chroma_sample_loc_type", "Set chroma sample location type (figure E-1)",
438  OFFSET(chroma_sample_loc_type), AV_OPT_TYPE_INT,
439  { .i64 = -1 }, -1, 6, FLAGS },
440 
441  { "tick_rate",
442  "Set VPS and VUI tick rate (time_scale / num_units_in_tick)",
443  OFFSET(tick_rate), AV_OPT_TYPE_RATIONAL,
444  { .dbl = 0.0 }, 0, UINT_MAX, FLAGS },
445  { "num_ticks_poc_diff_one",
446  "Set VPS and VUI number of ticks per POC increment",
447  OFFSET(num_ticks_poc_diff_one), AV_OPT_TYPE_INT,
448  { .i64 = -1 }, -1, INT_MAX, FLAGS },
449 
450  { "crop_left", "Set left border crop offset",
451  OFFSET(crop_left), AV_OPT_TYPE_INT,
452  { .i64 = -1 }, -1, HEVC_MAX_WIDTH, FLAGS },
453  { "crop_right", "Set right border crop offset",
454  OFFSET(crop_right), AV_OPT_TYPE_INT,
455  { .i64 = -1 }, -1, HEVC_MAX_WIDTH, FLAGS },
456  { "crop_top", "Set top border crop offset",
457  OFFSET(crop_top), AV_OPT_TYPE_INT,
458  { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
459  { "crop_bottom", "Set bottom border crop offset",
460  OFFSET(crop_bottom), AV_OPT_TYPE_INT,
461  { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
462 
463  { "level", "Set level (tables A.6 and A.7)",
465  { .i64 = LEVEL_UNSET }, LEVEL_UNSET, 0xff, FLAGS, "level" },
466  { "auto", "Attempt to guess level from stream properties",
468  { .i64 = LEVEL_AUTO }, .flags = FLAGS, .unit = "level" },
469 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
470  { .i64 = value }, .flags = FLAGS, .unit = "level"
471  { LEVEL("1", 30) },
472  { LEVEL("2", 60) },
473  { LEVEL("2.1", 63) },
474  { LEVEL("3", 90) },
475  { LEVEL("3.1", 93) },
476  { LEVEL("4", 120) },
477  { LEVEL("4.1", 123) },
478  { LEVEL("5", 150) },
479  { LEVEL("5.1", 153) },
480  { LEVEL("5.2", 156) },
481  { LEVEL("6", 180) },
482  { LEVEL("6.1", 183) },
483  { LEVEL("6.2", 186) },
484  { LEVEL("8.5", 255) },
485 #undef LEVEL
486 
487  { NULL }
488 };
489 
490 static const AVClass h265_metadata_class = {
491  .class_name = "h265_metadata_bsf",
492  .item_name = av_default_item_name,
493  .option = h265_metadata_options,
494  .version = LIBAVUTIL_VERSION_INT,
495 };
496 
497 static const enum AVCodecID h265_metadata_codec_ids[] = {
499 };
500 
502  .name = "hevc_metadata",
503  .priv_data_size = sizeof(H265MetadataContext),
504  .priv_class = &h265_metadata_class,
506  .close = &ff_cbs_bsf_generic_close,
509 };
H265MetadataContext::crop_bottom
int crop_bottom
Definition: h265_metadata_bsf.c:58
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
level
uint8_t level
Definition: svq3.c:204
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
opt.h
H265MetadataContext::chroma_sample_loc_type
int chroma_sample_loc_type
Definition: h265_metadata_bsf.c:49
H265RawSubLayerHRDParameters::bit_rate_value_minus1
uint32_t bit_rate_value_minus1[HEVC_MAX_CPB_CNT]
Definition: cbs_h265.h:93
CBSBSFType::codec_id
enum AVCodecID codec_id
Definition: cbs_bsf.h:32
BSF_ELEMENT_INSERT
@ BSF_ELEMENT_INSERT
Definition: cbs_bsf.h:104
OFFSET
#define OFFSET(x)
Definition: h265_metadata_bsf.c:411
H265MetadataContext::transfer_characteristics
int transfer_characteristics
Definition: h265_metadata_bsf.c:46
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:106
AVBitStreamFilter::name
const char * name
Definition: bsf.h:91
H265RawSlice::header
H265RawSliceHeader header
Definition: cbs_h265.h:534
HEVC_MAX_WIDTH
@ HEVC_MAX_WIDTH
Definition: hevc.h:138
level_idc
int level_idc
Definition: h264_levels.c:25
AVOption
AVOption.
Definition: opt.h:247
H265RawNALUnitHeader::nuh_temporal_id_plus1
uint8_t nuh_temporal_id_plus1
Definition: cbs_h265.h:32
CBSBSFContext
Definition: cbs_bsf.h:53
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:73
cbs.h
cbs_h265.h
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
H265MetadataContext::matrix_coefficients
int matrix_coefficients
Definition: h265_metadata_bsf.c:47
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Definition: opt.h:229
h265_metadata_options
static const AVOption h265_metadata_options[]
Definition: h265_metadata_bsf.c:413
H265MetadataContext::aud_nal
H265RawAUD aud_nal
Definition: h265_metadata_bsf.c:37
AVBSFContext
The bitstream filter state.
Definition: bsf.h:47
CodedBitstreamUnit
Coded bitstream unit structure.
Definition: cbs.h:69
H265LevelDescriptor
Definition: h265_profile_level.h:27
H265RawSPS
Definition: cbs_h265.h:244
h265_metadata_update_level
static void h265_metadata_update_level(AVBSFContext *bsf, uint8_t *level_idc)
Definition: h265_metadata_bsf.c:135
H265RawVPS
Definition: cbs_h265.h:183
init
static int init
Definition: av_tx.c:47
H265RawPPS
Definition: cbs_h265.h:346
bsf.h
cbs_bsf.h
H265RawHRDParameters::vcl_hrd_parameters_present_flag
uint8_t vcl_hrd_parameters_present_flag
Definition: cbs_h265.h:102
H265MetadataContext::level
int level
Definition: h265_metadata_bsf.c:60
H265MetadataContext::crop_left
int crop_left
Definition: h265_metadata_bsf.c:55
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
LEVEL
#define LEVEL(name, value)
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:167
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
ptl
const H265RawProfileTierLevel * ptl
Definition: h265_levels.c:170
ff_h265_guess_level
const H265LevelDescriptor * ff_h265_guess_level(const H265RawProfileTierLevel *ptl, int64_t bitrate, int width, int height, int slice_segments, int tile_rows, int tile_cols, int max_dec_pic_buffering)
Guess the level of a stream from some parameters.
Definition: h265_profile_level.c:162
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:121
width
#define width
HEVC_NAL_RSV_VCL31
@ HEVC_NAL_RSV_VCL31
Definition: hevc.h:60
H265MetadataContext::video_full_range_flag
int video_full_range_flag
Definition: h265_metadata_bsf.c:44
h265_metadata_update_sps
static int h265_metadata_update_sps(AVBSFContext *bsf, H265RawSPS *sps)
Definition: h265_metadata_bsf.c:188
tile_rows
int tile_rows
Definition: h265_levels.c:217
BSF_ELEMENT_REMOVE
@ BSF_ELEMENT_REMOVE
Definition: cbs_bsf.h:106
H265RawHRDParameters::bit_rate_scale
uint8_t bit_rate_scale
Definition: cbs_h265.h:110
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
h265_metadata_type
static const CBSBSFType h265_metadata_type
Definition: h265_metadata_bsf.c:399
ctx
AVFormatContext * ctx
Definition: movenc.c:48
tile_cols
int tile_cols
Definition: h265_levels.c:218
H265MetadataContext::common
CBSBSFContext common
Definition: h265_metadata_bsf.c:35
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
HEVC_SLICE_B
@ HEVC_SLICE_B
Definition: hevc.h:96
NULL
#define NULL
Definition: coverity.c:32
H265RawAUD
Definition: cbs_h265.h:437
HEVC_NAL_PPS
@ HEVC_NAL_PPS
Definition: hevc.h:63
ff_cbs_insert_unit_content
int ff_cbs_insert_unit_content(CodedBitstreamFragment *frag, int position, CodedBitstreamUnitType type, void *content, AVBufferRef *content_buf)
Insert a new unit into a fragment with the given content.
Definition: cbs.c:756
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
H265MetadataContext::level_warned
int level_warned
Definition: h265_metadata_bsf.c:62
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
H265RawSliceHeader::slice_type
uint8_t slice_type
Definition: cbs_h265.h:454
LEVEL_UNSET
@ LEVEL_UNSET
Definition: h265_metadata_bsf.c:30
H265RawNALUnitHeader
Definition: cbs_h265.h:29
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:47
H265MetadataContext::level_guess
int level_guess
Definition: h265_metadata_bsf.c:61
aud
static int FUNC() aud(CodedBitstreamContext *ctx, RWContext *rw, H264RawAUD *current)
Definition: cbs_h264_syntax_template.c:842
h265_metadata_guess_level
static void h265_metadata_guess_level(AVBSFContext *bsf, const CodedBitstreamFragment *au)
Definition: h265_metadata_bsf.c:66
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
CBSBSFType
Definition: cbs_bsf.h:31
ff_cbs_bsf_generic_close
void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition: cbs_bsf.c:150
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_NB]
Definition: vf_colorspace.c:177
h265_profile_level.h
H265RawHRDParameters
Definition: cbs_h265.h:100
CROP
#define CROP(border, unit)
height
#define height
H265MetadataContext
Definition: h265_metadata_bsf.c:34
HEVC_MAX_HEIGHT
@ HEVC_MAX_HEIGHT
Definition: hevc.h:139
H265MetadataContext::tick_rate
AVRational tick_rate
Definition: h265_metadata_bsf.c:51
H265RawNALUnitHeader::nuh_layer_id
uint8_t nuh_layer_id
Definition: cbs_h265.h:31
H265MetadataContext::poc_proportional_to_timing_flag
int poc_proportional_to_timing_flag
Definition: h265_metadata_bsf.c:52
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
common.h
H265MetadataContext::video_format
int video_format
Definition: h265_metadata_bsf.c:43
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:224
HEVC_SLICE_P
@ HEVC_SLICE_P
Definition: hevc.h:97
h265_metadata_init
static int h265_metadata_init(AVBSFContext *bsf)
Definition: h265_metadata_bsf.c:406
H265RawProfileTierLevel
Definition: cbs_h265.h:35
H265RawHRDParameters::nal_hrd_parameters_present_flag
uint8_t nal_hrd_parameters_present_flag
Definition: cbs_h265.h:101
hevc.h
LEVEL_AUTO
@ LEVEL_AUTO
Definition: h265_metadata_bsf.c:31
HEVC_NAL_VPS
@ HEVC_NAL_VPS
Definition: hevc.h:61
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:62
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
H265MetadataContext::colour_primaries
int colour_primaries
Definition: h265_metadata_bsf.c:45
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
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
BSF_ELEMENT_OPTIONS_PIR
#define BSF_ELEMENT_OPTIONS_PIR(name, help, field, opt_flags)
Definition: cbs_bsf.h:112
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
h265_metadata_class
static const AVClass h265_metadata_class
Definition: h265_metadata_bsf.c:490
HEVC_NAL_AUD
@ HEVC_NAL_AUD
Definition: hevc.h:64
FLAGS
#define FLAGS
Definition: h265_metadata_bsf.c:412
AVBitStreamFilter
Definition: bsf.h:90
h265_metadata_update_vps
static int h265_metadata_update_vps(AVBSFContext *bsf, H265RawVPS *vps)
Definition: h265_metadata_bsf.c:158
H265MetadataContext::crop_top
int crop_top
Definition: h265_metadata_bsf.c:57
H265RawHRDParameters::vcl_sub_layer_hrd_parameters
H265RawSubLayerHRDParameters vcl_sub_layer_hrd_parameters[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:124
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
H265MetadataContext::crop_right
int crop_right
Definition: h265_metadata_bsf.c:56
ff_hevc_metadata_bsf
const AVBitStreamFilter ff_hevc_metadata_bsf
Definition: h265_metadata_bsf.c:501
desc
const char * desc
Definition: libsvtav1.c:79
HEVC_NAL_SPS
@ HEVC_NAL_SPS
Definition: hevc.h:62
codec_ids
static enum AVCodecID codec_ids[]
Definition: aac_adtstoasc_bsf.c:148
AVPacket
This structure stores compressed data.
Definition: packet.h:350
H265RawHRDParameters::nal_sub_layer_hrd_parameters
H265RawSubLayerHRDParameters nal_sub_layer_hrd_parameters[HEVC_MAX_SUB_LAYERS]
Definition: cbs_h265.h:123
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
H265MetadataContext::num_ticks_poc_diff_one
int num_ticks_poc_diff_one
Definition: h265_metadata_bsf.c:53
h265_metadata_update_fragment
static int h265_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *au)
Definition: h265_metadata_bsf.c:331
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:233
H265MetadataContext::sample_aspect_ratio
AVRational sample_aspect_ratio
Definition: h265_metadata_bsf.c:41
h265_metadata_codec_ids
static enum AVCodecID h265_metadata_codec_ids[]
Definition: h265_metadata_bsf.c:497
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:152
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:831
H265RawSlice
Definition: cbs_h265.h:533
SET_OR_INFER
#define SET_OR_INFER(field, value, present_flag, infer)
H265MetadataContext::aud
int aud
Definition: h265_metadata_bsf.c:39