12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* ----------------------------------------------------------------------------------------------------------- 32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android 42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi� Copyright 1995 - 2015 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. 62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project All rights reserved. 72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1. INTRODUCTION 92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices. 122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications. 172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with 212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only. 242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation. 282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2. COPYRIGHT LICENSE 302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without 322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions: 332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or 352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form. 362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials 382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your 402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form. 412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without 432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission. 442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto. 472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term 502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3. NO PATENT LICENSE 542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software. 582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses. 612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4. DISCLAIMER 632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits, 692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict 702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if 712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage. 722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5. CONTACT INFORMATION 742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS 762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL 772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33 782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany 792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm 812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de 822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */ 832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************** MPEG-4 AAC Encoder ************************** 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Author(s): 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Description: 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/ 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_latm.h" 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h" 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const short celpFrameLengthTable[64] = { 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 154, 170, 186, 147, 156, 165, 114, 120, 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 186, 126, 132, 138, 142, 146, 154, 166, 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 174, 182, 190, 198, 206, 210, 214, 110, 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 114, 118, 120, 122, 218, 230, 242, 254, 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 266, 278, 286, 294, 318, 342, 358, 374, 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 390, 406, 422, 136, 142, 148, 154, 160, 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 166, 170, 174, 186, 198, 206, 214, 222, 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 230, 238, 216, 160, 280, 338, 0, 0 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/******* 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project write value to transport stream 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project first two bits define the size of the value itself 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project then the value itself, with a size of 0-3 bytes 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*******/ 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT transportEnc_LatmWriteValue(HANDLE_FDK_BITSTREAM hBs, int value) 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR valueBytes = 4; 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project unsigned int bitsWritten = 0; 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( value < (1<<8) ) { 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valueBytes = 1; 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if ( value < (1<<16) ) { 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valueBytes = 2; 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if ( value < (1<<24) ) { 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valueBytes = 3; 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valueBytes = 4; 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits(hBs, valueBytes-1, 2 ); /* size of value in Bytes */ 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (i=0; i<valueBytes; i++) { 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write most significant Byte first */ 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits(hBs, (UCHAR)(value>>((valueBytes-1-i)<<3)), 8); 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitsWritten = (valueBytes<<3)+2; 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return bitsWritten; 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT transportEnc_LatmCountFixBitDemandHeader ( HANDLE_LATM_STREAM hAss ) 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bitDemand = 0; 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int insertSetupData = 0 ; 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* only if start of new latm frame */ 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt==0) 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioSyncStream */ 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->tt == TT_MP4_LOAS) { 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 11 ; /* syncword */ 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 13 ; /* audioMuxLengthBytes */ 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioMuxElement*/ 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioMuxElement::Stream Mux Config */ 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->muxConfigPeriod > 0) { 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project insertSetupData = (hAss->latmFrameCounter == 0); 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project insertSetupData = 0; 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->tt != TT_MP4_LATM_MCP0) { 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioMuxElement::useSameStreamMux Flag */ 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=1; 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( insertSetupData ) { 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += hAss->streamMuxConfigBits; 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioMuxElement::otherDataBits */ 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 8*hAss->otherDataLenBytes; 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* AudioMuxElement::ByteAlign */ 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( bitDemand % 8 ) { 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->fillBits = 8 - (bitDemand % 8); 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += hAss->fillBits ; 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->fillBits = 0; 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return bitDemand ; 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT transportEnc_LatmCountVarBitDemandHeader ( HANDLE_LATM_STREAM hAss , unsigned int streamDataLength ) 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bitDemand = 0; 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int prog, layer; 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Payload Length Info*/ 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hAss->allStreamsSameTimeFraming ) { 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( prog=0; prog<hAss->noProgram; prog++ ) { 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( layer=0; layer<LATM_MAX_LAYERS; layer++ ) { 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]); 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( p_linfo->streamID >= 0 ) { 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch( p_linfo->frameLengthType ) { 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( streamDataLength > 0 ) { 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project streamDataLength -= bitDemand ; 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while( streamDataLength >= (255<<3) ) { 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=8; 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project streamDataLength -= (255<<3); 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 8; 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 6: 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 2; 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* there are many possibilities to use this mechanism. */ 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch( hAss->varMode ) { 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case LATMVAR_SIMPLE_SEQUENCE: { 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Use the sequence generated by the encoder */ 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //int streamCntPosition = transportEnc_SetWritePointer( hAss->hAssemble, 0 ); 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //int streamCntPosition = FDKgetValidBits( hAss->hAssemble ); 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=4; 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->varStreamCnt = 0; 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( prog=0; prog<hAss->noProgram; prog++ ) { 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( layer=0; layer<LATM_MAX_LAYERS; layer++ ) { 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]); 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( p_linfo->streamID >= 0 ) { 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=4; /* streamID */ 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch( p_linfo->frameLengthType ) { 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 0: 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project streamDataLength -= bitDemand ; 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while( streamDataLength >= (255<<3) ) { 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=8; 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project streamDataLength -= (255<<3); 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += 8; 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*bitDemand += 1; endFlag 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break;*/ 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1: 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 6: 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->varStreamCnt++; 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand+=4; 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //transportEnc_UpdateBitstreamField( hAss->hAssemble, streamCntPosition, hAss->varStreamCnt-1, 4 ); 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //UINT pos = streamCntPosition-FDKgetValidBits(hAss->hAssemble); 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //FDKpushBack( hAss->hAssemble, pos); 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //FDKwriteBits( hAss->hAssemble, hAss->varStreamCnt-1, 4); 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //FDKpushFor( hAss->hAssemble, pos-4); 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return bitDemand ; 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTRANSPORTENC_ERROR 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCreateStreamMuxConfig( 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_LATM_STREAM hAss, 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bufferFullness, 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CSTpCallBacks *cb 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT streamIDcnt, tmp; 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int layer, prog; 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT coreFrameOffset=0; 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 299e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi hAss->taraBufferFullness = 0xFF; 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxVersionA = 0; /* for future extensions */ 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits = 0; 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->audioMuxVersion, 1 ); /* audioMuxVersion */ 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits += 1; 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAss->audioMuxVersion == 1 ) { 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->audioMuxVersionA, 1 ); /* audioMuxVersionA */ 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=1; 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAss->audioMuxVersionA == 0 ) 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAss->audioMuxVersion == 1 ) { 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+= transportEnc_LatmWriteValue( hBs, hAss->taraBufferFullness );/* taraBufferFullness */ 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->allStreamsSameTimeFraming ? 1:0, 1 ); /* allStreamsSameTimeFraming */ 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->noSubframes-1, 6 ); /* Number of Subframes */ 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->noProgram-1, 4 ); /* Number of Programs */ 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=11; 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project streamIDcnt = 0; 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( prog=0; prog<hAss->noProgram; prog++ ) { 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int transLayer = 0; 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->noLayer[prog]-1, 3 ); 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=3; 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( layer=0; layer<LATM_MAX_LAYERS; layer++ ) { 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]); 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CODER_CONFIG *p_lci = hAss->config[prog][layer]; 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->streamID = -1; 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hAss->config[prog][layer] != NULL ) { 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int useSameConfig = 0; 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( transLayer > 0 ) { 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, useSameConfig ? 1 : 0, 1 ); 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=1; 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (useSameConfig == 0) || (transLayer==0) ) { 343e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi const UINT alignAnchor = FDKgetValidBits(hBs); 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportEnc_writeASC( 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs, 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->config[prog][layer], 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cb 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( hAss->audioMuxVersion == 1 ) { 352e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi UINT ascLen = transportEnc_LatmWriteValue(hBs, 0); 353e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi FDKbyteAlign(hBs, alignAnchor); 354e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi ascLen = FDKgetValidBits(hBs) - alignAnchor - ascLen; 355e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi FDKpushBack(hBs, FDKgetValidBits(hBs) - alignAnchor); 356e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi 357e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi transportEnc_LatmWriteValue(hBs, ascLen); 358e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transportEnc_writeASC( 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs, 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->config[prog][layer], 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cb 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 364e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi 365e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi FDKbyteAlign(hBs, alignAnchor); /* asc length fillbits */ 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 368e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5Jean-Michel Trivi hAss->streamMuxConfigBits += FDKgetValidBits(hBs) - alignAnchor; /* add asc length to smc summary */ 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transLayer++; 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( !hAss->allStreamsSameTimeFraming ) { 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( streamIDcnt >= LATM_MAX_STREAM_ID ) 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_CONFIG; 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->streamID = streamIDcnt++; 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch( p_lci->aot ) { 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_MAIN : 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LC : 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_SSR : 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_LTP : 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_AAC_SCAL : 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_LD : 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_ER_AAC_ELD : 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_USAC: 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthType = 0; 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, bufferFullness, 8 ); /* bufferFullness */ 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=11; 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( !hAss->allStreamsSameTimeFraming ) { 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CODER_CONFIG *p_lci_prev = hAss->config[prog][layer-1]; 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( ((p_lci->aot == AOT_AAC_SCAL) || (p_lci->aot == AOT_ER_AAC_SCAL)) && 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ((p_lci_prev->aot == AOT_CELP) || (p_lci_prev->aot == AOT_ER_CELP)) ) { 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, coreFrameOffset, 6 ); /* coreFrameOffset */ 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=6; 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_TWIN_VQ: 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthType = 1; 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = ( (p_lci->bitsFrame+7) >> 3 ) - 20; /* transmission frame length in bytes */ 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( (tmp < 0) ) { 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_TRANSMISSION_FRAME_LENGTH; 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, tmp, 9 ); 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=12; 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthBits = (tmp+20) << 3; 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_CELP: 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthType = 4; 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=3; 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( i=0; i<62; i++ ) { 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( celpFrameLengthTable[i] == p_lci->bitsFrame ) 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( i>=62 ) { 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_CELP_FRAME_LENGTH; 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, i, 6 ); /* CELPframeLengthTabelIndex */ 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=6; 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthBits = p_lci->bitsFrame; 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_HVXC: 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthType = 6; 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=3; 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( p_lci->bitsFrame == 40 ) { 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project i = 0; 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else if( p_lci->bitsFrame == 80 ) { 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project i = 1; 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_FRAME_BITS; 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, i, 1 ); /* HVXCframeLengthTableIndex */ 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=1; 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project p_linfo->frameLengthBits = p_lci->bitsFrame; 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case AOT_NULL_OBJECT: 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_AOT; 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, (hAss->otherDataLenBytes>0) ? 1:0, 1 ); /* otherDataPresent */ 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=1; 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hAss->otherDataLenBytes > 0 ) { 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT otherDataLenTmp = hAss->otherDataLenBytes; 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT escCnt = 0; 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT otherDataLenEsc = 1; 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while(otherDataLenTmp) { 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project otherDataLenTmp >>= 8; 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escCnt ++; 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project do { 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project otherDataLenTmp = (hAss->otherDataLenBytes>>(escCnt*8)) & 0xFF; 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project escCnt--; 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project otherDataLenEsc = escCnt>0; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, otherDataLenEsc, 1 ); 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, otherDataLenTmp, 8 ); 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=9; 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } while(otherDataLenEsc); 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT crcCheckPresent=0; 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project USHORT crcCheckSum=0; 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, crcCheckPresent, 1 ); /* crcCheckPresent */ 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=1; 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( crcCheckPresent ){ 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, crcCheckSum, 8 ); /* crcCheckSum */ 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->streamMuxConfigBits+=8; 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { /* if ( audioMuxVersionA == 0 ) */ 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* for future extensions */ 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_OK; 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic TRANSPORTENC_ERROR 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectWriteAuPayloadLengthInfo( HANDLE_FDK_BITSTREAM hBitStream, int AuLengthBits ) 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int restBytes; 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( AuLengthBits % 8 ) 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_AU_LENGTH; 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project while( AuLengthBits >= 255*8 ) { 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBitStream, 255, 8 ); /* 255 shows incomplete AU */ 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AuLengthBits -= (255*8); 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project restBytes = (AuLengthBits) >> 3; 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBitStream, restBytes, 8 ); 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_OK; 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTRANSPORTENC_ERROR transportEnc_LatmSetNrOfSubframes( HANDLE_LATM_STREAM hAss, 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noSubframes_next) /* nr of access units / payloads within a latm frame */ 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* sanity chk */ 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (noSubframes_next < 1 || noSubframes_next > MAX_NR_OF_SUBFRAMES) { 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_LATM_INVALID_NR_OF_SUBFRAMES; 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noSubframes_next = noSubframes_next; 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* if at start then we can take over the value immediately, otherwise we have to wait for the next SMC */ 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( (hAss->subFrameCnt == 0) && (hAss->latmFrameCounter == 0) ) { 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noSubframes = noSubframes_next; 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_OK; 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint allStreamsSameTimeFraming( HANDLE_LATM_STREAM hAss, UCHAR noProgram, UCHAR noLayer[] /* return */ ) 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int prog, layer; 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signed int lastNoSamples = -1; 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signed int minFrameSamples = FDK_INT_MAX; 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signed int maxFrameSamples = 0; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signed int highestSamplingRate = -1; 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( prog=0; prog<noProgram; prog++ ) { 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noLayer[prog] = 0; 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for( layer=0; layer<LATM_MAX_LAYERS; layer++ ) 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hAss->config[prog][layer] != NULL ) 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT hsfSamplesFrame; 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noLayer[prog]++; 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( highestSamplingRate < 0 ) 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project highestSamplingRate = hAss->config[prog][layer]->samplingRate; 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hsfSamplesFrame = hAss->config[prog][layer]->samplesPerFrame * highestSamplingRate / hAss->config[prog][layer]->samplingRate; 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hsfSamplesFrame <= minFrameSamples ) minFrameSamples = hsfSamplesFrame; 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hsfSamplesFrame >= maxFrameSamples ) maxFrameSamples = hsfSamplesFrame; 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( lastNoSamples == -1 ) { 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lastNoSamples = hsfSamplesFrame; 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hsfSamplesFrame != lastNoSamples ) { 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 1; 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Initialize LATM/LOAS Stream and add layer 0 at program 0. 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTRANSPORTENC_ERROR transportEnc_InitLatmStream( HANDLE_LATM_STREAM hAss, 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int fractDelayPresent, 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signed int muxConfigPeriod, /* insert setup data every muxConfigPeriod frames */ 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT audioMuxVersion, 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORT_TYPE tt 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK; 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss == NULL) 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_INVALID_PARAMETER; 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->tt = tt; 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noProgram = 1; 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxVersion = audioMuxVersion; 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Fill noLayer array using hAss->config */ 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->allStreamsSameTimeFraming = allStreamsSameTimeFraming( hAss, hAss->noProgram, hAss->noLayer ); 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Only allStreamsSameTimeFraming==1 is supported */ 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(hAss->allStreamsSameTimeFraming); 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->fractDelayPresent = fractDelayPresent; 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->otherDataLenBytes = 0; 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->varMode = LATMVAR_SIMPLE_SEQUENCE; 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* initialize counters */ 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->subFrameCnt = 0; 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noSubframes = DEFAULT_LATM_NR_OF_SUBFRAMES; 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noSubframes_next = DEFAULT_LATM_NR_OF_SUBFRAMES; 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* sync layer related */ 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxLengthBytes = 0; 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->latmFrameCounter = 0; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->muxConfigPeriod = muxConfigPeriod; 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectUINT transportEnc_LatmCountTotalBitDemandHeader ( HANDLE_LATM_STREAM hAss , unsigned int streamDataLength ) 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT bitDemand = 0; 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (hAss->tt) { 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_LOAS: 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_LATM_MCP0: 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case TT_MP4_LATM_MCP1: 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt == 0) { 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand = transportEnc_LatmCountFixBitDemandHeader ( hAss ); 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bitDemand += transportEnc_LatmCountVarBitDemandHeader ( hAss , streamDataLength /*- bitDemand*/); 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return bitDemand; 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic TRANSPORTENC_ERROR 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAdvanceAudioMuxElement ( 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_LATM_STREAM hAss, 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int auBits, 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bufferFullness, 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CSTpCallBacks *cb 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK; 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int insertMuxSetup; 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Insert setup data to assemble Buffer */ 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt == 0) 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->muxConfigPeriod > 0) { 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project insertMuxSetup = (hAss->latmFrameCounter == 0); 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project insertMuxSetup = 0; 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->tt != TT_MP4_LATM_MCP0) { 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( insertMuxSetup ) { 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, 0, 1 ); /* useSameStreamMux useNewStreamMux */ 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CreateStreamMuxConfig(hAss, hBs, bufferFullness, cb); 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != TRANSPORTENC_OK) 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, 1, 1 ); /* useSameStreamMux */ 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* PayloadLengthInfo */ 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int prog, layer; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (prog = 0; prog < hAss->noProgram; prog++) { 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (layer = 0; layer < hAss->noLayer[prog]; layer++) { 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = WriteAuPayloadLengthInfo( hBs, auBits ); 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != TRANSPORTENC_OK) 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* At this point comes the access unit. */ 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return TRANSPORTENC_OK; 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTRANSPORTENC_ERROR 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjecttransportEnc_LatmWrite ( 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_LATM_STREAM hAss, 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int auBits, 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int bufferFullness, 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CSTpCallBacks *cb 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORTENC_ERROR ErrorStatus; 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt == 0) { 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Start new frame */ 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKresetBitbuffer(hBs, BS_WRITER); 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->latmSubframeStart = FDKgetValidBits(hBs); 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Insert syncword and syncword distance 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - only if loas 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project - we must update the syncword distance (=audiomuxlengthbytes) later 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if( hAss->tt == TT_MP4_LOAS && hAss->subFrameCnt == 0) 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Start new LOAS frame */ 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, 0x2B7, 11 ); 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxLengthBytes = 0; 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxLengthBytesPos = FDKgetValidBits( hBs ); /* store read pointer position */ 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( hBs, hAss->audioMuxLengthBytes, 13 ); 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = AdvanceAudioMuxElement( 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss, 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hBs, 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project auBits, 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bufferFullness, 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cb 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != TRANSPORTENC_OK) 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid transportEnc_LatmAdjustSubframeBits(HANDLE_LATM_STREAM hAss, 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *bits) 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Substract bits from possible previous subframe */ 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *bits -= hAss->latmSubframeStart; 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Add fill bits */ 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt == 0) 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *bits += hAss->fillBits; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid transportEnc_LatmGetFrame(HANDLE_LATM_STREAM hAss, 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int *bytes) 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->subFrameCnt++; 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->subFrameCnt >= hAss->noSubframes) 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Add LOAS frame length if required. */ 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->tt == TT_MP4_LOAS) 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int latmBytes; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project latmBytes = (FDKgetValidBits(hBs)+7) >> 3; 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* write length info into assembler buffer */ 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->audioMuxLengthBytes = latmBytes - 3; /* 3=Syncword + length */ 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_BITSTREAM tmpBuf; 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKinitBitStream( &tmpBuf, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER ) ; 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKpushFor( &tmpBuf, hAss->audioMuxLengthBytesPos ); 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits( &tmpBuf, hAss->audioMuxLengthBytes, 13 ); 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsyncCache( &tmpBuf ); 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Write AudioMuxElement byte alignment fill bits */ 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKwriteBits(hBs, 0, hAss->fillBits); 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT( (FDKgetValidBits(hBs) % 8) == 0); 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->subFrameCnt = 0; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKsyncCache(hBs); 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *bytes = (FDKgetValidBits(hBs) + 7)>>3; 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //FDKfetchBuffer(hBs, buffer, (UINT*)bytes); 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->muxConfigPeriod > 0) 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->latmFrameCounter++; 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hAss->latmFrameCounter >= hAss->muxConfigPeriod) { 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->latmFrameCounter = 0; 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->noSubframes = hAss->noSubframes_next; 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else { 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* No data this time */ 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *bytes = 0; 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Init LATM/LOAS 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTRANSPORTENC_ERROR transportEnc_Latm_Init( 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_LATM_STREAM hAss, 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_FDK_BITSTREAM hBs, 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CODER_CONFIG *layerConfig, 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT audioMuxVersion, 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORT_TYPE tt, 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project CSTpCallBacks *cb 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project TRANSPORTENC_ERROR ErrorStatus; 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int fractDelayPresent = 0; 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int prog, layer; 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int setupDataDistanceFrames = layerConfig->headerPeriod; 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(setupDataDistanceFrames>=0); 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (prog=0; prog<LATM_MAX_PROGRAMS; prog++) { 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (layer=0; layer<LATM_MAX_LAYERS; layer++) { 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->config[prog][layer] = NULL; 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->m_linfo[prog][layer].streamID = -1; 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->config[0][0] = layerConfig; 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss->m_linfo[0][0].streamID = 0; 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = transportEnc_InitLatmStream( hAss, 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fractDelayPresent, 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project setupDataDistanceFrames, 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project (audioMuxVersion)?1:0, 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tt 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != TRANSPORTENC_OK) 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ErrorStatus = transportEnc_LatmSetNrOfSubframes( 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hAss, 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project layerConfig->nSubFrames 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (ErrorStatus != TRANSPORTENC_OK) 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project goto bail; 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Get the size of the StreamMuxConfig somehow */ 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project AdvanceAudioMuxElement(hAss, hBs, 0, 0, cb); 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //CreateStreamMuxConfig(hAss, hBs, 0); 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail: 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return ErrorStatus; 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 882