1c888fe027c338f337123de4da2de1ac73b0f7587Christian König/**************************************************************************
2c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
3c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Copyright 2011 Christian König.
4c888fe027c338f337123de4da2de1ac73b0f7587Christian König * All Rights Reserved.
5c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
6c888fe027c338f337123de4da2de1ac73b0f7587Christian König * Permission is hereby granted, free of charge, to any person obtaining a
7c888fe027c338f337123de4da2de1ac73b0f7587Christian König * copy of this software and associated documentation files (the
8c888fe027c338f337123de4da2de1ac73b0f7587Christian König * "Software"), to deal in the Software without restriction, including
9c888fe027c338f337123de4da2de1ac73b0f7587Christian König * without limitation the rights to use, copy, modify, merge, publish,
10c888fe027c338f337123de4da2de1ac73b0f7587Christian König * distribute, sub license, and/or sell copies of the Software, and to
11c888fe027c338f337123de4da2de1ac73b0f7587Christian König * permit persons to whom the Software is furnished to do so, subject to
12c888fe027c338f337123de4da2de1ac73b0f7587Christian König * the following conditions:
13c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
14c888fe027c338f337123de4da2de1ac73b0f7587Christian König * The above copyright notice and this permission notice (including the
15c888fe027c338f337123de4da2de1ac73b0f7587Christian König * next paragraph) shall be included in all copies or substantial portions
16c888fe027c338f337123de4da2de1ac73b0f7587Christian König * of the Software.
17c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
18c888fe027c338f337123de4da2de1ac73b0f7587Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c888fe027c338f337123de4da2de1ac73b0f7587Christian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c888fe027c338f337123de4da2de1ac73b0f7587Christian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c888fe027c338f337123de4da2de1ac73b0f7587Christian König * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c888fe027c338f337123de4da2de1ac73b0f7587Christian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c888fe027c338f337123de4da2de1ac73b0f7587Christian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c888fe027c338f337123de4da2de1ac73b0f7587Christian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c888fe027c338f337123de4da2de1ac73b0f7587Christian König *
26c888fe027c338f337123de4da2de1ac73b0f7587Christian König **************************************************************************/
27c888fe027c338f337123de4da2de1ac73b0f7587Christian König
28efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/*
29efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * Functions for fast bitwise access to multiple probably unaligned input buffers
30efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
31efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
32c888fe027c338f337123de4da2de1ac73b0f7587Christian König#ifndef vl_vlc_h
33c888fe027c338f337123de4da2de1ac73b0f7587Christian König#define vl_vlc_h
34c888fe027c338f337123de4da2de1ac73b0f7587Christian König
3519bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_compiler.h"
369765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
3719bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_math.h"
38e3b0e3776646d0367206e4544229622eb22fe9f8Brian Paul#include "util/u_pointer.h"
39efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst#include "util/u_debug.h"
4049967950a56de276ffcbaea80acbc9f5bd3207bcVinson Lee
41c888fe027c338f337123de4da2de1ac73b0f7587Christian Königstruct vl_vlc
42c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
439765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   uint64_t buffer;
44efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   signed invalid_bits;
45efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   const uint8_t *data;
46efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   const uint8_t *end;
47efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
48efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   unsigned          num_inputs;
49efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   const void *const *inputs;
50efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   const unsigned    *sizes;
51efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   unsigned          bytes_left;
529765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König};
539765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
549765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstruct vl_vlc_entry
559765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
569765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   int8_t length;
579765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   int8_t value;
589765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König};
599765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
609765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstruct vl_vlc_compressed
619765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
629765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   uint16_t bitcode;
639765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   struct vl_vlc_entry entry;
64c888fe027c338f337123de4da2de1ac73b0f7587Christian König};
65c888fe027c338f337123de4da2de1ac73b0f7587Christian König
66efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
67efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * initalize and decompress a lookup table
68efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
6949967950a56de276ffcbaea80acbc9f5bd3207bcVinson Leestatic INLINE void
709765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_init_table(struct vl_vlc_entry *dst, unsigned dst_size, const struct vl_vlc_compressed *src, unsigned src_size)
71c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
729765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   unsigned i, bits = util_logbase2(dst_size);
739765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
74efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(dst && dst_size);
75efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(src && src_size);
76efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
779765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   for (i=0;i<dst_size;++i) {
789765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König      dst[i].length = 0;
799765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König      dst[i].value = 0;
809765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   }
819765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
829765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   for(; src_size > 0; --src_size, ++src) {
839765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König      for(i=0; i<(1 << (bits - src->entry.length)); ++i)
849765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König         dst[src->bitcode >> (16 - bits) | i] = src->entry;
859765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   }
869765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König}
879765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
88efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
89efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * switch over to next input buffer
90efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
91efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorststatic INLINE void
92efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorstvl_vlc_next_input(struct vl_vlc *vlc)
93efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst{
94efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   const uint8_t* data = vlc->inputs[0];
95efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   unsigned len = vlc->sizes[0];
96efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
97efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(vlc);
98efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(vlc->num_inputs);
99efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
100efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->bytes_left -= len;
101efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
102efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   /* align the data pointer */
103efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   while (len && pointer_to_uintptr(data) & 3) {
104efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      vlc->buffer |= (uint64_t)*data << (24 + vlc->invalid_bits);
105efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      ++data;
106efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      --len;
107efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      vlc->invalid_bits -= 8;
108efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   }
109efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->data = data;
110efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->end = data + len;
111efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
112efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   --vlc->num_inputs;
113efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   ++vlc->inputs;
114efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   ++vlc->sizes;
115efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst}
116efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
117efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
118efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * fill the bit buffer, so that at least 32 bits are valid
119efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
1209765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE void
1219765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_fillbits(struct vl_vlc *vlc)
1229765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
123efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(vlc);
1249765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
125efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   /* as long as the buffer needs to be filled */
126efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   while (vlc->invalid_bits > 0) {
127efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      unsigned bytes_left = vlc->end - vlc->data;
128efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
129efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      /* if this input is depleted */
130efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      if (bytes_left == 0) {
131efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
132efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         if (vlc->num_inputs)
133efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst            /* go on to next input */
134efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst            vl_vlc_next_input(vlc);
135efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         else
136efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst            /* or give up since we don't have anymore inputs */
137efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst            return;
138efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
139efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      } else if (bytes_left >= 4) {
140efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
141efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         /* enough bytes in buffer, read in a whole dword */
142efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         uint64_t value = *(const uint32_t*)vlc->data;
1439765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
1449765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König#ifndef PIPE_ARCH_BIG_ENDIAN
145efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         value = util_bswap32(value);
1469765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König#endif
1479765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
148efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         vlc->buffer |= value << vlc->invalid_bits;
149efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         vlc->data += 4;
150efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         vlc->invalid_bits -= 32;
151efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
152efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         /* buffer is now definitely filled up avoid the loop test */
153efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         break;
154efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
155efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      } else while (vlc->data < vlc->end) {
156efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
157efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         /* not enough bytes left in buffer, read single bytes */
158efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         vlc->buffer |= (uint64_t)*vlc->data << (24 + vlc->invalid_bits);
159efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         ++vlc->data;
160efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst         vlc->invalid_bits -= 8;
161efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      }
1629765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   }
163c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
164c888fe027c338f337123de4da2de1ac73b0f7587Christian König
165efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
166efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * initialize vlc structure and start reading from first input buffer
167efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
16849967950a56de276ffcbaea80acbc9f5bd3207bcVinson Leestatic INLINE void
169efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorstvl_vlc_init(struct vl_vlc *vlc, unsigned num_inputs,
170efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst            const void *const *inputs, const unsigned *sizes)
171c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
172efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   unsigned i;
173efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
1749765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   assert(vlc);
175efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   assert(num_inputs);
1769765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
1779765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vlc->buffer = 0;
178efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->invalid_bits = 32;
179efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->num_inputs = num_inputs;
180efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->inputs = inputs;
181efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->sizes = sizes;
182efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->bytes_left = 0;
1839765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
184efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   for (i = 0; i < num_inputs; ++i)
185efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst      vlc->bytes_left += sizes[i];
1869765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
187efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vl_vlc_next_input(vlc);
1889765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vl_vlc_fillbits(vlc);
1899765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vl_vlc_fillbits(vlc);
1909765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König}
1919765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
192efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
193efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * number of bits still valid in bit buffer
194efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
195efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorststatic INLINE unsigned
196efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorstvl_vlc_valid_bits(struct vl_vlc *vlc)
197efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst{
198efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   return 32 - vlc->invalid_bits;
199efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst}
200efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst
201efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
202efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * number of bits left over all inbut buffers
203efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
2049765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE unsigned
205d4bbdbd03893e900d8bcf0b46e8307a877d1a3aeChristian Königvl_vlc_bits_left(struct vl_vlc *vlc)
2069765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
207efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   signed bytes_left = vlc->end - vlc->data;
208efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   bytes_left += vlc->bytes_left;
209efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   return bytes_left * 8 + vl_vlc_valid_bits(vlc);
210c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
211c888fe027c338f337123de4da2de1ac73b0f7587Christian König
212efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
213efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * get num_bits from bit buffer without removing them
214efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
2159765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE unsigned
2169765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_peekbits(struct vl_vlc *vlc, unsigned num_bits)
217c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
2181fdecef8868ce1a5ca6c2cb260294fb37d3bd69dMaarten Lankhorst   assert(vl_vlc_valid_bits(vlc) >= num_bits || vlc->data >= vlc->end);
2199765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   return vlc->buffer >> (64 - num_bits);
220c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
221c888fe027c338f337123de4da2de1ac73b0f7587Christian König
222efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
223efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * remove num_bits from bit buffer
224efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
22549967950a56de276ffcbaea80acbc9f5bd3207bcVinson Leestatic INLINE void
2269765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_eatbits(struct vl_vlc *vlc, unsigned num_bits)
227c888fe027c338f337123de4da2de1ac73b0f7587Christian König{
2281fdecef8868ce1a5ca6c2cb260294fb37d3bd69dMaarten Lankhorst   assert(vl_vlc_valid_bits(vlc) >= num_bits);
2299765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2309765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vlc->buffer <<= num_bits;
231efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst   vlc->invalid_bits += num_bits;
232c888fe027c338f337123de4da2de1ac73b0f7587Christian König}
233c888fe027c338f337123de4da2de1ac73b0f7587Christian König
234efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
235efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * get num_bits from bit buffer with removing them
236efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
2379765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE unsigned
2389765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_get_uimsbf(struct vl_vlc *vlc, unsigned num_bits)
2399765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
2409765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   unsigned value;
2419765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2421fdecef8868ce1a5ca6c2cb260294fb37d3bd69dMaarten Lankhorst   assert(vl_vlc_valid_bits(vlc) >= num_bits);
2439765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2449765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   value = vlc->buffer >> (64 - num_bits);
2459765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vl_vlc_eatbits(vlc, num_bits);
2469765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2479765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   return value;
2489765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König}
2499765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
250efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
251efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * treat num_bits as signed value and remove them from bit buffer
252efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
2539765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE signed
2549765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_get_simsbf(struct vl_vlc *vlc, unsigned num_bits)
2559765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
2569765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   signed value;
2579765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2581fdecef8868ce1a5ca6c2cb260294fb37d3bd69dMaarten Lankhorst   assert(vl_vlc_valid_bits(vlc) >= num_bits);
2599765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König
2609765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   value = ((int64_t)vlc->buffer) >> (64 - num_bits);
2619765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vl_vlc_eatbits(vlc, num_bits);
262c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2639765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   return value;
2649765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König}
265c888fe027c338f337123de4da2de1ac73b0f7587Christian König
266efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst/**
267efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst * lookup a value and length in a decompressed table
268efa93ae449b6dc8437ee7240a8ea050a0d1699e0Maarten Lankhorst */
2699765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königstatic INLINE int8_t
2709765dede7556f7ccfef1d90bab14a2bfa03384e5Christian Königvl_vlc_get_vlclbf(struct vl_vlc *vlc, const struct vl_vlc_entry *tbl, unsigned num_bits)
2719765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König{
2729765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   tbl += vl_vlc_peekbits(vlc, num_bits);
2739765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   vl_vlc_eatbits(vlc, tbl->length);
2749765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König   return tbl->value;
2759765dede7556f7ccfef1d90bab14a2bfa03384e5Christian König}
276c888fe027c338f337123de4da2de1ac73b0f7587Christian König
277c888fe027c338f337123de4da2de1ac73b0f7587Christian König#endif /* vl_vlc_h */
278