[xiph-commits] r14393 - trunk/ghost/libentcode

tterribe at svn.xiph.org tterribe at svn.xiph.org
Thu Jan 10 21:12:20 PST 2008


Author: tterribe
Date: 2008-01-10 21:12:17 -0800 (Thu, 10 Jan 2008)
New Revision: 14393

Modified:
   trunk/ghost/libentcode/ectest.c
   trunk/ghost/libentcode/entenc.h
   trunk/ghost/libentcode/mfrngenc.c
   trunk/ghost/libentcode/rangeenc.c
Log:
Add ec_enc_tellf, which can return the number of bits used to fractional
 precision.


Modified: trunk/ghost/libentcode/ectest.c
===================================================================
--- trunk/ghost/libentcode/ectest.c	2008-01-11 03:26:27 UTC (rev 14392)
+++ trunk/ghost/libentcode/ectest.c	2008-01-11 05:12:17 UTC (rev 14393)
@@ -73,11 +73,11 @@
     }
     ec_probmod_clear(&mod);
   }
-  nbits=ec_enc_tell(&enc);
+  nbits=ec_enc_tellf(&enc,4);
   ec_enc_done(&enc);
   fprintf(stderr,
-   "Encoded %0.2lf bits of entropy to %li bits (%0.3lf%% wasted).\n",
-   entropy,nbits,100*(nbits-entropy)/nbits);
+   "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
+   entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
   fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
   ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
   ec_dec_init(&dec,&buf);

Modified: trunk/ghost/libentcode/entenc.h
===================================================================
--- trunk/ghost/libentcode/entenc.h	2008-01-11 03:26:27 UTC (rev 14392)
+++ trunk/ghost/libentcode/entenc.h	2008-01-11 05:12:17 UTC (rev 14393)
@@ -66,9 +66,18 @@
 /*Returns the number of bits "used" by the encoded symbols so far.
   The actual number of bits may be larger, due to rounding to whole bytes, or
    smaller, due to trailing zeros that can be stripped.
-  Return: the number of bits.*/
+  Return: The number of bits.*/
 long ec_enc_tell(ec_enc *_this);
 
+/*Returns the number of bits "used" by the encoded symbols so far.
+  The actual number of bits may be larger, due to rounding to whole bytes, or
+   smaller, due to trailing zeros that can be stripped.
+  _b: The number of extra bits of precision to include.
+      At most 16 will be accurate.
+  Return: The number of bits scaled by 2**_b.
+          This will always be slightly larger than the exact value.*/
+long ec_enc_tellf(ec_enc *_this,int _b);
+
 /*Indicates that there are no more symbols to encode.
   All reamining output bytes are flushed to the output buffer.
   ec_enc_init() must be called before the encoder can be used again.*/

Modified: trunk/ghost/libentcode/mfrngenc.c
===================================================================
--- trunk/ghost/libentcode/mfrngenc.c	2008-01-11 03:26:27 UTC (rev 14392)
+++ trunk/ghost/libentcode/mfrngenc.c	2008-01-11 05:12:17 UTC (rev 14393)
@@ -132,6 +132,31 @@
   return nbits;
 }
 
+long ec_enc_tellf(ec_enc *_this,int _b){
+  ec_uint32 r;
+  int       l;
+  long      nbits;
+  nbits=ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext<<3;
+  /*To handle the non-integral number of bits still left in the encoder state,
+     we compute the number of bits of low that must be encoded to ensure that
+     the value is inside the range for any possible subsequent bits.
+    Note that this is subtly different than the actual value we would end the
+     stream with, which tries to make as many of the trailing bits zeros as
+     possible.*/
+  nbits+=EC_CODE_BITS;
+  nbits<<=_b;
+  l=EC_ILOG(_this->rng);
+  r=_this->rng>>l-16;
+  while(_b-->0){
+    int b;
+    r=r*r>>15;
+    b=(int)(r>>16);
+    l=l<<1|b;
+    r>>=b;
+  }
+  return nbits-l;
+}
+
 void ec_enc_done(ec_enc *_this){
   /*We compute the integer in the current interval that has the largest number
      of trailing zeros, and write that to the stream.

Modified: trunk/ghost/libentcode/rangeenc.c
===================================================================
--- trunk/ghost/libentcode/rangeenc.c	2008-01-11 03:26:27 UTC (rev 14392)
+++ trunk/ghost/libentcode/rangeenc.c	2008-01-11 05:12:17 UTC (rev 14393)
@@ -104,6 +104,31 @@
   return nbits;
 }
 
+long ec_enc_tellf(ec_enc *_this,int _b){
+  ec_uint32 r;
+  int       l;
+  long      nbits;
+  nbits=ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext<<3;
+  /*To handle the non-integral number of bits still left in the encoder state,
+     we compute the number of bits of low that must be encoded to ensure that
+     the value is inside the range for any possible subsequent bits.
+    Note that this is subtly different than the actual value we would end the
+     stream with, which tries to make as many of the trailing bits zeros as
+     possible.*/
+  nbits+=EC_CODE_BITS;
+  nbits<<=_b;
+  l=EC_ILOG(_this->rng);
+  r=_this->rng>>l-16;
+  while(_b-->0){
+    int b;
+    r=r*r>>15;
+    b=(int)(r>>16);
+    l=l<<1|b;
+    r>>=b;
+  }
+  return nbits-l;
+}
+
 void ec_enc_done(ec_enc *_this){
   /*We compute the integer in the current interval that has the largest number
      of trailing zeros, and write that to the stream.



More information about the commits mailing list