FFmpeg
dovi_rpu.c
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 #include "libavutil/buffer.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/crc.h"
27 
28 #include "avcodec.h"
29 #include "dovi_rpu.h"
30 #include "golomb.h"
31 #include "get_bits.h"
32 #include "refstruct.h"
33 
34 enum {
37 };
38 
39 /**
40  * Private contents of vdr.
41  */
42 typedef struct DOVIVdr {
45 } DOVIVdr;
46 
48 {
49  for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++)
50  ff_refstruct_unref(&s->vdr[i]);
51  ff_refstruct_unref(&s->ext_blocks);
52  av_free(s->rpu_buf);
53 
54  *s = (DOVIContext) {
55  .logctx = s->logctx,
56  };
57 }
58 
60 {
61  for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++)
62  ff_refstruct_unref(&s->vdr[i]);
63  ff_refstruct_unref(&s->ext_blocks);
64 
65  *s = (DOVIContext) {
66  .logctx = s->logctx,
67  .dv_profile = s->dv_profile,
68  /* preserve temporary buffer */
69  .rpu_buf = s->rpu_buf,
70  .rpu_buf_sz = s->rpu_buf_sz,
71  };
72 }
73 
75 {
76  s->logctx = s0->logctx;
77  s->mapping = s0->mapping;
78  s->color = s0->color;
79  s->dv_profile = s0->dv_profile;
80  for (int i = 0; i <= DOVI_MAX_DM_ID; i++)
81  ff_refstruct_replace(&s->vdr[i], s0->vdr[i]);
82  ff_refstruct_replace(&s->ext_blocks, s0->ext_blocks);
83 }
84 
86 {
87  if (!cfg)
88  return;
89 
90  s->dv_profile = cfg->dv_profile;
91 }
92 
94 {
95  AVFrameSideData *sd;
96  AVBufferRef *buf;
97  AVDOVIMetadata *dovi;
98  size_t dovi_size, ext_sz;
99 
100  if (!s->mapping || !s->color)
101  return 0; /* incomplete dovi metadata */
102 
103  dovi = av_dovi_metadata_alloc(&dovi_size);
104  if (!dovi)
105  return AVERROR(ENOMEM);
106 
107  buf = av_buffer_create((uint8_t *) dovi, dovi_size, NULL, NULL, 0);
108  if (!buf) {
109  av_free(dovi);
110  return AVERROR(ENOMEM);
111  }
112 
114  if (!sd) {
115  av_buffer_unref(&buf);
116  return AVERROR(ENOMEM);
117  }
118 
119  /* Copy only the parts of these structs known to us at compiler-time. */
120 #define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last))
121  COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, disable_residual_flag);
122  COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots);
123  COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal);
124  ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size);
125  for (int i = 0; i < s->num_ext_blocks; i++)
126  memcpy(av_dovi_get_ext(dovi, i), &s->ext_blocks[i], ext_sz);
127  dovi->num_ext_blocks = s->num_ext_blocks;
128  return 0;
129 }
130 
131 static int guess_profile(const AVDOVIRpuDataHeader *hdr)
132 {
133  switch (hdr->vdr_rpu_profile) {
134  case 0:
135  if (hdr->bl_video_full_range_flag)
136  return 5;
137  break;
138  case 1:
140  if (hdr->vdr_bit_depth == 12) {
141  return 7;
142  } else {
143  return 4;
144  }
145  } else {
146  return 8;
147  }
148  }
149 
150  return 0; /* unknown */
151 }
152 
153 static inline uint64_t get_ue_coef(GetBitContext *gb, const AVDOVIRpuDataHeader *hdr)
154 {
155  uint64_t ipart;
156  union { uint32_t u32; float f32; } fpart;
157 
158  switch (hdr->coef_data_type) {
159  case RPU_COEFF_FIXED:
160  ipart = get_ue_golomb_long(gb);
161  fpart.u32 = get_bits_long(gb, hdr->coef_log2_denom);
162  return (ipart << hdr->coef_log2_denom) | fpart.u32;
163 
164  case RPU_COEFF_FLOAT:
165  fpart.u32 = get_bits_long(gb, 32);
166  return fpart.f32 * (1LL << hdr->coef_log2_denom);
167  }
168 
169  return 0; /* unreachable */
170 }
171 
172 static inline int64_t get_se_coef(GetBitContext *gb, const AVDOVIRpuDataHeader *hdr)
173 {
174  int64_t ipart;
175  union { uint32_t u32; float f32; } fpart;
176 
177  switch (hdr->coef_data_type) {
178  case RPU_COEFF_FIXED:
179  ipart = get_se_golomb_long(gb);
180  fpart.u32 = get_bits_long(gb, hdr->coef_log2_denom);
181  return ipart * (1LL << hdr->coef_log2_denom) | fpart.u32;
182 
183  case RPU_COEFF_FLOAT:
184  fpart.u32 = get_bits_long(gb, 32);
185  return fpart.f32 * (1LL << hdr->coef_log2_denom);
186  }
187 
188  return 0; /* unreachable */
189 }
190 
191 static inline unsigned get_variable_bits(GetBitContext *gb, int n)
192 {
193  unsigned int value = get_bits(gb, n);
194  int read_more = get_bits1(gb);
195  while (read_more) {
196  value = (value + 1) << n;
197  value |= get_bits(gb, n);
198  read_more = get_bits1(gb);
199  }
200  return value;
201 }
202 
203 #define VALIDATE(VAR, MIN, MAX) \
204  do { \
205  if (VAR < MIN || VAR > MAX) { \
206  av_log(s->logctx, AV_LOG_ERROR, "RPU validation failed: " \
207  #MIN" <= "#VAR" = %d <= "#MAX"\n", (int) VAR); \
208  goto fail; \
209  } \
210  } while (0)
211 
213 {
214  switch (dm->level) {
215  case 1:
216  dm->l1.min_pq = get_bits(gb, 12);
217  dm->l1.max_pq = get_bits(gb, 12);
218  dm->l1.avg_pq = get_bits(gb, 12);
219  break;
220  case 2:
221  dm->l2.target_max_pq = get_bits(gb, 12);
222  dm->l2.trim_slope = get_bits(gb, 12);
223  dm->l2.trim_offset = get_bits(gb, 12);
224  dm->l2.trim_power = get_bits(gb, 12);
225  dm->l2.trim_chroma_weight = get_bits(gb, 12);
226  dm->l2.trim_saturation_gain = get_bits(gb, 12);
227  dm->l2.ms_weight = get_bits(gb, 13) - 8192;
228  break;
229  case 4:
230  dm->l4.anchor_pq = get_bits(gb, 12);
231  dm->l4.anchor_power = get_bits(gb, 12);
232  break;
233  case 5:
234  dm->l5.left_offset = get_bits(gb, 13);
235  dm->l5.right_offset = get_bits(gb, 13);
236  dm->l5.top_offset = get_bits(gb, 13);
237  dm->l5.bottom_offset = get_bits(gb, 13);
238  break;
239  case 6:
240  dm->l6.max_luminance = get_bits(gb, 16);
241  dm->l6.min_luminance = get_bits(gb, 16);
242  dm->l6.max_cll = get_bits(gb, 16);
243  dm->l6.max_fall = get_bits(gb, 16);
244  break;
245  case 255:
246  dm->l255.dm_run_mode = get_bits(gb, 8);
247  dm->l255.dm_run_version = get_bits(gb, 8);
248  for (int i = 0; i < 4; i++)
249  dm->l255.dm_debug[i] = get_bits(gb, 8);
250  break;
251  default:
252  av_log(s->logctx, AV_LOG_WARNING,
253  "Unknown Dolby Vision DM v1 level: %u\n", dm->level);
254  }
255 }
256 
258 {
259  AVCIExy xy;
260  const int denom = 32767;
261  xy.x = av_make_q(get_sbits(gb, 16), denom);
262  xy.y = av_make_q(get_sbits(gb, 16), denom);
263  return xy;
264 }
265 
267  int ext_block_length)
268 {
269  switch (dm->level) {
270  case 3:
271  dm->l3.min_pq_offset = get_bits(gb, 12);
272  dm->l3.max_pq_offset = get_bits(gb, 12);
273  dm->l3.avg_pq_offset = get_bits(gb, 12);
274  break;
275  case 8:
276  dm->l8.target_display_index = get_bits(gb, 8);
277  dm->l8.trim_slope = get_bits(gb, 12);
278  dm->l8.trim_offset = get_bits(gb, 12);
279  dm->l8.trim_power = get_bits(gb, 12);
280  dm->l8.trim_chroma_weight = get_bits(gb, 12);
281  dm->l8.trim_saturation_gain = get_bits(gb, 12);
282  dm->l8.ms_weight = get_bits(gb, 12) - 8192;
283  if (ext_block_length < 12)
284  break;
285  dm->l8.target_mid_contrast = get_bits(gb, 12);
286  if (ext_block_length < 13)
287  break;
288  dm->l8.clip_trim = get_bits(gb, 12);
289  if (ext_block_length < 19)
290  break;
291  for (int i = 0; i < 6; i++)
292  dm->l8.saturation_vector_field[i] = get_bits(gb, 8);
293  if (ext_block_length < 25)
294  break;
295  for (int i = 0; i < 6; i++)
296  dm->l8.hue_vector_field[i] = get_bits(gb, 8);
297  break;
298  case 9:
299  dm->l9.source_primary_index = get_bits(gb, 8);
300  if (ext_block_length < 17)
301  break;
306  break;
307  case 10:
308  dm->l10.target_display_index = get_bits(gb, 8);
309  dm->l10.target_max_pq = get_bits(gb, 12);
310  dm->l10.target_min_pq = get_bits(gb, 12);
311  dm->l10.target_primary_index = get_bits(gb, 8);
312  if (ext_block_length < 21)
313  break;
318  break;
319  case 11:
320  dm->l11.content_type = get_bits(gb, 8);
321  dm->l11.whitepoint = get_bits(gb, 4);
323  skip_bits(gb, 3); /* reserved */
324  dm->l11.sharpness = get_bits(gb, 2);
325  dm->l11.noise_reduction = get_bits(gb, 2);
326  dm->l11.mpeg_noise_reduction = get_bits(gb, 2);
327  dm->l11.frame_rate_conversion = get_bits(gb, 2);
328  dm->l11.brightness = get_bits(gb, 2);
329  dm->l11.color = get_bits(gb, 2);
330  break;
331  case 254:
332  dm->l254.dm_mode = get_bits(gb, 8);
333  dm->l254.dm_version_index = get_bits(gb, 8);
334  break;
335  default:
336  av_log(s->logctx, AV_LOG_WARNING,
337  "Unknown Dolby Vision DM v2 level: %u\n", dm->level);
338  }
339 }
340 
341 static int parse_ext_blocks(DOVIContext *s, GetBitContext *gb, int ver)
342 {
343  int num_ext_blocks, ext_block_length, start_pos, parsed_bits;
344 
345  num_ext_blocks = get_ue_golomb_31(gb);
346  align_get_bits(gb);
347  if (s->num_ext_blocks + num_ext_blocks > AV_DOVI_MAX_EXT_BLOCKS)
348  return AVERROR_INVALIDDATA;
349 
350  if (!s->ext_blocks) {
351  s->ext_blocks = ff_refstruct_allocz(sizeof(AVDOVIDmData) * AV_DOVI_MAX_EXT_BLOCKS);
352  if (!s->ext_blocks)
353  return AVERROR(ENOMEM);
354  }
355 
356  while (num_ext_blocks--) {
357  AVDOVIDmData *dm = &s->ext_blocks[s->num_ext_blocks++];
358  ext_block_length = get_ue_golomb_31(gb);
359  dm->level = get_bits(gb, 8);
360  start_pos = get_bits_count(gb);
361 
362  switch (ver) {
363  case 1: parse_ext_v1(s, gb, dm); break;
364  case 2: parse_ext_v2(s, gb, dm, ext_block_length); break;
365  }
366 
367  parsed_bits = get_bits_count(gb) - start_pos;
368  if (parsed_bits > ext_block_length * 8)
369  return AVERROR_INVALIDDATA;
370  skip_bits(gb, ext_block_length * 8 - parsed_bits);
371  }
372 
373  return 0;
374 }
375 
376 int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size,
377  int err_recognition)
378 {
379  AVDOVIRpuDataHeader *hdr = &s->header;
380  GetBitContext *gb = &(GetBitContext){0};
381  DOVIVdr *vdr;
382  int ret;
383 
384  uint8_t rpu_type;
385  uint8_t vdr_seq_info_present;
386  uint8_t vdr_dm_metadata_present;
387  uint8_t use_prev_vdr_rpu;
388  uint8_t use_nlq;
389  uint8_t profile;
390 
391  if (rpu_size < 5)
392  goto fail;
393 
394  /* Container */
395  if (s->dv_profile == 10 /* dav1.10 */) {
396  /* DV inside AV1 re-uses an EMDF container skeleton, but with fixed
397  * values - so we can effectively treat this as a magic byte sequence.
398  *
399  * The exact fields are, as follows:
400  * emdf_version : f(2) = 0
401  * key_id : f(3) = 6
402  * emdf_payload_id : f(5) = 31
403  * emdf_payload_id_ext : var(5) = 225
404  * smploffste : f(1) = 0
405  * duratione : f(1) = 0
406  * groupide : f(1) = 0
407  * codecdatae : f(1) = 0
408  * discard_unknown_payload : f(1) = 1
409  */
410  const unsigned header_magic = 0x01be6841u;
411  unsigned emdf_header, emdf_payload_size, emdf_protection;
412  if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0)
413  return ret;
414  emdf_header = get_bits_long(gb, 27);
415  VALIDATE(emdf_header, header_magic, header_magic);
416  emdf_payload_size = get_variable_bits(gb, 8);
417  VALIDATE(emdf_payload_size, 6, 512);
418  if (emdf_payload_size * 8 > get_bits_left(gb))
419  return AVERROR_INVALIDDATA;
420 
421  /* The payload is not byte-aligned (off by *one* bit, curse Dolby),
422  * so copy into a fresh buffer to preserve byte alignment of the
423  * RPU struct */
424  av_fast_padded_malloc(&s->rpu_buf, &s->rpu_buf_sz, emdf_payload_size);
425  if (!s->rpu_buf)
426  return AVERROR(ENOMEM);
427  for (int i = 0; i < emdf_payload_size; i++)
428  s->rpu_buf[i] = get_bits(gb, 8);
429  rpu = s->rpu_buf;
430  rpu_size = emdf_payload_size;
431 
432  /* Validate EMDF footer */
433  emdf_protection = get_bits(gb, 5 + 12);
434  VALIDATE(emdf_protection, 0x400, 0x400);
435  } else {
436  /* NAL RBSP with prefix and trailing zeroes */
437  VALIDATE(rpu[0], 25, 25); /* NAL prefix */
438  rpu++;
439  rpu_size--;
440  /* Strip trailing padding bytes */
441  while (rpu_size && rpu[rpu_size - 1] == 0)
442  rpu_size--;
443  }
444 
445  if (!rpu_size || rpu[rpu_size - 1] != 0x80)
446  goto fail;
447 
448  if (err_recognition & AV_EF_CRCCHECK) {
450  -1, rpu, rpu_size - 1)); /* exclude 0x80 */
451  if (crc) {
452  av_log(s->logctx, AV_LOG_ERROR, "RPU CRC mismatch: %X\n", crc);
453  if (err_recognition & AV_EF_EXPLODE)
454  goto fail;
455  }
456  }
457 
458  if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0)
459  return ret;
460 
461  /* RPU header */
462  rpu_type = get_bits(gb, 6);
463  if (rpu_type != 2) {
464  av_log(s->logctx, AV_LOG_WARNING, "Unrecognized RPU type "
465  "%"PRIu8", ignoring\n", rpu_type);
466  return 0;
467  }
468 
469  hdr->rpu_type = rpu_type;
470  hdr->rpu_format = get_bits(gb, 11);
471 
472  /* Values specific to RPU type 2 */
473  hdr->vdr_rpu_profile = get_bits(gb, 4);
474  hdr->vdr_rpu_level = get_bits(gb, 4);
475 
476  vdr_seq_info_present = get_bits1(gb);
477  if (vdr_seq_info_present) {
479  hdr->coef_data_type = get_bits(gb, 2);
481  switch (hdr->coef_data_type) {
482  case RPU_COEFF_FIXED:
483  hdr->coef_log2_denom = get_ue_golomb(gb);
484  VALIDATE(hdr->coef_log2_denom, 13, 32);
485  break;
486  case RPU_COEFF_FLOAT:
487  hdr->coef_log2_denom = 32; /* arbitrary, choose maximum precision */
488  break;
489  }
490 
491  hdr->vdr_rpu_normalized_idc = get_bits(gb, 2);
493 
494  if ((hdr->rpu_format & 0x700) == 0) {
495  int bl_bit_depth_minus8 = get_ue_golomb_31(gb);
496  int el_bit_depth_minus8 = get_ue_golomb_31(gb);
497  int vdr_bit_depth_minus8 = get_ue_golomb_31(gb);
498  VALIDATE(bl_bit_depth_minus8, 0, 8);
499  VALIDATE(el_bit_depth_minus8, 0, 8);
500  VALIDATE(vdr_bit_depth_minus8, 0, 8);
501  hdr->bl_bit_depth = bl_bit_depth_minus8 + 8;
502  hdr->el_bit_depth = el_bit_depth_minus8 + 8;
503  hdr->vdr_bit_depth = vdr_bit_depth_minus8 + 8;
505  skip_bits(gb, 3); /* reserved_zero_3bits */
507  hdr->disable_residual_flag = get_bits1(gb);
508  }
509  }
510 
511  if (!hdr->bl_bit_depth) {
512  av_log(s->logctx, AV_LOG_ERROR, "Missing RPU VDR sequence info?\n");
513  goto fail;
514  }
515 
516  vdr_dm_metadata_present = get_bits1(gb);
517  use_prev_vdr_rpu = get_bits1(gb);
518  use_nlq = (hdr->rpu_format & 0x700) == 0 && !hdr->disable_residual_flag;
519 
520  profile = s->dv_profile ? s->dv_profile : guess_profile(hdr);
521  if (profile == 5 && use_nlq) {
522  av_log(s->logctx, AV_LOG_ERROR, "Profile 5 RPUs should not use NLQ\n");
523  goto fail;
524  }
525 
526  if (use_prev_vdr_rpu) {
527  int prev_vdr_rpu_id = get_ue_golomb_31(gb);
528  VALIDATE(prev_vdr_rpu_id, 0, DOVI_MAX_DM_ID);
529  if (!s->vdr[prev_vdr_rpu_id]) {
530  av_log(s->logctx, AV_LOG_ERROR, "Unknown previous RPU ID: %u\n",
531  prev_vdr_rpu_id);
532  goto fail;
533  }
534  vdr = s->vdr[prev_vdr_rpu_id];
535  s->mapping = &vdr->mapping;
536  } else {
537  int vdr_rpu_id = get_ue_golomb_31(gb);
538  VALIDATE(vdr_rpu_id, 0, DOVI_MAX_DM_ID);
539  if (!s->vdr[vdr_rpu_id]) {
540  s->vdr[vdr_rpu_id] = ff_refstruct_allocz(sizeof(DOVIVdr));
541  if (!s->vdr[vdr_rpu_id])
542  return AVERROR(ENOMEM);
543  }
544 
545  vdr = s->vdr[vdr_rpu_id];
546  s->mapping = &vdr->mapping;
547 
548  vdr->mapping.vdr_rpu_id = vdr_rpu_id;
551 
552  for (int c = 0; c < 3; c++) {
553  AVDOVIReshapingCurve *curve = &vdr->mapping.curves[c];
554  int num_pivots_minus_2 = get_ue_golomb_31(gb);
555  int pivot = 0;
556 
557  VALIDATE(num_pivots_minus_2, 0, AV_DOVI_MAX_PIECES - 1);
558  curve->num_pivots = num_pivots_minus_2 + 2;
559  for (int i = 0; i < curve->num_pivots; i++) {
560  pivot += get_bits(gb, hdr->bl_bit_depth);
561  curve->pivots[i] = av_clip_uint16(pivot);
562  }
563  }
564 
565  if (use_nlq) {
566  int nlq_pivot = 0;
567  vdr->mapping.nlq_method_idc = get_bits(gb, 3);
568 
569  for (int i = 0; i < 2; i++) {
570  nlq_pivot += get_bits(gb, hdr->bl_bit_depth);
571  vdr->mapping.nlq_pivots[i] = av_clip_uint16(nlq_pivot);
572  }
573 
574  /**
575  * The patent mentions another legal value, NLQ_MU_LAW, but it's
576  * not documented anywhere how to parse or apply that type of NLQ.
577  */
579  } else {
581  }
582 
585  /* End of rpu_data_header(), start of vdr_rpu_data_payload() */
586 
587  for (int c = 0; c < 3; c++) {
588  AVDOVIReshapingCurve *curve = &vdr->mapping.curves[c];
589  for (int i = 0; i < curve->num_pivots - 1; i++) {
590  int mapping_idc = get_ue_golomb_31(gb);
591  VALIDATE(mapping_idc, 0, 1);
592  curve->mapping_idc[i] = mapping_idc;
593  switch (mapping_idc) {
595  int poly_order_minus1 = get_ue_golomb_31(gb);
596  VALIDATE(poly_order_minus1, 0, 1);
597  curve->poly_order[i] = poly_order_minus1 + 1;
598  if (poly_order_minus1 == 0) {
599  int linear_interp_flag = get_bits1(gb);
600  if (linear_interp_flag) {
601  /* lack of documentation/samples */
602  avpriv_request_sample(s->logctx, "Dolby Vision "
603  "linear interpolation");
605  return AVERROR_PATCHWELCOME;
606  }
607  }
608  for (int k = 0; k <= curve->poly_order[i]; k++)
609  curve->poly_coef[i][k] = get_se_coef(gb, hdr);
610  break;
611  }
612  case AV_DOVI_MAPPING_MMR: {
613  int mmr_order_minus1 = get_bits(gb, 2);
614  VALIDATE(mmr_order_minus1, 0, 2);
615  curve->mmr_order[i] = mmr_order_minus1 + 1;
616  curve->mmr_constant[i] = get_se_coef(gb, hdr);
617  for (int j = 0; j < curve->mmr_order[i]; j++) {
618  for (int k = 0; k < 7; k++)
619  curve->mmr_coef[i][j][k] = get_se_coef(gb, hdr);
620  }
621  break;
622  }
623  }
624  }
625  }
626 
627  if (use_nlq) {
628  for (int c = 0; c < 3; c++) {
629  AVDOVINLQParams *nlq = &vdr->mapping.nlq[c];
630  nlq->nlq_offset = get_bits(gb, hdr->el_bit_depth);
631  nlq->vdr_in_max = get_ue_coef(gb, hdr);
632  switch (vdr->mapping.nlq_method_idc) {
634  nlq->linear_deadzone_slope = get_ue_coef(gb, hdr);
635  nlq->linear_deadzone_threshold = get_ue_coef(gb, hdr);
636  break;
637  }
638  }
639  }
640  }
641 
642  if (vdr_dm_metadata_present) {
644  int affected_dm_id = get_ue_golomb_31(gb);
645  int current_dm_id = get_ue_golomb_31(gb);
646  VALIDATE(affected_dm_id, 0, DOVI_MAX_DM_ID);
647  VALIDATE(current_dm_id, 0, DOVI_MAX_DM_ID);
648  if (!s->vdr[affected_dm_id]) {
649  s->vdr[affected_dm_id] = ff_refstruct_allocz(sizeof(DOVIVdr));
650  if (!s->vdr[affected_dm_id])
651  return AVERROR(ENOMEM);
652  }
653 
654  if (!s->vdr[current_dm_id]) {
655  av_log(s->logctx, AV_LOG_ERROR, "Unknown previous RPU DM ID: %u\n",
656  current_dm_id);
657  goto fail;
658  }
659 
660  /* Update current pointer based on current_dm_id */
661  vdr = s->vdr[current_dm_id];
662  s->color = &vdr->color;
663 
664  /* Update values of affected_dm_id */
665  vdr = s->vdr[affected_dm_id];
666  color = &vdr->color;
667  color->dm_metadata_id = affected_dm_id;
668  color->scene_refresh_flag = get_ue_golomb_31(gb);
669  for (int i = 0; i < 9; i++)
670  color->ycc_to_rgb_matrix[i] = av_make_q(get_sbits(gb, 16), 1 << 13);
671  for (int i = 0; i < 3; i++) {
672  int denom = profile == 4 ? (1 << 30) : (1 << 28);
673  unsigned offset = get_bits_long(gb, 32);
674  if (offset > INT_MAX) {
675  /* Ensure the result fits inside AVRational */
676  offset >>= 1;
677  denom >>= 1;
678  }
679  color->ycc_to_rgb_offset[i] = av_make_q(offset, denom);
680  }
681  for (int i = 0; i < 9; i++)
682  color->rgb_to_lms_matrix[i] = av_make_q(get_sbits(gb, 16), 1 << 14);
683 
684  color->signal_eotf = get_bits(gb, 16);
685  color->signal_eotf_param0 = get_bits(gb, 16);
686  color->signal_eotf_param1 = get_bits(gb, 16);
687  color->signal_eotf_param2 = get_bits_long(gb, 32);
688  color->signal_bit_depth = get_bits(gb, 5);
689  VALIDATE(color->signal_bit_depth, 8, 16);
690  color->signal_color_space = get_bits(gb, 2);
691  color->signal_chroma_format = get_bits(gb, 2);
692  color->signal_full_range_flag = get_bits(gb, 2);
693  color->source_min_pq = get_bits(gb, 12);
694  color->source_max_pq = get_bits(gb, 12);
695  color->source_diagonal = get_bits(gb, 10);
696  }
697 
698  /* Parse extension blocks */
699  s->num_ext_blocks = 0;
700  if ((ret = parse_ext_blocks(s, gb, 1)) < 0) {
702  return ret;
703  }
704 
705  if (get_bits_left(gb) > 48 /* padding + CRC32 + terminator */) {
706  if ((ret = parse_ext_blocks(s, gb, 2)) < 0) {
708  return ret;
709  }
710  }
711 
712  return 0;
713 
714 fail:
715  ff_dovi_ctx_unref(s); /* don't leak potentially invalid state */
716  return AVERROR_INVALIDDATA;
717 }
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVDOVIDataMapping::nlq_method_idc
enum AVDOVINLQMethod nlq_method_idc
Definition: dovi_meta.h:148
AVDOVIDmLevel2::trim_chroma_weight
uint16_t trim_chroma_weight
Definition: dovi_meta.h:205
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
AVDOVIDmLevel8::trim_power
uint16_t trim_power
Definition: dovi_meta.h:242
AVDOVIDmLevel8::saturation_vector_field
uint8_t saturation_vector_field[6]
Definition: dovi_meta.h:248
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVDOVIDmLevel8::trim_offset
uint16_t trim_offset
Definition: dovi_meta.h:241
ff_dovi_ctx_unref
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition: dovi_rpu.c:47
AVColorPrimariesDesc::wp
AVWhitepointCoefficients wp
Definition: csp.h:79
DOVI_MAX_DM_ID
#define DOVI_MAX_DM_ID
Definition: dovi_rpu.h:30
color
Definition: vf_paletteuse.c:512
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:251
get_se_golomb_long
static int get_se_golomb_long(GetBitContext *gb)
Definition: golomb.h:294
AV_DOVI_MAX_EXT_BLOCKS
#define AV_DOVI_MAX_EXT_BLOCKS
Definition: dovi_meta.h:338
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:421
AV_FRAME_DATA_DOVI_METADATA
@ AV_FRAME_DATA_DOVI_METADATA
Parsed Dolby Vision metadata, suitable for passing to a software implementation.
Definition: frame.h:208
AVDOVIDmLevel9::source_display_primaries
AVColorPrimariesDesc source_display_primaries
Definition: dovi_meta.h:255
AVDOVIDmLevel8::trim_saturation_gain
uint16_t trim_saturation_gain
Definition: dovi_meta.h:244
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
AVDOVIDmLevel5::top_offset
uint16_t top_offset
Definition: dovi_meta.h:225
AVDOVIDmLevel11::frame_rate_conversion
uint8_t frame_rate_conversion
Definition: dovi_meta.h:274
RPU_COEFF_FLOAT
@ RPU_COEFF_FLOAT
Definition: dovi_rpu.c:36
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
av_dovi_get_ext
static av_always_inline AVDOVIDmData * av_dovi_get_ext(const AVDOVIMetadata *data, int index)
Definition: dovi_meta.h:360
get_ue_golomb
static int get_ue_golomb(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to 8190.
Definition: golomb.h:53
AVDOVIReshapingCurve::mmr_coef
int64_t mmr_coef[AV_DOVI_MAX_PIECES][3][7]
Definition: dovi_meta.h:116
AVDOVIDmLevel10::target_primary_index
uint8_t target_primary_index
Definition: dovi_meta.h:263
AV_DOVI_NLQ_NONE
@ AV_DOVI_NLQ_NONE
Definition: dovi_meta.h:120
AVDOVIDmLevel8::ms_weight
uint16_t ms_weight
Definition: dovi_meta.h:245
AVDOVIReshapingCurve::mapping_idc
enum AVDOVIMappingMethod mapping_idc[AV_DOVI_MAX_PIECES]
Definition: dovi_meta.h:109
AVDOVIDmLevel6::min_luminance
uint16_t min_luminance
Definition: dovi_meta.h:232
AVDOVIDmLevel10::target_display_index
uint8_t target_display_index
Definition: dovi_meta.h:260
AVDOVIDmLevel1::max_pq
uint16_t max_pq
Definition: dovi_meta.h:195
AVDOVIDmData::l11
AVDOVIDmLevel11 l11
Definition: dovi_meta.h:310
VALIDATE
#define VALIDATE(VAR, MIN, MAX)
Definition: dovi_rpu.c:203
AVDOVIRpuDataHeader::rpu_format
uint16_t rpu_format
Definition: dovi_meta.h:80
AVDOVIDataMapping::mapping_color_space
uint8_t mapping_color_space
Definition: dovi_meta.h:143
AVDOVIRpuDataHeader
Dolby Vision RPU data header.
Definition: dovi_meta.h:78
AVDOVIDmLevel8::hue_vector_field
uint8_t hue_vector_field[6]
Definition: dovi_meta.h:249
AVDOVIRpuDataHeader::coef_data_type
uint8_t coef_data_type
Definition: dovi_meta.h:84
crc.h
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
golomb.h
exp golomb vlc stuff
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
AVDOVIDmLevel11::color
uint8_t color
Definition: dovi_meta.h:276
AVDOVIDmLevel11::reference_mode_flag
uint8_t reference_mode_flag
Definition: dovi_meta.h:270
AVDOVIDmLevel11::brightness
uint8_t brightness
Definition: dovi_meta.h:275
DOVIContext
Definition: dovi_rpu.h:31
fail
#define fail()
Definition: checkasm.h:179
AVDOVIRpuDataHeader::el_bit_depth
uint8_t el_bit_depth
Definition: dovi_meta.h:89
GetBitContext
Definition: get_bits.h:108
AVDOVIDmLevel2::trim_power
uint16_t trim_power
Definition: dovi_meta.h:204
dovi_rpu.h
AVDOVIDmLevel2::trim_slope
uint16_t trim_slope
Definition: dovi_meta.h:202
AVDOVIDmLevel2::ms_weight
int16_t ms_weight
Definition: dovi_meta.h:207
refstruct.h
AVDOVIRpuDataHeader::vdr_rpu_normalized_idc
uint8_t vdr_rpu_normalized_idc
Definition: dovi_meta.h:86
AVDOVIRpuDataHeader::el_spatial_resampling_filter_flag
uint8_t el_spatial_resampling_filter_flag
Definition: dovi_meta.h:92
AVDOVIDmLevel8::clip_trim
uint16_t clip_trim
Definition: dovi_meta.h:247
AVDOVIDmLevel3::avg_pq_offset
uint16_t avg_pq_offset
Definition: dovi_meta.h:213
AVDOVIDmData
Dolby Vision metadata extension block.
Definition: dovi_meta.h:297
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
AVDOVIRpuDataHeader::chroma_resampling_explicit_filter_flag
uint8_t chroma_resampling_explicit_filter_flag
Definition: dovi_meta.h:83
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
AVDOVIDmLevel6::max_cll
uint16_t max_cll
Definition: dovi_meta.h:233
AVDOVIRpuDataHeader::vdr_bit_depth
uint8_t vdr_bit_depth
Definition: dovi_meta.h:90
AVDOVIRpuDataHeader::rpu_type
uint8_t rpu_type
Definition: dovi_meta.h:79
parse_ext_v2
static void parse_ext_v2(DOVIContext *s, GetBitContext *gb, AVDOVIDmData *dm, int ext_block_length)
Definition: dovi_rpu.c:266
AVDOVIMetadata
Combined struct representing a combination of header, mapping and color metadata, for attaching to fr...
Definition: dovi_meta.h:324
AVDOVIDmLevel8::trim_slope
uint16_t trim_slope
Definition: dovi_meta.h:240
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVDOVIDmLevel4::anchor_power
uint16_t anchor_power
Definition: dovi_meta.h:218
AVDOVIReshapingCurve::mmr_order
uint8_t mmr_order[AV_DOVI_MAX_PIECES]
Definition: dovi_meta.h:114
AVDOVIDmData::l3
AVDOVIDmLevel3 l3
Definition: dovi_meta.h:302
AVDOVIDmLevel11::noise_reduction
uint8_t noise_reduction
Definition: dovi_meta.h:272
AVDOVIRpuDataHeader::spatial_resampling_filter_flag
uint8_t spatial_resampling_filter_flag
Definition: dovi_meta.h:91
AVDOVIDmLevel10::target_min_pq
uint16_t target_min_pq
Definition: dovi_meta.h:262
get_cie_xy
static AVCIExy get_cie_xy(GetBitContext *gb)
Definition: dovi_rpu.c:257
get_sbits
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:320
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:57
get_bits.h
AV_DOVI_MAPPING_POLYNOMIAL
@ AV_DOVI_MAPPING_POLYNOMIAL
Definition: dovi_meta.h:97
av_dovi_get_header
static av_always_inline AVDOVIRpuDataHeader * av_dovi_get_header(const AVDOVIMetadata *data)
Definition: dovi_meta.h:342
AVDOVIReshapingCurve::poly_order
uint8_t poly_order[AV_DOVI_MAX_PIECES]
Definition: dovi_meta.h:111
get_se_coef
static int64_t get_se_coef(GetBitContext *gb, const AVDOVIRpuDataHeader *hdr)
Definition: dovi_rpu.c:172
AVDOVINLQParams::linear_deadzone_threshold
uint64_t linear_deadzone_threshold
Definition: dovi_meta.h:133
AVDOVIDmLevel8::target_mid_contrast
uint16_t target_mid_contrast
Definition: dovi_meta.h:246
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
AV_DOVI_MAPPING_MMR
@ AV_DOVI_MAPPING_MMR
Definition: dovi_meta.h:98
AVDOVIDmLevel5::bottom_offset
uint16_t bottom_offset
Definition: dovi_meta.h:226
parse_ext_blocks
static int parse_ext_blocks(DOVIContext *s, GetBitContext *gb, int ver)
Definition: dovi_rpu.c:341
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
ff_dovi_update_cfg
void ff_dovi_update_cfg(DOVIContext *s, const AVDOVIDecoderConfigurationRecord *cfg)
Read the contents of an AVDOVIDecoderConfigurationRecord (usually provided by stream side data) and u...
Definition: dovi_rpu.c:85
AVDOVIDmData::l9
AVDOVIDmLevel9 l9
Definition: dovi_meta.h:308
ff_refstruct_allocz
static void * ff_refstruct_allocz(size_t size)
Equivalent to ff_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
av_frame_new_side_data_from_buf
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
Definition: frame.c:786
AVDOVIDmLevel4::anchor_pq
uint16_t anchor_pq
Definition: dovi_meta.h:217
AVDOVIReshapingCurve::mmr_constant
int64_t mmr_constant[AV_DOVI_MAX_PIECES]
Definition: dovi_meta.h:115
AV_EF_CRCCHECK
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition: defs.h:48
AVDOVIDmLevel9::source_primary_index
uint8_t source_primary_index
Definition: dovi_meta.h:254
AVCIExy
Struct containing chromaticity x and y values for the standard CIE 1931 chromaticity definition.
Definition: csp.h:56
parse_ext_v1
static void parse_ext_v1(DOVIContext *s, GetBitContext *gb, AVDOVIDmData *dm)
Definition: dovi_rpu.c:212
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AVDOVIDmLevel2::target_max_pq
uint16_t target_max_pq
Definition: dovi_meta.h:201
AVDOVIDmLevel6::max_luminance
uint16_t max_luminance
Definition: dovi_meta.h:231
AVCIExy::x
AVRational x
Definition: csp.h:57
AVDOVIDmData::l2
AVDOVIDmLevel2 l2
Definition: dovi_meta.h:301
AVDOVIDataMapping::nlq_pivots
uint16_t nlq_pivots[2]
Definition: dovi_meta.h:152
AVPrimaryCoefficients::b
AVCIExy b
Definition: csp.h:65
AVDOVIDmLevel6::max_fall
uint16_t max_fall
Definition: dovi_meta.h:234
AVPrimaryCoefficients::r
AVCIExy r
Definition: csp.h:65
AVDOVIDmLevel8::target_display_index
uint8_t target_display_index
Definition: dovi_meta.h:239
AVDOVIDmData::l254
AVDOVIDmLevel254 l254
Definition: dovi_meta.h:311
ff_dovi_ctx_flush
void ff_dovi_ctx_flush(DOVIContext *s)
Partially reset the internal state.
Definition: dovi_rpu.c:59
AVDOVIDmLevel10::target_display_primaries
AVColorPrimariesDesc target_display_primaries
Definition: dovi_meta.h:264
DOVIVdr::mapping
AVDOVIDataMapping mapping
Definition: dovi_rpu.c:43
AV_DOVI_NLQ_LINEAR_DZ
@ AV_DOVI_NLQ_LINEAR_DZ
Definition: dovi_meta.h:121
guess_profile
static int guess_profile(const AVDOVIRpuDataHeader *hdr)
Definition: dovi_rpu.c:131
AVDOVIRpuDataHeader::vdr_rpu_profile
uint8_t vdr_rpu_profile
Definition: dovi_meta.h:81
av_bswap32
#define av_bswap32
Definition: bswap.h:28
AVDOVIDmLevel2::trim_saturation_gain
uint16_t trim_saturation_gain
Definition: dovi_meta.h:206
color
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:94
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
AVDOVIDmLevel8::trim_chroma_weight
uint16_t trim_chroma_weight
Definition: dovi_meta.h:243
AVDOVIDmLevel255::dm_run_mode
uint8_t dm_run_mode
Definition: dovi_meta.h:287
av_dovi_metadata_alloc
AVDOVIMetadata * av_dovi_metadata_alloc(size_t *size)
Allocate an AVDOVIMetadata structure and initialize its fields to default values.
Definition: dovi_meta.c:47
AVDOVIDmLevel1::min_pq
uint16_t min_pq
Definition: dovi_meta.h:194
AVPrimaryCoefficients::g
AVCIExy g
Definition: csp.h:65
COPY
#define COPY(t, a, b, last)
get_ue_coef
static uint64_t get_ue_coef(GetBitContext *gb, const AVDOVIRpuDataHeader *hdr)
Definition: dovi_rpu.c:153
AVDOVIDmLevel11::content_type
uint8_t content_type
Definition: dovi_meta.h:268
AVDOVIDmData::l10
AVDOVIDmLevel10 l10
Definition: dovi_meta.h:309
buffer.h
AVDOVIRpuDataHeader::coef_log2_denom
uint8_t coef_log2_denom
Definition: dovi_meta.h:85
AVDOVIRpuDataHeader::bl_video_full_range_flag
uint8_t bl_video_full_range_flag
Definition: dovi_meta.h:87
AVDOVIReshapingCurve::poly_coef
int64_t poly_coef[AV_DOVI_MAX_PIECES][3]
Definition: dovi_meta.h:112
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
AVDOVIDmData::l255
AVDOVIDmLevel255 l255
Definition: dovi_meta.h:312
AVDOVIDmData::l8
AVDOVIDmLevel8 l8
Definition: dovi_meta.h:307
AVDOVIDmLevel2::trim_offset
uint16_t trim_offset
Definition: dovi_meta.h:203
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVDOVIDmLevel10::target_max_pq
uint16_t target_max_pq
Definition: dovi_meta.h:261
AVDOVIDataMapping::num_y_partitions
uint32_t num_y_partitions
Definition: dovi_meta.h:150
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:52
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
get_variable_bits
static unsigned get_variable_bits(GetBitContext *gb, int n)
Definition: dovi_rpu.c:191
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
profile
int profile
Definition: mxfenc.c:2227
AVDOVINLQParams
Coefficients of the non-linear inverse quantization.
Definition: dovi_meta.h:128
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
AVDOVIDmData::l4
AVDOVIDmLevel4 l4
Definition: dovi_meta.h:303
RPU_COEFF_FIXED
@ RPU_COEFF_FIXED
Definition: dovi_rpu.c:35
AVDOVIDmData::l1
AVDOVIDmLevel1 l1
Definition: dovi_meta.h:300
AVDOVIDataMapping::curves
AVDOVIReshapingCurve curves[3]
Definition: dovi_meta.h:145
avcodec.h
AVDOVINLQParams::linear_deadzone_slope
uint64_t linear_deadzone_slope
Definition: dovi_meta.h:132
AVDOVIReshapingCurve
Definition: dovi_meta.h:106
ret
ret
Definition: filter_design.txt:187
AVDOVIDmLevel11::mpeg_noise_reduction
uint8_t mpeg_noise_reduction
Definition: dovi_meta.h:273
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
DOVIVdr
Private contents of vdr.
Definition: dovi_rpu.c:42
AVDOVIDmLevel11::sharpness
uint8_t sharpness
Definition: dovi_meta.h:271
AVDOVINLQParams::vdr_in_max
uint64_t vdr_in_max
Definition: dovi_meta.h:130
AVCIExy::y
AVRational y
Definition: csp.h:57
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:561
ff_refstruct_replace
void ff_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
AVDOVIDmData::l6
AVDOVIDmLevel6 l6
Definition: dovi_meta.h:305
AVDOVIReshapingCurve::num_pivots
uint8_t num_pivots
Definition: dovi_meta.h:107
AVDOVIDmLevel3::min_pq_offset
uint16_t min_pq_offset
Definition: dovi_meta.h:211
AVDOVIRpuDataHeader::vdr_rpu_level
uint8_t vdr_rpu_level
Definition: dovi_meta.h:82
av_dovi_get_color
static av_always_inline AVDOVIColorMetadata * av_dovi_get_color(const AVDOVIMetadata *data)
Definition: dovi_meta.h:354
AVDOVIDmLevel5::left_offset
uint16_t left_offset
Definition: dovi_meta.h:223
get_ue_golomb_31
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:120
AVDOVIDmData::l5
AVDOVIDmLevel5 l5
Definition: dovi_meta.h:304
AVDOVIDataMapping::mapping_chroma_format_idc
uint8_t mapping_chroma_format_idc
Definition: dovi_meta.h:144
AVDOVIDmLevel5::right_offset
uint16_t right_offset
Definition: dovi_meta.h:224
AVDOVIDmLevel255::dm_run_version
uint8_t dm_run_version
Definition: dovi_meta.h:288
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
AVDOVIDmLevel1::avg_pq
uint16_t avg_pq
Definition: dovi_meta.h:196
AVDOVIRpuDataHeader::bl_bit_depth
uint8_t bl_bit_depth
Definition: dovi_meta.h:88
AVDOVIColorMetadata
Dolby Vision RPU colorspace metadata parameters.
Definition: dovi_meta.h:160
AVDOVIDmData::level
uint8_t level
Definition: dovi_meta.h:298
DOVIVdr::color
AVDOVIColorMetadata color
Definition: dovi_rpu.c:44
av_clip_uint16
#define av_clip_uint16
Definition: common.h:111
AVDOVIDmLevel3::max_pq_offset
uint16_t max_pq_offset
Definition: dovi_meta.h:212
ff_dovi_rpu_parse
int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition)
Parse the contents of a Dovi RPU NAL and update the parsed values in the DOVIContext struct.
Definition: dovi_rpu.c:376
AVDOVIDmLevel254::dm_version_index
uint8_t dm_version_index
Definition: dovi_meta.h:282
AVDOVIDmLevel11::whitepoint
uint8_t whitepoint
Definition: dovi_meta.h:269
AVDOVIDmLevel254::dm_mode
uint8_t dm_mode
Definition: dovi_meta.h:281
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
get_ue_golomb_long
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:104
av_dovi_get_mapping
static av_always_inline AVDOVIDataMapping * av_dovi_get_mapping(const AVDOVIMetadata *data)
Definition: dovi_meta.h:348
s0
#define s0
Definition: regdef.h:37
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:250
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDOVIReshapingCurve::pivots
uint16_t pivots[AV_DOVI_MAX_PIECES+1]
Definition: dovi_meta.h:108
AVColorPrimariesDesc::prim
AVPrimaryCoefficients prim
Definition: csp.h:80
AVDOVINLQParams::nlq_offset
uint16_t nlq_offset
Definition: dovi_meta.h:129
AVDOVIDataMapping::vdr_rpu_id
uint8_t vdr_rpu_id
Definition: dovi_meta.h:142
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AVDOVIRpuDataHeader::disable_residual_flag
uint8_t disable_residual_flag
Definition: dovi_meta.h:93
AVDOVIDataMapping::nlq
AVDOVINLQParams nlq[3]
Definition: dovi_meta.h:151
AVDOVIDataMapping
Dolby Vision RPU data mapping parameters.
Definition: dovi_meta.h:141
ff_refstruct_unref
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
ff_dovi_attach_side_data
int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
Attach the decoded AVDOVIMetadata as side data to an AVFrame.
Definition: dovi_rpu.c:93
AV_DOVI_MAX_PIECES
#define AV_DOVI_MAX_PIECES
Coefficients of a piece-wise function.
Definition: dovi_meta.h:105
AVDOVIDataMapping::num_x_partitions
uint32_t num_x_partitions
Definition: dovi_meta.h:149
ff_dovi_ctx_replace
void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0)
Definition: dovi_rpu.c:74
AVDOVIDmLevel255::dm_debug
uint8_t dm_debug[4]
Definition: dovi_meta.h:289
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:54