1af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Copyright 2014 Google Inc. All Rights Reserved. 2af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// 3af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Use of this source code is governed by a BSD-style license 4af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// that can be found in the COPYING file in the root of the source 5af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// tree. An additional intellectual property rights grant can be found 6af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// in the file PATENTS. All contributing project authors may 7af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// be found in the AUTHORS file in the root of the source tree. 8af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// ----------------------------------------------------------------------------- 9af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// 10af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Specific inlined methods for boolean decoder [VP8GetBit() ...] 11af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// This file should be included by the .c sources that actually need to call 12af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// these methods. 13af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// 14af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Author: Skal (pascal.massimino@gmail.com) 15af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 16af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifndef WEBP_UTILS_BIT_READER_INL_H_ 17af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#define WEBP_UTILS_BIT_READER_INL_H_ 18af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 19af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifdef HAVE_CONFIG_H 20af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#include "webp/config.h" 21af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 22af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 23af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifdef WEBP_FORCE_ALIGNED 24af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#include <string.h> // memcpy 25af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 26af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 27af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#include "./bit_reader.h" 28af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#include "./endian_inl.h" 29af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 30af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifdef __cplusplus 31af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern "C" { 32af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 33af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 34af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora//------------------------------------------------------------------------------ 35af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Derived type lbit_t = natural type for memory I/O 36af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 37af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if (BITS > 32) 38af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroratypedef uint64_t lbit_t; 39af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#elif (BITS > 16) 40af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroratypedef uint32_t lbit_t; 41af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#elif (BITS > 8) 42af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroratypedef uint16_t lbit_t; 43af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else 44af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroratypedef uint8_t lbit_t; 45af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 46af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 47af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const uint8_t kVP8Log2Range[128]; 48af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const range_t kVP8NewRange[128]; 49af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 50af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// special case for the tail byte-reading 51af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid VP8LoadFinalBytes(VP8BitReader* const br); 52af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 53af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora//------------------------------------------------------------------------------ 54af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Inlined critical functions 55af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 56af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// makes sure br->value_ has at least BITS bits worth of data 57af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arorastatic WEBP_INLINE void VP8LoadNewBytes(VP8BitReader* const br) { 58af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora assert(br != NULL && br->buf_ != NULL); 59af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // Read 'BITS' bits at a time if possible. 60af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (br->buf_ + sizeof(lbit_t) <= br->buf_end_) { 61af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // convert memory type to register type (with some zero'ing!) 62af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bit_t bits; 63af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(WEBP_FORCE_ALIGNED) 64af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora lbit_t in_bits; 65af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora memcpy(&in_bits, br->buf_, sizeof(in_bits)); 66af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#elif defined(__mips__) && !defined(__mips64) // MIPS 67af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // This is needed because of un-aligned read. 68af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora lbit_t in_bits; 69af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora lbit_t* p_buf_ = (lbit_t*)br->buf_; 70af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora __asm__ volatile( 71af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora ".set push \n\t" 72af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora ".set at \n\t" 73af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora ".set macro \n\t" 74af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora "ulw %[in_bits], 0(%[p_buf_]) \n\t" 75af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora ".set pop \n\t" 76af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora : [in_bits]"=r"(in_bits) 77af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora : [p_buf_]"r"(p_buf_) 78af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora : "memory", "at" 79af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora ); 80af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else 81af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const lbit_t in_bits = *(const lbit_t*)br->buf_; 82af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 83af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->buf_ += BITS >> 3; 84af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if !defined(WORDS_BIGENDIAN) 85af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if (BITS > 32) 86af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits = BSwap64(in_bits); 87af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits >>= 64 - BITS; 88af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#elif (BITS >= 24) 89af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits = BSwap32(in_bits); 90af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits >>= (32 - BITS); 91af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#elif (BITS == 16) 92af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits = BSwap16(in_bits); 93af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else // BITS == 8 94af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits = (bit_t)in_bits; 95af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif // BITS > 32 96af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else // WORDS_BIGENDIAN 97af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bits = (bit_t)in_bits; 98af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (BITS != 8 * sizeof(bit_t)) bits >>= (8 * sizeof(bit_t) - BITS); 99af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 100af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->value_ = bits | (br->value_ << BITS); 101af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->bits_ += BITS; 102af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } else { 103af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora VP8LoadFinalBytes(br); // no need to be inlined 104af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 105af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora} 106af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 107af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Read a bit with proba 'prob'. Speed-critical function! 108af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arorastatic WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob) { 109af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // Don't move this declaration! It makes a big speed difference to store 110af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't 111af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora // alter br->range_ value. 112af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range_t range = br->range_; 113af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (br->bits_ < 0) { 114af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora VP8LoadNewBytes(br); 115af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 116af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora { 117af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const int pos = br->bits_; 118af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const range_t split = (range * prob) >> 8; 119af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const range_t value = (range_t)(br->value_ >> pos); 120af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__arm__) || defined(_M_ARM) // ARM-specific 121af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const int bit = ((int)(split - value) >> 31) & 1; 122af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (value > split) { 123af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range -= split + 1; 124af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->value_ -= (bit_t)(split + 1) << pos; 125af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } else { 126af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range = split; 127af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 128af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else // faster version on x86 129af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora int bit; // Don't use 'const int bit = (value > split);", it's slower. 130af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (value > split) { 131af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range -= split + 1; 132af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->value_ -= (bit_t)(split + 1) << pos; 133af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bit = 1; 134af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } else { 135af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range = split; 136af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora bit = 0; 137af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 138af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 139af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (range <= (range_t)0x7e) { 140af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const int shift = kVP8Log2Range[range]; 141af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora range = kVP8NewRange[range]; 142af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->bits_ -= shift; 143af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 144af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->range_ = range; 145af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora return bit; 146af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 147af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora} 148af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 149af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// simplified version of VP8GetBit() for prob=0x80 (note shift is always 1 here) 150af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arorastatic WEBP_INLINE int VP8GetSigned(VP8BitReader* const br, int v) { 151af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora if (br->bits_ < 0) { 152af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora VP8LoadNewBytes(br); 153af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 154af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora { 155af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const int pos = br->bits_; 156af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const range_t split = br->range_ >> 1; 157af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const range_t value = (range_t)(br->value_ >> pos); 158af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const int32_t mask = (int32_t)(split - value) >> 31; // -1 or 0 159af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->bits_ -= 1; 160af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->range_ += mask; 161af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->range_ |= 1; 162af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora br->value_ -= (bit_t)((split + 1) & mask) << pos; 163af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora return (v ^ mask) - mask; 164af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora } 165af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora} 166af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 167af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifdef __cplusplus 168af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora} // extern "C" 169af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 170af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 171af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif // WEBP_UTILS_BIT_READER_INL_H_ 172