ref: e5ec0f8da3602829811d26f03f1a841ceeee64ca
parent: 3cfcd0594afa1edc7137586d2951fd74f3938763
author: jm@0101bb08-14d6-0310-b084-bc0e0c8e3800 <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
date: Thu Jan 17 23:24:09 EST 2008
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
--- a/libentcode/mfrngdec.c
+++ b/libentcode/mfrngdec.c
@@ -137,24 +137,26 @@
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
--- a/libentcode/rangedec.c
+++ b/libentcode/rangedec.c
@@ -120,24 +120,26 @@
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