}
static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIBufferingPeriod *current)
+ H264RawSEIBufferingPeriod *current,
+ SEIMessageState *sei)
{
CodedBitstreamH264Context *h264 = ctx->priv_data;
const H264RawSPS *sps;
}
static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIPicTiming *current)
+ H264RawSEIPicTiming *current,
+ SEIMessageState *sei)
{
CodedBitstreamH264Context *h264 = ctx->priv_data;
const H264RawSPS *sps;
}
static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIPanScanRect *current)
+ H264RawSEIPanScanRect *current,
+ SEIMessageState *sei)
{
int err, i;
return 0;
}
-static int FUNC(sei_user_data_registered)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIUserDataRegistered *current,
- uint32_t *payload_size)
-{
- int err, i, j;
-
- HEADER("User Data Registered ITU-T T.35");
-
- u(8, itu_t_t35_country_code, 0x00, 0xff);
- if (current->itu_t_t35_country_code != 0xff)
- i = 1;
- else {
- u(8, itu_t_t35_country_code_extension_byte, 0x00, 0xff);
- i = 2;
- }
-
-#ifdef READ
- if (*payload_size < i) {
- av_log(ctx->log_ctx, AV_LOG_ERROR,
- "Invalid SEI user data registered payload.\n");
- return AVERROR_INVALIDDATA;
- }
- current->data_length = *payload_size - i;
-#else
- *payload_size = i + current->data_length;
-#endif
-
- allocate(current->data, current->data_length);
- for (j = 0; j < current->data_length; j++)
- xu(8, itu_t_t35_payload_byte[i], current->data[j], 0x00, 0xff, 1, i + j);
-
- return 0;
-}
-
-static int FUNC(sei_user_data_unregistered)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIUserDataUnregistered *current,
- uint32_t *payload_size)
-{
- int err, i;
-
- HEADER("User Data Unregistered");
-
-#ifdef READ
- if (*payload_size < 16) {
- av_log(ctx->log_ctx, AV_LOG_ERROR,
- "Invalid SEI user data unregistered payload.\n");
- return AVERROR_INVALIDDATA;
- }
- current->data_length = *payload_size - 16;
-#else
- *payload_size = 16 + current->data_length;
-#endif
-
- for (i = 0; i < 16; i++)
- us(8, uuid_iso_iec_11578[i], 0x00, 0xff, 1, i);
-
- allocate(current->data, current->data_length);
-
- for (i = 0; i < current->data_length; i++)
- xu(8, user_data_payload_byte[i], current->data[i], 0x00, 0xff, 1, i);
-
- return 0;
-}
-
static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIRecoveryPoint *current)
+ H264RawSEIRecoveryPoint *current,
+ SEIMessageState *sei)
{
int err;
}
static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIDisplayOrientation *current)
+ H264RawSEIDisplayOrientation *current,
+ SEIMessageState *sei)
{
int err;
return 0;
}
-static int FUNC(sei_mastering_display_colour_volume)(CodedBitstreamContext *ctx, RWContext *rw,
- H264RawSEIMasteringDisplayColourVolume *current)
-{
- 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_alternative_transfer_characteristics)(CodedBitstreamContext *ctx,
- RWContext *rw,
- H264RawSEIAlternativeTransferCharacteristics *current)
-{
- int err;
-
- HEADER("Alternative Transfer Characteristics");
-
- ub(8, preferred_transfer_characteristics);
-
- 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;
- case H264_SEI_TYPE_ALTERNATIVE_TRANSFER:
- CHECK(FUNC(sei_alternative_transfer_characteristics)
- (ctx, rw, ¤t->payload.alternative_transfer_characteristics));
- 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;
-}
-
static int FUNC(sei)(CodedBitstreamContext *ctx, RWContext *rw,
H264RawSEI *current)
{
- int err, k;
+ int err;
HEADER("Supplemental Enhancement Information");
CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header,
1 << H264_NAL_SEI));
-#ifdef READ
- for (k = 0; k < H264_MAX_SEI_PAYLOADS; k++) {
- uint32_t payload_type = 0;
- uint32_t payload_size = 0;
- uint32_t tmp;
-
- while (show_bits(rw, 8) == 0xff) {
- fixed(8, ff_byte, 0xff);
- payload_type += 255;
- }
- xu(8, last_payload_type_byte, tmp, 0, 254, 0);
- payload_type += tmp;
-
- while (show_bits(rw, 8) == 0xff) {
- fixed(8, ff_byte, 0xff);
- payload_size += 255;
- }
- xu(8, last_payload_size_byte, tmp, 0, 254, 0);
- payload_size += tmp;
-
- current->payload[k].payload_type = payload_type;
- current->payload[k].payload_size = payload_size;
-
- CHECK(FUNC(sei_payload)(ctx, rw, ¤t->payload[k]));
-
- if (!cbs_h2645_read_more_rbsp_data(rw))
- break;
- }
- if (k >= H264_MAX_SEI_PAYLOADS) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Too many payloads in "
- "SEI message: found %d.\n", k);
- return AVERROR_INVALIDDATA;
- }
- current->payload_count = k + 1;
-#else
- for (k = 0; k < current->payload_count; k++) {
- PutBitContext start_state;
- uint32_t tmp;
- int need_size, i;
-
- // Somewhat clumsy: we write the payload twice when
- // we don't know the size in advance. This will mess
- // with trace output, but is otherwise harmless.
- start_state = *rw;
- need_size = !current->payload[k].payload_size;
- for (i = 0; i < 1 + need_size; i++) {
- *rw = start_state;
-
- tmp = current->payload[k].payload_type;
- while (tmp >= 255) {
- fixed(8, ff_byte, 0xff);
- tmp -= 255;
- }
- xu(8, last_payload_type_byte, tmp, 0, 254, 0);
-
- tmp = current->payload[k].payload_size;
- while (tmp >= 255) {
- fixed(8, ff_byte, 0xff);
- tmp -= 255;
- }
- xu(8, last_payload_size_byte, tmp, 0, 254, 0);
-
- CHECK(FUNC(sei_payload)(ctx, rw, ¤t->payload[k]));
- }
- }
-#endif
+ CHECK(FUNC_SEI(message_list)(ctx, rw, ¤t->message_list, 1));
CHECK(FUNC(rbsp_trailing_bits)(ctx, rw));
(sps->pic_height_in_map_units_minus1 + 1);
max = (pic_size + pps->slice_group_change_rate_minus1) /
(pps->slice_group_change_rate_minus1 + 1);
- bits = av_log2(2 * max - 1);
+ bits = av_ceil_log2(max + 1);
u(bits, slice_group_change_cycle, 0, max);
}