Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/celt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy B. Terriberry <tterribe@xiph.org>2011-02-15 00:26:05 +0300
committerJean-Marc Valin <jean-marc.valin@octasic.com>2011-02-15 00:32:16 +0300
commitf18ad4387a58803694e64b440872482829ad564c (patch)
treece685236e1d6fb66413f3e1225c7222c9e83bbf0
parent5b236756a3243b5ea71f8910bbb09f319c5e4e15 (diff)
Refactor ec_enc_patch_initial_bits().
The return code has been eliminated in favor of using the existing error flag in the ec_enc struct. This also adds the declaration to the header, which JM's importation of Koen's adaptation of my original code in b3c05b6b omitted.
-rw-r--r--libcelt/entenc.c44
-rw-r--r--libcelt/entenc.h16
2 files changed, 37 insertions, 23 deletions
diff --git a/libcelt/entenc.c b/libcelt/entenc.c
index 9420132..9297b5f 100644
--- a/libcelt/entenc.c
+++ b/libcelt/entenc.c
@@ -215,29 +215,27 @@ void ec_enc_bits(ec_enc *_this,ec_uint32 _fl,unsigned _bits){
_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_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]=(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 _this->error=-1;
}
void ec_enc_shrink(ec_enc *_this,ec_uint32 _size){
diff --git a/libcelt/entenc.h b/libcelt/entenc.h
index 51dbca9..e64e887 100644
--- a/libcelt/entenc.h
+++ b/libcelt/entenc.h
@@ -78,6 +78,22 @@ void ec_enc_uint(ec_enc *_this,ec_uint32 _fl,ec_uint32 _ft);
This must be between 0 and 25, inclusive.*/
void ec_enc_bits(ec_enc *_this,ec_uint32 _fl,unsigned _ftb);
+/*Overwrites a few bits at the very start of an existing stream, after they
+ have already been encoded.
+ This makes it possible to have a few flags up front, where it is easy for
+ decoders to access them without parsing the whole stream, even if their
+ values are not determined until late in the encoding process, without having
+ to buffer all the intermediate symbols in the encoder.
+ In order for this to work, at least _nbits bits must have already been
+ encoded using probabilities that are an exact power of two.
+ The encoder can verify the number of encoded bits is sufficient, but cannot
+ check this latter condition.
+ _val: The bits to encode (in the least _nbits significant bits).
+ They will be decoded in order from most-significant to least.
+ _nbits: The number of bits to overwrite.
+ This must be no more than 8.*/
+void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits);
+
/*Compacts the data to fit in the target size.
This moves up the raw bits at the end of the current buffer so they are at
the end of the new buffer size.