16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* -----------------------------------------------------------------------------
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK© Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKForschung e.V. All rights reserved.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKscheme for digital audio. This FDK AAC Codec software is intended to be used on
116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKa wide variety of Android devices.
126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgeneral perceptual audio codecs. AAC-ELD is considered the best-performing
156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfull-bandwidth communications codec by independent studies and is widely
166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdeployed. AAC has been standardized by ISO and IEC as part of the MPEG
176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKspecifications.
186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKPatent licenses for necessary patent claims for the FDK AAC Codec (including
206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthose of Fraunhofer) may be obtained through Via Licensing
216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK(www.vialicensing.com) or through the respective patent owners individually for
226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe purpose of encoding or decoding bit streams in products that are compliant
236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith the ISO/IEC MPEG audio standards. Please note that most manufacturers of
246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAndroid devices already license these patent claims through Via Licensing or
256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdirectly from the patent owners, and therefore FDK AAC Codec software may
266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKalready be covered under those patent licenses when it is used for those
276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlicensed purposes only.
286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCommercially-licensed AAC software libraries, including floating-point versions
306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith enhanced sound quality, are also available from Fraunhofer. Users are
316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKencouraged to check the Fraunhofer website for additional applications
326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKinformation and documentation.
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKRedistribution and use in source and binary forms, with or without modification,
376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKare permitted without payment of copyright license fees provided that you
386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsatisfy the following conditions:
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in redistributions of
416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec or your modifications thereto in source code form.
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in the documentation
446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKand/or other materials provided with redistributions of the FDK AAC Codec or
456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKyour modifications thereto in binary form. You must make available free of
466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKcharge copies of the complete source code of the FDK AAC Codec and your
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe name of Fraunhofer may not be used to endorse or promote products derived
506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfrom this library without prior written permission.
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may not charge copyright license fees for anyone to use, copy or distribute
536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec software or your modifications thereto.
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYour modified versions of the FDK AAC Codec must carry prominent notices stating
566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat you changed the software and the date of any change. For modified versions
576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKof the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmust be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC Codec Library for Android."
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlimitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer provides no warranty of patent non-infringement with respect to this
666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsoftware.
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may use this FDK AAC Codec software or modifications thereto only for
696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKpurposes that are authorized by appropriate patent licenses.
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKholders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKincluding but not limited to the implied warranties of merchantability and
766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKor consequential damages, including but not limited to procurement of substitute
796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgoods or services; loss of use, data, or profits, or business interruption,
806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKhowever caused and on any theory of liability, whether in contract, strict
816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKliability, or tort (including negligence), arising in any way out of the use of
826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthis software, even if advised of the possibility of such damage.
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK----------------------------------------------------------------------------- */
946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/******************* MPEG transport format encoder library *********************
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK   Author(s):   Manuel Jander
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: MPEG Transport encode
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*******************************************************************************/
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_lib.h"
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* library info */
1066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "tp_version.h"
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MODULE_NAME "transportEnc"
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_asc.h"
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_adts.h"
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_adif.h"
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "tpenc_latm.h"
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct {
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int curSubFrame;
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int nSubFrames;
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int prevBits;
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} RAWPACKETS_INFO;
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstruct TRANSPORTENC {
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CODER_CONFIG config;
1266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  TRANSPORT_TYPE transportFmt; /*!< MPEG4 transport type. */
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_BITSTREAM bitStream;
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR *bsBuffer;
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT bsBufferSize;
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  INT pceFrameCounter; /*!< Indicates frame period when PCE must be written in
1336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                          raw_data_block. -1 means not to write a PCE in
1346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                          raw_dat_block. */
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  union {
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    STRUCT_ADTS adts;
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ADIF_INFO adif;
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    LATM_STREAM latm;
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    RAWPACKETS_INFO raw;
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } writer;
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  CSTpCallBacks callbacks;
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct _TRANSPORTENC_STRUCT TRANSPORTENC_STRUCT;
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * MEMORY Declaration
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKC_ALLOC_MEM(Ram_TransportEncoder, struct TRANSPORTENC, 1)
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_Open(HANDLE_TRANSPORTENC *phTpEnc) {
15816c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi  HANDLE_TRANSPORTENC hTpEnc;
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (phTpEnc == NULL) {
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return TRANSPORTENC_INVALID_PARAMETER;
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
16416c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi  hTpEnc = GetRam_TransportEncoder(0);
16516c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi
1666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTpEnc == NULL) {
16716c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi    return TRANSPORTENC_NO_MEM;
16816c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi  }
16916c472c201c197d3660334df5952eb4084897f9fJean-Michel Trivi
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *phTpEnc = hTpEnc;
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return TRANSPORTENC_OK;
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief  Get frame period of PCE in raw_data_block.
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
1776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * - Write PCE only if necessary. PCE can be part of the ASC if chConfig==0
1786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * whererfore no additonal PCE will be written in raw_data_block.
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * - A matrixMixdown coefficient can only be written if chConfig is 5.0 or 5.1.
1806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * - The PCE repetition rate in raw_data_block can be controlled via
1816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * headerPeriod parameter.
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
1836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param channelMode           Encoder Channel Mode.
1846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param channelConfigZero     No standard channel configuration.
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param transportFmt          Format of the transport to be written.
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param headerPeriod          Chosen PCE frame repetition rate.
1876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param matrixMixdownA        Indicates if a valid Matrix Mixdown coefficient
1886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * is available.
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *
1906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \return  PCE frame repetition rate. -1 means no PCE present in
1916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * raw_data_block.
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */
1936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic INT getPceRepetitionRate(const CHANNEL_MODE channelMode,
1946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                const int channelConfigZero,
1956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                const TRANSPORT_TYPE transportFmt,
1966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                const int headerPeriod,
1976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                const int matrixMixdownA) {
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT pceFrameCounter = -1; /* variable to be returned */
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (headerPeriod > 0) {
2016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    switch (getChannelConfig(channelMode, channelConfigZero)) {
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case 0:
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        switch (transportFmt) {
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TT_MP4_ADTS:
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TT_MP4_LATM_MCP0:
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          case TT_MP4_RAW:
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            pceFrameCounter = headerPeriod;
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            break;
2096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          case TT_MP4_ADIF: /* ADIF header comprises PCE */
2106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            if ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1)) {
2116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              pceFrameCounter = headerPeriod; /* repeating pce only meaningful
2126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                                 for potential matrix mixdown */
2136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              break;
2146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            }
2156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          case TT_MP4_LOAS:      /* PCE in ASC if chChonfig==0 */
2166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          default:
2186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            pceFrameCounter = -1; /* no PCE in raw_data_block */
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case 5: /* MODE_1_2_2 */
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case 6: /* MODE_1_2_2_1 */
2236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        /* matrixMixdownCoefficient can only be written if 5.0 and 5.1 config
2246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK         * present. */
2256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        if (matrixMixdownA != 0) {
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          switch (transportFmt) {
2276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            case TT_MP4_ADIF: /* ADIF header comprises PCE */
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case TT_MP4_ADTS:
2296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            case TT_MP4_LOAS:      /* no PCE in ASC because chConfig!=0 */
2306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK            case TT_MP4_LATM_MCP1: /* no PCE in ASC because chConfig!=0 */
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case TT_MP4_LATM_MCP0:
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            case TT_MP4_RAW:
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              pceFrameCounter = headerPeriod;
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              break;
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            default:
2366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK              pceFrameCounter = -1; /* no PCE in raw_data_block */
2376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          }                         /* switch transportFmt */
2386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        }                           /* if matrixMixdownA!=0 */
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        break;
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:
2416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        pceFrameCounter = -1; /* no PCE in raw_data_block */
2426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }                         /* switch getChannelConfig() */
2436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }                           /* if headerPeriod>0  */
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else {
2456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    pceFrameCounter = -1; /* no PCE in raw_data_block */
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return pceFrameCounter;
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_Init(HANDLE_TRANSPORTENC hTpEnc,
2526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     UCHAR *bsBuffer, INT bsBufferSize,
2536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     TRANSPORT_TYPE transportFmt,
2546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     CODER_CONFIG *cconfig, UINT flags) {
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Copy configuration structure */
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemcpy(&hTpEnc->config, cconfig, sizeof(CODER_CONFIG));
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Init transportEnc struct. */
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->transportFmt = transportFmt;
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->bsBuffer = bsBuffer;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->bsBufferSize = bsBufferSize;
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  FDKinitBitStream(&hTpEnc->bitStream, hTpEnc->bsBuffer, hTpEnc->bsBufferSize,
2656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                   0, BS_WRITER);
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (transportFmt) {
2686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADIF:
2696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      /* Sanity checks */
2706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if ((hTpEnc->config.aot != AOT_AAC_LC) ||
2716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          (hTpEnc->config.samplesPerFrame != 1024)) {
2726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return TRANSPORTENC_INVALID_PARAMETER;
2736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      }
2746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.headerWritten = 0;
2756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.samplingRate = hTpEnc->config.samplingRate;
2766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.bitRate = hTpEnc->config.bitRate;
2776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.profile = ((int)hTpEnc->config.aot) - 1;
2786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.cm = hTpEnc->config.channelMode;
2796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.bVariableRate = 0;
2806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.instanceTag = 0;
2816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.matrixMixdownA = hTpEnc->config.matrixMixdownA;
2826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.adif.pseudoSurroundEnable =
2836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          (hTpEnc->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0;
2846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADTS:
2876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      /* Sanity checks */
2886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if ((hTpEnc->config.aot != AOT_AAC_LC) ||
2896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          (hTpEnc->config.samplesPerFrame != 1024)) {
2906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return TRANSPORTENC_INVALID_PARAMETER;
2916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      }
2926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if (adtsWrite_Init(&hTpEnc->writer.adts, &hTpEnc->config) != 0) {
2936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return TRANSPORTENC_INVALID_PARAMETER;
2946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      }
2956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LOAS:
2986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LATM_MCP0:
2996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LATM_MCP1: {
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      TRANSPORTENC_ERROR error;
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      error = transportEnc_Latm_Init(&hTpEnc->writer.latm, &hTpEnc->bitStream,
3036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     &hTpEnc->config, flags & TP_FLAG_LATM_AMV,
3046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     transportFmt, &hTpEnc->callbacks);
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (error != TRANSPORTENC_OK) {
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return error;
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    } break;
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_RAW:
3116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.raw.curSubFrame = 0;
3126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->writer.raw.nSubFrames = hTpEnc->config.nSubFrames;
3136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    default:
3166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      return TRANSPORTENC_INVALID_PARAMETER;
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* pceFrameCounter indicates if PCE must be written in raw_data_block. */
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->pceFrameCounter = getPceRepetitionRate(
3216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      hTpEnc->config.channelMode, hTpEnc->config.channelConfigZero,
3226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      transportFmt, hTpEnc->config.headerPeriod, hTpEnc->config.matrixMixdownA);
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return TRANSPORTENC_OK;
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_AddOtherDataBits(HANDLE_TRANSPORTENC hTpEnc,
3286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                                 const int nBits) {
3296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
3306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
3316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  switch (hTpEnc->transportFmt) {
3326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LATM_MCP0:
3336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LATM_MCP1:
3346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_LOAS:
3356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      tpErr = transportEnc_LatmAddOtherDataBits(&hTpEnc->writer.latm, nBits);
3366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
3376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADTS:
3386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADIF:
3396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_RAW:
3406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    default:
3416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      tpErr = TRANSPORTENC_UNKOWN_ERROR;
3426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }
3436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
3446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  return tpErr;
3456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK}
3466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
3476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKHANDLE_FDK_BITSTREAM transportEnc_GetBitstream(HANDLE_TRANSPORTENC hTp) {
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return &hTp->bitStream;
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKint transportEnc_RegisterSbrCallback(HANDLE_TRANSPORTENC hTpEnc,
3526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     const cbSbr_t cbSbr, void *user_data) {
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hTpEnc == NULL) {
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->callbacks.cbSbr = cbSbr;
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTpEnc->callbacks.cbSbrData = user_data;
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKint transportEnc_RegisterUsacCallback(HANDLE_TRANSPORTENC hTpEnc,
3616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                      const cbUsac_t cbUsac, void *user_data) {
3626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTpEnc == NULL) {
3636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    return -1;
3646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }
3656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  hTpEnc->callbacks.cbUsac = cbUsac;
3666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  hTpEnc->callbacks.cbUsacData = user_data;
3676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  return 0;
3686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK}
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKint transportEnc_RegisterSscCallback(HANDLE_TRANSPORTENC hTpEnc,
3716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     const cbSsc_t cbSsc, void *user_data) {
3726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTpEnc == NULL) {
3736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    return -1;
3746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  }
3756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  hTpEnc->callbacks.cbSsc = cbSsc;
3766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  hTpEnc->callbacks.cbSscData = user_data;
3776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  return 0;
3786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK}
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_WriteAccessUnit(HANDLE_TRANSPORTENC hTp,
3816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                                INT frameUsedBits,
3826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                                int bufferFullness, int ncc) {
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  TRANSPORTENC_ERROR err = TRANSPORTENC_OK;
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (!hTp) {
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return TRANSPORTENC_INVALID_PARAMETER;
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream;
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* In case of writing PCE in raw_data_block frameUsedBits must be adapted. */
3916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
3926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    frameUsedBits += transportEnc_GetPCEBits(
3936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        hTp->config.channelMode, hTp->config.matrixMixdownA,
3946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        3); /* Consider 3 bits ID signalling in alignment */
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTp->transportFmt) {
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADIF:
3996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
4006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                       BS_WRITER);
4016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if (0 != adifWrite_EncodeHeader(&hTp->writer.adif, hBs, bufferFullness)) {
4026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        err = TRANSPORTENC_INVALID_CONFIG;
4036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      }
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADTS:
4066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      bufferFullness /= ncc; /* Number of Considered Channels */
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bufferFullness /= 32;
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bufferFullness = FDKmin(0x7FF, bufferFullness); /* Signal variable rate */
4096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      adtsWrite_EncodeHeader(&hTp->writer.adts, &hTp->bitStream, bufferFullness,
4106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                             frameUsedBits);
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LOAS:
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP0:
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP1:
4156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      bufferFullness /= ncc; /* Number of Considered Channels */
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bufferFullness /= 32;
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      bufferFullness = FDKmin(0xFF, bufferFullness); /* Signal variable rate */
4186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      transportEnc_LatmWrite(&hTp->writer.latm, hBs, frameUsedBits,
4196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                             bufferFullness, &hTp->callbacks);
4206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_RAW:
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hTp->writer.raw.curSubFrame >= hTp->writer.raw.nSubFrames) {
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hTp->writer.raw.curSubFrame = 0;
4246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
4256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                         BS_WRITER);
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTp->writer.raw.prevBits = FDKgetValidBits(hBs);
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = TRANSPORTENC_UNSUPPORTED_FORMAT;
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Write PCE in raw_data_block if required */
4356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT crcIndex = 0;
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Align inside PCE with repsect to the first bit of the raw_data_block() */
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UINT alignAnchor = FDKgetValidBits(&hTp->bitStream);
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Write PCE element ID bits */
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&hTp->bitStream, ID_PCE, 3);
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if ((hTp->transportFmt == TT_MP4_ADTS) &&
4446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        !hTp->writer.adts.protection_absent) {
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      crcIndex = adtsWrite_CrcStartReg(&hTp->writer.adts, &hTp->bitStream, 0);
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Write PCE as first raw_data_block element */
4496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    transportEnc_writePCE(
4506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        &hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0,
4516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        1, hTp->config.matrixMixdownA,
4526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        (hTp->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0, alignAnchor);
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if ((hTp->transportFmt == TT_MP4_ADTS) &&
4556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        !hTp->writer.adts.protection_absent) {
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex);
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTp->pceFrameCounter = 0; /* reset pce frame counter */
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTp->pceFrameCounter != -1) {
4626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    hTp->pceFrameCounter++; /* Update pceFrameCounter only if PCE writing is
4636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                               active. */
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return err;
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp,
4706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                              int *bits) {
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTp->transportFmt) {
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP0:
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP1:
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LOAS:
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      transportEnc_LatmAdjustSubframeBits(&hTp->writer.latm, bits);
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADTS:
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      adtsWrite_EndRawDataBlock(&hTp->writer.adts, &hTp->bitStream, bits);
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADIF:
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Substract ADIF header from AU bits, not to be considered. */
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *bits -= adifWrite_GetHeaderBits(&hTp->writer.adif);
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTp->writer.adif.headerWritten = 1;
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_RAW:
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *bits -= hTp->writer.raw.prevBits;
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return TRANSPORTENC_OK;
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc,
4966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                         int *nbytes) {
4976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_FDK_BITSTREAM hBs = &hTpEnc->bitStream;
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTpEnc->transportFmt) {
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP0:
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP1:
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LOAS:
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *nbytes = hTpEnc->bsBufferSize;
5056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      tpErr = transportEnc_LatmGetFrame(&hTpEnc->writer.latm, hBs, nbytes);
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADTS:
5086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      if (hTpEnc->writer.adts.currentBlock >=
5096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          hTpEnc->writer.adts.num_raw_blocks + 1) {
5106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hTpEnc->writer.adts.currentBlock = 0;
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      } else {
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        *nbytes = 0;
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADIF:
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_ASSERT((INT)FDKgetValidBits(hBs) >= 0);
5186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_RAW:
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKsyncCache(hBs);
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTpEnc->writer.raw.curSubFrame++;
5236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      *nbytes = ((FDKgetValidBits(hBs) - hTpEnc->writer.raw.prevBits) + 7) >> 3;
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  return tpErr;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKINT transportEnc_GetStaticBits(HANDLE_TRANSPORTENC hTp, int auBits) {
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nbits = 0, nPceBits = 0;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Write PCE within raw_data_block in transport lib. */
5366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
5376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    nPceBits = transportEnc_GetPCEBits(
5386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        hTp->config.channelMode, hTp->config.matrixMixdownA,
5396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        3);             /* Consider 3 bits ID signalling in alignment */
5406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    auBits += nPceBits; /* Adapt required raw_data_block bit consumtpion for AU
5416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                           length information e.g. in LATM/LOAS configuration.
5426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                         */
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTp->transportFmt) {
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADIF:
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_RAW:
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nbits = 0; /* Do not consider the ADIF header into the total bitrate */
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_ADTS:
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nbits = adtsWrite_GetHeaderBits(&hTp->writer.adts);
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LOAS:
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP0:
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP1:
5566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      nbits =
5576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          transportEnc_LatmCountTotalBitDemandHeader(&hTp->writer.latm, auBits);
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nbits = 0;
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  /* PCE is written in the transport library therefore the bit consumption is
5656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK   * part of the transport static bits. */
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  nbits += nPceBits;
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return nbits;
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid transportEnc_Close(HANDLE_TRANSPORTENC *phTp) {
5726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  if (phTp != NULL) {
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phTp != NULL) {
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FreeRam_TransportEncoder(phTp);
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKint transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits) {
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int crcReg = 0;
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTpEnc->transportFmt) {
5836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADTS:
5846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      crcReg = adtsWrite_CrcStartReg(&hTpEnc->writer.adts, &hTpEnc->bitStream,
5856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                     mBits);
5866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
5876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    default:
5886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return crcReg;
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKvoid transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg) {
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (hTpEnc->transportFmt) {
5966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    case TT_MP4_ADTS:
5976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      adtsWrite_CrcEndReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, reg);
5986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
5996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    default:
6006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      break;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,
6056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                        CODER_CONFIG *cc,
6066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                        FDK_BITSTREAM *dataBuffer,
6076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK                                        UINT *confType) {
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HANDLE_LATM_STREAM hLatmConfig = &hTpEnc->writer.latm;
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  *confType = 0; /* set confType variable to default */
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* write StreamMuxConfig or AudioSpecificConfig depending on format used */
6146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  switch (hTpEnc->transportFmt) {
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP0:
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LATM_MCP1:
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case TT_MP4_LOAS:
6186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      tpErr =
6196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK          CreateStreamMuxConfig(hLatmConfig, dataBuffer, 0, &hTpEnc->callbacks);
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *confType = 1; /* config is SMC */
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    default:
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (transportEnc_writeASC(dataBuffer, cc, &hTpEnc->callbacks) != 0) {
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        tpErr = TRANSPORTENC_UNKOWN_ERROR;
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return tpErr;
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKTRANSPORTENC_ERROR transportEnc_GetLibInfo(LIB_INFO *info) {
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int i;
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (info == NULL) {
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return TRANSPORTENC_INVALID_PARAMETER;
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* search for next free tab */
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i = 0; i < FDK_MODULE_LAST; i++) {
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (info[i].module_id == FDK_NONE) break;
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (i == FDK_MODULE_LAST) {
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return TRANSPORTENC_UNKOWN_ERROR;
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info += i;
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->module_id = FDK_TPENC;
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2);
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  LIB_VERSION_STRING(info);
6496e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#ifdef __ANDROID__
6506e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen  info->build_date = "";
6516e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen  info->build_time = "";
6526e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#else
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_date = __DATE__;
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->build_time = __TIME__;
6556e8330732f61d1da1485fc07b61444f490d5e623Dan Willemsen#endif
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  info->title = TP_LIB_TITLE;
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Set flags */
6596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK  info->flags =
6606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK      0 | CAPF_ADIF | CAPF_ADTS | CAPF_LATM | CAPF_LOAS | CAPF_RAWPACKETS;
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return TRANSPORTENC_OK;
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
664