int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, BitstreamContext *bc, int width, const char *name, uint32_t *write_to, uint32_t range_min, uint32_t range_max) { uint32_t value; int position; av_assert0(width <= 32); if (bitstream_bits_left(bc) < 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 = bitstream_tell(bc); value = bitstream_read(bc, 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, bits, value); }
static int find_group3_syncmarker(BitstreamContext *bc, int srcsize) { unsigned int state = -1; srcsize -= bitstream_tell(bc); while (srcsize-- > 0) { state += state + bitstream_read_bit(bc); if ((state & 0xFFF) == 1) return 0; } return -1; }
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 void get_bits_align32(BitstreamContext *s) { int n = (-bitstream_tell(s)) & 31; if (n) bitstream_skip(s, n); }