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:
parent
3cfcd0594a
commit
e5ec0f8da3
2 changed files with 32 additions and 28 deletions
|
@ -137,24 +137,26 @@ static int ec_dec_in(ec_dec *_this){
|
||||||
int ret;
|
int ret;
|
||||||
ret=ec_byte_read1(_this->buf);
|
ret=ec_byte_read1(_this->buf);
|
||||||
if(ret<0){
|
if(ret<0){
|
||||||
|
unsigned char *buf;
|
||||||
long bytes;
|
long bytes;
|
||||||
bytes=ec_byte_bytes(_this->buf);
|
bytes=ec_byte_bytes(_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);
|
buf=ec_byte_get_buffer(_this->buf);
|
||||||
|
/*Breaking abstraction: don't do this at home, kids.*/
|
||||||
|
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
|
/*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.*/
|
zero, return an extra EC_FOF_RSV1 byte.*/
|
||||||
do bytes--;
|
do p--;
|
||||||
while(bytes>0&&buf[bytes]==EC_FOF_RSV1);
|
while(p>buf&&p[0]==EC_FOF_RSV1);
|
||||||
if(!buf[bytes])ret=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 ret;
|
return 0;
|
||||||
|
}
|
||||||
|
else return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Normalizes the contents of dif and rng so that rng lies entirely in the
|
/*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;
|
int ret;
|
||||||
ret=ec_byte_read1(_this->buf);
|
ret=ec_byte_read1(_this->buf);
|
||||||
if(ret<0){
|
if(ret<0){
|
||||||
|
unsigned char *buf;
|
||||||
long bytes;
|
long bytes;
|
||||||
bytes=ec_byte_bytes(_this->buf);
|
bytes=ec_byte_bytes(_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);
|
buf=ec_byte_get_buffer(_this->buf);
|
||||||
|
/*Breaking abstraction: don't do this at home, kids.*/
|
||||||
|
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
|
/*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.*/
|
zero, return an extra EC_FOF_RSV1 byte.*/
|
||||||
do bytes--;
|
do p--;
|
||||||
while(bytes>0&&buf[bytes]==EC_FOF_RSV1);
|
while(p>buf&&p[0]==EC_FOF_RSV1);
|
||||||
if(!buf[bytes])ret=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 ret;
|
return 0;
|
||||||
|
}
|
||||||
|
else return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Normalizes the contents of dif and rng so that rng lies entirely in the
|
/*Normalizes the contents of dif and rng so that rng lies entirely in the
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue