ref: b3c05b6be2a6579af55a625903e9e70687a4d77f
parent: 079b91695099adacffc3dd7d5f6c4ae1e7515bdf
author: Timothy B. Terriberry <[email protected]>
date: Mon Feb 14 09:40:27 EST 2011
Implements ec_enc_patch_initial_bits()
--- a/libcelt/entenc.c
+++ b/libcelt/entenc.c
@@ -215,6 +215,31 @@
_this->nbits_total+=_bits;
}
+int ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,int _nbits){
+ int shift;
+ unsigned mask;
+ if(_nbits<0||_nbits>EC_SYM_BITS)return -1;
+ shift=EC_SYM_BITS-_nbits;
+ mask=(1<<_nbits)-1<<shift;
+ if(_this->offs>0){
+ /*The first byte has been finalized.*/
+ _this->buf[0]=(unsigned char)(_this->buf[0]&~mask|_val<<shift);
+ }
+ else if(_this->rem>=0){
+ /*The first byte is still awaiting carry propagation.*/
+ _this->rem=_this->rem&~mask|_val<<shift;
+ }
+ else if(_this->rng<=EC_CODE_TOP>>shift){
+ /*The renormalization loop has never been run.*/
+ _this->val=_this->val&~((ec_uint32)mask<<EC_CODE_SHIFT)|
+ (ec_uint32)_val<<EC_CODE_SHIFT+shift;
+ }
+ /*The encoder hasn't even encoded _nbits of data yet.*/
+ else return -1;
+ /*Success!*/
+ return 0;
+}
+
void ec_enc_shrink(ec_enc *_this,ec_uint32 _size){
celt_assert(_this->offs+_this->end_offs<=_size);
CELT_MOVE(_this->buf+_size-_this->end_offs,