Timothy B. Terriberry
2008-Dec-21 03:12 UTC
[PATCH] Fix ectest to not check a case which isn't guaranteed to work, and which we don't use.
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--