const char *name, uint32_t *write_to,
uint32_t range_min, uint32_t range_max)
{
- uint32_t value;
- int position, zeroes, i, j;
- char bits[65];
+ uint32_t zeroes, bits_value, value;
+ int position;
if (ctx->trace_enable)
position = get_bits_count(gbc);
- zeroes = i = 0;
+ zeroes = 0;
while (1) {
- if (get_bits_left(gbc) < zeroes + 1) {
+ if (get_bits_left(gbc) < 1) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid uvlc code at "
"%s: bitstream ended.\n", name);
return AVERROR_INVALIDDATA;
}
- if (get_bits1(gbc)) {
- bits[i++] = '1';
+ if (get_bits1(gbc))
break;
- } else {
- bits[i++] = '0';
- ++zeroes;
- }
+ ++zeroes;
}
if (zeroes >= 32) {
value = MAX_UINT_BITS(32);
} else {
- value = get_bits_long(gbc, zeroes);
-
- for (j = 0; j < zeroes; j++)
- bits[i++] = (value >> (zeroes - j - 1) & 1) ? '1' : '0';
+ if (get_bits_left(gbc) < zeroes) {
+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid uvlc code at "
+ "%s: bitstream ended.\n", name);
+ return AVERROR_INVALIDDATA;
+ }
- value += (1 << zeroes) - 1;
+ bits_value = get_bits_long(gbc, zeroes);
+ value = bits_value + (UINT32_C(1) << zeroes) - 1;
}
if (ctx->trace_enable) {
+ char bits[65];
+ int i, j, k;
+
+ if (zeroes >= 32) {
+ while (zeroes > 32) {
+ k = FFMIN(zeroes - 32, 32);
+ for (i = 0; i < k; i++)
+ bits[i] = '0';
+ bits[i] = 0;
+ ff_cbs_trace_syntax_element(ctx, position, name,
+ NULL, bits, 0);
+ zeroes -= k;
+ position += k;
+ }
+ }
+
+ for (i = 0; i < zeroes; i++)
+ bits[i] = '0';
+ bits[i++] = '1';
+
+ if (zeroes < 32) {
+ for (j = 0; j < zeroes; j++)
+ bits[i++] = (bits_value >> (zeroes - j - 1) & 1) ? '1' : '0';
+ }
+
bits[i] = 0;
- ff_cbs_trace_syntax_element(ctx, position, name, NULL,
- bits, value);
+ ff_cbs_trace_syntax_element(ctx, position, name,
+ NULL, bits, value);
}
if (value < range_min || value > range_max) {
if (INT_MAX / 8 < size) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid fragment: "
- "too large (%zu bytes).\n", size);
+ "too large (%"SIZE_SPECIFIER" bytes).\n", size);
err = AVERROR_INVALIDDATA;
goto fail;
}
if (get_bits_left(&gbc) < 8) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU: fragment "
- "too short (%zu bytes).\n", size);
+ "too short (%"SIZE_SPECIFIER" bytes).\n", size);
err = AVERROR_INVALIDDATA;
goto fail;
}
if (size < obu_length) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU length: "
- "%"PRIu64", but only %zu bytes remaining in fragment.\n",
+ "%"PRIu64", but only %"SIZE_SPECIFIER" bytes remaining in fragment.\n",
obu_length, size);
err = AVERROR_INVALIDDATA;
goto fail;
} else {
if (unit->data_size < 1 + obu->header.obu_extension_flag) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU length: "
- "unit too short (%zu).\n", unit->data_size);
+ "unit too short (%"SIZE_SPECIFIER").\n", unit->data_size);
return AVERROR_INVALIDDATA;
}
obu->obu_size = unit->data_size - 1 - obu->header.obu_extension_flag;
if (obu->header.obu_extension_flag) {
priv->temporal_id = obu->header.temporal_id;
- priv->spatial_id = obu->header.temporal_id;
+ priv->spatial_id = obu->header.spatial_id;
if (obu->header.obu_type != AV1_OBU_SEQUENCE_HEADER &&
obu->header.obu_type != AV1_OBU_TEMPORAL_DELIMITER &&
if (obu->obu_size > 0 &&
obu->header.obu_type != AV1_OBU_TILE_GROUP &&
obu->header.obu_type != AV1_OBU_FRAME) {
- err = cbs_av1_read_trailing_bits(ctx, &gbc,
- obu->obu_size * 8 + start_pos - end_pos);
+ int nb_bits = obu->obu_size * 8 + start_pos - end_pos;
+
+ if (nb_bits <= 0)
+ return AVERROR_INVALIDDATA;
+
+ err = cbs_av1_read_trailing_bits(ctx, &gbc, nb_bits);
if (err < 0)
return err;
}
if (err < 0) {
av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
"sufficiently large write buffer (last attempt "
- "%zu bytes).\n", priv->write_buffer_size);
+ "%"SIZE_SPECIFIER" bytes).\n", priv->write_buffer_size);
return err;
}
}