41 *
size = hdr_plus ?
sizeof(*hdr_plus) : 0;
86 if (
s->num_windows < 1 ||
s->num_windows > 3) {
93 for (
int w = 1;
w <
s->num_windows;
w++) {
118 s->targeted_system_display_maximum_luminance =
120 s->targeted_system_display_actual_peak_luminance_flag =
get_bits1(gb);
122 if (
s->targeted_system_display_actual_peak_luminance_flag) {
128 if (((rows < 2) || (rows > 25)) || ((cols < 2) || (cols > 25))) {
131 s->num_rows_targeted_system_display_actual_peak_luminance = rows;
132 s->num_cols_targeted_system_display_actual_peak_luminance = cols;
137 for (
int i = 0;
i < rows;
i++) {
138 for (
int j = 0; j < cols; j++) {
139 s->targeted_system_display_actual_peak_luminance[
i][j] =
144 for (
int w = 0;
w <
s->num_windows;
w++) {
149 for (
int i = 0;
i < 3;
i++) {
174 s->mastering_display_actual_peak_luminance_flag =
get_bits1(gb);
175 if (
s->mastering_display_actual_peak_luminance_flag) {
181 if (((rows < 2) || (rows > 25)) || ((cols < 2) || (cols > 25))) {
184 s->num_rows_mastering_display_actual_peak_luminance = rows;
185 s->num_cols_mastering_display_actual_peak_luminance = cols;
190 for (
int i = 0;
i < rows;
i++) {
191 for (
int j = 0; j < cols; j++) {
192 s->mastering_display_actual_peak_luminance[
i][j] =
198 for (
int w = 0;
w <
s->num_windows;
w++) {
240 size_t size_bits, size_bytes;
266 for (
int w = 1;
w <
s->num_windows;
w++)
272 if (
s->targeted_system_display_actual_peak_luminance_flag)
274 s->num_rows_targeted_system_display_actual_peak_luminance *
275 s->num_cols_targeted_system_display_actual_peak_luminance * 4;
277 for (
int w = 0;
w <
s->num_windows;
w++)
278 size_bits += 72 +
s->params[
w].num_distribution_maxrgb_percentiles * 24 + 10;
281 if (
s->mastering_display_actual_peak_luminance_flag)
283 s->num_rows_mastering_display_actual_peak_luminance *
284 s->num_cols_mastering_display_actual_peak_luminance * 4;
286 for (
int w = 0;
w <
s->num_windows;
w++) {
288 if (
s->params[
w].tone_mapping_flag)
289 size_bits += 28 +
s->params[
w].num_bezier_curve_anchors * 10;
292 if (
s->params[
w].color_saturation_mapping_flag)
296 size_bytes = (size_bits + 7) / 8;
304 if (*
size < size_bytes)
321 for (
int w = 1;
w <
s->num_windows;
w++) {
322 put_bits(pb, 16,
s->params[
w].window_upper_left_corner_x.num /
s->params[
w].window_upper_left_corner_x.den);
323 put_bits(pb, 16,
s->params[
w].window_upper_left_corner_y.num /
s->params[
w].window_upper_left_corner_y.den);
324 put_bits(pb, 16,
s->params[
w].window_lower_right_corner_x.num /
s->params[
w].window_lower_right_corner_x.den);
325 put_bits(pb, 16,
s->params[
w].window_lower_right_corner_y.num /
s->params[
w].window_lower_right_corner_y.den);
326 put_bits(pb, 16,
s->params[
w].center_of_ellipse_x);
327 put_bits(pb, 16,
s->params[
w].center_of_ellipse_y);
329 put_bits(pb, 16,
s->params[
w].semimajor_axis_internal_ellipse);
330 put_bits(pb, 16,
s->params[
w].semimajor_axis_external_ellipse);
331 put_bits(pb, 16,
s->params[
w].semiminor_axis_external_ellipse);
332 put_bits(pb, 1,
s->params[
w].overlap_process_option);
336 s->targeted_system_display_maximum_luminance.den);
337 put_bits(pb, 1,
s->targeted_system_display_actual_peak_luminance_flag);
338 if (
s->targeted_system_display_actual_peak_luminance_flag) {
339 put_bits(pb, 5,
s->num_rows_targeted_system_display_actual_peak_luminance);
340 put_bits(pb, 5,
s->num_cols_targeted_system_display_actual_peak_luminance);
341 for (
int i = 0;
i <
s->num_rows_targeted_system_display_actual_peak_luminance;
i++) {
342 for (
int j = 0; j <
s->num_cols_targeted_system_display_actual_peak_luminance; j++)
344 s->targeted_system_display_actual_peak_luminance[
i][j].den);
348 for (
int w = 0;
w <
s->num_windows;
w++) {
349 for (
int i = 0;
i < 3;
i++)
351 put_bits(pb, 17,
s->params[
w].average_maxrgb.num *
rgb_den /
s->params[
w].average_maxrgb.den);
352 put_bits(pb, 4,
s->params[
w].num_distribution_maxrgb_percentiles);
353 for (
int i = 0;
i <
s->params[
w].num_distribution_maxrgb_percentiles;
i++) {
354 put_bits(pb, 7,
s->params[
w].distribution_maxrgb[
i].percentage);
356 s->params[
w].distribution_maxrgb[
i].percentile.den);
359 s->params[
w].fraction_bright_pixels.den);
362 put_bits(pb, 1,
s->mastering_display_actual_peak_luminance_flag);
363 if (
s->mastering_display_actual_peak_luminance_flag) {
364 put_bits(pb, 5,
s->num_rows_mastering_display_actual_peak_luminance);
365 put_bits(pb, 5,
s->num_cols_mastering_display_actual_peak_luminance);
366 for (
int i = 0;
i <
s->num_rows_mastering_display_actual_peak_luminance;
i++) {
367 for (
int j = 0; j <
s->num_cols_mastering_display_actual_peak_luminance; j++)
369 s->mastering_display_actual_peak_luminance[
i][j].den);
373 for (
int w = 0;
w <
s->num_windows;
w++) {
374 put_bits(pb, 1,
s->params[
w].tone_mapping_flag);
375 if (
s->params[
w].tone_mapping_flag) {
378 put_bits(pb, 4,
s->params[
w].num_bezier_curve_anchors);
379 for (
int i = 0;
i <
s->params[
w].num_bezier_curve_anchors;
i++)
381 s->params[
w].bezier_curve_anchors[
i].den);
382 put_bits(pb, 1,
s->params[
w].color_saturation_mapping_flag);
383 if (
s->params[
w].color_saturation_mapping_flag)
385 s->params[
w].color_saturation_weight.den);
402 *
size = smpte2094_app5 ?
sizeof(*smpte2094_app5) : 0;
404 return smpte2094_app5;
420 #define GET_BITS_OR_FAIL(var, n) \
422 if (get_bits_left(gb) < n) { \
423 ret = AVERROR_INVALIDDATA; \
426 var = get_bits(gb, n); \
433 int ret, reserved_zero;
439 uint8_t *padded_data =
av_mallocz(padded_size);
465 if (
s->has_custom_hdr_reference_white_flag)
467 if (!
s->has_adaptive_tone_map_flag) {
475 if (
s->use_reference_white_tone_mapping_flag) {
481 if (
s->num_alternate_images > 4) {
488 if (
s->gain_application_space_chromaticities_flag == 3)
489 for (
int r = 0;
r < 8;
r++)
492 for (
int a = 0;
a <
s->num_alternate_images;
a++) {
496 if (!
a || !
s->has_common_component_mix_params_flag) {
498 if (
s->component_mixing_type[
a] != 3) {
505 for (
int k = 0; k < 6; k++)
507 for (
int k = 0; k < 6; k++) {
508 if (
s->has_component_mixing_coefficient_flag[
a][k]) {
511 s->component_mixing_coefficient[
a][k] = 0;
516 s->component_mixing_type[
a] =
s->component_mixing_type[0];
517 if (
s->component_mixing_type[
a] == 3) {
518 for (
int k = 0; k < 6; k++) {
519 s->has_component_mixing_coefficient_flag[
a][k] =
520 s->has_component_mixing_coefficient_flag[0][k];
521 s->component_mixing_coefficient[
a][k] =
s->component_mixing_coefficient[0][k];
527 if (!
a || !
s->has_common_curve_params_flag) {
529 if (
s->gain_curve_num_control_points_minus_1[
a] > 31) {
539 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++) {
543 s->gain_curve_num_control_points_minus_1[
a] =
544 s->gain_curve_num_control_points_minus_1[0];
545 s->gain_curve_use_pchip_slope_flag[
a] =
s->gain_curve_use_pchip_slope_flag[0];
546 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++) {
547 s->gain_curve_control_points_x[
a][
c] =
s->gain_curve_control_points_x[0][
c];
550 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++)
552 if (!
s->gain_curve_use_pchip_slope_flag[
a]) {
553 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++)
567 size_t size_bytes, size_bits;
575 if (
s->application_version >= 8 ||
s->minimum_application_version >= 3)
578 size_bits += 3 + 3 + 2;
579 size_bits += 1 + 1 + 6;
580 if (
s->has_custom_hdr_reference_white_flag)
582 if (
s->has_adaptive_tone_map_flag) {
584 if (
s->use_reference_white_tone_mapping_flag) {
587 size_bits += 3 + 2 + 1 + 1;
588 if (
s->gain_application_space_chromaticities_flag == 3)
590 if (
s->num_alternate_images > 4)
592 for (
int a = 0;
a <
s->num_alternate_images;
a++) {
594 if (!
a || !
s->has_common_component_mix_params_flag) {
596 if (
s->component_mixing_type[
a] != 3) {
600 for (
int k = 0; k < 6; k++)
601 if (
s->has_component_mixing_coefficient_flag[
a][k])
605 if (!
a || !
s->has_common_curve_params_flag) {
606 size_bits += 5 + 1 + 2;
607 if (
s->gain_curve_num_control_points_minus_1[
a] > 31)
609 size_bits += 16 * (
s->gain_curve_num_control_points_minus_1[
a] + 1);
611 size_bits += 16 * (
s->gain_curve_num_control_points_minus_1[
a] + 1);
612 if (!
s->gain_curve_use_pchip_slope_flag[
a])
613 size_bits += 16 * (
s->gain_curve_num_control_points_minus_1[
a] + 1);
619 size_bytes = size_bits >> 3;
625 if (*
size < size_bytes)
638 put_bits(pb, 3,
s->minimum_application_version);
642 put_bits(pb, 1,
s->has_custom_hdr_reference_white_flag);
643 put_bits(pb, 1,
s->has_adaptive_tone_map_flag);
646 if (
s->has_custom_hdr_reference_white_flag)
647 put_bits(pb, 16,
s->hdr_reference_white);
649 if (
s->has_adaptive_tone_map_flag) {
651 put_bits(pb, 16,
s->baseline_hdr_headroom);
652 put_bits(pb, 1,
s->use_reference_white_tone_mapping_flag);
653 if (
s->use_reference_white_tone_mapping_flag) {
656 put_bits(pb, 3,
s->num_alternate_images);
657 put_bits(pb, 2,
s->gain_application_space_chromaticities_flag);
658 put_bits(pb, 1,
s->has_common_component_mix_params_flag);
659 put_bits(pb, 1,
s->has_common_curve_params_flag);
661 if (
s->gain_application_space_chromaticities_flag == 3)
662 for (
int r = 0;
r < 8;
r++)
663 put_bits(pb, 16,
s->gain_application_space_chromaticities[
r]);
665 for (
int a = 0;
a <
s->num_alternate_images;
a++) {
666 put_bits(pb, 16,
s->alternate_hdr_headrooms[
a]);
669 if (!
a || !
s->has_common_component_mix_params_flag) {
671 if (
s->component_mixing_type[
a] != 3) {
674 for (
int k = 0; k < 6; k++)
675 put_bits(pb, 1,
s->has_component_mixing_coefficient_flag[
a][k]);
676 for (
int k = 0; k < 6; k++)
677 if (
s->has_component_mixing_coefficient_flag[
a][k])
678 put_bits(pb, 16,
s->component_mixing_coefficient[
a][k]);
683 if (!
a || !
s->has_common_curve_params_flag) {
684 put_bits(pb, 5,
s->gain_curve_num_control_points_minus_1[
a]);
685 put_bits(pb, 1,
s->gain_curve_use_pchip_slope_flag[
a]);
687 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++)
688 put_bits(pb, 16,
s->gain_curve_control_points_x[
a][
c]);
690 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++)
691 put_bits(pb, 16,
s->gain_curve_control_points_y[
a][
c]);
692 if (!
s->gain_curve_use_pchip_slope_flag[
a]) {
693 for (
int c = 0;
c <=
s->gain_curve_num_control_points_minus_1[
a];
c++)
694 put_bits(pb, 16,
s->gain_curve_control_points_theta[
a][
c]);