int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, GetBitContext *gbc, int width, const char *name, const int *subscripts, uint32_t *write_to, uint32_t range_min, uint32_t range_max) { uint32_t value; int position; av_assert0(width > 0 && width <= 32); if (get_bits_left(gbc) < width) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid value at " "%s: bitstream ended.\n", name); return AVERROR_INVALIDDATA; } if (ctx->trace_enable) position = get_bits_count(gbc); value = get_bits_long(gbc, width); if (ctx->trace_enable) { char bits[33]; int i; for (i = 0; i < width; i++) bits[i] = value >> (width - i - 1) & 1 ? '1' : '0'; bits[i] = 0; ff_cbs_trace_syntax_element(ctx, position, name, subscripts, bits, value); }
static int cbs_vp9_read_s(CodedBitstreamContext *ctx, GetBitContext *gbc, int width, const char *name, const int *subscripts, int32_t *write_to) { uint32_t magnitude; int position, sign; int32_t value; if (ctx->trace_enable) position = get_bits_count(gbc); if (get_bits_left(gbc) < width + 1) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid signed value at " "%s: bitstream ended.\n", name); return AVERROR_INVALIDDATA; } magnitude = get_bits(gbc, width); sign = get_bits1(gbc); value = sign ? -(int32_t)magnitude : magnitude; if (ctx->trace_enable) { char bits[33]; int i; for (i = 0; i < width; i++) bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0'; bits[i] = sign ? '1' : '0'; bits[i + 1] = 0; ff_cbs_trace_syntax_element(ctx, position, name, subscripts, bits, value); }
static int cbs_write_ue_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc, const char *name, uint32_t value, uint32_t range_min, uint32_t range_max) { int len; if (value < range_min || value > range_max) { av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: " "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n", name, value, range_min, range_max); return AVERROR_INVALIDDATA; } av_assert0(value != UINT32_MAX); len = av_log2(value + 1); if (put_bits_left(pbc) < 2 * len + 1) return AVERROR(ENOSPC); if (ctx->trace_enable) { char bits[65]; int i; for (i = 0; i < len; i++) bits[i] = '0'; bits[len] = '1'; for (i = 0; i < len; i++) bits[len + i + 1] = (value + 1) >> (len - i - 1) & 1 ? '1' : '0'; bits[len + len + 1] = 0; ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc), name, bits, value); }
static int cbs_read_se_golomb(CodedBitstreamContext *ctx, BitstreamContext *bc, const char *name, int32_t *write_to, int32_t range_min, int32_t range_max) { int32_t value; int position, i, j; unsigned int k; uint32_t v; char bits[65]; position = bitstream_tell(bc); for (i = 0; i < 32; i++) { if (bitstream_bits_left(bc) < i + 1) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at " "%s: bitstream ended.\n", name); return AVERROR_INVALIDDATA; } k = bitstream_read_bit(bc); bits[i] = k ? '1' : '0'; if (k) break; } if (i >= 32) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at " "%s: more than 31 zeroes.\n", name); return AVERROR_INVALIDDATA; } v = 1; for (j = 0; j < i; j++) { k = bitstream_read_bit(bc); bits[i + j + 1] = k ? '1' : '0'; v = v << 1 | k; } bits[i + j + 1] = 0; if (v & 1) value = -(int32_t)(v / 2); else value = v / 2; if (ctx->trace_enable) ff_cbs_trace_syntax_element(ctx, position, name, bits, value); if (value < range_min || value > range_max) { av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: " "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n", name, value, range_min, range_max); return AVERROR_INVALIDDATA; } *write_to = value; return 0; }
static int cbs_read_ue_golomb(CodedBitstreamContext *ctx, GetBitContext *gbc, const char *name, uint32_t *write_to, uint32_t range_min, uint32_t range_max) { uint32_t value; int position, i, j; unsigned int k; char bits[65]; position = get_bits_count(gbc); for (i = 0; i < 32; i++) { if (get_bits_left(gbc) < i + 1) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at " "%s: bitstream ended.\n", name); return AVERROR_INVALIDDATA; } k = get_bits1(gbc); bits[i] = k ? '1' : '0'; if (k) break; } if (i >= 32) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at " "%s: more than 31 zeroes.\n", name); return AVERROR_INVALIDDATA; } value = 1; for (j = 0; j < i; j++) { k = get_bits1(gbc); bits[i + j + 1] = k ? '1' : '0'; value = value << 1 | k; } bits[i + j + 1] = 0; --value; if (ctx->trace_enable) ff_cbs_trace_syntax_element(ctx, position, name, bits, value); if (value < range_min || value > range_max) { av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: " "%"PRIu32", but must be in [%"PRIu32",%"PRIu32"].\n", name, value, range_min, range_max); return AVERROR_INVALIDDATA; } *write_to = value; return 0; }