/*Outputs a symbol, with a carry bit. Ifthereisapotentialtopropagateacarryoverseveralsymbols,theyare buffereduntilitcanbedeterminedwhetherornotanactualcarrywill occur. Ifthecounterforthebufferedsymbolsoverflows,thenthestreambecomes undecodable. Thisgivesatheoreticallimitofafewbillionsymbolsinasinglepacketon 32-bitsystems. Thealternativeistotruncatetherangeinordertoforceacarry,but
requires similar carry tracking in the decoder, needlessly slowing it down.*/ staticvoid ec_enc_carry_out(ec_enc *_this,int _c){ if(_c!=EC_SYM_MAX){ /*No further carry propagation possible, flush buffer.*/ int carry;
carry=_c>>EC_SYM_BITS; /*Don't output a byte on the first write.
This compare should be taken care of by branch-prediction thereafter.*/ if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry); if(_this->ext>0){ unsigned sym;
sym=(EC_SYM_MAX+carry)&EC_SYM_MAX; do _this->error|=ec_write_byte(_this,sym); while(--(_this->ext)>0);
}
_this->rem=_c&EC_SYM_MAX;
} else _this->ext++;
}
static OPUS_INLINE void ec_enc_normalize(ec_enc *_this){ /*If the range is too small, output some bits and rescale it.*/ while(_this->rng<=EC_CODE_BOT){
ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT)); /*Move the next-to-high-order symbol into the high-order position.*/
_this->val=(_this->val<<EC_SYM_BITS)&(EC_CODE_TOP-1);
_this->rng<<=EC_SYM_BITS;
_this->nbits_total+=EC_SYM_BITS;
}
}
void ec_enc_init(ec_enc *_this,unsignedchar *_buf,opus_uint32 _size){
_this->buf=_buf;
_this->end_offs=0;
_this->end_window=0;
_this->nend_bits=0; /*This is the offset from which ec_tell() will subtract partial bits.*/
_this->nbits_total=EC_CODE_BITS+1;
_this->offs=0;
_this->rng=EC_CODE_TOP;
_this->rem=-1;
_this->val=0;
_this->ext=0;
_this->storage=_size;
_this->error=0;
}
void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){ unsigned ft; unsigned fl; int ftb; /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
celt_assert(_ft>1);
_ft--;
ftb=EC_ILOG(_ft); if(ftb>EC_UINT_BITS){
ftb-=EC_UINT_BITS;
ft=(_ft>>ftb)+1;
fl=(unsigned)(_fl>>ftb);
ec_encode(_this,fl,fl+1,ft);
ec_enc_bits(_this,_fl&(((opus_uint32)1<<ftb)-1U),ftb);
} else ec_encode(_this,_fl,_fl+1,_ft+1);
}
void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){ int shift; unsigned mask;
celt_assert(_nbits<=EC_SYM_BITS);
shift=EC_SYM_BITS-_nbits;
mask=((1<<_nbits)-1)<<shift; if(_this->offs>0){ /*The first byte has been finalized.*/
_this->buf[0]=(unsignedchar)((_this->buf[0]&~mask)|_val<<shift);
} elseif(_this->rem>=0){ /*The first byte is still awaiting carry propagation.*/
_this->rem=(_this->rem&~mask)|_val<<shift;
} elseif(_this->rng<=(EC_CODE_TOP>>_nbits)){ /*The renormalization loop has never been run.*/
_this->val=(_this->val&~((opus_uint32)mask<<EC_CODE_SHIFT))|
(opus_uint32)_val<<(EC_CODE_SHIFT+shift);
} /*The encoder hasn't even encoded _nbits of data yet.*/ else _this->error=-1;
}
void ec_enc_done(ec_enc *_this){
ec_window window; int used;
opus_uint32 msk;
opus_uint32 end; int l; /*We output the minimum number of bits that ensures that the symbols encoded
thus far will be decoded correctly regardless of the bits that follow.*/
l=EC_CODE_BITS-EC_ILOG(_this->rng);
msk=(EC_CODE_TOP-1)>>l;
end=(_this->val+msk)&~msk; if((end|msk)>=_this->val+_this->rng){
l++;
msk>>=1;
end=(_this->val+msk)&~msk;
} while(l>0){
ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT));
end=(end<<EC_SYM_BITS)&(EC_CODE_TOP-1);
l-=EC_SYM_BITS;
} /*If we have a buffered byte flush it into the output buffer.*/ if(_this->rem>=0||_this->ext>0)ec_enc_carry_out(_this,0); /*If we have buffered extra bits, flush them as well.*/
window=_this->end_window;
used=_this->nend_bits; while(used>=EC_SYM_BITS){
_this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX);
window>>=EC_SYM_BITS;
used-=EC_SYM_BITS;
} /*Clear any excess space and add any remaining extra bits to the last byte.*/ if(!_this->error){ if (_this->buf) OPUS_CLEAR(_this->buf+_this->offs,
_this->storage-_this->offs-_this->end_offs); if(used>0){ /*If there's no range coder data at all, give up.*/ if(_this->end_offs>=_this->storage)_this->error=-1; else{
l=-l; /*If we've busted, don't add too many extra bits to the last byte; it
would corrupt the range coder data, and that's more important.*/ if(_this->offs+_this->end_offs>=_this->storage&&l<used){
window&=(1<<l)-1;
_this->error=-1;
}
_this->buf[_this->storage-_this->end_offs-1]|=(unsignedchar)window;
}
}
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-09-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.