Add ec_dec_tell() to report the same information as ec_enc_tell() decode side. Remove...
[opus.git] / libentcode / entdec.c
index 9712155..3ec7cf5 100644 (file)
@@ -96,10 +96,20 @@ ec_uint32 ec_dec_bits(ec_dec *_this,int _ftb){
   return t;
 }
 
+ec_uint64 ec_dec_bits64(ec_dec *_this,int _ftb){
+  ec_uint64 t;
+  if(_ftb>32){
+    t=ec_dec_bits(_this,32);
+    _ftb-=32;
+  }
+  else t=0;
+  return t<<_ftb|ec_dec_bits(_this,_ftb);
+}
+
 ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
   ec_uint32 mask;
-  ec_uint32 ft;
   ec_uint32 t;
+  unsigned  ft;
   unsigned  s;
   int       ftb;
   t=0;
@@ -107,7 +117,7 @@ ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
   ftb=EC_ILOG(_ft);
   while(ftb>EC_UNIT_BITS){
     ftb-=EC_UNIT_BITS;
-    ft=(_ft>>ftb)+1;
+    ft=(unsigned)(_ft>>ftb)+1;
     s=ec_decode(_this,ft);
     ec_dec_update(_this,s,s+1,ft);
     t=t<<EC_UNIT_BITS|s;
@@ -116,8 +126,34 @@ ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
     _ft=_ft&mask;
   }
   _ft++;
-  s=ec_decode(_this,_ft);
-  ec_dec_update(_this,s,s+1,_ft);
+  s=ec_decode(_this,(unsigned)_ft);
+  ec_dec_update(_this,s,s+1,(unsigned)_ft);
+  t=t<<ftb|s;
+  return t;
+}
+
+ec_uint64 ec_dec_uint64(ec_dec *_this,ec_uint64 _ft){
+  ec_uint64 mask;
+  ec_uint64 t;
+  unsigned  ft;
+  unsigned  s;
+  int       ftb;
+  t=0;
+  _ft--;
+  ftb=EC_ILOG64(_ft);
+  while(ftb>EC_UNIT_BITS){
+    ftb-=EC_UNIT_BITS;
+    ft=(unsigned)(_ft>>ftb)+1;
+    s=ec_decode(_this,ft);
+    ec_dec_update(_this,s,s+1,ft);
+    t=t<<EC_UNIT_BITS|s;
+    if(s<ft-1)return t<<ftb|ec_dec_bits64(_this,ftb);
+    mask=((ec_uint64)1<<ftb)-1;
+    _ft=_ft&mask;
+  }
+  _ft++;
+  s=ec_decode(_this,(unsigned)_ft);
+  ec_dec_update(_this,s,s+1,(unsigned)_ft);
   t=t<<ftb|s;
   return t;
 }