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