23#ifndef ALTERH264_BITS_READER_H
24#define ALTERH264_BITS_READER_H
31 const uint8_t *start, *
end;
44 br->
read = (
const uint32_t *)((uintptr_t)buf & ~(uintptr_t)3);
45 br->
bits = 32 - (buf - (
const uint8_t *)br->
read) * 8;
48 v = (
v >> 24) | ((
v >> 8) & 0x0000ff00) | ((
v << 8) & 0x00ff0000) | (
v << 24);
54 return ((
const uint8_t *)br->
read - br->
start) * 8 - br->
bits;
69 int left = (br->
end - (
const uint8_t *)br->
read) * 8;
72 v1 = br->
val >> (32 - br->
bits);
79 if (left < (
int)
bits) {
80 br->
read = (
const uint32_t *)(((uintptr_t)br->
end + 3) & ~(uintptr_t)3);
90 v2 = (v2 >> 24) | ((v2 >> 8) & 0x0000ff00) | ((v2 << 8) & 0x00ff0000) | (v2 << 24);
92 v1 |= v2 >> (32 -
bits);
119 int left = (br->
end - (
const uint8_t *)br->
read) * 8;
124 br->
read = (
const uint32_t *)(((uintptr_t)br->
end + 3) & ~(uintptr_t)3);
131 if (endian_is.little)
132 v2 = (v2 >> 24) | ((v2 >> 8) & 0x0000ff00) | ((v2 << 8) & 0x00ff0000) | (v2 << 24);
135 br->
bits = (left >= 32 ? 32 : left) -
bits;
155 static const uint32_t mask[4] = {0x00000000, 0xff000000, 0xffff0000, 0xffffff00};
165 if ((
const uint8_t *)br->
read < br->
end) {
166 const uint32_t *p = (
const uint32_t *)((uintptr_t)br->
end & ~(uintptr_t)3);
168 n = br->
end - (
const uint8_t *)p;
171 if (endian_is.little)
172 v = (
v >> 24) | ((
v >> 8) & 0x0000ff00) | ((
v << 8) & 0x00ff0000) | (
v << 24);
178 while (!
v && (p > br->
read)) {
180 if (endian_is.little)
181 v = (
v >> 24) | ((
v >> 8) & 0x0000ff00) | ((
v << 8) & 0x00ff0000) | (
v << 24);
192 v = br->
val >> n << n;
209 uint32_t v1 = br->
val;
212 while (!(v1 & 0x80000000))
217 int left = (br->
end - (
const uint8_t *)br->
read) * 8;
221 br->
read = (
const uint32_t *)(((uintptr_t)br->
end + 3) & ~(uintptr_t)3);
228 if (rest > (uint32_t)left)
231 if (endian_is.little)
232 v2 = (v2 >> 24) | ((v2 >> 8) & 0x0000ff00) | ((v2 << 8) & 0x00ff0000) | (v2 << 24);
233 if (v2 & (0xffffffff << (32 - rest))) {
234 while (!(v2 & 0x80000000))
241 br->
bits = (left > 32 ? 32 : left) + br->
bits - size;
245 if (br->
bits >= size) {
246 uint32_t res = br->
val >> (32 - size);
253 int left = (br->
end - (
const uint8_t *)br->
read) * 8;
256 if (left < (
int)size) {
257 br->
read = (
const uint32_t *)(((uintptr_t)br->
end + 3) & ~(uintptr_t)3);
264 if (endian_is.little)
265 v2 = (v2 >> 24) | ((v2 >> 8) & 0x0000ff00) | ((v2 << 8) & 0x00ff0000) | (v2 << 24);
266 res = (res << size) + (v2 >> (32 - size));
267 br->
val = v2 << size;
268 br->
bits = (left > 32 ? 32 : left) - size;
276 return (res & 1) ? (int32_t)((res + 1) >> 1) : -(int32_t)(res >> 1);
282int main (
int argc,
char **argv) {
283 static const uint8_t test[] =
"\x75\x99\xfb\x07\x55\xd8\xff\x23\x11\xab\xa8";
285 unsigned int v1, v2, v3, v4, v5, v6, v7, v8, v9, m;
303 printf (
"%s\n", __FILE__);
304 printf (
"(1) 3 7 5 (8) 8 (7) 1 12 4 23 9\n");
305 printf (
"--- %08x %08x %08x --- %08x --- %08x %08x %08x %08x %08x\n", v1, v2, v3, v4, v5, v6, v7, v8, v9);
306 printf (
"more: %08x\n", m);
Definition bits_reader.h:26
const uint8_t * start
Definition bits_reader.h:27
int oflow
Definition bits_reader.h:28
uint32_t bits
Definition vdec_hw_bits_reader.h:32
const uint32_t * read
Definition vdec_hw_bits_reader.h:30
uint32_t val
Definition vdec_hw_bits_reader.h:32
const uint8_t * end
Definition vdec_hw_bits_reader.h:31
uint32_t v
Definition utils.c:1157
static uint32_t bits_exp_ue(bits_reader_t *br)
Definition vdec_hw_bits_reader.h:201
static int32_t bits_exp_se(bits_reader_t *br)
Definition vdec_hw_bits_reader.h:273
static void _bits_skip_slow(bits_reader_t *br, uint32_t bits)
Definition vdec_hw_bits_reader.h:113
static uint32_t bits_tell(bits_reader_t *br)
Definition vdec_hw_bits_reader.h:53
static uint32_t bits_read(bits_reader_t *br, const uint32_t bits)
Definition vdec_hw_bits_reader.h:99
static void bits_set_buf(bits_reader_t *br, const uint8_t *buf, uint32_t len)
Definition vdec_hw_bits_reader.h:35
static void bits_skip(bits_reader_t *br, const uint32_t bits)
Definition vdec_hw_bits_reader.h:139
static uint32_t bits_valid_left(bits_reader_t *br)
Definition vdec_hw_bits_reader.h:154
static uint32_t _bits_read_slow(bits_reader_t *br, uint32_t bits)
Definition vdec_hw_bits_reader.h:63