Reverted some of Timothy's changes to the range decoding that were causing decode random decode problems at the end of the stream (but only once in a while).

git-svn-id: http://svn.xiph.org/trunk/ghost@14413 0101bb08-14d6-0310-b084-bc0e0c8e3800
This commit is contained in:
jm@0101bb08-14d6-0310-b084-bc0e0c8e3800 2008-01-18 04:24:09 +00:00 committed by Jean-Marc Valin
parent 3cfcd0594a
commit e5ec0f8da3
2 changed files with 32 additions and 28 deletions

View file

@ -137,24 +137,26 @@ static int ec_dec_in(ec_dec *_this){
int ret;
ret=ec_byte_read1(_this->buf);
if(ret<0){
long bytes;
unsigned char *buf;
long bytes;
bytes=ec_byte_bytes(_this->buf);
buf=ec_byte_get_buffer(_this->buf);
/*Breaking abstraction: don't do this at home, kids.*/
if(_this->buf->storage==bytes&&bytes>0){
unsigned char *buf;
buf=ec_byte_get_buffer(_this->buf);
/*If we end in a string of 0 or more EC_FOF_RSV1 bytes preceded by a
zero, return an extra EC_FOF_RSV1 byte.*/
do bytes--;
while(bytes>0&&buf[bytes]==EC_FOF_RSV1);
if(!buf[bytes])ret=EC_FOF_RSV1;
if(_this->buf->storage==bytes){
ec_byte_adv1(_this->buf);
if(bytes>0){
unsigned char *p;
p=buf+bytes;
/*If we end in a string of 0 or more EC_FOF_RSV1 bytes preceded by a
zero, return an extra EC_FOF_RSV1 byte.*/
do p--;
while(p>buf&&p[0]==EC_FOF_RSV1);
if(!p[0])return EC_FOF_RSV1;
}
}
else ret=0;
/*Needed to make sure the above conditional only triggers once, and to keep
oc_dec_tell() operating correctly.*/
ec_byte_adv1(_this->buf);
return 0;
}
return ret;
else return ret;
}
/*Normalizes the contents of dif and rng so that rng lies entirely in the

View file

@ -120,24 +120,26 @@ static int ec_dec_in(ec_dec *_this){
int ret;
ret=ec_byte_read1(_this->buf);
if(ret<0){
long bytes;
unsigned char *buf;
long bytes;
bytes=ec_byte_bytes(_this->buf);
buf=ec_byte_get_buffer(_this->buf);
/*Breaking abstraction: don't do this at home, kids.*/
if(_this->buf->storage==bytes&&bytes>0){
unsigned char *buf;
buf=ec_byte_get_buffer(_this->buf);
/*If we end in a string of 0 or more EC_FOF_RSV1 bytes preceded by a
zero, return an extra EC_FOF_RSV1 byte.*/
do bytes--;
while(bytes>0&&buf[bytes]==EC_FOF_RSV1);
if(!buf[bytes])ret=EC_FOF_RSV1;
if(_this->buf->storage==bytes){
ec_byte_adv1(_this->buf);
if(bytes>0){
unsigned char *p;
p=buf+bytes;
/*If we end in a string of 0 or more EC_FOF_RSV1 bytes preceded by a
zero, return an extra EC_FOF_RSV1 byte.*/
do p--;
while(p>buf&&p[0]==EC_FOF_RSV1);
if(!p[0])return EC_FOF_RSV1;
}
}
else ret=0;
/*Needed to make sure the above conditional only triggers once, and to keep
oc_dec_tell() operating correctly.*/
ec_byte_adv1(_this->buf);
return 0;
}
return ret;
else return ret;
}
/*Normalizes the contents of dif and rng so that rng lies entirely in the