-static int FUNC(sei_mastering_display_colour_volume)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIMasteringDisplayColourVolume *current)
-{
- int err, c;
-
- 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_payload)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIPayload *current)
-{
- 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) {
- case H264_SEI_TYPE_BUFFERING_PERIOD:
- CHECK(FUNC(sei_buffering_period)
- (ctx, rw, ¤t->payload.buffering_period));
- break;
- case H264_SEI_TYPE_PIC_TIMING:
- CHECK(FUNC(sei_pic_timing)
- (ctx, rw, ¤t->payload.pic_timing));
- break;
- case H264_SEI_TYPE_PAN_SCAN_RECT:
- CHECK(FUNC(sei_pan_scan_rect)
- (ctx, rw, ¤t->payload.pan_scan_rect));
- break;
- case H264_SEI_TYPE_FILLER_PAYLOAD:
- {
- for (i = 0; i < current->payload_size; i++)
- fixed(8, ff_byte, 0xff);
- }
- break;
- case H264_SEI_TYPE_USER_DATA_REGISTERED:
- CHECK(FUNC(sei_user_data_registered)
- (ctx, rw, ¤t->payload.user_data_registered, ¤t->payload_size));
- break;
- case H264_SEI_TYPE_USER_DATA_UNREGISTERED:
- CHECK(FUNC(sei_user_data_unregistered)
- (ctx, rw, ¤t->payload.user_data_unregistered, ¤t->payload_size));
- break;
- case H264_SEI_TYPE_RECOVERY_POINT:
- CHECK(FUNC(sei_recovery_point)
- (ctx, rw, ¤t->payload.recovery_point));
- break;
- case H264_SEI_TYPE_DISPLAY_ORIENTATION:
- CHECK(FUNC(sei_display_orientation)
- (ctx, rw, ¤t->payload.display_orientation));
- break;
- case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME:
- CHECK(FUNC(sei_mastering_display_colour_volume)
- (ctx, rw, ¤t->payload.mastering_display_colour_volume));
- break;
- 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.other.data_length; 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;
- }
-#else
- end_position = put_bits_count(rw);
- current->payload_size = (end_position - start_position) / 8;
-#endif
-
- return 0;
-}
-