-static int FUNC(payload_extension)(CodedBitstreamContext *ctx, RWContext *rw,
- H265RawExtensionData *current, uint32_t payload_size,
- int cur_pos)
-{
- int err;
- size_t byte_length, k;
-
-#ifdef READ
- GetBitContext tmp;
- int bits_left, payload_zero_bits;
-
- if (!cbs_h265_payload_extension_present(rw, payload_size, cur_pos))
- return 0;
-
- bits_left = 8 * payload_size - cur_pos;
- tmp = *rw;
- if (bits_left > 8)
- skip_bits_long(&tmp, bits_left - 8);
- payload_zero_bits = get_bits(&tmp, FFMIN(bits_left, 8));
- if (!payload_zero_bits)
- return AVERROR_INVALIDDATA;
- payload_zero_bits = ff_ctz(payload_zero_bits);
- current->bit_length = bits_left - payload_zero_bits - 1;
- allocate(current->data, (current->bit_length + 7) / 8);
-#endif
-
- byte_length = (current->bit_length + 7) / 8;
- for (k = 0; k < byte_length; k++) {
- int length = FFMIN(current->bit_length - k * 8, 8);
- xu(length, reserved_payload_extension_data, current->data[k],
- 0, MAX_UINT_BITS(length), 0);
- }
-
- return 0;
-}
-
-static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
- H265RawSEIPayload *current, int prefix)
-{
- int err, i;
- int start_position, current_position;
- int more_data = !!current->extension_data.bit_length;
-
-#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 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 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
-#define SEI_TYPE_E(type, prefix_valid, suffix_valid, name) \
- case SEI_TYPE_ ## type: \
- SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
- CHECK(FUNC(sei_ ## name)(ctx, rw, ¤t->payload.name, \
- ¤t->payload_size, \
- &more_data)); \
- break
-
-#define SEI_TYPE_N2(type, prefix_valid, suffix_valid, name) \
- case SEI_TYPE_ ## type: \
- SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
- CHECK(FUNC_SEI(sei_ ## name)(ctx, rw, ¤t->payload.name)); \
- break
-#define SEI_TYPE_S2(type, prefix_valid, suffix_valid, name) \
- case SEI_TYPE_ ## type: \
- SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
- CHECK(FUNC_SEI(sei_ ## name)(ctx, rw, ¤t->payload.name, \
- ¤t->payload_size)); \
- break
-
- SEI_TYPE_E(BUFFERING_PERIOD, 1, 0, buffering_period);
- SEI_TYPE_N(PIC_TIMING, 1, 0, pic_timing);
- SEI_TYPE_N(PAN_SCAN_RECT, 1, 0, pan_scan_rect);
- SEI_TYPE_S2(USER_DATA_REGISTERED_ITU_T_T35,
- 1, 1, user_data_registered);
- SEI_TYPE_S2(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_N2(MASTERING_DISPLAY_COLOUR_VOLUME,
- 1, 0, mastering_display_colour_volume);
- SEI_TYPE_N2(CONTENT_LIGHT_LEVEL_INFO,1, 0, content_light_level);
- SEI_TYPE_N2(ALTERNATIVE_TRANSFER_CHARACTERISTICS,
- 1, 0, alternative_transfer_characteristics);
- SEI_TYPE_N(ALPHA_CHANNEL_INFO, 1, 0, alpha_channel_info);
-
-#undef SEI_TYPE_N
-#undef SEI_TYPE_S
-#undef SEI_TYPE_E
- 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);
- }
- }
-
- // more_data_in_payload()
-#ifdef READ
- current_position = get_bits_count(rw) - start_position;
- if (current_position < 8 * current->payload_size) {
-#else
- current_position = put_bits_count(rw) - start_position;
- if (byte_alignment(rw) || more_data) {
-#endif
- CHECK(FUNC(payload_extension)(ctx, rw, ¤t->extension_data,
- current->payload_size, current_position));
- fixed(1, bit_equal_to_one, 1);
- while (byte_alignment(rw))
- fixed(1, bit_equal_to_zero, 0);
- }
-
-#ifdef WRITE
- current->payload_size = (put_bits_count(rw) - start_position) >> 3;
-#endif
-
- return 0;
-}
-