| /* Copyright (c) 2001-2011 Timothy B. Terriberry |
| */ |
| /* |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions |
| are met: |
| |
| - Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| |
| - Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the distribution. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
| CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include "entcode.h" |
| #include "arch.h" |
| |
| #if !defined(EC_CLZ) |
| int ec_ilog(opus_uint32 _v){ |
| /*On a Pentium M, this branchless version tested as the fastest on |
| 1,000,000,000 random 32-bit integers, edging out a similar version with |
| branches, and a 256-entry LUT version.*/ |
| int ret; |
| int m; |
| ret=!!_v; |
| m=!!(_v&0xFFFF0000)<<4; |
| _v>>=m; |
| ret|=m; |
| m=!!(_v&0xFF00)<<3; |
| _v>>=m; |
| ret|=m; |
| m=!!(_v&0xF0)<<2; |
| _v>>=m; |
| ret|=m; |
| m=!!(_v&0xC)<<1; |
| _v>>=m; |
| ret|=m; |
| ret+=!!(_v&0x2); |
| return ret; |
| } |
| #endif |
| |
| opus_uint32 ec_tell_frac(ec_ctx *_this){ |
| opus_uint32 nbits; |
| opus_uint32 r; |
| int l; |
| int i; |
| /*To handle the non-integral number of bits still left in the encoder/decoder |
| state, we compute the worst-case number of bits of val that must be |
| encoded to ensure that the value is inside the range for any possible |
| subsequent bits. |
| The computation here is independent of val itself (the decoder does not |
| even track that value), even though the real number of bits used after |
| ec_enc_done() may be 1 smaller if rng is a power of two and the |
| corresponding trailing bits of val are all zeros. |
| If we did try to track that special case, then coding a value with a |
| probability of 1/(1<<n) might sometimes appear to use more than n bits. |
| This may help explain the surprising result that a newly initialized |
| encoder or decoder claims to have used 1 bit.*/ |
| nbits=_this->nbits_total<<BITRES; |
| l=EC_ILOG(_this->rng); |
| r=_this->rng>>(l-16); |
| for(i=BITRES;i-->0;){ |
| int b; |
| r=r*r>>15; |
| b=(int)(r>>16); |
| l=l<<1|b; |
| r>>=b; |
| } |
| return nbits-l; |
| } |