1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2015 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 /************************** MPEG-4 Transport Decoder ************************ 85 86 Author(s): Manuel Jander 87 Description: MPEG Transport decoder 88 89 ******************************************************************************/ 90 91 #include "tpdec_lib.h" 92 93 /* library version */ 94 #include "version" 95 96 97 #include "tp_data.h" 98 99 #include "tpdec_adts.h" 100 101 #include "tpdec_adif.h" 102 103 #include "tpdec_latm.h" 104 105 #include "tpdec_drm.h" 106 107 108 #define MODULE_NAME "transportDec" 109 110 typedef union { 111 STRUCT_ADTS adts; 112 113 CAdifHeader adif; 114 115 CLatmDemux latm; 116 117 STRUCT_DRM drm; 118 119 } transportdec_parser_t; 120 121 struct TRANSPORTDEC 122 { 123 TRANSPORT_TYPE transportFmt; /*!< MPEG4 transportDec type. */ 124 125 CSTpCallBacks callbacks; /*!< Struct holding callback and its data */ 126 127 FDK_BITSTREAM bitStream[2]; /* Bitstream reader */ 128 UCHAR *bsBuffer; /* Internal bitstreamd data buffer (unallocated in case of TT_MP4_RAWPACKETS) */ 129 130 transportdec_parser_t parser; /* Format specific parser structs. */ 131 132 CSAudioSpecificConfig asc[(1*2)]; /* Audio specific config from the last config found. */ 133 UINT globalFramePos; /* Global transport frame reference bit position. */ 134 UINT accessUnitAnchor[2]; /* Current access unit start bit position. */ 135 INT auLength[2]; /* Length of current access unit. */ 136 INT numberOfRawDataBlocks; /* Current number of raw data blocks contained remaining from the current transport frame. */ 137 UINT avgBitRate; /* Average bit rate used for frame loss estimation. */ 138 UINT lastValidBufferFullness; /* Last valid buffer fullness value for frame loss estimation */ 139 INT remainder; /* Reminder in division during lost access unit estimation. */ 140 INT missingAccessUnits; /* Estimated missing access units. */ 141 UINT burstPeriod; /* Data burst period in mili seconds. */ 142 UINT holdOffFrames; /* Amount of frames that were already hold off due to buffer fullness condition not being met. */ 143 UINT flags; /* Flags. */ 144 }; 145 146 /* Flag bitmasks for "flags" member of struct TRANSPORTDEC */ 147 #define TPDEC_SYNCOK 1 148 #define TPDEC_MINIMIZE_DELAY 2 149 #define TPDEC_IGNORE_BUFFERFULLNESS 4 150 #define TPDEC_EARLY_CONFIG 8 151 #define TPDEC_LOST_FRAMES_PENDING 16 152 #define TPDEC_CONFIG_FOUND 32 153 154 C_ALLOC_MEM(Ram_TransportDecoder, TRANSPORTDEC, 1) 155 C_ALLOC_MEM(Ram_TransportDecoderBuffer, UCHAR, TRANSPORTDEC_INBUF_SIZE) 156 157 158 159 160 HANDLE_TRANSPORTDEC transportDec_Open( const TRANSPORT_TYPE transportFmt, const UINT flags) 161 { 162 HANDLE_TRANSPORTDEC hInput; 163 164 hInput = GetRam_TransportDecoder(0); 165 if ( hInput == NULL ) { 166 return NULL; 167 } 168 169 /* Init transportDec struct. */ 170 hInput->transportFmt = transportFmt; 171 172 switch (transportFmt) { 173 174 case TT_MP4_ADIF: 175 break; 176 177 case TT_MP4_ADTS: 178 if (flags & TP_FLAG_MPEG4) 179 hInput->parser.adts.decoderCanDoMpeg4 = 1; 180 else 181 hInput->parser.adts.decoderCanDoMpeg4 = 0; 182 adtsRead_CrcInit(&hInput->parser.adts); 183 hInput->parser.adts.BufferFullnesStartFlag = 1; 184 hInput->numberOfRawDataBlocks = 0; 185 break; 186 187 case TT_DRM: 188 drmRead_CrcInit(&hInput->parser.drm); 189 break; 190 191 case TT_MP4_LATM_MCP0: 192 case TT_MP4_LATM_MCP1: 193 case TT_MP4_LOAS: 194 case TT_MP4_RAW: 195 break; 196 197 default: 198 FreeRam_TransportDecoder(&hInput); 199 hInput = NULL; 200 break; 201 } 202 203 if (hInput != NULL) { 204 /* Create bitstream */ 205 if ( TT_IS_PACKET(transportFmt) ) { 206 hInput->bsBuffer = NULL; 207 } else { 208 hInput->bsBuffer = GetRam_TransportDecoderBuffer(0); 209 if (hInput->bsBuffer == NULL) { 210 transportDec_Close( &hInput ); 211 return NULL; 212 } 213 FDKinitBitStream(&hInput->bitStream[0], hInput->bsBuffer, TRANSPORTDEC_INBUF_SIZE, 0, BS_READER); 214 } 215 216 hInput->burstPeriod = 0; 217 } 218 219 return hInput; 220 } 221 222 TRANSPORTDEC_ERROR transportDec_OutOfBandConfig(HANDLE_TRANSPORTDEC hTp, UCHAR *conf, const UINT length, UINT layer ) 223 { 224 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; 225 226 FDK_BITSTREAM bs; 227 HANDLE_FDK_BITSTREAM hBs = &bs; 228 229 FDKinitBitStream(hBs, conf, 0x10000000, length<<3, BS_READER); 230 231 int fConfigFound = 0; 232 233 /* config transport decoder */ 234 switch (hTp->transportFmt) { 235 case TT_MP4_LATM_MCP0: 236 case TT_MP4_LATM_MCP1: 237 case TT_MP4_LOAS: 238 { 239 if (layer != 0) { 240 return TRANSPORTDEC_INVALID_PARAMETER; 241 } 242 CLatmDemux *pLatmDemux = &hTp->parser.latm; 243 err = CLatmDemux_ReadStreamMuxConfig(hBs, pLatmDemux, &hTp->callbacks, hTp->asc, &fConfigFound); 244 if (err != TRANSPORTDEC_OK) { 245 return err; 246 } 247 } 248 break; 249 default: 250 fConfigFound = 1; 251 err = AudioSpecificConfig_Parse(&hTp->asc[layer], hBs, 1, &hTp->callbacks); 252 if (err == TRANSPORTDEC_OK) { 253 int errC; 254 255 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]); 256 if (errC != 0) { 257 err = TRANSPORTDEC_PARSE_ERROR; 258 } 259 } 260 break; 261 case TT_DRM: 262 fConfigFound = 1; 263 err = DrmRawSdcAudioConfig_Parse(&hTp->asc[layer], hBs); 264 if (err == TRANSPORTDEC_OK) { 265 int errC; 266 267 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]); 268 if (errC != 0) { 269 err = TRANSPORTDEC_PARSE_ERROR; 270 } 271 } 272 break; 273 } 274 275 if (err == TRANSPORTDEC_OK && fConfigFound) { 276 hTp->flags |= TPDEC_CONFIG_FOUND; 277 } 278 279 return err; 280 } 281 282 int transportDec_RegisterAscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbUpdateConfig_t cbUpdateConfig, void* user_data) 283 { 284 if (hTpDec == NULL) { 285 return -1; 286 } 287 hTpDec->callbacks.cbUpdateConfig = cbUpdateConfig; 288 hTpDec->callbacks.cbUpdateConfigData = user_data; 289 return 0; 290 } 291 292 int transportDec_RegisterSscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSsc_t cbSsc, void* user_data) 293 { 294 if (hTpDec == NULL) { 295 return -1; 296 } 297 hTpDec->callbacks.cbSsc = cbSsc; 298 hTpDec->callbacks.cbSscData = user_data; 299 return 0; 300 } 301 302 int transportDec_RegisterSbrCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSbr_t cbSbr, void* user_data) 303 { 304 if (hTpDec == NULL) { 305 return -1; 306 } 307 hTpDec->callbacks.cbSbr = cbSbr; 308 hTpDec->callbacks.cbSbrData = user_data; 309 return 0; 310 } 311 312 TRANSPORTDEC_ERROR transportDec_FillData( 313 const HANDLE_TRANSPORTDEC hTp, 314 UCHAR *pBuffer, 315 const UINT bufferSize, 316 UINT *pBytesValid, 317 const INT layer ) 318 { 319 HANDLE_FDK_BITSTREAM hBs; 320 321 if ( (hTp == NULL) 322 || (layer >= 2) ) { 323 return TRANSPORTDEC_INVALID_PARAMETER; 324 } 325 326 if (*pBytesValid == 0) { 327 /* nothing to do */ 328 return TRANSPORTDEC_OK; 329 } 330 331 /* set bitbuffer shortcut */ 332 hBs = &hTp->bitStream[layer]; 333 334 if ( TT_IS_PACKET(hTp->transportFmt) ) { 335 if (hTp->numberOfRawDataBlocks == 0) { 336 /* For packet based transport, pass input buffer to bitbuffer without copying the data. 337 Unfortunately we do not know the actual buffer size. And the FDK bit buffer implementation 338 needs a number 2^x. So we assume the maximum of 48 channels with 6144 bits per channel 339 and round it up to the next power of 2 => 65536 bytes */ 340 FDKinitBitStream(hBs, pBuffer, 0x10000, (*pBytesValid)<<3, BS_READER); 341 *pBytesValid = 0; 342 } 343 } else { 344 /* ... else feed bitbuffer with new stream data (append). */ 345 if (hTp->numberOfRawDataBlocks <= 0) { 346 FDKfeedBuffer (hBs, pBuffer, bufferSize, pBytesValid) ; 347 } 348 } 349 350 return TRANSPORTDEC_OK; 351 } 352 353 HANDLE_FDK_BITSTREAM transportDec_GetBitstream( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) 354 { 355 return &hTp->bitStream[layer]; 356 } 357 358 TRANSPORT_TYPE transportDec_GetFormat( const HANDLE_TRANSPORTDEC hTp ) 359 { 360 return hTp->transportFmt; 361 } 362 363 INT transportDec_GetBufferFullness( const HANDLE_TRANSPORTDEC hTp ) 364 { 365 INT bufferFullness = -1; 366 367 switch (hTp->transportFmt) { 368 case TT_MP4_ADTS: 369 if (hTp->parser.adts.bs.adts_fullness != 0x7ff) { 370 bufferFullness = hTp->parser.adts.bs.frame_length*8 + hTp->parser.adts.bs.adts_fullness * 32 * getNumberOfEffectiveChannels(hTp->parser.adts.bs.channel_config); 371 } 372 break; 373 case TT_MP4_LOAS: 374 case TT_MP4_LATM_MCP0: 375 case TT_MP4_LATM_MCP1: 376 if (hTp->parser.latm.m_linfo[0][0].m_bufferFullness != 0xff) { 377 bufferFullness = hTp->parser.latm.m_linfo[0][0].m_bufferFullness; 378 } 379 break; 380 default: 381 break; 382 } 383 384 return bufferFullness; 385 } 386 387 /** 388 * \brief adjust bit stream position and the end of an access unit. 389 * \param hTp transport decoder handle. 390 * \return error code. 391 */ 392 static 393 TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit(HANDLE_TRANSPORTDEC hTp) 394 { 395 HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; 396 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; 397 398 switch (hTp->transportFmt) { 399 case TT_MP4_LOAS: 400 case TT_MP4_LATM_MCP0: 401 case TT_MP4_LATM_MCP1: 402 if ( hTp->numberOfRawDataBlocks == 0 ) 403 { 404 /* Do byte align at the end of AudioMuxElement. */ 405 FDKbyteAlign(hBs, hTp->globalFramePos); 406 407 /* Check global frame length */ 408 if (hTp->transportFmt == TT_MP4_LOAS && hTp->parser.latm.m_audioMuxLengthBytes > 0) 409 { 410 int loasOffset; 411 412 loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes*8 + FDKgetValidBits(hBs)) - hTp->globalFramePos; 413 if (loasOffset != 0) { 414 FDKpushBiDirectional(hBs, loasOffset); 415 /* For ELD and other payloads there is an unknown amount of padding, so ignore unread bits, but 416 throw an error only if too many bits where read. */ 417 if (loasOffset < 0) { 418 err = TRANSPORTDEC_PARSE_ERROR; 419 } 420 } 421 } 422 } 423 break; 424 425 case TT_MP4_ADTS: 426 if (hTp->parser.adts.bs.protection_absent == 0) 427 { 428 int offset; 429 430 /* Calculate offset to end of AU */ 431 offset = hTp->parser.adts.rawDataBlockDist[hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks]<<3; 432 /* CAUTION: The PCE (if available) is declared to be a part of the header! */ 433 offset -= hTp->accessUnitAnchor[0] - FDKgetValidBits(hBs) + 16 + hTp->parser.adts.bs.num_pce_bits; 434 FDKpushBiDirectional(hBs, offset); 435 } 436 if (hTp->parser.adts.bs.num_raw_blocks > 0 && hTp->parser.adts.bs.protection_absent == 0) { 437 /* Note this CRC read currently happens twice because of transportDec_CrcCheck() */ 438 hTp->parser.adts.crcReadValue = FDKreadBits(hBs, 16); 439 } 440 if ( hTp->numberOfRawDataBlocks == 0 ) 441 { 442 /* Check global frame length */ 443 if (hTp->parser.adts.bs.protection_absent == 0) 444 { 445 int offset; 446 447 offset = (hTp->parser.adts.bs.frame_length*8 - ADTS_SYNCLENGTH + FDKgetValidBits(hBs)) - hTp->globalFramePos; 448 if (offset != 0) { 449 FDKpushBiDirectional(hBs, offset); 450 } 451 } 452 } 453 break; 454 455 default: 456 break; 457 } 458 459 return err; 460 } 461 462 463 /** 464 * \brief Determine additional buffer fullness contraint due to burst data reception. 465 * The parameter TPDEC_PARAM_BURSTPERIOD must have been set as a precondition. 466 * \param hTp transport decoder handle. 467 * \param bufferFullness the buffer fullness value of the first frame to be decoded. 468 * \param bitsAvail the amount of available bits at the end of the first frame to be decoded. 469 * \return error code 470 */ 471 static 472 TRANSPORTDEC_ERROR additionalHoldOffNeeded( 473 HANDLE_TRANSPORTDEC hTp, 474 INT bufferFullness, 475 INT bitsAvail 476 ) 477 { 478 INT checkLengthBits, avgBitsPerFrame; 479 INT maxAU; /* maximum number of frames per Master Frame */ 480 INT samplesPerFrame = hTp->asc->m_samplesPerFrame; 481 INT samplingFrequency = (INT)hTp->asc->m_samplingFrequency; 482 483 if ( (hTp->avgBitRate == 0) || (hTp->burstPeriod == 0) ) { 484 return TRANSPORTDEC_OK; 485 } 486 if ( (samplesPerFrame == 0 ) || (samplingFrequency == 0) ) { 487 return TRANSPORTDEC_NOT_ENOUGH_BITS; 488 } 489 490 /* One Master Frame is sent every hTp->burstPeriod ms */ 491 maxAU = hTp->burstPeriod * samplingFrequency + (samplesPerFrame*1000 - 1); 492 maxAU = maxAU / (samplesPerFrame*1000); 493 /* Subtract number of frames which were already held off. */ 494 maxAU -= hTp->holdOffFrames; 495 496 avgBitsPerFrame = hTp->avgBitRate * samplesPerFrame + (samplingFrequency-1); 497 avgBitsPerFrame = avgBitsPerFrame / samplingFrequency; 498 499 /* Consider worst case of bufferFullness quantization. */ 500 switch (hTp->transportFmt) { 501 case TT_MP4_ADIF: 502 case TT_MP4_ADTS: 503 case TT_MP4_LOAS: 504 case TT_MP4_LATM_MCP0: 505 case TT_MP4_LATM_MCP1: 506 bufferFullness += 31; 507 break; 508 default: 509 break; 510 } 511 512 checkLengthBits = bufferFullness + (maxAU-1)*avgBitsPerFrame; 513 514 /* Check if buffer is big enough to fullfill buffer fullness condition */ 515 if ( (checkLengthBits /*+headerBits*/) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { 516 return TRANSPORTDEC_SYNC_ERROR; 517 } 518 519 if ( bitsAvail < checkLengthBits ) { 520 return TRANSPORTDEC_NOT_ENOUGH_BITS; 521 } 522 else { 523 return TRANSPORTDEC_OK; 524 } 525 } 526 527 static TRANSPORTDEC_ERROR transportDec_readHeader( 528 HANDLE_TRANSPORTDEC hTp, 529 HANDLE_FDK_BITSTREAM hBs, 530 int syncLength, 531 int ignoreBufferFullness, 532 int *pRawDataBlockLength, 533 int *pfTraverseMoreFrames, 534 int *pSyncLayerFrameBits, 535 int *pfConfigFound, 536 int *pHeaderBits 537 ) 538 { 539 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; 540 int rawDataBlockLength = *pRawDataBlockLength; 541 int fTraverseMoreFrames = (pfTraverseMoreFrames != NULL) ? *pfTraverseMoreFrames : 0; 542 int syncLayerFrameBits = (pSyncLayerFrameBits != NULL) ? *pSyncLayerFrameBits : 0; 543 int fConfigFound = (pfConfigFound != NULL) ? *pfConfigFound : 0; 544 int startPos; 545 546 startPos = FDKgetValidBits(hBs); 547 548 switch (hTp->transportFmt) { 549 case TT_MP4_ADTS: 550 if (hTp->numberOfRawDataBlocks <= 0) 551 { 552 int errC; 553 554 hTp->globalFramePos = FDKgetValidBits(hBs); 555 556 /* Parse ADTS header */ 557 err = adtsRead_DecodeHeader( &hTp->parser.adts, &hTp->asc[0], hBs, ignoreBufferFullness ); 558 if (err != TRANSPORTDEC_OK) { 559 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { 560 err = TRANSPORTDEC_SYNC_ERROR; 561 } 562 } else { 563 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); 564 if (errC != 0) { 565 if (errC == TRANSPORTDEC_NEED_TO_RESTART) { 566 err = TRANSPORTDEC_NEED_TO_RESTART; 567 goto bail; 568 } else { 569 err = TRANSPORTDEC_SYNC_ERROR; 570 } 571 } else { 572 fConfigFound = 1; 573 hTp->numberOfRawDataBlocks = hTp->parser.adts.bs.num_raw_blocks+1; 574 } 575 } 576 } 577 else { 578 /* Reset CRC because the next bits are the beginning of a raw_data_block() */ 579 FDKcrcReset(&hTp->parser.adts.crcInfo); 580 hTp->parser.adts.bs.num_pce_bits = 0; 581 } 582 if (err == TRANSPORTDEC_OK) { 583 hTp->numberOfRawDataBlocks--; 584 rawDataBlockLength = adtsRead_GetRawDataBlockLength(&hTp->parser.adts, (hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks)); 585 if (rawDataBlockLength <= 0) { 586 /* No further frame traversal possible. */ 587 fTraverseMoreFrames = 0; 588 } 589 syncLayerFrameBits = (hTp->parser.adts.bs.frame_length<<3) - (startPos - FDKgetValidBits(hBs)) - syncLength; 590 if (syncLayerFrameBits <= 0) { 591 err = TRANSPORTDEC_SYNC_ERROR; 592 } 593 } else { 594 hTp->numberOfRawDataBlocks = 0; 595 } 596 break; 597 case TT_MP4_LOAS: 598 if (hTp->numberOfRawDataBlocks <= 0) 599 { 600 syncLayerFrameBits = FDKreadBits(hBs, 13); 601 hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits; 602 syncLayerFrameBits <<= 3; 603 } 604 case TT_MP4_LATM_MCP1: 605 case TT_MP4_LATM_MCP0: 606 if (hTp->numberOfRawDataBlocks <= 0) 607 { 608 hTp->globalFramePos = FDKgetValidBits(hBs); 609 610 err = CLatmDemux_Read( 611 hBs, 612 &hTp->parser.latm, 613 hTp->transportFmt, 614 &hTp->callbacks, 615 hTp->asc, 616 &fConfigFound, 617 ignoreBufferFullness); 618 619 if (err != TRANSPORTDEC_OK) { 620 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { 621 err = TRANSPORTDEC_SYNC_ERROR; 622 } 623 } else { 624 hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); 625 if (hTp->transportFmt == TT_MP4_LOAS) { 626 syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13); 627 } 628 } 629 } else { 630 err = CLatmDemux_ReadPayloadLengthInfo(hBs, &hTp->parser.latm); 631 if (err != TRANSPORTDEC_OK) { 632 err = TRANSPORTDEC_SYNC_ERROR; 633 } 634 } 635 if (err == TRANSPORTDEC_OK) { 636 rawDataBlockLength = CLatmDemux_GetFrameLengthInBits(&hTp->parser.latm); 637 hTp->numberOfRawDataBlocks--; 638 } else { 639 hTp->numberOfRawDataBlocks = 0; 640 } 641 break; 642 default: 643 { 644 syncLayerFrameBits = 0; 645 } 646 break; 647 } 648 649 bail: 650 651 *pRawDataBlockLength = rawDataBlockLength; 652 653 if (pHeaderBits != NULL) { 654 *pHeaderBits += startPos - (INT)FDKgetValidBits(hBs); 655 } 656 if (pfConfigFound != NULL) { 657 *pfConfigFound = fConfigFound; 658 } 659 660 if (pfTraverseMoreFrames != NULL) { 661 *pfTraverseMoreFrames = fTraverseMoreFrames; 662 } 663 if (pSyncLayerFrameBits != NULL) { 664 *pSyncLayerFrameBits = syncLayerFrameBits; 665 } 666 if (pfConfigFound != NULL) { 667 *pfConfigFound = fConfigFound; 668 } 669 670 return err; 671 } 672 673 /* How many bits to advance for synchronization search. */ 674 #define TPDEC_SYNCSKIP 8 675 676 static 677 TRANSPORTDEC_ERROR synchronization( 678 HANDLE_TRANSPORTDEC hTp, 679 INT *pHeaderBits 680 ) 681 { 682 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK, errFirstFrame = TRANSPORTDEC_OK; 683 HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; 684 685 INT syncLayerFrameBits = 0; /* Length of sync layer frame (i.e. LOAS) */ 686 INT rawDataBlockLength = 0, rawDataBlockLengthPrevious; 687 INT totalBits; 688 INT headerBits = 0, headerBitsFirstFrame = 0, headerBitsPrevious; 689 INT numFramesTraversed = 0, fTraverseMoreFrames, fConfigFound = (hTp->flags & TPDEC_CONFIG_FOUND), startPosFirstFrame = -1; 690 INT numRawDataBlocksFirstFrame = 0, numRawDataBlocksPrevious, globalFramePosFirstFrame = 0, rawDataBlockLengthFirstFrame = 0; 691 INT ignoreBufferFullness = hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK); 692 693 /* Synch parameters */ 694 INT syncLength; /* Length of sync word in bits */ 695 UINT syncWord; /* Sync word to be found */ 696 UINT syncMask; /* Mask for sync word (for adding one bit, so comprising one bit less) */ 697 C_ALLOC_SCRATCH_START(contextFirstFrame, transportdec_parser_t, 1); 698 699 totalBits = (INT)FDKgetValidBits(hBs); 700 701 if (totalBits <= 0) { 702 err = TRANSPORTDEC_NOT_ENOUGH_BITS; 703 goto bail; 704 } 705 706 fTraverseMoreFrames = (hTp->flags & (TPDEC_MINIMIZE_DELAY|TPDEC_EARLY_CONFIG)) && ! (hTp->flags & TPDEC_SYNCOK); 707 708 /* Set transport specific sync parameters */ 709 switch (hTp->transportFmt) { 710 case TT_MP4_ADTS: 711 syncWord = ADTS_SYNCWORD; 712 syncLength = ADTS_SYNCLENGTH; 713 break; 714 case TT_MP4_LOAS: 715 syncWord = 0x2B7; 716 syncLength = 11; 717 break; 718 default: 719 syncWord = 0; 720 syncLength = 0; 721 break; 722 } 723 724 syncMask = (1<<syncLength)-1; 725 726 do { 727 INT bitsAvail = 0; /* Bits available in bitstream buffer */ 728 INT checkLengthBits; /* Helper to check remaining bits and buffer boundaries */ 729 UINT synch; /* Current sync word read from bitstream */ 730 731 headerBitsPrevious = headerBits; 732 733 bitsAvail = (INT)FDKgetValidBits(hBs); 734 735 if (hTp->numberOfRawDataBlocks == 0) { 736 /* search synchword */ 737 738 FDK_ASSERT( (bitsAvail % TPDEC_SYNCSKIP) == 0); 739 740 if ((bitsAvail-syncLength) < TPDEC_SYNCSKIP) { 741 err = TRANSPORTDEC_NOT_ENOUGH_BITS; 742 headerBits = 0; 743 } else { 744 745 synch = FDKreadBits(hBs, syncLength); 746 747 if ( !(hTp->flags & TPDEC_SYNCOK) ) { 748 for (; (bitsAvail-syncLength) >= TPDEC_SYNCSKIP; bitsAvail-=TPDEC_SYNCSKIP) { 749 if (synch == syncWord) { 750 break; 751 } 752 synch = ((synch << TPDEC_SYNCSKIP) & syncMask) | FDKreadBits(hBs, TPDEC_SYNCSKIP); 753 } 754 } 755 if (synch != syncWord) { 756 /* No correct syncword found. */ 757 err = TRANSPORTDEC_SYNC_ERROR; 758 } else { 759 err = TRANSPORTDEC_OK; 760 } 761 headerBits = syncLength; 762 } 763 } else { 764 headerBits = 0; 765 } 766 767 /* Save previous raw data block data */ 768 rawDataBlockLengthPrevious = rawDataBlockLength; 769 numRawDataBlocksPrevious = hTp->numberOfRawDataBlocks; 770 771 /* Parse transport header (raw data block granularity) */ 772 773 if (err == TRANSPORTDEC_OK ) 774 { 775 err = transportDec_readHeader( 776 hTp, 777 hBs, 778 syncLength, 779 ignoreBufferFullness, 780 &rawDataBlockLength, 781 &fTraverseMoreFrames, 782 &syncLayerFrameBits, 783 &fConfigFound, 784 &headerBits 785 ); 786 } 787 788 bitsAvail -= headerBits; 789 790 checkLengthBits = syncLayerFrameBits; 791 792 /* Check if the whole frame would fit the bitstream buffer */ 793 if (err == TRANSPORTDEC_OK) { 794 if ( (checkLengthBits+headerBits) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { 795 /* We assume that the size of the transport bit buffer has been 796 chosen to meet all system requirements, thus this condition 797 is considered a synchronisation error. */ 798 err = TRANSPORTDEC_SYNC_ERROR; 799 } else { 800 if ( bitsAvail < checkLengthBits ) { 801 err = TRANSPORTDEC_NOT_ENOUGH_BITS; 802 } 803 } 804 } 805 806 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { 807 break; 808 } 809 810 811 if (err == TRANSPORTDEC_SYNC_ERROR) { 812 int bits; 813 814 /* Enforce re-sync of transport headers. */ 815 hTp->numberOfRawDataBlocks = 0; 816 817 /* Ensure that the bit amount lands at a multiple of TPDEC_SYNCSKIP */ 818 bits = (bitsAvail + headerBits) % TPDEC_SYNCSKIP; 819 /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead next time. */ 820 FDKpushBiDirectional(hBs, -(headerBits - TPDEC_SYNCSKIP) + bits); 821 bitsAvail += headerBits - TPDEC_SYNCSKIP - bits; 822 headerBits = 0; 823 } 824 825 /* Frame traversal */ 826 if ( fTraverseMoreFrames ) 827 { 828 /* Save parser context for early config discovery "rewind all frames" */ 829 if ( (hTp->flags & TPDEC_EARLY_CONFIG) && !(hTp->flags & TPDEC_MINIMIZE_DELAY)) 830 { 831 /* ignore buffer fullness if just traversing additional frames for ECD */ 832 ignoreBufferFullness = 1; 833 834 /* Save context in order to return later */ 835 if ( err == TRANSPORTDEC_OK && startPosFirstFrame == -1 ) { 836 startPosFirstFrame = FDKgetValidBits(hBs); 837 numRawDataBlocksFirstFrame = hTp->numberOfRawDataBlocks; 838 globalFramePosFirstFrame = hTp->globalFramePos; 839 rawDataBlockLengthFirstFrame = rawDataBlockLength; 840 headerBitsFirstFrame = headerBits; 841 errFirstFrame = err; 842 FDKmemcpy(contextFirstFrame, &hTp->parser, sizeof(transportdec_parser_t)); 843 } 844 845 /* Break when config was found or it is not possible anymore to find a config */ 846 if (startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK)) 847 { 848 /* In case of ECD and sync error, do not rewind anywhere. */ 849 if (err == TRANSPORTDEC_SYNC_ERROR) 850 { 851 startPosFirstFrame = -1; 852 fConfigFound = 0; 853 numFramesTraversed = 0; 854 } 855 break; 856 } 857 } 858 859 if (err == TRANSPORTDEC_OK) { 860 FDKpushFor(hBs, rawDataBlockLength); 861 bitsAvail -= rawDataBlockLength; 862 numFramesTraversed++; 863 /* Ignore error here itentionally. */ 864 transportDec_AdjustEndOfAccessUnit(hTp); 865 } 866 } 867 } while ( fTraverseMoreFrames || (err == TRANSPORTDEC_SYNC_ERROR && !(hTp->flags & TPDEC_SYNCOK))); 868 869 /* Restore context in case of ECD frame traversal */ 870 if ( startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK) ) { 871 FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - startPosFirstFrame); 872 FDKmemcpy(&hTp->parser, contextFirstFrame, sizeof(transportdec_parser_t)); 873 hTp->numberOfRawDataBlocks = numRawDataBlocksFirstFrame; 874 hTp->globalFramePos = globalFramePosFirstFrame; 875 rawDataBlockLength = rawDataBlockLengthFirstFrame; 876 headerBits = headerBitsFirstFrame; 877 err = errFirstFrame; 878 numFramesTraversed = 0; 879 } 880 881 /* Additional burst data mode buffer fullness check. */ 882 if ( !(hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) { 883 err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), FDKgetValidBits(hBs) - syncLayerFrameBits); 884 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { 885 hTp->holdOffFrames++; 886 } 887 } 888 889 /* Rewind for retry because of not enough bits */ 890 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { 891 FDKpushBack(hBs, headerBits); 892 headerBits = 0; 893 } 894 else { 895 /* reset hold off frame counter */ 896 hTp->holdOffFrames = 0; 897 } 898 899 /* Return to last good frame in case of frame traversal but not ECD. */ 900 if (numFramesTraversed > 0) { 901 FDKpushBack(hBs, rawDataBlockLengthPrevious); 902 if (err != TRANSPORTDEC_OK) { 903 hTp->numberOfRawDataBlocks = numRawDataBlocksPrevious; 904 headerBits = headerBitsPrevious; 905 } 906 err = TRANSPORTDEC_OK; 907 } 908 909 bail: 910 hTp->auLength[0] = rawDataBlockLength; 911 912 /* Detect pointless TRANSPORTDEC_NOT_ENOUGH_BITS error case, were the bit buffer is already full, 913 or no new burst packet fits. Recover by advancing the bit buffer. */ 914 if ( (TRANSPORTDEC_NOT_ENOUGH_BITS == err) && (FDKgetValidBits(hBs) >= ((TRANSPORTDEC_INBUF_SIZE*8 - ((hTp->avgBitRate*hTp->burstPeriod)/1000)) - 7)) ) 915 { 916 FDKpushFor(hBs, TPDEC_SYNCSKIP); 917 err = TRANSPORTDEC_SYNC_ERROR; 918 } 919 920 if (err == TRANSPORTDEC_OK) { 921 hTp->flags |= TPDEC_SYNCOK; 922 } 923 924 if (fConfigFound) { 925 hTp->flags |= TPDEC_CONFIG_FOUND; 926 } 927 928 if (pHeaderBits != NULL) { 929 *pHeaderBits = headerBits; 930 } 931 932 if (err == TRANSPORTDEC_SYNC_ERROR) { 933 hTp->flags &= ~TPDEC_SYNCOK; 934 } 935 936 C_ALLOC_SCRATCH_END(contextFirstFrame, transportdec_parser_t, 1); 937 938 return err; 939 } 940 941 /** 942 * \brief Synchronize to stream and estimate the amount of missing access units due 943 * to a current synchronization error in case of constant average bit rate. 944 */ 945 static 946 TRANSPORTDEC_ERROR transportDec_readStream ( HANDLE_TRANSPORTDEC hTp, const UINT layer ) 947 { 948 949 TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; 950 HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[layer]; 951 INT nAU = -1; 952 INT headerBits; 953 INT bitDistance, bfDelta; 954 955 /* Obtain distance to next synch word */ 956 bitDistance = FDKgetValidBits(hBs); 957 error = synchronization(hTp, &headerBits); 958 bitDistance -= FDKgetValidBits(hBs); 959 960 961 FDK_ASSERT(bitDistance >= 0); 962 963 if (error == TRANSPORTDEC_SYNC_ERROR || (hTp->flags & TPDEC_LOST_FRAMES_PENDING)) 964 { 965 /* Check if estimating lost access units is feasible. */ 966 if (hTp->avgBitRate > 0 && hTp->asc[0].m_samplesPerFrame > 0 && hTp->asc[0].m_samplingFrequency > 0) 967 { 968 if (error == TRANSPORTDEC_OK) 969 { 970 int aj; 971 972 aj = transportDec_GetBufferFullness(hTp); 973 if (aj > 0) { 974 bfDelta = aj; 975 } else { 976 bfDelta = 0; 977 } 978 /* sync was ok: last of a series of bad access units. */ 979 hTp->flags &= ~TPDEC_LOST_FRAMES_PENDING; 980 /* Add up bitDistance until end of the current frame. Later we substract 981 this frame from the grand total, since this current successfully synchronized 982 frame should not be skipped of course; but it must be accounted into the 983 bufferfulness math. */ 984 bitDistance += hTp->auLength[0]; 985 } else { 986 if ( !(hTp->flags & TPDEC_LOST_FRAMES_PENDING) ) { 987 /* sync not ok: one of many bad access units. */ 988 hTp->flags |= TPDEC_LOST_FRAMES_PENDING; 989 bfDelta = - (INT)hTp->lastValidBufferFullness; 990 } else { 991 bfDelta = 0; 992 } 993 } 994 995 { 996 int num, denom; 997 998 /* Obtain estimate of number of lost frames */ 999 num = hTp->asc[0].m_samplingFrequency * (bfDelta + bitDistance) + hTp->remainder; 1000 denom = hTp->avgBitRate * hTp->asc[0].m_samplesPerFrame; 1001 if (num > 0) { 1002 nAU = num / denom; 1003 hTp->remainder = num % denom; 1004 } else { 1005 hTp->remainder = num; 1006 } 1007 1008 if (error == TRANSPORTDEC_OK) 1009 { 1010 /* Final adjustment of remainder, taken -1 into account because current 1011 frame should not be skipped, thus substract -1 or do nothing instead 1012 of +1-1 accordingly. */ 1013 if ( (denom - hTp->remainder) >= hTp->remainder ) { 1014 nAU--; 1015 } 1016 1017 if (nAU < 0) { 1018 /* There was one frame too much concealed, so unfortunately we will have to skip one good frame. */ 1019 transportDec_EndAccessUnit(hTp); 1020 error = synchronization(hTp, &headerBits); 1021 nAU = -1; 1022 #ifdef DEBUG 1023 FDKprintf("ERROR: Bufferfullness accounting failed. remainder=%d, nAU=%d\n", hTp->remainder, nAU); 1024 #endif 1025 } 1026 hTp->remainder = 0; 1027 /* Enforce last missed frames to be concealed. */ 1028 if (nAU > 0) { 1029 FDKpushBack(hBs, headerBits); 1030 } 1031 } 1032 } 1033 } 1034 } 1035 1036 /* Be sure that lost frames are handled correctly. This is necessary due to some 1037 sync error sequences where later it turns out that there is not enough data, but 1038 the bits upto the sync word are discarded, thus causing a value of nAU > 0 */ 1039 if (nAU > 0) { 1040 error = TRANSPORTDEC_SYNC_ERROR; 1041 } 1042 1043 hTp->missingAccessUnits = nAU; 1044 1045 return error; 1046 } 1047 1048 /* returns error code */ 1049 TRANSPORTDEC_ERROR transportDec_ReadAccessUnit( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) 1050 { 1051 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; 1052 HANDLE_FDK_BITSTREAM hBs; 1053 1054 if (!hTp) { 1055 return TRANSPORTDEC_INVALID_PARAMETER; 1056 } 1057 1058 hBs = &hTp->bitStream[layer]; 1059 1060 if ((INT)FDKgetValidBits(hBs) <= 0) { 1061 err = TRANSPORTDEC_NOT_ENOUGH_BITS; 1062 } 1063 1064 switch (hTp->transportFmt) { 1065 1066 case TT_MP4_ADIF: 1067 /* Read header if not already done */ 1068 if (!(hTp->flags & TPDEC_CONFIG_FOUND)) 1069 { 1070 CProgramConfig *pce; 1071 1072 AudioSpecificConfig_Init(&hTp->asc[0]); 1073 pce = &hTp->asc[0].m_progrConfigElement; 1074 err = adifRead_DecodeHeader(&hTp->parser.adif, pce, hBs); 1075 if (err) 1076 goto bail; 1077 1078 /* Map adif header to ASC */ 1079 hTp->asc[0].m_aot = (AUDIO_OBJECT_TYPE)(pce->Profile + 1); 1080 hTp->asc[0].m_samplingFrequencyIndex = pce->SamplingFrequencyIndex; 1081 hTp->asc[0].m_samplingFrequency = SamplingRateTable[pce->SamplingFrequencyIndex]; 1082 hTp->asc[0].m_channelConfiguration = 0; 1083 hTp->asc[0].m_samplesPerFrame = 1024; 1084 hTp->avgBitRate = hTp->parser.adif.BitRate; 1085 1086 /* Call callback to decoder. */ 1087 { 1088 int errC; 1089 1090 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); 1091 if (errC == 0) { 1092 hTp->flags |= TPDEC_CONFIG_FOUND; 1093 } else { 1094 err = TRANSPORTDEC_PARSE_ERROR; 1095 goto bail; 1096 } 1097 } 1098 } 1099 hTp->auLength[layer] = -1; /* Access Unit data length is unknown. */ 1100 break; 1101 1102 case TT_MP4_RAW: 1103 case TT_DRM: 1104 /* One Access Unit was filled into buffer. 1105 So get the length out of the buffer. */ 1106 hTp->auLength[layer] = FDKgetValidBits(hBs); 1107 hTp->flags |= TPDEC_SYNCOK; 1108 break; 1109 1110 case TT_MP4_LATM_MCP0: 1111 case TT_MP4_LATM_MCP1: 1112 { 1113 int fConfigFound = hTp->flags & TPDEC_CONFIG_FOUND; 1114 err = transportDec_readHeader(hTp, hBs, 0, 1, &hTp->auLength[layer], NULL, NULL, &fConfigFound, NULL); 1115 if (fConfigFound) { 1116 hTp->flags |= TPDEC_CONFIG_FOUND; 1117 } 1118 } 1119 break; 1120 1121 case TT_MP4_ADTS: 1122 case TT_MP4_LOAS: 1123 err = transportDec_readStream(hTp, layer); 1124 break; 1125 1126 default: 1127 err = TRANSPORTDEC_UNSUPPORTED_FORMAT; 1128 break; 1129 } 1130 1131 if (err == TRANSPORTDEC_OK) { 1132 hTp->accessUnitAnchor[layer] = FDKgetValidBits(hBs); 1133 } else { 1134 hTp->accessUnitAnchor[layer] = 0; 1135 } 1136 1137 bail: 1138 return err; 1139 } 1140 1141 INT transportDec_GetAuBitsRemaining( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) 1142 { 1143 INT bits; 1144 1145 if (hTp->accessUnitAnchor[layer] > 0 && hTp->auLength[layer] > 0) { 1146 bits = hTp->auLength[layer] - (hTp->accessUnitAnchor[layer] - FDKgetValidBits(&hTp->bitStream[layer])); 1147 } else { 1148 bits = FDKgetValidBits(&hTp->bitStream[layer]); 1149 } 1150 1151 return bits; 1152 } 1153 1154 INT transportDec_GetAuBitsTotal( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) 1155 { 1156 return hTp->auLength[layer]; 1157 } 1158 1159 TRANSPORTDEC_ERROR transportDec_GetMissingAccessUnitCount ( INT *pNAccessUnits, HANDLE_TRANSPORTDEC hTp ) 1160 { 1161 *pNAccessUnits = hTp->missingAccessUnits; 1162 1163 return TRANSPORTDEC_OK; 1164 } 1165 1166 /* Inform the transportDec layer that reading of access unit has finished. */ 1167 TRANSPORTDEC_ERROR transportDec_EndAccessUnit(HANDLE_TRANSPORTDEC hTp) 1168 { 1169 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; 1170 1171 1172 err = transportDec_AdjustEndOfAccessUnit(hTp); 1173 1174 switch (hTp->transportFmt) { 1175 default: 1176 break; 1177 } 1178 1179 return err; 1180 } 1181 1182 TRANSPORTDEC_ERROR transportDec_SetParam ( const HANDLE_TRANSPORTDEC hTp, 1183 const TPDEC_PARAM param, 1184 const INT value) 1185 { 1186 TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; 1187 1188 switch (param) { 1189 case TPDEC_PARAM_MINIMIZE_DELAY: 1190 if (value) { 1191 hTp->flags |= TPDEC_MINIMIZE_DELAY; 1192 } else { 1193 hTp->flags &= ~TPDEC_MINIMIZE_DELAY; 1194 } 1195 break; 1196 case TPDEC_PARAM_EARLY_CONFIG: 1197 if (value) { 1198 hTp->flags |= TPDEC_EARLY_CONFIG; 1199 } else { 1200 hTp->flags &= ~TPDEC_EARLY_CONFIG; 1201 } 1202 break; 1203 case TPDEC_PARAM_IGNORE_BUFFERFULLNESS: 1204 if (value) { 1205 hTp->flags |= TPDEC_IGNORE_BUFFERFULLNESS; 1206 } else { 1207 hTp->flags &= ~TPDEC_IGNORE_BUFFERFULLNESS; 1208 } 1209 break; 1210 case TPDEC_PARAM_SET_BITRATE: 1211 hTp->avgBitRate = value; 1212 break; 1213 case TPDEC_PARAM_BURST_PERIOD: 1214 hTp->burstPeriod = value; 1215 break; 1216 case TPDEC_PARAM_RESET: 1217 { 1218 int i; 1219 1220 for (i=0; i<(1*2); i++) { 1221 FDKresetBitbuffer(&hTp->bitStream[i]); 1222 hTp->auLength[i] = 0; 1223 hTp->accessUnitAnchor[i] = 0; 1224 } 1225 hTp->flags &= ~(TPDEC_SYNCOK|TPDEC_LOST_FRAMES_PENDING); 1226 if (hTp->transportFmt != TT_MP4_ADIF) { 1227 hTp->flags &= ~TPDEC_CONFIG_FOUND; 1228 } 1229 hTp->remainder = 0; 1230 hTp->avgBitRate = 0; 1231 hTp->missingAccessUnits = 0; 1232 hTp->numberOfRawDataBlocks = 0; 1233 hTp->globalFramePos = 0; 1234 hTp->holdOffFrames = 0; 1235 } 1236 break; 1237 } 1238 1239 return error; 1240 } 1241 1242 UINT transportDec_GetNrOfSubFrames(HANDLE_TRANSPORTDEC hTp) 1243 { 1244 UINT nSubFrames = 0; 1245 1246 if (hTp == NULL) 1247 return 0; 1248 1249 if (hTp->transportFmt==TT_MP4_LATM_MCP1 || hTp->transportFmt==TT_MP4_LATM_MCP0 || hTp->transportFmt==TT_MP4_LOAS) 1250 nSubFrames = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); 1251 else if (hTp->transportFmt==TT_MP4_ADTS) 1252 nSubFrames = hTp->parser.adts.bs.num_raw_blocks; 1253 1254 return nSubFrames; 1255 } 1256 1257 void transportDec_Close(HANDLE_TRANSPORTDEC *phTp) 1258 { 1259 if (phTp != NULL) 1260 { 1261 if (*phTp != NULL) { 1262 if ( ! TT_IS_PACKET((*phTp)->transportFmt) ) { 1263 FreeRam_TransportDecoderBuffer(&(*phTp)->bsBuffer); 1264 } 1265 if (*phTp != NULL) { 1266 FreeRam_TransportDecoder(phTp); 1267 } 1268 } 1269 } 1270 } 1271 1272 TRANSPORTDEC_ERROR transportDec_GetLibInfo( LIB_INFO *info ) 1273 { 1274 int i; 1275 1276 if (info == NULL) { 1277 return TRANSPORTDEC_UNKOWN_ERROR; 1278 } 1279 1280 /* search for next free tab */ 1281 for (i = 0; i < FDK_MODULE_LAST; i++) { 1282 if (info[i].module_id == FDK_NONE) break; 1283 } 1284 if (i == FDK_MODULE_LAST) return TRANSPORTDEC_UNKOWN_ERROR; 1285 info += i; 1286 1287 info->module_id = FDK_TPDEC; 1288 #ifdef __ANDROID__ 1289 info->build_date = ""; 1290 info->build_time = ""; 1291 #else 1292 info->build_date = __DATE__; 1293 info->build_time = __TIME__; 1294 #endif 1295 info->title = TP_LIB_TITLE; 1296 info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2); 1297 LIB_VERSION_STRING(info); 1298 info->flags = 0 1299 | CAPF_ADIF 1300 | CAPF_ADTS 1301 | CAPF_LATM 1302 | CAPF_LOAS 1303 | CAPF_RAWPACKETS 1304 | CAPF_DRM 1305 ; 1306 1307 return TRANSPORTDEC_OK; /* FDKERR_NOERROR; */ 1308 } 1309 1310 1311 int transportDec_CrcStartReg(HANDLE_TRANSPORTDEC pTp, INT mBits) 1312 { 1313 switch (pTp->transportFmt) { 1314 case TT_MP4_ADTS: 1315 return adtsRead_CrcStartReg(&pTp->parser.adts, &pTp->bitStream[0], mBits); 1316 case TT_DRM: 1317 return drmRead_CrcStartReg(&pTp->parser.drm, &pTp->bitStream[0], mBits); 1318 default: 1319 return 0; 1320 } 1321 } 1322 1323 void transportDec_CrcEndReg(HANDLE_TRANSPORTDEC pTp, INT reg) 1324 { 1325 switch (pTp->transportFmt) { 1326 case TT_MP4_ADTS: 1327 adtsRead_CrcEndReg(&pTp->parser.adts, &pTp->bitStream[0], reg); 1328 break; 1329 case TT_DRM: 1330 drmRead_CrcEndReg(&pTp->parser.drm, &pTp->bitStream[0], reg); 1331 break; 1332 default: 1333 break; 1334 } 1335 } 1336 1337 TRANSPORTDEC_ERROR transportDec_CrcCheck(HANDLE_TRANSPORTDEC pTp) 1338 { 1339 switch (pTp->transportFmt) { 1340 case TT_MP4_ADTS: 1341 if ( (pTp->parser.adts.bs.num_raw_blocks > 0) && (pTp->parser.adts.bs.protection_absent == 0) ) 1342 { 1343 HANDLE_FDK_BITSTREAM hBs = &pTp->bitStream[0]; 1344 1345 transportDec_AdjustEndOfAccessUnit(pTp); 1346 } 1347 return adtsRead_CrcCheck(&pTp->parser.adts); 1348 case TT_DRM: 1349 return drmRead_CrcCheck(&pTp->parser.drm); 1350 break; 1351 default: 1352 return TRANSPORTDEC_OK; 1353 } 1354 } 1355