Stack allocation cleanup...
[speexdsp.git] / libspeex / speex_bits.h
1 /* Copyright (C) 2002 Jean-Marc Valin */
2 /**
3    @file speex_bits.h
4    @brief Handles bit packing/unpacking
5 */
6 /*
7    Redistribution and use in source and binary forms, with or without
8    modification, are permitted provided that the following conditions
9    are met:
10    
11    - Redistributions of source code must retain the above copyright
12    notice, this list of conditions and the following disclaimer.
13    
14    - Redistributions in binary form must reproduce the above copyright
15    notice, this list of conditions and the following disclaimer in the
16    documentation and/or other materials provided with the distribution.
17    
18    - Neither the name of the Xiph.org Foundation nor the names of its
19    contributors may be used to endorse or promote products derived from
20    this software without specific prior written permission.
21    
22    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
26    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34 */
35
36 #ifndef BITS_H
37 #define BITS_H
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 /** Maximum size of the bit-stream (for fixed-size allocation) */
44 #define MAX_BYTES_PER_FRAME 1000
45
46 /** Bit-packing data structure representing (part of) a bit-stream. */
47 typedef struct SpeexBits {
48    char *bytes; /**< "raw" data */
49    int  nbBits; /**< Total number of bits stored in the stream*/
50    int  bytePtr; /**< Position of the byte "cursor" */
51    int  bitPtr;  /**< Position of the bit "cursor" within the current byte */
52    int  owner; /**< Does the struct "own" the "raw" buffer (member "bytes") */
53 } SpeexBits;
54
55 /** Initializes and allocates resources for a SpeexBits struct */
56 void speex_bits_init(SpeexBits *bits);
57
58 /** Initializes SpeexBits struct using a pre-allocated buffer*/
59 void speex_bits_init_buffer(SpeexBits *bits, void *buff);
60
61 /** Frees all resources assiociated to a SpeexBits struct. Right now this does nothing since no resources are allocated, but this could change in the future.*/
62 void speex_bits_destroy(SpeexBits *bits);
63
64 /** Resets bits to initial value (just after initialization, erasing content)*/
65 void speex_bits_reset(SpeexBits *bits);
66
67 /** Rewind the bit-stream to the beginning (ready for read) without erasing the content */
68 void speex_bits_rewind(SpeexBits *bits);
69
70 /** Initializes the bit-stream from the data in an area of memory */
71 void speex_bits_read_from(SpeexBits *bits, char *bytes, int len);
72
73 /** Append bytes to the bit-stream
74  * @param bits Bit-stream to operate on
75  * @param bytes pointer to the bytes what will be appended
76  * @param len Number of bytes of append
77  */
78 void speex_bits_read_whole_bytes(SpeexBits *bits, char *bytes, int len);
79
80 /** Write the content of a bit-stream to an area of memory */
81 int speex_bits_write(SpeexBits *bits, char *bytes, int max_len);
82
83 /** Like speex_bits_write, but writes only the complete bytes in the stream. Also removes the written bytes from the stream */
84 int speex_bits_write_whole_bytes(SpeexBits *bits, char *bytes, int max_len);
85
86 /** Append bits to the bit-stream
87  * @param bits Bit-stream to operate on
88  * @param data Value to append as integer
89  * @param nbBits number of bits to consider in "data"
90  */
91 void speex_bits_pack(SpeexBits *bits, int data, int nbBits);
92
93 /** Interpret the next bits in the bit-stream as a signed integer
94  *
95  * @param bits Bit-stream to operate on
96  * @param nbBits Number of bits to interpret
97  * @return A signed integer represented by the bits read
98  */
99 int speex_bits_unpack_signed(SpeexBits *bits, int nbBits);
100
101 /** Interpret the next bits in the bit-stream as an unsigned integer
102  *
103  * @param bits Bit-stream to operate on
104  * @param nbBits Number of bits to interpret
105  * @return An unsigned integer represented by the bits read
106  */
107 unsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits);
108
109 /** Returns the number of bytes in the bit-stream, including the last one even if it is not "full"
110  *
111  * @param bits Bit-stream to operate on
112  * @return Number of bytes in the stream
113  */
114 int speex_bits_nbytes(SpeexBits *bits);
115
116 /** Same as speex_bits_unpack_unsigned, but without modifying the cursor position */
117 unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits);
118
119 /** Get the value of the next bit in the stream, without modifying the
120  * "cursor" position 
121  * 
122  * @param bits Bit-stream to operate on
123  */
124 int speex_bits_peek(SpeexBits *bits);
125
126 /** Advances the position of the "bit cursor" in the stream 
127  *
128  * @param bits Bit-stream to operate on
129  * @param n Number of bits to advance
130  * */
131 void speex_bits_advance(SpeexBits *bits, int n);
132
133 #ifdef __cplusplus
134 }
135 #endif
136
137 #endif