Commit e5ec0f8d authored by jm@0101bb08-14d6-0310-b084-bc0e0c8e3800's avatar jm@0101bb08-14d6-0310-b084-bc0e0c8e3800 Committed by Jean-Marc Valin
Browse files

Reverted some of Timothy's changes to the range decoding that were causing...

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
parent 3cfcd059
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment