summaryrefslogtreecommitdiff
path: root/src/video_dec/libvdpau/bits_reader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_dec/libvdpau/bits_reader.h')
-rw-r--r--src/video_dec/libvdpau/bits_reader.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/video_dec/libvdpau/bits_reader.h b/src/video_dec/libvdpau/bits_reader.h
new file mode 100644
index 000000000..9563c9d3b
--- /dev/null
+++ b/src/video_dec/libvdpau/bits_reader.h
@@ -0,0 +1,36 @@
+#include <sys/types.h>
+
+
+
+typedef struct {
+ uint8_t *buffer;
+ int offbits;
+} bits_reader_t;
+
+static void bits_reader_set( bits_reader_t *br, uint8_t *buf )
+{
+ br->buffer = buf;
+ br->offbits = 0;
+}
+
+static uint32_t read_bits( bits_reader_t *br, int nbits )
+{
+ int i, nbytes;
+ uint32_t ret = 0;
+ uint8_t *buf;
+
+ buf = br->buffer;
+ nbytes = (br->offbits + nbits)/8;
+ if ( ((br->offbits + nbits) %8 ) > 0 )
+ nbytes++;
+ for ( i=0; i<nbytes; i++ )
+ ret += buf[i]<<((nbytes-i-1)*8);
+ i = (4-nbytes)*8+br->offbits;
+ ret = ((ret<<i)>>i)>>((nbytes*8)-nbits-br->offbits);
+
+ br->offbits += nbits;
+ br->buffer += br->offbits / 8;
+ br->offbits %= 8;
+
+ return ret;
+}