Eliminate the ec_int32 and ec_uint32 typedefs.
[opus.git] / libcelt / entcode.c
index fe35606..0626e51 100644 (file)
@@ -1,29 +1,40 @@
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "entcode.h"
+/* 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.
 
-void ec_byte_reset(ec_byte_buffer *_b){
-  _b->ptr=_b->buf;
-}
+   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.
+*/
 
-long ec_byte_bytes(ec_byte_buffer *_b){
-  return _b->ptr-_b->buf;
-}
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
-unsigned char *ec_byte_get_buffer(ec_byte_buffer *_b){
-  return _b->buf;
-}
+#include "entcode.h"
 
 
 
-int ec_ilog(ec_uint32 _v){
-#if defined(EC_CLZ)
-  return EC_CLZ0-EC_CLZ(_v);
-#else
+#if !defined(EC_CLZ)
+int ec_ilog(celt_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.*/
@@ -44,33 +55,36 @@ int ec_ilog(ec_uint32 _v){
   ret|=m;
   ret+=!!(_v&0x2);
   return ret;
-#endif
 }
-
-int ec_ilog64(ec_uint64 _v){
-#if defined(EC_CLZ64)
-  return EC_CLZ64_0-EC_CLZ64(_v);
-#else
-  ec_uint32 v;
-  int       ret;
-  int       m;
-  ret=!!_v;
-  m=!!(_v&0xFFFFFFFF00000000)<<5;
-  v=(ec_uint32)(_v>>m);
-  ret|=m;
-  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
+
+
+celt_uint32 ec_tell_frac(ec_ctx *_this){
+  celt_uint32 nbits;
+  celt_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;
 }