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