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);
|
||||
}
|
||||
nbits=ec_enc_tell(&enc);
|
||||
nbits=ec_enc_tellf(&enc,4);
|
||||
ec_enc_done(&enc);
|
||||
fprintf(stderr,
|
||||
"Encoded %0.2lf bits of entropy to %li bits (%0.3lf%% wasted).\n",
|
||||
entropy,nbits,100*(nbits-entropy)/nbits);
|
||||
"Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
|
||||
entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
|
||||
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_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.
|
||||
The actual number of bits may be larger, due to rounding to whole bytes, or
|
||||
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);
|
||||
|
||||
/*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.
|
||||
All reamining output bytes are flushed to the output buffer.
|
||||
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;
|
||||
}
|
||||
|
||||
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){
|
||||
/*We compute the integer in the current interval that has the largest number
|
||||
of trailing zeros, and write that to the stream.
|
||||
|
|
|
@ -104,6 +104,31 @@ long ec_enc_tell(ec_enc *_this){
|
|||
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){
|
||||
/*We compute the integer in the current interval that has the largest number
|
||||
of trailing zeros, and write that to the stream.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue