1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Frderung 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 (at) 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 */ 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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