Move skip coding into interp_bits2pulses().
[opus.git] / libcelt / entdec.h
index f5feb1a..7d3046d 100644 (file)
@@ -1,3 +1,34 @@
+/* Copyright (c) 2001-2008 Timothy B. Terriberry
+   Copyright (c) 2008-2009 Xiph.Org Foundation */
+/*
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #if !defined(_entdec_H)
 # define _entdec_H (1)
 # include "entcode.h"
@@ -16,11 +47,17 @@ struct ec_dec{
    int             rem;
    /*The number of values in the current range.*/
    ec_uint32       rng;
-   /*The difference between the input value and the lowest value in the current
-      range.*/
+   /*The difference between the top of the current range and the input value.*/
    ec_uint32       dif;
    /*Normalization factor.*/
    ec_uint32       nrm;
+   /*Byte that will be written at the end*/
+   unsigned char   end_byte;
+   /*Number of valid bits in end_byte*/
+   int             end_bits_left;
+   int             nb_end_bits;
+   /*Nonzero if an error occurred*/
+   int             error;
 };
 
 
@@ -42,7 +79,8 @@ void ec_dec_init(ec_dec *_this,ec_byte_buffer *_buf);
            up to and including the one encoded is fh, then the returned value
            will fall in the range [fl,fh).*/
 unsigned ec_decode(ec_dec *_this,unsigned _ft);
-unsigned ec_decode_bin(ec_dec *_this,unsigned bits);
+unsigned ec_decode_bin(ec_dec *_this,unsigned _bits);
+
 /*Advance the decoder past the next symbol using the frequency information the
    symbol was encoded with.
   Exactly one call to ec_decode() must have been made so that all necessary
@@ -64,14 +102,7 @@ void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,
   _ftb: The number of bits to extract.
         This must be at least one, and no more than 32.
   Return: The decoded bits.*/
-ec_uint32 ec_dec_bits(ec_dec *_this,int _ftb);
-/*Extracts a sequence of raw bits from the stream.
-  The bits must have been encoded with ec_enc_bits64().
-  No call to ec_dec_update() is necessary after this call.
-  _ftb: The number of bits to extract.
-        This must be at least one, and no more than 64.
-  Return: The decoded bits.*/
-ec_uint64 ec_dec_bits64(ec_dec *_this,int _ftb);
+ec_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb);
 /*Extracts a raw unsigned integer with a non-power-of-2 range from the stream.
   The bits must have been encoded with ec_enc_uint().
   No call to ec_dec_update() is necessary after this call.
@@ -79,18 +110,11 @@ ec_uint64 ec_dec_bits64(ec_dec *_this,int _ftb);
        This must be at least one, and no more than 2**32-1.
   Return: The decoded bits.*/
 ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft);
-/*Extracts a raw unsigned integer with a non-power-of-2 range from the stream.
-  The bits must have been encoded with ec_enc_uint64().
-  No call to ec_dec_update() is necessary after this call.
-  _ft: The number of integers that can be decoded (one more than the max).
-       This must be at least one, and no more than 2**64-1.
-  Return: The decoded bits.*/
-ec_uint64 ec_dec_uint64(ec_dec *_this,ec_uint64 _ft);
 
-/*Returns the number of bits "used" by the decoded symbols so far.
-  The actual number of bits may be larger, due to rounding to whole bytes, or
-   smaller, due to trailing zeros that were be stripped, so this is not an
-   estimate of the true packet size.
+/* Decode a bit that has a _prob/65536 probability of being a one */
+int ec_dec_bit_prob(ec_dec *_this,unsigned _prob);
+
+/*Returns the number of bits "used" by the encoded symbols so far.
   This same number can be computed by the encoder, and is suitable for making
    coding decisions.
   _b: The number of extra bits of precision to include.
@@ -98,6 +122,9 @@ ec_uint64 ec_dec_uint64(ec_dec *_this,ec_uint64 _ft);
   Return: The number of bits scaled by 2**_b.
           This will always be slightly larger than the exact value (e.g., all
            rounding error is in the positive direction).*/
-long ec_dec_tell(ec_dec *_this,int _b);
+ec_uint32 ec_dec_tell(ec_dec *_this,int _b);
+
+/*Returns a nonzero value if any error has been detected during decoding*/
+int ec_dec_get_error(ec_dec *_this);
 
 #endif