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