Add ec_enc_tellf, which can return the number of bits used to fractional precision.
git-svn-id: http://svn.xiph.org/trunk/ghost@14393 0101bb08-14d6-0310-b084-bc0e0c8e3800
This commit is contained in:
parent
06390d082d
commit
fad779ca56
4 changed files with 63 additions and 4 deletions
|
@ -73,11 +73,11 @@ int main(int _argc,char **_argv){
|
||||||
}
|
}
|
||||||
ec_probmod_clear(&mod);
|
ec_probmod_clear(&mod);
|
||||||
}
|
}
|
||||||
nbits=ec_enc_tell(&enc);
|
nbits=ec_enc_tellf(&enc,4);
|
||||||
ec_enc_done(&enc);
|
ec_enc_done(&enc);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Encoded %0.2lf bits of entropy to %li bits (%0.3lf%% wasted).\n",
|
"Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
|
||||||
entropy,nbits,100*(nbits-entropy)/nbits);
|
entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
|
||||||
fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
|
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_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
|
||||||
ec_dec_init(&dec,&buf);
|
ec_dec_init(&dec,&buf);
|
||||||
|
|
|
@ -66,9 +66,18 @@ void ec_enc_uint64(ec_enc *_this,ec_uint64 _fl,ec_uint64 _ft);
|
||||||
/*Returns the number of bits "used" by the encoded symbols so far.
|
/*Returns the number of bits "used" by the encoded symbols so far.
|
||||||
The actual number of bits may be larger, due to rounding to whole bytes, or
|
The actual number of bits may be larger, due to rounding to whole bytes, or
|
||||||
smaller, due to trailing zeros that can be stripped.
|
smaller, due to trailing zeros that can be stripped.
|
||||||
Return: the number of bits.*/
|
Return: The number of bits.*/
|
||||||
long ec_enc_tell(ec_enc *_this);
|
long ec_enc_tell(ec_enc *_this);
|
||||||
|
|
||||||
|
/*Returns the number of bits "used" by the encoded symbols so far.
|
||||||
|
The actual number of bits may be larger, due to rounding to whole bytes, or
|
||||||
|
smaller, due to trailing zeros that can be stripped.
|
||||||
|
_b: The number of extra bits of precision to include.
|
||||||
|
At most 16 will be accurate.
|
||||||
|
Return: The number of bits scaled by 2**_b.
|
||||||
|
This will always be slightly larger than the exact value.*/
|
||||||
|
long ec_enc_tellf(ec_enc *_this,int _b);
|
||||||
|
|
||||||
/*Indicates that there are no more symbols to encode.
|
/*Indicates that there are no more symbols to encode.
|
||||||
All reamining output bytes are flushed to the output buffer.
|
All reamining output bytes are flushed to the output buffer.
|
||||||
ec_enc_init() must be called before the encoder can be used again.*/
|
ec_enc_init() must be called before the encoder can be used again.*/
|
||||||
|
|
|
@ -132,6 +132,31 @@ long ec_enc_tell(ec_enc *_this){
|
||||||
return nbits;
|
return nbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long ec_enc_tellf(ec_enc *_this,int _b){
|
||||||
|
ec_uint32 r;
|
||||||
|
int l;
|
||||||
|
long nbits;
|
||||||
|
nbits=ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext<<3;
|
||||||
|
/*To handle the non-integral number of bits still left in the encoder state,
|
||||||
|
we compute the number of bits of low that must be encoded to ensure that
|
||||||
|
the value is inside the range for any possible subsequent bits.
|
||||||
|
Note that this is subtly different than the actual value we would end the
|
||||||
|
stream with, which tries to make as many of the trailing bits zeros as
|
||||||
|
possible.*/
|
||||||
|
nbits+=EC_CODE_BITS;
|
||||||
|
nbits<<=_b;
|
||||||
|
l=EC_ILOG(_this->rng);
|
||||||
|
r=_this->rng>>l-16;
|
||||||
|
while(_b-->0){
|
||||||
|
int b;
|
||||||
|
r=r*r>>15;
|
||||||
|
b=(int)(r>>16);
|
||||||
|
l=l<<1|b;
|
||||||
|
r>>=b;
|
||||||
|
}
|
||||||
|
return nbits-l;
|
||||||
|
}
|
||||||
|
|
||||||
void ec_enc_done(ec_enc *_this){
|
void ec_enc_done(ec_enc *_this){
|
||||||
/*We compute the integer in the current interval that has the largest number
|
/*We compute the integer in the current interval that has the largest number
|
||||||
of trailing zeros, and write that to the stream.
|
of trailing zeros, and write that to the stream.
|
||||||
|
|
|
@ -104,6 +104,31 @@ long ec_enc_tell(ec_enc *_this){
|
||||||
return nbits;
|
return nbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long ec_enc_tellf(ec_enc *_this,int _b){
|
||||||
|
ec_uint32 r;
|
||||||
|
int l;
|
||||||
|
long nbits;
|
||||||
|
nbits=ec_byte_bytes(_this->buf)+(_this->rem>=0)+_this->ext<<3;
|
||||||
|
/*To handle the non-integral number of bits still left in the encoder state,
|
||||||
|
we compute the number of bits of low that must be encoded to ensure that
|
||||||
|
the value is inside the range for any possible subsequent bits.
|
||||||
|
Note that this is subtly different than the actual value we would end the
|
||||||
|
stream with, which tries to make as many of the trailing bits zeros as
|
||||||
|
possible.*/
|
||||||
|
nbits+=EC_CODE_BITS;
|
||||||
|
nbits<<=_b;
|
||||||
|
l=EC_ILOG(_this->rng);
|
||||||
|
r=_this->rng>>l-16;
|
||||||
|
while(_b-->0){
|
||||||
|
int b;
|
||||||
|
r=r*r>>15;
|
||||||
|
b=(int)(r>>16);
|
||||||
|
l=l<<1|b;
|
||||||
|
r>>=b;
|
||||||
|
}
|
||||||
|
return nbits-l;
|
||||||
|
}
|
||||||
|
|
||||||
void ec_enc_done(ec_enc *_this){
|
void ec_enc_done(ec_enc *_this){
|
||||||
/*We compute the integer in the current interval that has the largest number
|
/*We compute the integer in the current interval that has the largest number
|
||||||
of trailing zeros, and write that to the stream.
|
of trailing zeros, and write that to the stream.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue