xref: /aosp_15_r20/external/aac/libFDK/include/FDK_bitstream.h (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /******************* Library for basic calculation routines ********************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   M. Lohwasser
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: bitstream interface to bitbuffer routines
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #ifndef FDK_BITSTREAM_H
104*e5436536SAndroid Build Coastguard Worker #define FDK_BITSTREAM_H
105*e5436536SAndroid Build Coastguard Worker 
106*e5436536SAndroid Build Coastguard Worker #include "FDK_bitbuffer.h"
107*e5436536SAndroid Build Coastguard Worker #include "machine_type.h"
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker #define CACHE_BITS 32
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker #define BUFSIZE_DUMMY_VALUE MAX_BUFSIZE_BYTES
114*e5436536SAndroid Build Coastguard Worker 
115*e5436536SAndroid Build Coastguard Worker typedef enum { BS_READER, BS_WRITER } FDK_BS_CFG;
116*e5436536SAndroid Build Coastguard Worker 
117*e5436536SAndroid Build Coastguard Worker typedef struct {
118*e5436536SAndroid Build Coastguard Worker   UINT CacheWord;
119*e5436536SAndroid Build Coastguard Worker   UINT BitsInCache;
120*e5436536SAndroid Build Coastguard Worker   FDK_BITBUF hBitBuf;
121*e5436536SAndroid Build Coastguard Worker   UINT ConfigCache;
122*e5436536SAndroid Build Coastguard Worker } FDK_BITSTREAM;
123*e5436536SAndroid Build Coastguard Worker 
124*e5436536SAndroid Build Coastguard Worker typedef FDK_BITSTREAM *HANDLE_FDK_BITSTREAM;
125*e5436536SAndroid Build Coastguard Worker 
126*e5436536SAndroid Build Coastguard Worker /**
127*e5436536SAndroid Build Coastguard Worker  * \brief CreateBitStream Function.
128*e5436536SAndroid Build Coastguard Worker  *
129*e5436536SAndroid Build Coastguard Worker  * Create and initialize bitstream with extern allocated buffer.
130*e5436536SAndroid Build Coastguard Worker  *
131*e5436536SAndroid Build Coastguard Worker  * \param pBuffer  Pointer to BitBuffer array.
132*e5436536SAndroid Build Coastguard Worker  * \param bufSize  Length of BitBuffer array. (awaits size 2^n and <=
133*e5436536SAndroid Build Coastguard Worker  * MAX_BUFSIZE_BYTES)
134*e5436536SAndroid Build Coastguard Worker  * \param config   Initialize BitStream as Reader or Writer.
135*e5436536SAndroid Build Coastguard Worker  */
136*e5436536SAndroid Build Coastguard Worker FDK_INLINE
137*e5436536SAndroid Build Coastguard Worker HANDLE_FDK_BITSTREAM FDKcreateBitStream(UCHAR *pBuffer, UINT bufSize,
138*e5436536SAndroid Build Coastguard Worker                                         FDK_BS_CFG config = BS_READER) {
139*e5436536SAndroid Build Coastguard Worker   HANDLE_FDK_BITSTREAM hBitStream =
140*e5436536SAndroid Build Coastguard Worker       (HANDLE_FDK_BITSTREAM)FDKcalloc(1, sizeof(FDK_BITSTREAM));
141*e5436536SAndroid Build Coastguard Worker   if (hBitStream == NULL) return NULL;
142*e5436536SAndroid Build Coastguard Worker   FDK_InitBitBuffer(&hBitStream->hBitBuf, pBuffer, bufSize, 0);
143*e5436536SAndroid Build Coastguard Worker 
144*e5436536SAndroid Build Coastguard Worker   /* init cache */
145*e5436536SAndroid Build Coastguard Worker   hBitStream->CacheWord = hBitStream->BitsInCache = 0;
146*e5436536SAndroid Build Coastguard Worker   hBitStream->ConfigCache = config;
147*e5436536SAndroid Build Coastguard Worker 
148*e5436536SAndroid Build Coastguard Worker   return hBitStream;
149*e5436536SAndroid Build Coastguard Worker }
150*e5436536SAndroid Build Coastguard Worker 
151*e5436536SAndroid Build Coastguard Worker /**
152*e5436536SAndroid Build Coastguard Worker  * \brief Initialize BistreamBuffer. BitBuffer can point to filled BitBuffer
153*e5436536SAndroid Build Coastguard Worker  * array .
154*e5436536SAndroid Build Coastguard Worker  *
155*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
156*e5436536SAndroid Build Coastguard Worker  * \param pBuffer    Pointer to BitBuffer array.
157*e5436536SAndroid Build Coastguard Worker  * \param bufSize    Length of BitBuffer array in bytes. (awaits size 2^n and <=
158*e5436536SAndroid Build Coastguard Worker  * MAX_BUFSIZE_BYTES)
159*e5436536SAndroid Build Coastguard Worker  * \param validBits  Number of valid BitBuffer filled Bits.
160*e5436536SAndroid Build Coastguard Worker  * \param config     Initialize BitStream as Reader or Writer.
161*e5436536SAndroid Build Coastguard Worker  * \return void
162*e5436536SAndroid Build Coastguard Worker  */
163*e5436536SAndroid Build Coastguard Worker FDK_INLINE
164*e5436536SAndroid Build Coastguard Worker void FDKinitBitStream(HANDLE_FDK_BITSTREAM hBitStream, UCHAR *pBuffer,
165*e5436536SAndroid Build Coastguard Worker                       UINT bufSize, UINT validBits,
166*e5436536SAndroid Build Coastguard Worker                       FDK_BS_CFG config = BS_READER) {
167*e5436536SAndroid Build Coastguard Worker   FDK_InitBitBuffer(&hBitStream->hBitBuf, pBuffer, bufSize, validBits);
168*e5436536SAndroid Build Coastguard Worker 
169*e5436536SAndroid Build Coastguard Worker   /* init cache */
170*e5436536SAndroid Build Coastguard Worker   hBitStream->CacheWord = hBitStream->BitsInCache = 0;
171*e5436536SAndroid Build Coastguard Worker   hBitStream->ConfigCache = config;
172*e5436536SAndroid Build Coastguard Worker }
173*e5436536SAndroid Build Coastguard Worker 
174*e5436536SAndroid Build Coastguard Worker /**
175*e5436536SAndroid Build Coastguard Worker  * \brief ResetBitbuffer Function. Reset states in BitBuffer and Cache.
176*e5436536SAndroid Build Coastguard Worker  *
177*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
178*e5436536SAndroid Build Coastguard Worker  * \param config     Initialize BitStream as Reader or Writer.
179*e5436536SAndroid Build Coastguard Worker  * \return void
180*e5436536SAndroid Build Coastguard Worker  */
181*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKresetBitbuffer(HANDLE_FDK_BITSTREAM hBitStream,
182*e5436536SAndroid Build Coastguard Worker                                   FDK_BS_CFG config = BS_READER) {
183*e5436536SAndroid Build Coastguard Worker   FDK_ResetBitBuffer(&hBitStream->hBitBuf);
184*e5436536SAndroid Build Coastguard Worker 
185*e5436536SAndroid Build Coastguard Worker   /* init cache */
186*e5436536SAndroid Build Coastguard Worker   hBitStream->CacheWord = hBitStream->BitsInCache = 0;
187*e5436536SAndroid Build Coastguard Worker   hBitStream->ConfigCache = config;
188*e5436536SAndroid Build Coastguard Worker }
189*e5436536SAndroid Build Coastguard Worker 
190*e5436536SAndroid Build Coastguard Worker /** DeleteBitStream.
191*e5436536SAndroid Build Coastguard Worker 
192*e5436536SAndroid Build Coastguard Worker     Deletes the in Create Bitstream allocated BitStream and BitBuffer.
193*e5436536SAndroid Build Coastguard Worker */
FDKdeleteBitStream(HANDLE_FDK_BITSTREAM hBitStream)194*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKdeleteBitStream(HANDLE_FDK_BITSTREAM hBitStream) {
195*e5436536SAndroid Build Coastguard Worker   FDK_DeleteBitBuffer(&hBitStream->hBitBuf);
196*e5436536SAndroid Build Coastguard Worker   FDKfree(hBitStream);
197*e5436536SAndroid Build Coastguard Worker }
198*e5436536SAndroid Build Coastguard Worker 
199*e5436536SAndroid Build Coastguard Worker /**
200*e5436536SAndroid Build Coastguard Worker  * \brief ReadBits Function (forward). This function returns a number of
201*e5436536SAndroid Build Coastguard Worker  * sequential bits from the input bitstream.
202*e5436536SAndroid Build Coastguard Worker  *
203*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
204*e5436536SAndroid Build Coastguard Worker  * \param numberOfBits  The number of bits to be retrieved. ( (0),1 <=
205*e5436536SAndroid Build Coastguard Worker  * numberOfBits <= 32)
206*e5436536SAndroid Build Coastguard Worker  * \return the requested bits, right aligned
207*e5436536SAndroid Build Coastguard Worker  * \return
208*e5436536SAndroid Build Coastguard Worker  */
209*e5436536SAndroid Build Coastguard Worker 
FDKreadBits(HANDLE_FDK_BITSTREAM hBitStream,const UINT numberOfBits)210*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKreadBits(HANDLE_FDK_BITSTREAM hBitStream,
211*e5436536SAndroid Build Coastguard Worker                             const UINT numberOfBits) {
212*e5436536SAndroid Build Coastguard Worker   UINT bits = 0;
213*e5436536SAndroid Build Coastguard Worker   INT missingBits = (INT)numberOfBits - (INT)hBitStream->BitsInCache;
214*e5436536SAndroid Build Coastguard Worker 
215*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT(numberOfBits <= 32);
216*e5436536SAndroid Build Coastguard Worker   if (missingBits > 0) {
217*e5436536SAndroid Build Coastguard Worker     if (missingBits != 32) bits = hBitStream->CacheWord << missingBits;
218*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = FDK_get32(&hBitStream->hBitBuf);
219*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += CACHE_BITS;
220*e5436536SAndroid Build Coastguard Worker   }
221*e5436536SAndroid Build Coastguard Worker 
222*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache -= numberOfBits;
223*e5436536SAndroid Build Coastguard Worker 
224*e5436536SAndroid Build Coastguard Worker   return (bits | (hBitStream->CacheWord >> hBitStream->BitsInCache)) &
225*e5436536SAndroid Build Coastguard Worker          BitMask[numberOfBits];
226*e5436536SAndroid Build Coastguard Worker }
227*e5436536SAndroid Build Coastguard Worker 
FDKreadBit(HANDLE_FDK_BITSTREAM hBitStream)228*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKreadBit(HANDLE_FDK_BITSTREAM hBitStream) {
229*e5436536SAndroid Build Coastguard Worker   if (!hBitStream->BitsInCache) {
230*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = FDK_get32(&hBitStream->hBitBuf);
231*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache = CACHE_BITS - 1;
232*e5436536SAndroid Build Coastguard Worker     return hBitStream->CacheWord >> 31;
233*e5436536SAndroid Build Coastguard Worker   }
234*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache--;
235*e5436536SAndroid Build Coastguard Worker 
236*e5436536SAndroid Build Coastguard Worker   return (hBitStream->CacheWord >> hBitStream->BitsInCache) & 1;
237*e5436536SAndroid Build Coastguard Worker }
238*e5436536SAndroid Build Coastguard Worker 
239*e5436536SAndroid Build Coastguard Worker /**
240*e5436536SAndroid Build Coastguard Worker  * \brief Read2Bits Function (forward). This function reads 2 sequential
241*e5436536SAndroid Build Coastguard Worker  *        bits from the input bitstream. It is the optimized version
242*e5436536SAndroid Build Coastguard Worker           of FDKreadBits() for reading 2 bits.
243*e5436536SAndroid Build Coastguard Worker  *
244*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
245*e5436536SAndroid Build Coastguard Worker  * \return the requested bits, right aligned
246*e5436536SAndroid Build Coastguard Worker  * \return
247*e5436536SAndroid Build Coastguard Worker  */
FDKread2Bits(HANDLE_FDK_BITSTREAM hBitStream)248*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKread2Bits(HANDLE_FDK_BITSTREAM hBitStream) {
249*e5436536SAndroid Build Coastguard Worker   /*
250*e5436536SAndroid Build Coastguard Worker   ** Version corresponds to optimized FDKreadBits implementation
251*e5436536SAndroid Build Coastguard Worker   ** calling FDK_get32, that keeps read pointer aligned.
252*e5436536SAndroid Build Coastguard Worker   */
253*e5436536SAndroid Build Coastguard Worker   UINT bits = 0;
254*e5436536SAndroid Build Coastguard Worker   INT missingBits = 2 - (INT)hBitStream->BitsInCache;
255*e5436536SAndroid Build Coastguard Worker   if (missingBits > 0) {
256*e5436536SAndroid Build Coastguard Worker     bits = hBitStream->CacheWord << missingBits;
257*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = FDK_get32(&hBitStream->hBitBuf);
258*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += CACHE_BITS;
259*e5436536SAndroid Build Coastguard Worker   }
260*e5436536SAndroid Build Coastguard Worker 
261*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache -= 2;
262*e5436536SAndroid Build Coastguard Worker 
263*e5436536SAndroid Build Coastguard Worker   return (bits | (hBitStream->CacheWord >> hBitStream->BitsInCache)) & 0x3;
264*e5436536SAndroid Build Coastguard Worker }
265*e5436536SAndroid Build Coastguard Worker 
266*e5436536SAndroid Build Coastguard Worker /**
267*e5436536SAndroid Build Coastguard Worker  * \brief ReadBits Function (backward). This function returns a number of
268*e5436536SAndroid Build Coastguard Worker  * sequential bits from the input bitstream.
269*e5436536SAndroid Build Coastguard Worker  *
270*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
271*e5436536SAndroid Build Coastguard Worker  * \param numberOfBits  The number of bits to be retrieved.
272*e5436536SAndroid Build Coastguard Worker  * \return the requested bits, right aligned
273*e5436536SAndroid Build Coastguard Worker  */
FDKreadBitsBwd(HANDLE_FDK_BITSTREAM hBitStream,const UINT numberOfBits)274*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKreadBitsBwd(HANDLE_FDK_BITSTREAM hBitStream,
275*e5436536SAndroid Build Coastguard Worker                                const UINT numberOfBits) {
276*e5436536SAndroid Build Coastguard Worker   const UINT validMask = BitMask[numberOfBits];
277*e5436536SAndroid Build Coastguard Worker 
278*e5436536SAndroid Build Coastguard Worker   if (hBitStream->BitsInCache <= numberOfBits) {
279*e5436536SAndroid Build Coastguard Worker     const INT freeBits = (CACHE_BITS - 1) - hBitStream->BitsInCache;
280*e5436536SAndroid Build Coastguard Worker 
281*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = (hBitStream->CacheWord << freeBits) |
282*e5436536SAndroid Build Coastguard Worker                             FDK_getBwd(&hBitStream->hBitBuf, freeBits);
283*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += freeBits;
284*e5436536SAndroid Build Coastguard Worker   }
285*e5436536SAndroid Build Coastguard Worker 
286*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache -= numberOfBits;
287*e5436536SAndroid Build Coastguard Worker 
288*e5436536SAndroid Build Coastguard Worker   return (hBitStream->CacheWord >> hBitStream->BitsInCache) & validMask;
289*e5436536SAndroid Build Coastguard Worker }
290*e5436536SAndroid Build Coastguard Worker 
291*e5436536SAndroid Build Coastguard Worker /**
292*e5436536SAndroid Build Coastguard Worker  * \brief read an integer value using a varying number of bits from the
293*e5436536SAndroid Build Coastguard Worker  * bitstream
294*e5436536SAndroid Build Coastguard Worker  *
295*e5436536SAndroid Build Coastguard Worker  *        q.v. ISO/IEC FDIS 23003-3  Table 16
296*e5436536SAndroid Build Coastguard Worker  *
297*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
298*e5436536SAndroid Build Coastguard Worker  * \param nBits1  number of bits to read for a small integer value or escape
299*e5436536SAndroid Build Coastguard Worker  * value
300*e5436536SAndroid Build Coastguard Worker  * \param nBits2  number of bits to read for a medium sized integer value or
301*e5436536SAndroid Build Coastguard Worker  * escape value
302*e5436536SAndroid Build Coastguard Worker  * \param nBits3  number of bits to read for a large integer value
303*e5436536SAndroid Build Coastguard Worker  * \return integer value read from bitstream
304*e5436536SAndroid Build Coastguard Worker  */
escapedValue(HANDLE_FDK_BITSTREAM hBitStream,int nBits1,int nBits2,int nBits3)305*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT escapedValue(HANDLE_FDK_BITSTREAM hBitStream, int nBits1,
306*e5436536SAndroid Build Coastguard Worker                              int nBits2, int nBits3) {
307*e5436536SAndroid Build Coastguard Worker   UINT value = FDKreadBits(hBitStream, nBits1);
308*e5436536SAndroid Build Coastguard Worker 
309*e5436536SAndroid Build Coastguard Worker   if (value == (UINT)(1 << nBits1) - 1) {
310*e5436536SAndroid Build Coastguard Worker     UINT valueAdd = FDKreadBits(hBitStream, nBits2);
311*e5436536SAndroid Build Coastguard Worker     value += valueAdd;
312*e5436536SAndroid Build Coastguard Worker     if (valueAdd == (UINT)(1 << nBits2) - 1) {
313*e5436536SAndroid Build Coastguard Worker       value += FDKreadBits(hBitStream, nBits3);
314*e5436536SAndroid Build Coastguard Worker     }
315*e5436536SAndroid Build Coastguard Worker   }
316*e5436536SAndroid Build Coastguard Worker 
317*e5436536SAndroid Build Coastguard Worker   return value;
318*e5436536SAndroid Build Coastguard Worker }
319*e5436536SAndroid Build Coastguard Worker 
320*e5436536SAndroid Build Coastguard Worker /**
321*e5436536SAndroid Build Coastguard Worker  * \brief return a number of bits from the bitBuffer.
322*e5436536SAndroid Build Coastguard Worker  *        You have to know what you do! Cache has to be synchronized before
323*e5436536SAndroid Build Coastguard Worker  * using this function.
324*e5436536SAndroid Build Coastguard Worker  *
325*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
326*e5436536SAndroid Build Coastguard Worker  * \param numBits The number of bits to be retrieved.
327*e5436536SAndroid Build Coastguard Worker  * \return the requested bits, right aligned
328*e5436536SAndroid Build Coastguard Worker  */
FDKgetBits(HANDLE_FDK_BITSTREAM hBitStream,UINT numBits)329*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKgetBits(HANDLE_FDK_BITSTREAM hBitStream, UINT numBits) {
330*e5436536SAndroid Build Coastguard Worker   return FDK_get(&hBitStream->hBitBuf, numBits);
331*e5436536SAndroid Build Coastguard Worker }
332*e5436536SAndroid Build Coastguard Worker 
333*e5436536SAndroid Build Coastguard Worker /**
334*e5436536SAndroid Build Coastguard Worker  * \brief WriteBits Function. This function writes numberOfBits of value into
335*e5436536SAndroid Build Coastguard Worker  * bitstream.
336*e5436536SAndroid Build Coastguard Worker  *
337*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
338*e5436536SAndroid Build Coastguard Worker  * \param value         The data to be written
339*e5436536SAndroid Build Coastguard Worker  * \param numberOfBits  The number of bits to be written
340*e5436536SAndroid Build Coastguard Worker  * \return              Number of bits written
341*e5436536SAndroid Build Coastguard Worker  */
FDKwriteBits(HANDLE_FDK_BITSTREAM hBitStream,UINT value,const UINT numberOfBits)342*e5436536SAndroid Build Coastguard Worker FDK_INLINE UCHAR FDKwriteBits(HANDLE_FDK_BITSTREAM hBitStream, UINT value,
343*e5436536SAndroid Build Coastguard Worker                               const UINT numberOfBits) {
344*e5436536SAndroid Build Coastguard Worker   const UINT validMask = BitMask[numberOfBits];
345*e5436536SAndroid Build Coastguard Worker 
346*e5436536SAndroid Build Coastguard Worker   if (hBitStream == NULL) {
347*e5436536SAndroid Build Coastguard Worker     return numberOfBits;
348*e5436536SAndroid Build Coastguard Worker   }
349*e5436536SAndroid Build Coastguard Worker 
350*e5436536SAndroid Build Coastguard Worker   if ((hBitStream->BitsInCache + numberOfBits) < CACHE_BITS) {
351*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += numberOfBits;
352*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord =
353*e5436536SAndroid Build Coastguard Worker         (hBitStream->CacheWord << numberOfBits) | (value & validMask);
354*e5436536SAndroid Build Coastguard Worker   } else {
355*e5436536SAndroid Build Coastguard Worker     /* Put always 32 bits into memory             */
356*e5436536SAndroid Build Coastguard Worker     /* - fill cache's LSBits with MSBits of value */
357*e5436536SAndroid Build Coastguard Worker     /* - store 32 bits in memory using subroutine */
358*e5436536SAndroid Build Coastguard Worker     /* - fill remaining bits into cache's LSBits  */
359*e5436536SAndroid Build Coastguard Worker     /* - upper bits in cache are don't care       */
360*e5436536SAndroid Build Coastguard Worker 
361*e5436536SAndroid Build Coastguard Worker     /* Compute number of bits to be filled into cache */
362*e5436536SAndroid Build Coastguard Worker     int missing_bits = CACHE_BITS - hBitStream->BitsInCache;
363*e5436536SAndroid Build Coastguard Worker     int remaining_bits = numberOfBits - missing_bits;
364*e5436536SAndroid Build Coastguard Worker     value = value & validMask;
365*e5436536SAndroid Build Coastguard Worker     /* Avoid shift left by 32 positions */
366*e5436536SAndroid Build Coastguard Worker     UINT CacheWord =
367*e5436536SAndroid Build Coastguard Worker         (missing_bits == 32) ? 0 : (hBitStream->CacheWord << missing_bits);
368*e5436536SAndroid Build Coastguard Worker     CacheWord |= (value >> (remaining_bits));
369*e5436536SAndroid Build Coastguard Worker     FDK_put(&hBitStream->hBitBuf, CacheWord, 32);
370*e5436536SAndroid Build Coastguard Worker 
371*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = value;
372*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache = remaining_bits;
373*e5436536SAndroid Build Coastguard Worker   }
374*e5436536SAndroid Build Coastguard Worker 
375*e5436536SAndroid Build Coastguard Worker   return numberOfBits;
376*e5436536SAndroid Build Coastguard Worker }
377*e5436536SAndroid Build Coastguard Worker 
378*e5436536SAndroid Build Coastguard Worker /**
379*e5436536SAndroid Build Coastguard Worker  * \brief WriteBits Function (backward). This function writes numberOfBits of
380*e5436536SAndroid Build Coastguard Worker  * value into bitstream.
381*e5436536SAndroid Build Coastguard Worker  *
382*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
383*e5436536SAndroid Build Coastguard Worker  * \param value         Variable holds data to be written.
384*e5436536SAndroid Build Coastguard Worker  * \param numberOfBits  The number of bits to be written.
385*e5436536SAndroid Build Coastguard Worker  * \return number of bits written
386*e5436536SAndroid Build Coastguard Worker  */
FDKwriteBitsBwd(HANDLE_FDK_BITSTREAM hBitStream,UINT value,const UINT numberOfBits)387*e5436536SAndroid Build Coastguard Worker FDK_INLINE UCHAR FDKwriteBitsBwd(HANDLE_FDK_BITSTREAM hBitStream, UINT value,
388*e5436536SAndroid Build Coastguard Worker                                  const UINT numberOfBits) {
389*e5436536SAndroid Build Coastguard Worker   const UINT validMask = BitMask[numberOfBits];
390*e5436536SAndroid Build Coastguard Worker 
391*e5436536SAndroid Build Coastguard Worker   if ((hBitStream->BitsInCache + numberOfBits) <= CACHE_BITS) {
392*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += numberOfBits;
393*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord =
394*e5436536SAndroid Build Coastguard Worker         (hBitStream->CacheWord << numberOfBits) | (value & validMask);
395*e5436536SAndroid Build Coastguard Worker   } else {
396*e5436536SAndroid Build Coastguard Worker     FDK_putBwd(&hBitStream->hBitBuf, hBitStream->CacheWord,
397*e5436536SAndroid Build Coastguard Worker                hBitStream->BitsInCache);
398*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache = numberOfBits;
399*e5436536SAndroid Build Coastguard Worker     hBitStream->CacheWord = (value & validMask);
400*e5436536SAndroid Build Coastguard Worker   }
401*e5436536SAndroid Build Coastguard Worker 
402*e5436536SAndroid Build Coastguard Worker   return numberOfBits;
403*e5436536SAndroid Build Coastguard Worker }
404*e5436536SAndroid Build Coastguard Worker 
405*e5436536SAndroid Build Coastguard Worker /**
406*e5436536SAndroid Build Coastguard Worker  * \brief write an integer value using a varying number of bits from the
407*e5436536SAndroid Build Coastguard Worker  * bitstream
408*e5436536SAndroid Build Coastguard Worker  *
409*e5436536SAndroid Build Coastguard Worker  *        q.v. ISO/IEC FDIS 23003-3  Table 16
410*e5436536SAndroid Build Coastguard Worker  *
411*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
412*e5436536SAndroid Build Coastguard Worker  * \param value   the data to be written
413*e5436536SAndroid Build Coastguard Worker  * \param nBits1  number of bits to write for a small integer value or escape
414*e5436536SAndroid Build Coastguard Worker  * value
415*e5436536SAndroid Build Coastguard Worker  * \param nBits2  number of bits to write for a medium sized integer value or
416*e5436536SAndroid Build Coastguard Worker  * escape value
417*e5436536SAndroid Build Coastguard Worker  * \param nBits3  number of bits to write for a large integer value
418*e5436536SAndroid Build Coastguard Worker  * \return number of bits written
419*e5436536SAndroid Build Coastguard Worker  */
FDKwriteEscapedValue(HANDLE_FDK_BITSTREAM hBitStream,UINT value,UINT nBits1,UINT nBits2,UINT nBits3)420*e5436536SAndroid Build Coastguard Worker FDK_INLINE UCHAR FDKwriteEscapedValue(HANDLE_FDK_BITSTREAM hBitStream,
421*e5436536SAndroid Build Coastguard Worker                                       UINT value, UINT nBits1, UINT nBits2,
422*e5436536SAndroid Build Coastguard Worker                                       UINT nBits3) {
423*e5436536SAndroid Build Coastguard Worker   UCHAR nbits = 0;
424*e5436536SAndroid Build Coastguard Worker   UINT tmp = (1 << nBits1) - 1;
425*e5436536SAndroid Build Coastguard Worker 
426*e5436536SAndroid Build Coastguard Worker   if (value < tmp) {
427*e5436536SAndroid Build Coastguard Worker     nbits += FDKwriteBits(hBitStream, value, nBits1);
428*e5436536SAndroid Build Coastguard Worker   } else {
429*e5436536SAndroid Build Coastguard Worker     nbits += FDKwriteBits(hBitStream, tmp, nBits1);
430*e5436536SAndroid Build Coastguard Worker     value -= tmp;
431*e5436536SAndroid Build Coastguard Worker     tmp = (1 << nBits2) - 1;
432*e5436536SAndroid Build Coastguard Worker 
433*e5436536SAndroid Build Coastguard Worker     if (value < tmp) {
434*e5436536SAndroid Build Coastguard Worker       nbits += FDKwriteBits(hBitStream, value, nBits2);
435*e5436536SAndroid Build Coastguard Worker     } else {
436*e5436536SAndroid Build Coastguard Worker       nbits += FDKwriteBits(hBitStream, tmp, nBits2);
437*e5436536SAndroid Build Coastguard Worker       value -= tmp;
438*e5436536SAndroid Build Coastguard Worker 
439*e5436536SAndroid Build Coastguard Worker       nbits += FDKwriteBits(hBitStream, value, nBits3);
440*e5436536SAndroid Build Coastguard Worker     }
441*e5436536SAndroid Build Coastguard Worker   }
442*e5436536SAndroid Build Coastguard Worker 
443*e5436536SAndroid Build Coastguard Worker   return nbits;
444*e5436536SAndroid Build Coastguard Worker }
445*e5436536SAndroid Build Coastguard Worker 
446*e5436536SAndroid Build Coastguard Worker /**
447*e5436536SAndroid Build Coastguard Worker  * \brief SyncCache Function. Clear cache after read forward.
448*e5436536SAndroid Build Coastguard Worker  *
449*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
450*e5436536SAndroid Build Coastguard Worker  * \return void
451*e5436536SAndroid Build Coastguard Worker  */
FDKsyncCache(HANDLE_FDK_BITSTREAM hBitStream)452*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKsyncCache(HANDLE_FDK_BITSTREAM hBitStream) {
453*e5436536SAndroid Build Coastguard Worker   if (hBitStream->ConfigCache == BS_READER)
454*e5436536SAndroid Build Coastguard Worker     FDK_pushBack(&hBitStream->hBitBuf, hBitStream->BitsInCache,
455*e5436536SAndroid Build Coastguard Worker                  hBitStream->ConfigCache);
456*e5436536SAndroid Build Coastguard Worker   else if (hBitStream->BitsInCache) /* BS_WRITER */
457*e5436536SAndroid Build Coastguard Worker     FDK_put(&hBitStream->hBitBuf, hBitStream->CacheWord,
458*e5436536SAndroid Build Coastguard Worker             hBitStream->BitsInCache);
459*e5436536SAndroid Build Coastguard Worker 
460*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache = 0;
461*e5436536SAndroid Build Coastguard Worker   hBitStream->CacheWord = 0;
462*e5436536SAndroid Build Coastguard Worker }
463*e5436536SAndroid Build Coastguard Worker 
464*e5436536SAndroid Build Coastguard Worker /**
465*e5436536SAndroid Build Coastguard Worker  * \brief SyncCache Function. Clear cache after read backwards.
466*e5436536SAndroid Build Coastguard Worker  *
467*e5436536SAndroid Build Coastguard Worker  * \param  hBitStream HANDLE_FDK_BITSTREAM handle
468*e5436536SAndroid Build Coastguard Worker  * \return void
469*e5436536SAndroid Build Coastguard Worker  */
FDKsyncCacheBwd(HANDLE_FDK_BITSTREAM hBitStream)470*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKsyncCacheBwd(HANDLE_FDK_BITSTREAM hBitStream) {
471*e5436536SAndroid Build Coastguard Worker   if (hBitStream->ConfigCache == BS_READER) {
472*e5436536SAndroid Build Coastguard Worker     FDK_pushForward(&hBitStream->hBitBuf, hBitStream->BitsInCache,
473*e5436536SAndroid Build Coastguard Worker                     hBitStream->ConfigCache);
474*e5436536SAndroid Build Coastguard Worker   } else { /* BS_WRITER */
475*e5436536SAndroid Build Coastguard Worker     FDK_putBwd(&hBitStream->hBitBuf, hBitStream->CacheWord,
476*e5436536SAndroid Build Coastguard Worker                hBitStream->BitsInCache);
477*e5436536SAndroid Build Coastguard Worker   }
478*e5436536SAndroid Build Coastguard Worker 
479*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache = 0;
480*e5436536SAndroid Build Coastguard Worker   hBitStream->CacheWord = 0;
481*e5436536SAndroid Build Coastguard Worker }
482*e5436536SAndroid Build Coastguard Worker 
483*e5436536SAndroid Build Coastguard Worker /**
484*e5436536SAndroid Build Coastguard Worker  * \brief Byte Alignment Function with anchor
485*e5436536SAndroid Build Coastguard Worker  *        This function performs the byte_alignment() syntactic function on the
486*e5436536SAndroid Build Coastguard Worker  * input stream, i.e. some bits will be discarded so that the next bits to be
487*e5436536SAndroid Build Coastguard Worker  * read/written would be aligned on a byte boundary with respect to the
488*e5436536SAndroid Build Coastguard Worker  * given alignment anchor.
489*e5436536SAndroid Build Coastguard Worker  *
490*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
491*e5436536SAndroid Build Coastguard Worker  * \param alignmentAnchor bit position to be considered as origin for byte
492*e5436536SAndroid Build Coastguard Worker  * alignment
493*e5436536SAndroid Build Coastguard Worker  * \return void
494*e5436536SAndroid Build Coastguard Worker  */
FDKbyteAlign(HANDLE_FDK_BITSTREAM hBitStream,UINT alignmentAnchor)495*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKbyteAlign(HANDLE_FDK_BITSTREAM hBitStream,
496*e5436536SAndroid Build Coastguard Worker                              UINT alignmentAnchor) {
497*e5436536SAndroid Build Coastguard Worker   FDKsyncCache(hBitStream);
498*e5436536SAndroid Build Coastguard Worker   if (hBitStream->ConfigCache == BS_READER) {
499*e5436536SAndroid Build Coastguard Worker     FDK_pushForward(
500*e5436536SAndroid Build Coastguard Worker         &hBitStream->hBitBuf,
501*e5436536SAndroid Build Coastguard Worker         (UINT)((INT)8 - (((INT)alignmentAnchor -
502*e5436536SAndroid Build Coastguard Worker                           (INT)FDK_getValidBits(&hBitStream->hBitBuf)) &
503*e5436536SAndroid Build Coastguard Worker                          0x07)) &
504*e5436536SAndroid Build Coastguard Worker             0x07,
505*e5436536SAndroid Build Coastguard Worker         hBitStream->ConfigCache);
506*e5436536SAndroid Build Coastguard Worker   } else {
507*e5436536SAndroid Build Coastguard Worker     FDK_put(&hBitStream->hBitBuf, 0,
508*e5436536SAndroid Build Coastguard Worker             (8 - ((FDK_getValidBits(&hBitStream->hBitBuf) - alignmentAnchor) &
509*e5436536SAndroid Build Coastguard Worker                   0x07)) &
510*e5436536SAndroid Build Coastguard Worker                 0x07);
511*e5436536SAndroid Build Coastguard Worker   }
512*e5436536SAndroid Build Coastguard Worker }
513*e5436536SAndroid Build Coastguard Worker 
514*e5436536SAndroid Build Coastguard Worker /**
515*e5436536SAndroid Build Coastguard Worker  * \brief Push Back(Cache) / For / BiDirectional Function.
516*e5436536SAndroid Build Coastguard Worker  *        PushBackCache function ungets a number of bits erroneously
517*e5436536SAndroid Build Coastguard Worker  * read/written by the last Get() call. NB: The number of bits to be stuffed
518*e5436536SAndroid Build Coastguard Worker  * back into the stream may never exceed the number of bits returned by
519*e5436536SAndroid Build Coastguard Worker  * the immediately preceding Get() call.
520*e5436536SAndroid Build Coastguard Worker  *
521*e5436536SAndroid Build Coastguard Worker  *       PushBack function ungets a number of bits (combines cache and bitbuffer
522*e5436536SAndroid Build Coastguard Worker  * indices) PushFor  function gets a number of bits (combines cache and
523*e5436536SAndroid Build Coastguard Worker  * bitbuffer indices) PushBiDirectional gets/ungets number of bits as
524*e5436536SAndroid Build Coastguard Worker  * defined in PusBack/For function NB: The sign of bits is not known, so
525*e5436536SAndroid Build Coastguard Worker  * the function checks direction and calls appropriate function. (positive
526*e5436536SAndroid Build Coastguard Worker  * sign pushFor, negative sign pushBack )
527*e5436536SAndroid Build Coastguard Worker  *
528*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
529*e5436536SAndroid Build Coastguard Worker  * \param numberOfBits  The number of bits to be pushed back/for.
530*e5436536SAndroid Build Coastguard Worker  * \return void
531*e5436536SAndroid Build Coastguard Worker  */
FDKpushBackCache(HANDLE_FDK_BITSTREAM hBitStream,const UINT numberOfBits)532*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKpushBackCache(HANDLE_FDK_BITSTREAM hBitStream,
533*e5436536SAndroid Build Coastguard Worker                                  const UINT numberOfBits) {
534*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT((hBitStream->BitsInCache + numberOfBits) <= CACHE_BITS);
535*e5436536SAndroid Build Coastguard Worker   hBitStream->BitsInCache += numberOfBits;
536*e5436536SAndroid Build Coastguard Worker }
537*e5436536SAndroid Build Coastguard Worker 
FDKpushBack(HANDLE_FDK_BITSTREAM hBitStream,const UINT numberOfBits)538*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKpushBack(HANDLE_FDK_BITSTREAM hBitStream,
539*e5436536SAndroid Build Coastguard Worker                             const UINT numberOfBits) {
540*e5436536SAndroid Build Coastguard Worker   if ((hBitStream->BitsInCache + numberOfBits) < CACHE_BITS &&
541*e5436536SAndroid Build Coastguard Worker       (hBitStream->ConfigCache == BS_READER)) {
542*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache += numberOfBits;
543*e5436536SAndroid Build Coastguard Worker     FDKsyncCache(hBitStream); /* sync cache to avoid invalid cache */
544*e5436536SAndroid Build Coastguard Worker   } else {
545*e5436536SAndroid Build Coastguard Worker     FDKsyncCache(hBitStream);
546*e5436536SAndroid Build Coastguard Worker     FDK_pushBack(&hBitStream->hBitBuf, numberOfBits, hBitStream->ConfigCache);
547*e5436536SAndroid Build Coastguard Worker   }
548*e5436536SAndroid Build Coastguard Worker }
549*e5436536SAndroid Build Coastguard Worker 
FDKpushFor(HANDLE_FDK_BITSTREAM hBitStream,const UINT numberOfBits)550*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKpushFor(HANDLE_FDK_BITSTREAM hBitStream,
551*e5436536SAndroid Build Coastguard Worker                            const UINT numberOfBits) {
552*e5436536SAndroid Build Coastguard Worker   if ((hBitStream->BitsInCache > numberOfBits) &&
553*e5436536SAndroid Build Coastguard Worker       (hBitStream->ConfigCache == BS_READER)) {
554*e5436536SAndroid Build Coastguard Worker     hBitStream->BitsInCache -= numberOfBits;
555*e5436536SAndroid Build Coastguard Worker   } else {
556*e5436536SAndroid Build Coastguard Worker     FDKsyncCache(hBitStream);
557*e5436536SAndroid Build Coastguard Worker     FDK_pushForward(&hBitStream->hBitBuf, numberOfBits,
558*e5436536SAndroid Build Coastguard Worker                     hBitStream->ConfigCache);
559*e5436536SAndroid Build Coastguard Worker   }
560*e5436536SAndroid Build Coastguard Worker }
561*e5436536SAndroid Build Coastguard Worker 
FDKpushBiDirectional(HANDLE_FDK_BITSTREAM hBitStream,const INT numberOfBits)562*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKpushBiDirectional(HANDLE_FDK_BITSTREAM hBitStream,
563*e5436536SAndroid Build Coastguard Worker                                      const INT numberOfBits) {
564*e5436536SAndroid Build Coastguard Worker   if (numberOfBits >= 0)
565*e5436536SAndroid Build Coastguard Worker     FDKpushFor(hBitStream, numberOfBits);
566*e5436536SAndroid Build Coastguard Worker   else
567*e5436536SAndroid Build Coastguard Worker     FDKpushBack(hBitStream, -numberOfBits);
568*e5436536SAndroid Build Coastguard Worker }
569*e5436536SAndroid Build Coastguard Worker 
570*e5436536SAndroid Build Coastguard Worker /**
571*e5436536SAndroid Build Coastguard Worker  * \brief GetValidBits Function.  Clear cache and return valid Bits from
572*e5436536SAndroid Build Coastguard Worker  * Bitbuffer.
573*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
574*e5436536SAndroid Build Coastguard Worker  * \return amount of valid bits that still can be read or were already written.
575*e5436536SAndroid Build Coastguard Worker  *
576*e5436536SAndroid Build Coastguard Worker  */
FDKgetValidBits(HANDLE_FDK_BITSTREAM hBitStream)577*e5436536SAndroid Build Coastguard Worker FDK_INLINE UINT FDKgetValidBits(HANDLE_FDK_BITSTREAM hBitStream) {
578*e5436536SAndroid Build Coastguard Worker   FDKsyncCache(hBitStream);
579*e5436536SAndroid Build Coastguard Worker   return FDK_getValidBits(&hBitStream->hBitBuf);
580*e5436536SAndroid Build Coastguard Worker }
581*e5436536SAndroid Build Coastguard Worker 
582*e5436536SAndroid Build Coastguard Worker /**
583*e5436536SAndroid Build Coastguard Worker  * \brief return amount of unused Bits from Bitbuffer.
584*e5436536SAndroid Build Coastguard Worker  * \param hBitStream HANDLE_FDK_BITSTREAM handle
585*e5436536SAndroid Build Coastguard Worker  * \return amount of free bits that still can be written into the bitstream
586*e5436536SAndroid Build Coastguard Worker  */
FDKgetFreeBits(HANDLE_FDK_BITSTREAM hBitStream)587*e5436536SAndroid Build Coastguard Worker FDK_INLINE INT FDKgetFreeBits(HANDLE_FDK_BITSTREAM hBitStream) {
588*e5436536SAndroid Build Coastguard Worker   return FDK_getFreeBits(&hBitStream->hBitBuf);
589*e5436536SAndroid Build Coastguard Worker }
590*e5436536SAndroid Build Coastguard Worker 
591*e5436536SAndroid Build Coastguard Worker /**
592*e5436536SAndroid Build Coastguard Worker  * \brief Fill the BitBuffer with a number of input bytes from  external source.
593*e5436536SAndroid Build Coastguard Worker  *        The bytesValid variable returns the number of ramaining valid bytes in
594*e5436536SAndroid Build Coastguard Worker  * extern inputBuffer.
595*e5436536SAndroid Build Coastguard Worker  *
596*e5436536SAndroid Build Coastguard Worker  * \param hBitStream  HANDLE_FDK_BITSTREAM handle
597*e5436536SAndroid Build Coastguard Worker  * \param inputBuffer Pointer to input buffer with bitstream data.
598*e5436536SAndroid Build Coastguard Worker  * \param bufferSize  Total size of inputBuffer array.
599*e5436536SAndroid Build Coastguard Worker  * \param bytesValid  Input: number of valid bytes in inputBuffer. Output: bytes
600*e5436536SAndroid Build Coastguard Worker  * still left unread in inputBuffer.
601*e5436536SAndroid Build Coastguard Worker  * \return void
602*e5436536SAndroid Build Coastguard Worker  */
FDKfeedBuffer(HANDLE_FDK_BITSTREAM hBitStream,const UCHAR inputBuffer[],const UINT bufferSize,UINT * bytesValid)603*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKfeedBuffer(HANDLE_FDK_BITSTREAM hBitStream,
604*e5436536SAndroid Build Coastguard Worker                               const UCHAR inputBuffer[], const UINT bufferSize,
605*e5436536SAndroid Build Coastguard Worker                               UINT *bytesValid) {
606*e5436536SAndroid Build Coastguard Worker   FDKsyncCache(hBitStream);
607*e5436536SAndroid Build Coastguard Worker   FDK_Feed(&hBitStream->hBitBuf, inputBuffer, bufferSize, bytesValid);
608*e5436536SAndroid Build Coastguard Worker }
609*e5436536SAndroid Build Coastguard Worker 
610*e5436536SAndroid Build Coastguard Worker /**
611*e5436536SAndroid Build Coastguard Worker  * \brief fill destination BitBuffer with a number of bytes from source
612*e5436536SAndroid Build Coastguard Worker  * BitBuffer. The bytesValid variable returns the number of ramaining valid
613*e5436536SAndroid Build Coastguard Worker  * bytes in source BitBuffer.
614*e5436536SAndroid Build Coastguard Worker  *
615*e5436536SAndroid Build Coastguard Worker  * \param hBSDst            HANDLE_FDK_BITSTREAM handle to write data into
616*e5436536SAndroid Build Coastguard Worker  * \param hBSSrc            HANDLE_FDK_BITSTREAM handle to read data from
617*e5436536SAndroid Build Coastguard Worker  * \param bytesValid        Input: number of valid bytes in inputBuffer. Output:
618*e5436536SAndroid Build Coastguard Worker  * bytes still left unread in inputBuffer.
619*e5436536SAndroid Build Coastguard Worker  * \return void
620*e5436536SAndroid Build Coastguard Worker  */
FDKcopyBuffer(HANDLE_FDK_BITSTREAM hBSDst,HANDLE_FDK_BITSTREAM hBSSrc,UINT * bytesValid)621*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKcopyBuffer(HANDLE_FDK_BITSTREAM hBSDst,
622*e5436536SAndroid Build Coastguard Worker                               HANDLE_FDK_BITSTREAM hBSSrc, UINT *bytesValid) {
623*e5436536SAndroid Build Coastguard Worker   FDKsyncCache(hBSSrc);
624*e5436536SAndroid Build Coastguard Worker   FDK_Copy(&hBSDst->hBitBuf, &hBSSrc->hBitBuf, bytesValid);
625*e5436536SAndroid Build Coastguard Worker }
626*e5436536SAndroid Build Coastguard Worker 
627*e5436536SAndroid Build Coastguard Worker /**
628*e5436536SAndroid Build Coastguard Worker  * \brief fill the outputBuffer with all valid bytes hold in BitBuffer. The
629*e5436536SAndroid Build Coastguard Worker  * WriteBytes variable returns the number of written Bytes.
630*e5436536SAndroid Build Coastguard Worker  *
631*e5436536SAndroid Build Coastguard Worker  * \param hBitStream    HANDLE_FDK_BITSTREAM handle
632*e5436536SAndroid Build Coastguard Worker  * \param outputBuffer  Pointer to output buffer.
633*e5436536SAndroid Build Coastguard Worker  * \param writeBytes    Number of bytes write to output buffer.
634*e5436536SAndroid Build Coastguard Worker  * \return void
635*e5436536SAndroid Build Coastguard Worker  */
FDKfetchBuffer(HANDLE_FDK_BITSTREAM hBitStream,UCHAR * outputBuffer,UINT * writeBytes)636*e5436536SAndroid Build Coastguard Worker FDK_INLINE void FDKfetchBuffer(HANDLE_FDK_BITSTREAM hBitStream,
637*e5436536SAndroid Build Coastguard Worker                                UCHAR *outputBuffer, UINT *writeBytes) {
638*e5436536SAndroid Build Coastguard Worker   FDKsyncCache(hBitStream);
639*e5436536SAndroid Build Coastguard Worker   FDK_Fetch(&hBitStream->hBitBuf, outputBuffer, writeBytes);
640*e5436536SAndroid Build Coastguard Worker }
641*e5436536SAndroid Build Coastguard Worker 
642*e5436536SAndroid Build Coastguard Worker #endif
643