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 "bsf_internal.h"
24 #include "cbs.h"
25 #include "cbs_bsf.h"
26 #include "cbs_h265.h"
27 #include "hevc.h"
28 #include "h265_profile_level.h"
29 
30 enum {
32  LEVEL_AUTO = -1,
33 };
34 
35 typedef struct H265MetadataContext {
37 
39 
40  int aud;
41 
43 
49 
51 
55 
56  int crop_left;
58  int crop_top;
60 
61  int level;
65 
66 
68  const CodedBitstreamFragment *au)
69 {
73  const H265RawHRDParameters *hrd = NULL;
74  int64_t bit_rate = 0;
75  int width = 0, height = 0;
76  int tile_cols = 0, tile_rows = 0;
77  int max_dec_pic_buffering = 0;
78  int i;
79 
80  for (i = 0; i < au->nb_units; i++) {
81  const CodedBitstreamUnit *unit = &au->units[i];
82 
83  if (unit->type == HEVC_NAL_VPS) {
84  const H265RawVPS *vps = unit->content;
85 
86  ptl = &vps->profile_tier_level;
87  max_dec_pic_buffering = vps->vps_max_dec_pic_buffering_minus1[0] + 1;
88 
89  if (vps->vps_num_hrd_parameters > 0)
90  hrd = &vps->hrd_parameters[0];
91 
92  } else if (unit->type == HEVC_NAL_SPS) {
93  const H265RawSPS *sps = unit->content;
94 
95  ptl = &sps->profile_tier_level;
96  max_dec_pic_buffering = sps->sps_max_dec_pic_buffering_minus1[0] + 1;
97 
98  width = sps->pic_width_in_luma_samples;
99  height = sps->pic_height_in_luma_samples;
100 
101  if (sps->vui.vui_hrd_parameters_present_flag)
102  hrd = &sps->vui.hrd_parameters;
103 
104  } else if (unit->type == HEVC_NAL_PPS) {
105  const H265RawPPS *pps = unit->content;
106 
107  if (pps->tiles_enabled_flag) {
108  tile_cols = pps->num_tile_columns_minus1 + 1;
109  tile_rows = pps->num_tile_rows_minus1 + 1;
110  }
111  }
112  }
113 
114  if (hrd) {
116  bit_rate = (hrd->nal_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
117  (INT64_C(1) << hrd->bit_rate_scale + 6);
118  } else if (hrd->vcl_hrd_parameters_present_flag) {
119  bit_rate = (hrd->vcl_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
120  (INT64_C(1) << hrd->bit_rate_scale + 6);
121  // Adjust for VCL vs. NAL limits.
122  bit_rate = bit_rate * 11 / 10;
123  }
124  }
125 
126  desc = ff_h265_guess_level(ptl, bit_rate, width, height,
127  0, tile_rows, tile_cols,
128  max_dec_pic_buffering);
129  if (desc) {
130  av_log(bsf, AV_LOG_DEBUG, "Stream appears to conform to "
131  "level %s.\n", desc->name);
132  ctx->level_guess = desc->level_idc;
133  }
134 }
135 
137  uint8_t *level_idc)
138 {
140 
141  if (ctx->level != LEVEL_UNSET) {
142  if (ctx->level == LEVEL_AUTO) {
143  if (ctx->level_guess) {
144  *level_idc = ctx->level_guess;
145  } else {
146  if (!ctx->level_warned) {
147  av_log(bsf, AV_LOG_WARNING, "Unable to determine level "
148  "of stream: using level 8.5.\n");
149  ctx->level_warned = 1;
150  }
151  *level_idc = 255;
152  }
153  } else {
154  *level_idc = ctx->level;
155  }
156  }
157 }
158 
160  H265RawVPS *vps)
161 {
163 
164  if (ctx->tick_rate.num && ctx->tick_rate.den) {
165  int num, den;
166 
167  av_reduce(&num, &den, ctx->tick_rate.num, ctx->tick_rate.den,
168  UINT32_MAX > INT_MAX ? UINT32_MAX : INT_MAX);
169 
170  vps->vps_time_scale = num;
171  vps->vps_num_units_in_tick = den;
172 
173  vps->vps_timing_info_present_flag = 1;
174 
175  if (ctx->num_ticks_poc_diff_one > 0) {
176  vps->vps_num_ticks_poc_diff_one_minus1 =
177  ctx->num_ticks_poc_diff_one - 1;
178  vps->vps_poc_proportional_to_timing_flag = 1;
179  } else if (ctx->num_ticks_poc_diff_one == 0) {
180  vps->vps_poc_proportional_to_timing_flag = 0;
181  }
182  }
183 
184  h265_metadata_update_level(bsf, &vps->profile_tier_level.general_level_idc);
185 
186  return 0;
187 }
188 
190  H265RawSPS *sps)
191 {
193  int need_vui = 0;
194  int crop_unit_x, crop_unit_y;
195 
196  if (ctx->sample_aspect_ratio.num && ctx->sample_aspect_ratio.den) {
197  // Table E-1.
198  static const AVRational sar_idc[] = {
199  { 0, 0 }, // Unspecified (never written here).
200  { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 },
201  { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 },
202  { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 },
203  { 160, 99 }, { 4, 3 }, { 3, 2 }, { 2, 1 },
204  };
205  int num, den, i;
206 
207  av_reduce(&num, &den, ctx->sample_aspect_ratio.num,
208  ctx->sample_aspect_ratio.den, 65535);
209 
210  for (i = 1; i < FF_ARRAY_ELEMS(sar_idc); i++) {
211  if (num == sar_idc[i].num &&
212  den == sar_idc[i].den)
213  break;
214  }
215  if (i == FF_ARRAY_ELEMS(sar_idc)) {
216  sps->vui.aspect_ratio_idc = 255;
217  sps->vui.sar_width = num;
218  sps->vui.sar_height = den;
219  } else {
220  sps->vui.aspect_ratio_idc = i;
221  }
222  sps->vui.aspect_ratio_info_present_flag = 1;
223  need_vui = 1;
224  }
225 
226 #define SET_OR_INFER(field, value, present_flag, infer) do { \
227  if (value >= 0) { \
228  field = value; \
229  need_vui = 1; \
230  } else if (!present_flag) \
231  field = infer; \
232  } while (0)
233 
234  if (ctx->video_format >= 0 ||
235  ctx->video_full_range_flag >= 0 ||
236  ctx->colour_primaries >= 0 ||
237  ctx->transfer_characteristics >= 0 ||
238  ctx->matrix_coefficients >= 0) {
239 
240  SET_OR_INFER(sps->vui.video_format, ctx->video_format,
241  sps->vui.video_signal_type_present_flag, 5);
242 
243  SET_OR_INFER(sps->vui.video_full_range_flag,
244  ctx->video_full_range_flag,
245  sps->vui.video_signal_type_present_flag, 0);
246 
247  if (ctx->colour_primaries >= 0 ||
248  ctx->transfer_characteristics >= 0 ||
249  ctx->matrix_coefficients >= 0) {
250 
251  SET_OR_INFER(sps->vui.colour_primaries,
252  ctx->colour_primaries,
253  sps->vui.colour_description_present_flag, 2);
254 
255  SET_OR_INFER(sps->vui.transfer_characteristics,
256  ctx->transfer_characteristics,
257  sps->vui.colour_description_present_flag, 2);
258 
259  SET_OR_INFER(sps->vui.matrix_coefficients,
260  ctx->matrix_coefficients,
261  sps->vui.colour_description_present_flag, 2);
262 
263  sps->vui.colour_description_present_flag = 1;
264  }
265  sps->vui.video_signal_type_present_flag = 1;
266  need_vui = 1;
267  }
268 
269  if (ctx->chroma_sample_loc_type >= 0) {
270  sps->vui.chroma_sample_loc_type_top_field =
271  ctx->chroma_sample_loc_type;
272  sps->vui.chroma_sample_loc_type_bottom_field =
273  ctx->chroma_sample_loc_type;
274  sps->vui.chroma_loc_info_present_flag = 1;
275  need_vui = 1;
276  }
277 
278  if (ctx->tick_rate.num && ctx->tick_rate.den) {
279  int num, den;
280 
281  av_reduce(&num, &den, ctx->tick_rate.num, ctx->tick_rate.den,
282  UINT32_MAX > INT_MAX ? UINT32_MAX : INT_MAX);
283 
284  sps->vui.vui_time_scale = num;
285  sps->vui.vui_num_units_in_tick = den;
286 
287  sps->vui.vui_timing_info_present_flag = 1;
288  need_vui = 1;
289 
290  if (ctx->num_ticks_poc_diff_one > 0) {
291  sps->vui.vui_num_ticks_poc_diff_one_minus1 =
292  ctx->num_ticks_poc_diff_one - 1;
293  sps->vui.vui_poc_proportional_to_timing_flag = 1;
294  } else if (ctx->num_ticks_poc_diff_one == 0) {
295  sps->vui.vui_poc_proportional_to_timing_flag = 0;
296  }
297  }
298 
299  if (sps->separate_colour_plane_flag || sps->chroma_format_idc == 0) {
300  crop_unit_x = 1;
301  crop_unit_y = 1;
302  } else {
303  crop_unit_x = 1 + (sps->chroma_format_idc < 3);
304  crop_unit_y = 1 + (sps->chroma_format_idc < 2);
305  }
306 #define CROP(border, unit) do { \
307  if (ctx->crop_ ## border >= 0) { \
308  if (ctx->crop_ ## border % unit != 0) { \
309  av_log(bsf, AV_LOG_ERROR, "Invalid value for crop_%s: " \
310  "must be a multiple of %d.\n", #border, unit); \
311  return AVERROR(EINVAL); \
312  } \
313  sps->conf_win_ ## border ## _offset = \
314  ctx->crop_ ## border / unit; \
315  sps->conformance_window_flag = 1; \
316  } \
317  } while (0)
318  CROP(left, crop_unit_x);
319  CROP(right, crop_unit_x);
320  CROP(top, crop_unit_y);
321  CROP(bottom, crop_unit_y);
322 #undef CROP
323 
324  if (need_vui)
325  sps->vui_parameters_present_flag = 1;
326 
327  h265_metadata_update_level(bsf, &sps->profile_tier_level.general_level_idc);
328 
329  return 0;
330 }
331 
334 {
336  int err, i;
337 
338  // If an AUD is present, it must be the first NAL unit.
339  if (au->nb_units && au->units[0].type == HEVC_NAL_AUD) {
340  if (ctx->aud == BSF_ELEMENT_REMOVE)
341  ff_cbs_delete_unit(au, 0);
342  } else {
343  if (pkt && ctx->aud == BSF_ELEMENT_INSERT) {
344  H265RawAUD *aud = &ctx->aud_nal;
345  int pic_type = 0, temporal_id = 8, layer_id = 0;
346 
347  for (i = 0; i < au->nb_units; i++) {
348  const H265RawNALUnitHeader *nal = au->units[i].content;
349  if (!nal)
350  continue;
351  if (nal->nuh_temporal_id_plus1 < temporal_id + 1)
352  temporal_id = nal->nuh_temporal_id_plus1 - 1;
353 
354  if (au->units[i].type <= HEVC_NAL_RSV_VCL31) {
355  const H265RawSlice *slice = au->units[i].content;
356  layer_id = nal->nuh_layer_id;
357  if (slice->header.slice_type == HEVC_SLICE_B &&
358  pic_type < 2)
359  pic_type = 2;
360  if (slice->header.slice_type == HEVC_SLICE_P &&
361  pic_type < 1)
362  pic_type = 1;
363  }
364  }
365 
366  aud->nal_unit_header = (H265RawNALUnitHeader) {
367  .nal_unit_type = HEVC_NAL_AUD,
368  .nuh_layer_id = layer_id,
369  .nuh_temporal_id_plus1 = temporal_id + 1,
370  };
371  aud->pic_type = pic_type;
372 
374  if (err < 0) {
375  av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n");
376  return err;
377  }
378  }
379  }
380 
381  if (ctx->level == LEVEL_AUTO && !ctx->level_guess)
382  h265_metadata_guess_level(bsf, au);
383 
384  for (i = 0; i < au->nb_units; i++) {
385  if (au->units[i].type == HEVC_NAL_VPS) {
386  err = h265_metadata_update_vps(bsf, au->units[i].content);
387  if (err < 0)
388  return err;
389  }
390  if (au->units[i].type == HEVC_NAL_SPS) {
391  err = h265_metadata_update_sps(bsf, au->units[i].content);
392  if (err < 0)
393  return err;
394  }
395  }
396 
397  return 0;
398 }
399 
402  .fragment_name = "access unit",
403  .unit_name = "NAL unit",
404  .update_fragment = &h265_metadata_update_fragment,
405 };
406 
408 {
410 }
411 
412 #define OFFSET(x) offsetof(H265MetadataContext, x)
413 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
414 static const AVOption h265_metadata_options[] = {
415  BSF_ELEMENT_OPTIONS_PIR("aud", "Access Unit Delimiter NAL units",
416  aud, FLAGS),
417 
418  { "sample_aspect_ratio", "Set sample aspect ratio (table E-1)",
419  OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL,
420  { .dbl = 0.0 }, 0, 65535, FLAGS },
421 
422  { "video_format", "Set video format (table E-2)",
423  OFFSET(video_format), AV_OPT_TYPE_INT,
424  { .i64 = -1 }, -1, 7, FLAGS },
425  { "video_full_range_flag", "Set video full range flag",
426  OFFSET(video_full_range_flag), AV_OPT_TYPE_INT,
427  { .i64 = -1 }, -1, 1, FLAGS },
428  { "colour_primaries", "Set colour primaries (table E-3)",
429  OFFSET(colour_primaries), AV_OPT_TYPE_INT,
430  { .i64 = -1 }, -1, 255, FLAGS },
431  { "transfer_characteristics", "Set transfer characteristics (table E-4)",
433  { .i64 = -1 }, -1, 255, FLAGS },
434  { "matrix_coefficients", "Set matrix coefficients (table E-5)",
435  OFFSET(matrix_coefficients), AV_OPT_TYPE_INT,
436  { .i64 = -1 }, -1, 255, FLAGS },
437 
438  { "chroma_sample_loc_type", "Set chroma sample location type (figure E-1)",
439  OFFSET(chroma_sample_loc_type), AV_OPT_TYPE_INT,
440  { .i64 = -1 }, -1, 5, FLAGS },
441 
442  { "tick_rate",
443  "Set VPS and VUI tick rate (time_scale / num_units_in_tick)",
444  OFFSET(tick_rate), AV_OPT_TYPE_RATIONAL,
445  { .dbl = 0.0 }, 0, UINT_MAX, FLAGS },
446  { "num_ticks_poc_diff_one",
447  "Set VPS and VUI number of ticks per POC increment",
448  OFFSET(num_ticks_poc_diff_one), AV_OPT_TYPE_INT,
449  { .i64 = -1 }, -1, INT_MAX, FLAGS },
450 
451  { "crop_left", "Set left border crop offset",
452  OFFSET(crop_left), AV_OPT_TYPE_INT,
453  { .i64 = -1 }, -1, HEVC_MAX_WIDTH, FLAGS },
454  { "crop_right", "Set right border crop offset",
455  OFFSET(crop_right), AV_OPT_TYPE_INT,
456  { .i64 = -1 }, -1, HEVC_MAX_WIDTH, FLAGS },
457  { "crop_top", "Set top border crop offset",
458  OFFSET(crop_top), AV_OPT_TYPE_INT,
459  { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
460  { "crop_bottom", "Set bottom border crop offset",
461  OFFSET(crop_bottom), AV_OPT_TYPE_INT,
462  { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
463 
464  { "level", "Set level (tables A.6 and A.7)",
466  { .i64 = LEVEL_UNSET }, LEVEL_UNSET, 0xff, FLAGS, "level" },
467  { "auto", "Attempt to guess level from stream properties",
469  { .i64 = LEVEL_AUTO }, .flags = FLAGS, .unit = "level" },
470 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
471  { .i64 = value }, .flags = FLAGS, .unit = "level"
472  { LEVEL("1", 30) },
473  { LEVEL("2", 60) },
474  { LEVEL("2.1", 63) },
475  { LEVEL("3", 90) },
476  { LEVEL("3.1", 93) },
477  { LEVEL("4", 120) },
478  { LEVEL("4.1", 123) },
479  { LEVEL("5", 150) },
480  { LEVEL("5.1", 153) },
481  { LEVEL("5.2", 156) },
482  { LEVEL("6", 180) },
483  { LEVEL("6.1", 183) },
484  { LEVEL("6.2", 186) },
485  { LEVEL("8.5", 255) },
486 #undef LEVEL
487 
488  { NULL }
489 };
490 
491 static const AVClass h265_metadata_class = {
492  .class_name = "h265_metadata_bsf",
493  .item_name = av_default_item_name,
494  .option = h265_metadata_options,
495  .version = LIBAVUTIL_VERSION_INT,
496 };
497 
498 static const enum AVCodecID h265_metadata_codec_ids[] = {
500 };
501 
503  .p.name = "hevc_metadata",
504  .p.codec_ids = h265_metadata_codec_ids,
505  .p.priv_class = &h265_metadata_class,
506  .priv_data_size = sizeof(H265MetadataContext),
508  .close = &ff_cbs_bsf_generic_close,
510 };
H265MetadataContext::crop_bottom
int crop_bottom
Definition: h265_metadata_bsf.c:59
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
bsf_internal.h
opt.h
H265MetadataContext::chroma_sample_loc_type
int chroma_sample_loc_type
Definition: h265_metadata_bsf.c:50
H265RawSubLayerHRDParameters::bit_rate_value_minus1
uint32_t bit_rate_value_minus1[HEVC_MAX_CPB_CNT]
Definition: cbs_h265.h:93
ff_hevc_metadata_bsf
const FFBitStreamFilter ff_hevc_metadata_bsf
Definition: h265_metadata_bsf.c:502
CBSBSFType::codec_id
enum AVCodecID codec_id
Definition: cbs_bsf.h:32
OFFSET
#define OFFSET(x)
Definition: h265_metadata_bsf.c:412
H265MetadataContext::transfer_characteristics
int transfer_characteristics
Definition: h265_metadata_bsf.c:47
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:106
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
H265RawSlice::header
H265RawSliceHeader header
Definition: cbs_h265.h:534
level_idc
int level_idc
Definition: h264_levels.c:25
AVOption
AVOption.
Definition: opt.h:251
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:48
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Definition: opt.h:230
h265_metadata_options
static const AVOption h265_metadata_options[]
Definition: h265_metadata_bsf.c:414
H265MetadataContext::aud_nal
H265RawAUD aud_nal
Definition: h265_metadata_bsf.c:38
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
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:136
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:61
H265MetadataContext::crop_left
int crop_left
Definition: h265_metadata_bsf.c:56
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
LEVEL_AUTO
@ LEVEL_AUTO
Definition: h265_metadata_bsf.c:32
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:45
h265_metadata_update_sps
static int h265_metadata_update_sps(AVBSFContext *bsf, H265RawSPS *sps)
Definition: h265_metadata_bsf.c:189
tile_rows
int tile_rows
Definition: h265_levels.c:217
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:400
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:36
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
FFBitStreamFilter
Definition: bsf_internal.h:27
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:740
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
H265MetadataContext::level_warned
int level_warned
Definition: h265_metadata_bsf.c:63
LEVEL_UNSET
@ LEVEL_UNSET
Definition: h265_metadata_bsf.c:31
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
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
H265RawNALUnitHeader
Definition: cbs_h265.h:29
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
H265MetadataContext::level_guess
int level_guess
Definition: h265_metadata_bsf.c:62
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
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:67
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
CBSBSFType
Definition: cbs_bsf.h:31
HEVC_MAX_WIDTH
@ HEVC_MAX_WIDTH
Definition: hevc.h:138
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:165
h265_profile_level.h
H265RawHRDParameters
Definition: cbs_h265.h:100
CROP
#define CROP(border, unit)
height
#define height
H265MetadataContext
Definition: h265_metadata_bsf.c:35
H265MetadataContext::tick_rate
AVRational tick_rate
Definition: h265_metadata_bsf.c:52
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:53
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:269
common.h
H265MetadataContext::video_format
int video_format
Definition: h265_metadata_bsf.c:44
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:226
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:407
HEVC_MAX_HEIGHT
@ HEVC_MAX_HEIGHT
Definition: hevc.h:139
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
HEVC_NAL_VPS
@ HEVC_NAL_VPS
Definition: hevc.h:61
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
H265MetadataContext::colour_primaries
int colour_primaries
Definition: h265_metadata_bsf.c:46
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:491
HEVC_NAL_AUD
@ HEVC_NAL_AUD
Definition: hevc.h:64
FLAGS
#define FLAGS
Definition: h265_metadata_bsf.c:413
h265_metadata_update_vps
static int h265_metadata_update_vps(AVBSFContext *bsf, H265RawVPS *vps)
Definition: h265_metadata_bsf.c:159
H265MetadataContext::crop_top
int crop_top
Definition: h265_metadata_bsf.c:58
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:225
H265MetadataContext::crop_right
int crop_right
Definition: h265_metadata_bsf.c:57
desc
const char * desc
Definition: libsvtav1.c:83
HEVC_NAL_SPS
@ HEVC_NAL_SPS
Definition: hevc.h:62
BSF_ELEMENT_REMOVE
@ BSF_ELEMENT_REMOVE
Definition: cbs_bsf.h:106
AVPacket
This structure stores compressed data.
Definition: packet.h:351
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:27
H265MetadataContext::num_ticks_poc_diff_one
int num_ticks_poc_diff_one
Definition: h265_metadata_bsf.c:54
h265_metadata_update_fragment
static int h265_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *au)
Definition: h265_metadata_bsf.c:332
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
H265MetadataContext::sample_aspect_ratio
AVRational sample_aspect_ratio
Definition: h265_metadata_bsf.c:42
h265_metadata_codec_ids
static enum AVCodecID h265_metadata_codec_ids[]
Definition: h265_metadata_bsf.c:498
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:823
BSF_ELEMENT_INSERT
@ BSF_ELEMENT_INSERT
Definition: cbs_bsf.h:104
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:40