- int err, c;
-
- HEADER("Mastering Display Colour Volume");
-
- for (c = 0; c < 3; c++) {
- us(16, display_primaries_x[c], 0, 50000, 1, c);
- us(16, display_primaries_y[c], 0, 50000, 1, c);
- }
-
- u(16, white_point_x, 0, 50000);
- u(16, white_point_y, 0, 50000);
-
- u(32, max_display_mastering_luminance,
- 1, MAX_UINT_BITS(32));
- u(32, min_display_mastering_luminance,
- 0, current->max_display_mastering_luminance - 1);
-
- return 0;
-}
-
-static int FUNC(sei_content_light_level)(CodedBitstreamContext *ctx, RWContext *rw,
- H265RawSEIContentLightLevelInfo *current)
-{
- int err;
-
- HEADER("Content Light Level");
-
- u(16, max_content_light_level, 0, MAX_UINT_BITS(16));
- u(16, max_pic_average_light_level, 0, MAX_UINT_BITS(16));
-
- return 0;
-}
-
-static int FUNC(sei_alternative_transfer_characteristics)(CodedBitstreamContext *ctx,
- RWContext *rw,
- H265RawSEIAlternativeTransferCharacteristics *current)
-{
- int err;
-
- HEADER("Alternative Transfer Characteristics");
-
- u(8, preferred_transfer_characteristics, 0, 255);
-
- return 0;
-}
-
-static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
- H265RawSEIPayload *current, int prefix)
-{
- int err, i;
- int start_position, end_position;
-
-#ifdef READ
- start_position = get_bits_count(rw);
-#else
- start_position = put_bits_count(rw);
-#endif
-
- switch (current->payload_type) {
-#define SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid) do { \
- if (prefix && !prefix_valid) { \
- av_log(ctx->log_ctx, AV_LOG_ERROR, "SEI type %s invalid " \
- "as prefix SEI!\n", #name); \
- return AVERROR_INVALIDDATA; \
- } \
- if (!prefix && !suffix_valid) { \
- av_log(ctx->log_ctx, AV_LOG_ERROR, "SEI type %s invalid " \
- "as suffix SEI!\n", #name); \
- return AVERROR_INVALIDDATA; \
- } \
- } while (0)
-#define SEI_TYPE_N(type, prefix_valid, suffix_valid, name) \
- case HEVC_SEI_TYPE_ ## type: \
- SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
- CHECK(FUNC(sei_ ## name)(ctx, rw, ¤t->payload.name)); \
- break
-#define SEI_TYPE_S(type, prefix_valid, suffix_valid, name) \
- case HEVC_SEI_TYPE_ ## type: \
- SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
- CHECK(FUNC(sei_ ## name)(ctx, rw, ¤t->payload.name, \
- ¤t->payload_size)); \
- break
-
- SEI_TYPE_S(BUFFERING_PERIOD, 1, 0, buffering_period);
- SEI_TYPE_N(PICTURE_TIMING, 1, 0, pic_timing);
- SEI_TYPE_N(PAN_SCAN_RECT, 1, 0, pan_scan_rect);
- SEI_TYPE_S(USER_DATA_REGISTERED_ITU_T_T35,
- 1, 1, user_data_registered);
- SEI_TYPE_S(USER_DATA_UNREGISTERED, 1, 1, user_data_unregistered);
- SEI_TYPE_N(RECOVERY_POINT, 1, 0, recovery_point);
- SEI_TYPE_N(DISPLAY_ORIENTATION, 1, 0, display_orientation);
- SEI_TYPE_N(ACTIVE_PARAMETER_SETS, 1, 0, active_parameter_sets);
- SEI_TYPE_N(DECODED_PICTURE_HASH, 0, 1, decoded_picture_hash);
- SEI_TYPE_N(TIME_CODE, 1, 0, time_code);
- SEI_TYPE_N(MASTERING_DISPLAY_INFO, 1, 0, mastering_display);
- SEI_TYPE_N(CONTENT_LIGHT_LEVEL_INFO, 1, 0, content_light_level);
- SEI_TYPE_N(ALTERNATIVE_TRANSFER_CHARACTERISTICS,
- 1, 0, alternative_transfer_characteristics);
-
-#undef SEI_TYPE
- default:
- {
-#ifdef READ
- current->payload.other.data_length = current->payload_size;
-#endif
- allocate(current->payload.other.data, current->payload.other.data_length);
-
- for (i = 0; i < current->payload_size; i++)
- xu(8, payload_byte[i], current->payload.other.data[i], 0, 255,
- 1, i);
- }
- }
-
- if (byte_alignment(rw)) {
- fixed(1, bit_equal_to_one, 1);
- while (byte_alignment(rw))
- fixed(1, bit_equal_to_zero, 0);
- }
-
-#ifdef READ
- end_position = get_bits_count(rw);
- if (end_position < start_position + 8 * current->payload_size) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Incorrect SEI payload length: "
- "header %"PRIu32" bits, actually %d bits.\n",
- 8 * current->payload_size,
- end_position - start_position);
- return AVERROR_INVALIDDATA;