[PATCH] Fix ectest to not check a case which isn't guaranteed to work, and which we don't use.

Timothy B. Terriberry tterribe at xiph.org
Sat Dec 20 19:12:18 PST 2008


When I removed the special case for EC_ILOG(0) in commit
 06390d082dcdfa8addb3dde337543bc0f0ebae44, it broke ec_dec_uint() with _ft=1
 (which should encode the value 0 using 0 bits).
This feature was tested by ectest.c, but not actually used by libcelt.
An assert has been added to ec_dec_uint() to ensure that we don't try to use
 this feature by accident.
ec_enc_uint() was actually correct, but support for this feature has been
 removed and the assert put in its place.
---
 libcelt/entdec.c |    3 +++
 libcelt/entenc.c |    4 +++-
 tests/ectest.c   |    4 ++--
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/libcelt/entdec.c b/libcelt/entdec.c
index 555543f..284ce39 100644
--- a/libcelt/entdec.c
+++ b/libcelt/entdec.c
@@ -5,6 +5,7 @@
 #include <stddef.h>
 #include "entdec.h"
 #include "os_support.h"
+#include "arch.h"
 
 
 void ec_byte_readinit(ec_byte_buffer *_b,unsigned char *_buf,long _bytes){
@@ -106,6 +107,8 @@ ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
   unsigned  s;
   int       ftb;
   t=0;
+  /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
+  celt_assert(_ft>1);
   _ft--;
   ftb=EC_ILOG(_ft);
   if(ftb>EC_UNIT_BITS){
diff --git a/libcelt/entenc.c b/libcelt/entenc.c
index 3da351e..d0cbb0c 100644
--- a/libcelt/entenc.c
+++ b/libcelt/entenc.c
@@ -100,8 +100,10 @@ void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft){
   unsigned  ft;
   unsigned  fl;
   int       ftb;
+  /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
+  celt_assert(_ft>1);
   _ft--;
-  ftb=EC_ILOG(_ft)&-!!_ft;
+  ftb=EC_ILOG(_ft);
   if(ftb>EC_UNIT_BITS){
     ftb-=EC_UNIT_BITS;
     ft=(_ft>>ftb)+1;
diff --git a/tests/ectest.c b/tests/ectest.c
index b3fc220..49d39a1 100644
--- a/tests/ectest.c
+++ b/tests/ectest.c
@@ -31,7 +31,7 @@ int main(int _argc,char **_argv){
   /*Testing encoding of raw bit values.*/
   ec_byte_writeinit(&buf);
   ec_enc_init(&enc,&buf);
-  for(ft=0;ft<1024;ft++){
+  for(ft=2;ft<1024;ft++){
     for(i=0;i<ft;i++){
       entropy+=log(ft)*M_LOG2E;
       ec_enc_uint(&enc,i,ft);
@@ -59,7 +59,7 @@ int main(int _argc,char **_argv){
   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);
-  for(ft=0;ft<1024;ft++){
+  for(ft=2;ft<1024;ft++){
     for(i=0;i<ft;i++){
       sym=ec_dec_uint(&dec,ft);
       if(sym!=i){
-- 
1.5.2.5


--------------030206030905070301010901--


More information about the celt-dev mailing list