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
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi� Copyright  1995 - 2013 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/**********************  Fraunhofer IIS FDK AAC Encoder lib  ******************
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Author(s): V. Bacigalupo
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   Description: Metadata Encoder library interface functions
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "metadata_main.h"
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "metadata_compressor.h"
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_bitstream.h"
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_audio.h"
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h"
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*----------------- defines ----------------------*/
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MAX_DRC_BANDS        (1<<4)
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MAX_DRC_CHANNELS        (8)
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define MAX_DRC_FRAMELEN   (2*1024)
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------- structure definitions --------------------*/
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projecttypedef struct AAC_METADATA
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* MPEG: Dynamic Range Control */
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  struct {
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         prog_ref_level_present;
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR                         prog_ref_level;
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         dyn_rng_sgn[MAX_DRC_BANDS];
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         dyn_rng_ctl[MAX_DRC_BANDS];
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         drc_bands_present;
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         drc_band_incr;
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         drc_band_top[MAX_DRC_BANDS];
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         drc_interpolation_scheme;
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_METADATA_DRC_PROFILE   drc_profile;
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                           drc_TargetRefLevel;    /* used for Limiter */
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* excluded channels */
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         excluded_chns_present;
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         exclude_mask[2];       /* MAX_NUMBER_CHANNELS/8 */
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } mpegDrc;
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* ETSI: addtl ancillary data */
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  struct {
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Heavy Compression */
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         compression_on;        /* flag, if compression value should be written */
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR                         compression_value;     /* compression value */
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_METADATA_DRC_PROFILE   comp_profile;
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                           comp_TargetRefLevel;   /* used for Limiter */
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                           timecode_coarse_status;
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT                           timecode_fine_status;
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } etsiAncData;
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR                         centerMixLevel;          /* center downmix level (0...7, according to table) */
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  SCHAR                         surroundMixLevel;        /* surround downmix level (0...7, according to table) */
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR                         WritePCEMixDwnIdx;       /* flag */
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR                         DmxLvl_On;               /* flag */
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR                         dolbySurroundMode;
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR                         metadataMode;            /* indicate meta data mode in current frame (delay line) */
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} AAC_METADATA;
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstruct FDK_METADATA_ENCODER
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                metadataMode;
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  HDRC_COMP          hDrcComp;
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AACENC_MetaData    submittedMetaData;
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                nAudioDataDelay;
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                nMetaDataDelay;
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                nChannels;
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT_PCM            audioDelayBuffer[MAX_DRC_CHANNELS*MAX_DRC_FRAMELEN];
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int                audioDelayIdx;
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AAC_METADATA       metaDataBuffer[3];
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  int                metaDataDelayIdx;
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR              drcInfoPayload[12];
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR              drcDsePayload[8];
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                matrix_mixdown_idx;
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  AACENC_EXT_PAYLOAD exPayload[2];
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                nExtensions;
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT                finalizeMetaData;                   /* Delay switch off by one frame and write default configuration to
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                                            finalize the metadata setup. */
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*---------------- constants -----------------------*/
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const AACENC_MetaData defaultMetaDataSetup = {
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_METADATA_DRC_NONE,
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    AACENC_METADATA_DRC_NONE,
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    -(31<<16),
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    -(31<<16),
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0,
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    -(31<<16),
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0,
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0,
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0,
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0,
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_DBL dmxTable[8] = {
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ((FIXP_DBL)MAXVAL_DBL), FL2FXCONST_DBL(0.841f), FL2FXCONST_DBL(0.707f), FL2FXCONST_DBL(0.596f),
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FL2FXCONST_DBL(0.500f), FL2FXCONST_DBL(0.422f), FL2FXCONST_DBL(0.355f), FL2FXCONST_DBL(0.000f)
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const UCHAR surmix2matrix_mixdown_idx[8] = {
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    0, 0, 0, 1, 1, 2, 2, 3
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*--------------- function declarations --------------------*/
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR WriteMetadataPayload(
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_FDK_METADATA_ENCODER hMetaData,
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA * const  pMetadata
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT WriteDynamicRangeInfoPayload(
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA* const pMetadata,
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR* const              pExtensionPayload
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT WriteEtsiAncillaryDataPayload(
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA* const pMetadata,
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR* const              pExtensionPayload
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR CompensateAudioDelay(
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER hMetaDataEnc,
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM * const             pAudioSamples,
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                   nAudioSamples
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR LoadSubmittedMetadata(
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_MetaData *   const hMetadata,
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                       nChannels,
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                       metadataMode,
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_METADATA * const            pAacMetaData
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR ProcessCompressor(
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_METADATA                    *pMetadata,
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HDRC_COMP                        hDrcComp,
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT_PCM * const            pSamples,
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                        nSamples
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        );
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*------------- function definitions ----------------*/
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic DRC_PROFILE convertProfile(AACENC_METADATA_DRC_PROFILE aacProfile)
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    DRC_PROFILE drcProfile = DRC_NONE;
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch(aacProfile) {
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_NONE:          drcProfile = DRC_NONE;          break;
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_FILMSTANDARD:  drcProfile = DRC_FILMSTANDARD;  break;
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_FILMLIGHT:     drcProfile = DRC_FILMLIGHT;     break;
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_MUSICSTANDARD: drcProfile = DRC_MUSICSTANDARD; break;
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_MUSICLIGHT:    drcProfile = DRC_MUSICLIGHT;    break;
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      case AACENC_METADATA_DRC_SPEECH:        drcProfile = DRC_SPEECH;        break;
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      default:                                drcProfile = DRC_NONE;          break;
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return drcProfile;
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* convert dialog normalization to program reference level */
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* NOTE: this only is correct, if the decoder target level is set to -31dB for line mode / -20dB for RF mode */
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UCHAR dialnorm2progreflvl(const INT d)
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return ((UCHAR)FDKmax(0, FDKmin((-d + (1<<13)) >> 14, 127)));
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* convert program reference level to dialog normalization */
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT progreflvl2dialnorm(const UCHAR p)
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -((INT)(p<<(16-2)));
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* encode downmix levels to Downmixing_levels_MPEG4 */
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic SCHAR encodeDmxLvls(const SCHAR cmixlev, const SCHAR surmixlev)
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR dmxLvls = 0;
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    dmxLvls |= 0x80 | (cmixlev << 4); /* center_mix_level_on */
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    dmxLvls |= 0x08 | surmixlev;      /* surround_mix_level_on */
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return dmxLvls;
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* encode AAC DRC gain (ISO/IEC 14496-3:2005  4.5.2.7) */
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void encodeDynrng(INT gain, UCHAR* const dyn_rng_ctl, UCHAR* const dyn_rng_sgn )
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(gain < 0)
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *dyn_rng_sgn = 1;
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      gain = -gain;
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *dyn_rng_sgn = 0;
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    gain = FDKmin(gain,(127<<14));
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *dyn_rng_ctl = (UCHAR)((gain + (1<<13)) >> 14);
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* decode AAC DRC gain (ISO/IEC 14496-3:2005  4.5.2.7) */
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT decodeDynrng(const UCHAR dyn_rng_ctl, const UCHAR dyn_rng_sgn)
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT tmp = ((INT)dyn_rng_ctl << (16-2));
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (dyn_rng_sgn) tmp = -tmp;
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return tmp;
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* encode AAC compression value (ETSI TS 101 154 page 99) */
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic UCHAR encodeCompr(INT gain)
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR x, y;
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT tmp;
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* tmp = (int)((48.164f - gain) / 6.0206f * 15 + 0.5f); */
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    tmp = ((3156476 - gain) * 15 + 197283) / 394566;
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (tmp >= 240) {
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 0xFF;
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else if (tmp < 0) {
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 0;
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        x = tmp / 15;
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        y = tmp % 15;
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return (x << 4) | y;
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* decode AAC compression value (ETSI TS 101 154 page 99) */
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT decodeCompr(const UCHAR compr)
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT gain;
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    SCHAR x = compr >> 4;     /* 4 MSB of compr */
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    UCHAR y = (compr & 0x0F); /* 4 LSB of compr */
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* gain = (INT)((48.164f - 6.0206f * x - 0.4014f * y) ); */
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    gain = (INT)( scaleValue(((LONG)FL2FXCONST_DBL(6.0206f/128.f)*(8-x) - (LONG)FL2FXCONST_DBL(0.4014f/128.f)*y), -(DFRACT_BITS-1-7-16)) );
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return gain;
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_METADATA_ERROR FDK_MetadataEnc_Open(
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER *phMetaData
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    HANDLE_FDK_METADATA_ENCODER hMetaData = NULL;
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phMetaData == NULL) {
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INVALID_HANDLE;
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* allocate memory */
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData = (HANDLE_FDK_METADATA_ENCODER) FDKcalloc(1, sizeof(FDK_METADATA_ENCODER) );
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetaData == NULL) {
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_MEMORY_ERROR;
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(hMetaData, sizeof(FDK_METADATA_ENCODER));
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Allocate DRC Compressor. */
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (FDK_DRC_Generator_Open(&hMetaData->hDrcComp)!=0) {
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_MEMORY_ERROR;
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Return metadata instance */
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *phMetaData = hMetaData;
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_MetadataEnc_Close(&hMetaData);
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_METADATA_ERROR FDK_MetadataEnc_Close(
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER *phMetaData
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (phMetaData == NULL) {
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INVALID_HANDLE;
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (*phMetaData != NULL) {
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_DRC_Generator_Close(&(*phMetaData)->hDrcComp);
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKfree(*phMetaData);
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      *phMetaData = NULL;
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_METADATA_ERROR FDK_MetadataEnc_Init(
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER hMetaData,
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                   resetStates,
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                   metadataMode,
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                   audioDelay,
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                  frameLength,
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                  sampleRate,
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const UINT                  nChannels,
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const CHANNEL_MODE          channelMode,
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const CHANNEL_ORDER         channelOrder
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int i, nFrames, delay;
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetaData==NULL) {
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INVALID_HANDLE;
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Determine values for delay compensation. */
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (nFrames=0, delay=audioDelay-frameLength; delay>0; delay-=frameLength, nFrames++);
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hMetaData->nChannels>MAX_DRC_CHANNELS) || ((-delay)>MAX_DRC_FRAMELEN) ) {
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INIT_ERROR;
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize with default setup. */
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(&hMetaData->submittedMetaData, &defaultMetaDataSetup,  sizeof(AACENC_MetaData));
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->finalizeMetaData = 0; /* finalize meta data only while on/off switching, else disabled */
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Reset delay lines. */
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( resetStates || (hMetaData->nAudioDataDelay!=-delay) || (hMetaData->nChannels!=(INT)nChannels) )
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(hMetaData->audioDelayBuffer, sizeof(hMetaData->audioDelayBuffer));
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(hMetaData->metaDataBuffer, sizeof(hMetaData->metaDataBuffer));
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hMetaData->audioDelayIdx = 0;
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hMetaData->metaDataDelayIdx = 0;
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Enable meta data. */
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (hMetaData->metadataMode==0) && (metadataMode!=0) ) {
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* disable meta data in all delay lines */
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (i=0; i<(int)(sizeof(hMetaData->metaDataBuffer)/sizeof(AAC_METADATA)); i++) {
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          LoadSubmittedMetadata(&hMetaData->submittedMetaData, nChannels, 0, &hMetaData->metaDataBuffer[i]);
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* Disable meta data.*/
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (hMetaData->metadataMode!=0) && (metadataMode==0) ) {
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->finalizeMetaData = hMetaData->metadataMode;
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize delay. */
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->nAudioDataDelay = -delay;
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->nMetaDataDelay  = nFrames;
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->nChannels       = nChannels;
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->metadataMode    = metadataMode;
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Initialize compressor. */
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (metadataMode != 0) {
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ( FDK_DRC_Generator_Initialize(
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hMetaData->hDrcComp,
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         DRC_NONE,
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         DRC_NONE,
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         frameLength,
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         sampleRate,
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         channelMode,
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         channelOrder,
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         1) != 0)
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          err = METADATA_INIT_ERROR;
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR ProcessCompressor(
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_METADATA                    *pMetadata,
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HDRC_COMP                        hDrcComp,
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT_PCM * const            pSamples,
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                        nSamples
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT dynrng, compr;
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    DRC_PROFILE profileDrc  = convertProfile(pMetadata->mpegDrc.drc_profile);
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    DRC_PROFILE profileComp = convertProfile(pMetadata->etsiAncData.comp_profile);
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (pMetadata==NULL) || (hDrcComp==NULL) ) {
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INVALID_HANDLE;
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return err;
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* first, check if profile is same as last frame
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     * otherwise, update setup */
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (profileDrc != FDK_DRC_Generator_getDrcProfile(hDrcComp))
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      || (profileComp != FDK_DRC_Generator_getCompProfile(hDrcComp)) )
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDK_DRC_Generator_setDrcProfile(hDrcComp, profileDrc, profileComp);
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Sanity check */
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (profileComp == DRC_NONE) {
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pMetadata->etsiAncData.compression_value = 0x80;  /* to ensure no external values will be written if not configured */
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* in case of embedding external values, copy this now (limiter may overwrite them) */
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    dynrng = decodeDynrng(pMetadata->mpegDrc.dyn_rng_ctl[0], pMetadata->mpegDrc.dyn_rng_sgn[0]);
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    compr  = decodeCompr(pMetadata->etsiAncData.compression_value);
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Call compressor */
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (FDK_DRC_Generator_Calc(hDrcComp,
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           pSamples,
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           progreflvl2dialnorm(pMetadata->mpegDrc.prog_ref_level),
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           pMetadata->mpegDrc.drc_TargetRefLevel,
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           pMetadata->etsiAncData.comp_TargetRefLevel,
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           dmxTable[pMetadata->centerMixLevel],
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           dmxTable[pMetadata->surroundMixLevel],
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &dynrng,
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           &compr) != 0)
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_ENCODE_ERROR;
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Write DRC values */
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pMetadata->mpegDrc.drc_band_incr = 0;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    encodeDynrng(dynrng, pMetadata->mpegDrc.dyn_rng_ctl, pMetadata->mpegDrc.dyn_rng_sgn);
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    pMetadata->etsiAncData.compression_value = encodeCompr(compr);
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDK_METADATA_ERROR FDK_MetadataEnc_Process(
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER      hMetaDataEnc,
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM * const                  pAudioSamples,
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                        nAudioSamples,
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_MetaData * const    pMetadata,
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AACENC_EXT_PAYLOAD **            ppMetaDataExtPayload,
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UINT *                           nMetaDataExtensions,
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT *                            matrix_mixdown_idx
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int metaDataDelayWriteIdx, metaDataDelayReadIdx, metadataMode;
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Where to write new meta data info */
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    metaDataDelayWriteIdx = hMetaDataEnc->metaDataDelayIdx;
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* How to write the data */
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    metadataMode = hMetaDataEnc->metadataMode;
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Compensate meta data delay. */
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaDataEnc->metaDataDelayIdx++;
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetaDataEnc->metaDataDelayIdx > hMetaDataEnc->nMetaDataDelay) hMetaDataEnc->metaDataDelayIdx = 0;
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Where to read pending meta data info from. */
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    metaDataDelayReadIdx = hMetaDataEnc->metaDataDelayIdx;
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Submit new data if available. */
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata!=NULL) {
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKmemcpy(&hMetaDataEnc->submittedMetaData, pMetadata, sizeof(AACENC_MetaData));
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Write one additional frame with default configuration of meta data. Ensure defined behaviour on decoder side. */
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hMetaDataEnc->finalizeMetaData!=0) && (hMetaDataEnc->metadataMode==0)) {
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemcpy(&hMetaDataEnc->submittedMetaData, &defaultMetaDataSetup,  sizeof(AACENC_MetaData));
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      metadataMode = hMetaDataEnc->finalizeMetaData;
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hMetaDataEnc->finalizeMetaData = 0;
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Get last submitted data. */
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (err = LoadSubmittedMetadata(
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hMetaDataEnc->submittedMetaData,
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hMetaDataEnc->nChannels,
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         metadataMode,
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx])) != METADATA_OK )
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Calculate compressor if necessary and updata meta data info */
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx].metadataMode != 0) {
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if ( (err = ProcessCompressor(
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx],
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hMetaDataEnc->hDrcComp,
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         pAudioSamples,
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         nAudioSamples)) != METADATA_OK)
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      {
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Get last submitted data again. */
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        LoadSubmittedMetadata(
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hMetaDataEnc->submittedMetaData,
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         hMetaDataEnc->nChannels,
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                         metadataMode,
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx]);
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Convert Meta Data side info to bitstream data. */
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (err = WriteMetadataPayload(hMetaDataEnc, &hMetaDataEnc->metaDataBuffer[metaDataDelayReadIdx])) != METADATA_OK ) {
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goto bail;
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Assign meta data to output */
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *ppMetaDataExtPayload = hMetaDataEnc->exPayload;
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *nMetaDataExtensions  = hMetaDataEnc->nExtensions;
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *matrix_mixdown_idx   = hMetaDataEnc->matrix_mixdown_idx;
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Compensate audio delay, reset err status. */
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    err = CompensateAudioDelay(hMetaDataEnc, pAudioSamples, nAudioSamples);
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR CompensateAudioDelay(
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER hMetaDataEnc,
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM * const             pAudioSamples,
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                   nAudioSamples
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetaDataEnc->nAudioDataDelay) {
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      int i, delaySamples = hMetaDataEnc->nAudioDataDelay*hMetaDataEnc->nChannels;
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i = 0; i < nAudioSamples; i++) {
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT_PCM tmp = pAudioSamples[i];
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAudioSamples[i] = hMetaDataEnc->audioDelayBuffer[hMetaDataEnc->audioDelayIdx];
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaDataEnc->audioDelayBuffer[hMetaDataEnc->audioDelayIdx] = tmp;
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaDataEnc->audioDelayIdx++;
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (hMetaDataEnc->audioDelayIdx >= delaySamples) hMetaDataEnc->audioDelayIdx = 0;
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*-----------------------------------------------------------------------------
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  functionname: WriteMetadataPayload
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  description:  fills anc data and extension payload
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  returns:      Error status
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ------------------------------------------------------------------------------*/
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR WriteMetadataPayload(
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const HANDLE_FDK_METADATA_ENCODER hMetaData,
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA * const        pMetadata
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( (hMetaData==NULL) || (pMetadata==NULL) ) {
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        err = METADATA_INVALID_HANDLE;
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        goto bail;
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->nExtensions = 0;
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hMetaData->matrix_mixdown_idx = -1;
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* AAC-DRC */
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->metadataMode != 0)
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->exPayload[hMetaData->nExtensions].pData               = hMetaData->drcInfoPayload;
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->exPayload[hMetaData->nExtensions].dataType            = EXT_DYNAMIC_RANGE;
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->exPayload[hMetaData->nExtensions].associatedChElement = -1;
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->exPayload[hMetaData->nExtensions].dataSize =
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              WriteDynamicRangeInfoPayload(pMetadata, hMetaData->exPayload[hMetaData->nExtensions].pData);
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hMetaData->nExtensions++;
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* Matrix Mixdown Coefficient in PCE */
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (pMetadata->WritePCEMixDwnIdx) {
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->matrix_mixdown_idx = surmix2matrix_mixdown_idx[pMetadata->surroundMixLevel];
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* ETSI TS 101 154 (DVB) - MPEG4 ancillary_data() */
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (pMetadata->metadataMode == 2) /* MP4_METADATA_MPEG_ETSI */
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->exPayload[hMetaData->nExtensions].pData               = hMetaData->drcDsePayload;
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->exPayload[hMetaData->nExtensions].dataType            = EXT_DATA_ELEMENT;
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->exPayload[hMetaData->nExtensions].associatedChElement = -1;
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->exPayload[hMetaData->nExtensions].dataSize =
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 WriteEtsiAncillaryDataPayload(pMetadata,hMetaData->exPayload[hMetaData->nExtensions].pData);
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            hMetaData->nExtensions++;
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } /* metadataMode == 2 */
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } /* metadataMode != 0 */
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectbail:
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT WriteDynamicRangeInfoPayload(
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA* const pMetadata,
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR* const              pExtensionPayload
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT pce_tag_present = 0;        /* yet fixed setting! */
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    const INT prog_ref_lev_res_bits = 0;
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT i, drc_num_bands = 1;
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_BITSTREAM bsWriter;
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKinitBitStream(&bsWriter, pExtensionPayload, 16, 0, BS_WRITER);
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* dynamic_range_info() */
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, pce_tag_present, 1);                                         /* pce_tag_present */
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pce_tag_present) {
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, 0x0, 4);                                                   /* pce_instance_tag */
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, 0x0, 4);                                                   /* drc_tag_reserved_bits */
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   }
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Exclude channels */
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->mpegDrc.excluded_chns_present) ? 1 : 0, 1);      /* excluded_chns_present*/
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Multiband DRC */
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->mpegDrc.drc_bands_present) ? 1 : 0, 1);          /* drc_bands_present */
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->mpegDrc.drc_bands_present)
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, pMetadata->mpegDrc.drc_band_incr, 4);                      /* drc_band_incr */
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, pMetadata->mpegDrc.drc_interpolation_scheme, 4);           /* drc_interpolation_scheme */
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      drc_num_bands += pMetadata->mpegDrc.drc_band_incr;
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i=0; i<drc_num_bands; i++) {
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FDKwriteBits(&bsWriter, pMetadata->mpegDrc.drc_band_top[i], 8);                  /* drc_band_top */
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Program Reference Level */
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, pMetadata->mpegDrc.prog_ref_level_present, 1);               /* prog_ref_level_present */
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->mpegDrc.prog_ref_level_present)
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, pMetadata->mpegDrc.prog_ref_level, 7);                     /* prog_ref_level */
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, prog_ref_lev_res_bits, 1);                                 /* prog_ref_level_reserved_bits */
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* DRC Values */
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for (i=0; i<drc_num_bands; i++) {
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, (pMetadata->mpegDrc.dyn_rng_sgn[i]) ? 1 : 0, 1);           /* dyn_rng_sgn[ */
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, pMetadata->mpegDrc.dyn_rng_ctl[i], 7);                     /* dyn_rng_ctl */
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* return number of valid bits in extension payload. */
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return FDKgetValidBits(&bsWriter);
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT WriteEtsiAncillaryDataPayload(
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AAC_METADATA* const pMetadata,
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        UCHAR* const              pExtensionPayload
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_BITSTREAM bsWriter;
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKinitBitStream(&bsWriter, pExtensionPayload, 16, 0, BS_WRITER);
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ancillary_data_sync */
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, 0xBC, 8);
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* bs_info */
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, 0x3, 2);                                                     /* mpeg_audio_type */
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, pMetadata->dolbySurroundMode, 2);                            /* dolby_surround_mode */
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, 0x0, 4);                                                     /* reserved */
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* ancillary_data_status */
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, 0, 3);                                                       /* 3 bit Reserved, set to "0" */
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->DmxLvl_On) ? 1 : 0, 1);                          /* downmixing_levels_MPEG4_status */
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, 0, 1);                                                       /* Reserved, set to "0" */
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.compression_on) ? 1 : 0, 1);         /* audio_coding_mode_and_compression status */
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.timecode_coarse_status) ? 1 : 0, 1); /* coarse_grain_timecode_status */
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.timecode_fine_status) ? 1 : 0, 1);   /* fine_grain_timecode_status */
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* downmixing_levels_MPEG4_status */
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->DmxLvl_On) {
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, encodeDmxLvls(pMetadata->centerMixLevel, pMetadata->surroundMixLevel), 8);
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* audio_coding_mode_and_compression_status */
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->etsiAncData.compression_on) {
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, 0x01, 8);                                                  /* audio coding mode */
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, pMetadata->etsiAncData.compression_value, 8);              /* compression value */
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* grain-timecode coarse/fine */
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->etsiAncData.timecode_coarse_status) {
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, 0x0, 16);                                                  /* not yet supported */
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pMetadata->etsiAncData.timecode_fine_status) {
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKwriteBits(&bsWriter, 0x0, 16);                                                  /* not yet supported */
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return FDKgetValidBits(&bsWriter);
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FDK_METADATA_ERROR LoadSubmittedMetadata(
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const AACENC_MetaData * const   hMetadata,
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                       nChannels,
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        const INT                       metadataMode,
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        AAC_METADATA * const            pAacMetaData
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDK_METADATA_ERROR err = METADATA_OK;
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (pAacMetaData==NULL) {
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      err = METADATA_INVALID_HANDLE;
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    else {
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* init struct */
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      FDKmemclear(pAacMetaData, sizeof(AAC_METADATA));
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if (hMetadata!=NULL) {
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* convert data */
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->mpegDrc.drc_profile            = hMetadata->drc_profile;
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->etsiAncData.comp_profile       = hMetadata->comp_profile;
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->mpegDrc.drc_TargetRefLevel     = hMetadata->drc_TargetRefLevel;
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->etsiAncData.comp_TargetRefLevel= hMetadata->comp_TargetRefLevel;
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->mpegDrc.prog_ref_level_present = hMetadata->prog_ref_level_present;
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->mpegDrc.prog_ref_level         = dialnorm2progreflvl(hMetadata->prog_ref_level);
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->centerMixLevel                 = hMetadata->centerMixLevel;
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->surroundMixLevel               = hMetadata->surroundMixLevel;
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->WritePCEMixDwnIdx              = hMetadata->PCE_mixdown_idx_present;
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->DmxLvl_On                      = hMetadata->ETSI_DmxLvl_present;
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->etsiAncData.compression_on = 1;
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (nChannels == 2) {
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pAacMetaData->dolbySurroundMode = hMetadata->dolbySurroundMode;     /* dolby_surround_mode */
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        } else {
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          pAacMetaData->dolbySurroundMode = 0;
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->etsiAncData.timecode_coarse_status = 0; /* not yet supported - attention: Update GetEstMetadataBytesPerFrame() if enable this! */
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->etsiAncData.timecode_fine_status   = 0; /* not yet supported - attention: Update GetEstMetadataBytesPerFrame() if enable this! */
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->metadataMode = metadataMode;
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        pAacMetaData->metadataMode = 0;                      /* there is no configuration available */
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return err;
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT FDK_MetadataEnc_GetDelay(
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        HANDLE_FDK_METADATA_ENCODER hMetadataEnc
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        )
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT delay = 0;
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (hMetadataEnc!=NULL) {
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        delay = hMetadataEnc->nAudioDataDelay;
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return delay;
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
872