videoeditorengine/mp3aacManipLib/AACGain/src/aacaud.cpp
changeset 9 d87d32eab1a9
parent 0 951a5db380a0
--- a/videoeditorengine/mp3aacManipLib/AACGain/src/aacaud.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,973 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - Initial contribution
-*
-* Contributors:
-* Ixonos Plc
-*
-* Description:
-*
-*/
-
-
-/**************************************************************************
-  aacaud.cpp - High level interface implementations for AAC decoder.
- 
-  Author(s): Juha Ojanpera
-  Copyright (c) 2000-2004 by Nokia Research Center, Speech and Audio Systems.
-  *************************************************************************/
-
-/*-- System Headers. --*/
-#include <math.h>
-
-/*-- Project Headers. --*/
-#include "aacaud.h"
-#include "dec_huf.h"
-#include "tool2.h"
-
-CAACAudDec* CAACAudDec::NewL(int16 aNumCh, int16 aNumCCh)
-    {
-    CAACAudDec* self = new (ELeave) CAACAudDec();
-    CleanupStack::PushL(self);
-    self->ConstructL(aNumCh, aNumCCh);
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-void CAACAudDec::ConstructL(int16 aNumCh, int16 aNumCCh)
-    {
-
-    //----------------->
-
-    int16 i, tmp;
-
-    numCh = aNumCh;
-    numCCh = aNumCCh;
-
-    /*-- Set the limit for the number of decoded audio elements. --*/
-    if(numCh > ChansD - XChansD)
-        numCh = ChansD - XChansD;
-
-    /*-- How many coupling channels are accepted ? --*/
-    if(numCCh > CChansD - XCChansD)
-        numCCh = CChansD - XCChansD;
-
-    /*-- # of channels outputted. --*/
-    numOutCh = numCh;
-
-    /*-- Allocate main channel elements. --*/
-    tmp = (int16) (numCh + XChansD);
-    
-    winInfo = new (ELeave) CWindowInfo*[tmp];
-    tool = new (ELeave) CToolInfo*[tmp];
-
-    windowAmount = tmp;
-
-    for(i = 0; i < tmp; i++)
-        {
-        winInfo[i] = CWindowInfo::NewL();
-        tool[i] = CToolInfo::NewL();
-        }
-
-    /*-- Allocate coupling channel elements. --*/
-    tmp = (int16) (numCCh + XCChansD);
-    ccInfo = new (ELeave) CCInfo*[tmp];
-  
-    for(i = 0; i < tmp; i++)
-        {
-        ccInfo[i] = CCInfo::NewL();
-        }
-
-    /*-- Get spectral codebooks parameters. --*/
-    huf = LoadHuffmanDecTablesL();
-  
-    /*-- Get scalefactor codebook parameters. --*/
-    sf_huf = LoadSfHuffmanTableL();
-
-    mc_info = CMC_Info::NewL();
-  
-    for(i = 0; i < ChansD; i++)
-        {
-        mc_info->ch_info[i].huf = huf;
-        mc_info->ch_info[i].sf_huf = sf_huf;
-        }
-
-    //<------------------
-
-    }
-
-CAACAudDec::CAACAudDec() : tool(0), mc_info(0), ccInfo(0), winInfo(0),
-                           huf(0), sf_huf(0)
-    {
-#ifdef EAACPLUS_DECODER
-    sbrStream = NULL;
-    sbrDecInfo = NULL;
-#endif /*-- EAACPLUS_DECODER --*/
-    }
-
-CAACAudDec::~CAACAudDec()
-    {
-
-    /*-- Allocate main channel elements. --*/
-    TInt tmp = (int16) (numCh + XChansD);
-    TInt i = 0;
-    if (winInfo != 0)
-        {
-        for(i = 0; i < tmp; i++)
-            {
-            if (winInfo[i] != 0) delete winInfo[i];
-            if (tool[i] != 0) delete tool[i];
-            }
-
-        delete[] winInfo;
-        }
-    
-    if (tool != 0) delete[] tool;
-
-
-    /*-- Allocate coupling channel elements. --*/
-    tmp = (int16) (numCCh + XCChansD);
-    
-    if (ccInfo != 0)
-        {
-        for(i = 0; i < tmp; i++)
-            {
-            if (ccInfo[i] != 0) delete ccInfo[i];
-            }
-        }
-
-    if (ccInfo != 0) delete[] ccInfo;
-  
-    CloseHuffmanDecTables(huf); huf = NULL;
-    CloseSfHuffmanTable(sf_huf); sf_huf = NULL;
-
-    if (mc_info != 0) delete mc_info;
-
-
-  sbrStream = CloseSBRBitStream(sbrStream);
-  sbrDecInfo = CloseSBR(sbrDecInfo);
-
-  }
-
-/*
- * Prepares Ch_Info structure for given audio element. The return value is
- * channel index into 'mip->ch_into' structure.
- */
-static INLINE int16
-enter_chn(int16 nch, int16 tag, int16 common_window, CMC_Info *mip)
-{
-  TCh_Info *cip;
-  BOOL parseCh;
-  int16 cidx = 0;
-
-  /*-- Build configuration. --*/
-  if(mip->nch + nch > (mip->maxnCh + 1) || mip->dummyAlways)
-  {
-    parseCh = FALSE;
-    cidx = mip->dummyCh;
-    mip->dummyAlways = TRUE;
-  }
-  else
-  {
-    parseCh = TRUE;
-    cidx = mip->nch;
-    mip->nch = (int16) (mip->nch + nch);
-  }
-
-  if(nch == 1) /*-- SCE. --*/
-  {
-    cip = &mip->ch_info[cidx];
-
-    cip->cpe = 0;
-    cip->ncch = 0;
-    cip->tag = tag;
-    cip->widx = cidx;
-    cip->present = 1;
-    cip->paired_ch = cidx;
-    cip->parseCh = parseCh;
-  }
-  else         /*-- CPE. --*/
-  {
-    /*-- Left. --*/
-    cip = &mip->ch_info[cidx];
-    cip->cpe = 1;
-    cip->ncch = 0;
-    cip->tag = tag;
-    cip->widx = cidx;
-    cip->present = 1;
-    cip->parseCh = parseCh;
-    cip->paired_ch = (int16) (cidx + 1);
-
-    /*-- Right. ---*/
-    cip = &mip->ch_info[cidx + 1];
-    cip->cpe = 1;
-    cip->ncch = 0;
-    cip->tag = tag;
-    cip->present = 1;
-    cip->paired_ch = cidx;
-    cip->parseCh = parseCh;
-    cip->widx = (common_window) ? (int16) cidx : (int16) (cidx + 1);
-  }
-
-  return (cidx);
-}
-
-/*
- * Retrieve appropriate channel index for the program and decoder configuration.
- */
-int16
-ChIndex(int16 nch, int16 tag, int16 wnd, CMC_Info *mip)
-{
-  /*
-   * Channel index to position mapping for 5.1 configuration is :
-   *  0 center
-   *  1 left  front
-   *  2 right front
-   *  3 left surround
-   *  4 right surround
-   *  5 lfe
-   */
-  return (enter_chn(nch, tag, wnd, mip));
-}
-
-/*
- * Given cpe and tag, returns channel index of SCE or left channel in CPE.
- */
-int16
-CCChIndex(CMC_Info *mip, int16 cpe, int16 tag)
-{
-  int16 ch;
-  TCh_Info *cip = &mip->ch_info[0];
-
-  for(ch = 0; ch < mip->nch; ch++, cip++)
-    if(cip->cpe == cpe && cip->tag == tag)
-      return (ch);
-
-  /*
-   * No match, so channel is not in this program. Just parse the channel(s).
-   */
-  cip = &mip->ch_info[mip->dummyCh];
-  cip->cpe = cpe;
-  cip->widx = mip->dummyCh;
-  cip->parseCh = TRUE;
-
-  return (mip->dummyCh);
-}
-
-/* 
- * Checks continuity of configuration from one block to next.
- */
-static INLINE void
-ResetMCInfo(CMC_Info *mip)
-{
-  /*-- Reset channels counts. --*/
-  mip->nch = 0;
-  mip->ncch = 0;
-  mip->dummyAlways = 0;
-}
-
-/*
- * Deletes resources allocated to the specified AAC decoder.
- */
-EXPORT_C CAACAudDec *
-DeleteAACAudDec(CAACAudDec *aac)
-{ 
-  if(aac)
-  {
-    delete (aac);
-    aac = 0;
-  }
-  
-  return (NULL);
-}
-
-/*
- * Creates handle to AAC decoder core. The input parameters are
- * the number of main ('numCh') and coupling ('numCCh') channels 
- * to be supported.
- *
- * Return AAC decoder handle on success, NULL on failure.
- */
-EXPORT_C void
-CreateAACAudDecL(CAACAudDec*& aDecHandle, int16 numCh, int16 numCCh)
-{
-    aDecHandle = CAACAudDec::NewL(numCh, numCCh);
-
-    return;
-}
-
-/*
- * Creates handle to eAAC+ decoder.
- */
-EXPORT_C uint8
-CreateAACPlusAudDecL(CAACAudDec *aDecHandle, int16 sampleRateIdx, uint8 isStereo, uint8 isDualMono)
-{
-
-  int32 sampleRate = AACSampleRate(sampleRateIdx);
-
-  aDecHandle->sbrStream = OpenSBRBitStreamL();
-  aDecHandle->sbrDecInfo = OpenSBRDecoderL(sampleRate, 1024, isStereo, isDualMono);
-
-  return (1);
-
-
-}
-
-/*
- * Prepares AAC core engine for decoding. The input parameters are the 
- * AAC profile ID (or object type in case MPEG-4 AAC) and the sampling 
- * rate index.
- */
-EXPORT_C void
-InitAACAudDec(CAACAudDec *aac, int16 profile, int16 sampleRateIdx, uint8 is960)
-{
-  int16 i, j;
-  CMC_Info *mip;
-  PredType predType;
-
-  mip = aac->mc_info;
-
-  mip->profile = (uint8) profile;
-  mip->sfreq_idx = (uint8) sampleRateIdx;
-  
-  mip->cur_prog = -1;
-  mip->default_config = 1;
-
-  /*
-   * Set channel restrictions so that we know how to handle 
-   * unused channel elements.
-   */
-  mip->maxnCh = aac->numCh;
-  mip->dummyCh = mip->maxnCh;
-  mip->maxnCCh = aac->numCCh;
-  mip->dummyCCh = mip->maxnCCh;
-
-  /*-- Initialize sfb parameters. --*/
-  AACSfbInfoInit(mip->sfbInfo, mip->sfreq_idx, is960);
-
-  ResetAACAudDec(aac);
-
-  /*-- How many bands used for prediction (BWAP or LTP). --*/
-  if(profile == LTP_Object)
-  {
-    predType = LTP_PRED;
-    j = LTP_MAX_PRED_BANDS;
-  }
-  else
-  {
-    j = 0;
-    predType = NO_PRED;
-  }
-  
-  for(i = 0; i < aac->numCh + XChansD; i++)
-  {
-    aac->winInfo[i]->predBands = (uint8) j;
-    aac->winInfo[i]->predType = predType;
-  }
-  for(i = 0; i < aac->numCCh + XCChansD; i++)
-  {
-    aac->ccInfo[i]->winInfo->predBands = (uint8) j;
-    aac->ccInfo[i]->winInfo->predType = predType;
-  }
-
-  aac->samplesPerFrame = (is960) ? (int16) LN2_960 : (int16) LN2;
-}
-
-/*
- * Resets internal members from the specified AAC decoder core.
- */
-EXPORT_C void
-ResetAACAudDec(CAACAudDec *aac)
-{
-  int16 i;
-  CMC_Info *mip;
-  CWindowInfo *winInfo;
-
-  mip = aac->mc_info;
-
-  /*-- Reset some modules. --*/
-  ResetMCInfo(mip);
-
-  /*
-   * Assume that the first window shape is of type Kaiser-Bessel
-   * Derived (KBD). If not, then we use it anyway. The mismatch
-   * in the first frame is not of prime importance.
-   */
-
-  for(i = 0; i < aac->numCh; i++)
-  {    
-    //tool = aac->tool[i];
-    winInfo = aac->winInfo[i];
-
-    winInfo->wshape[0].prev_bk = WS_KBD;
-    winInfo->wshape[1].prev_bk = WS_KBD;
-  }
-
-  for(i = 0; i < aac->numCCh; i++)
-  {
-    //tool = aac->ccInfo[i]->tool;
-
-    aac->ccInfo[i]->winInfo->wshape[0].prev_bk = WS_KBD;
-    aac->ccInfo[i]->winInfo->wshape[1].prev_bk = WS_KBD;
-  }
-}
-
-/*
- * Reads data stream element from the specified bitstream.
- * 
- * Returns # of read bits.
- */
-static INLINE int16
-GetDSE(TBitStream *bs)
-{
-  int16 align_flag, cnt, bitsRead;
-  
-  bitsRead = (int16) BsGetBitsRead(bs);
-  
-  // read tag
-  BsGetBits(bs, LEN_TAG);
-  align_flag = (int16) BsGetBits(bs, LEN_D_ALIGN);
-  cnt = (int16) BsGetBits(bs, LEN_D_CNT);
-
-  if(cnt == (1 << LEN_D_CNT) - 1)
-    cnt = (int16) (cnt + BsGetBits(bs, LEN_D_ESC));
-  
-  if(align_flag) BsByteAlign(bs);
-
-  BsSkipNBits(bs, cnt << 3);
-
-  bitsRead = (int16) (BsGetBitsRead(bs) - bitsRead);
-
-  return (bitsRead);
-}
-
-/*
- * Reads fill element from the bitstream.
- */
-int32
-CAACAudDec::extension_payload(TBitStream *bs, int32 cnt, uint32 prevEleID)
-{  
-  uint8 extType = (uint8) BsGetBits(bs, LEN_EX_TYPE);
-
-  switch(extType)
-  {
-    case EX_FILL_DATA:
-    default:
-      if(sbrStream && !ReadSBRExtensionData(bs, sbrStream, extType, prevEleID, cnt))
-      {
-
-      BsGetBits(bs, LEN_NIBBLE);
-      BsSkipNBits(bs, (cnt - 1) << 3); 
-      break;  
-
-      }
-      else if (!sbrStream)
-      {
-      BsGetBits(bs, LEN_NIBBLE);
-      BsSkipNBits(bs, (cnt - 1) << 3); 
-      break;
-          
-      }
-      
-      
-      
-  }
-
-  return (cnt);
-}
-
-/*
- * Reads fill data from the bitstream.
- */
-void
-CAACAudDec::GetFIL(TBitStream *bs, uint32 prevEleID)
-{
-  int32 cnt;
-  
-  cnt = BsGetBits(bs, LEN_F_CNT);
-  if(cnt == (1 << LEN_F_CNT) - 1)
-    cnt += BsGetBits(bs, LEN_F_ESC) - 1;
-
-  while(cnt > 0)
-    cnt -= extension_payload(bs, cnt, prevEleID);
-}
-
-/*
- * Reads program configuration element from the specified bitstream.
- */
-int16
-GetPCE(TBitStream *bs, TProgConfig *p)
-{
-  int16 i;
-
-  p->pce_present = TRUE;
-  p->tag = (int16) BsGetBits(bs, LEN_TAG);
-  p->profile = (int16) BsGetBits(bs, LEN_PROFILE);
-  p->sample_rate_idx = (int16) BsGetBits(bs, LEN_SAMP_IDX);
-  p->front.num_ele = (int16) BsGetBits(bs, LEN_NUM_ELE);
-  p->side.num_ele = (int16) BsGetBits(bs, LEN_NUM_ELE);
-  p->back.num_ele = (int16) BsGetBits(bs, LEN_NUM_ELE);
-  p->lfe.num_ele = (int16) BsGetBits(bs, LEN_NUM_LFE);
-  p->data.num_ele = (int16) BsGetBits(bs, LEN_NUM_DAT);
-  p->coupling.num_ele = (int16) BsGetBits(bs, LEN_NUM_CCE);
-
-  p->mono_mix.present = (int16) BsGetBits(bs, 1);
-  if(p->mono_mix.present == 1)
-    p->mono_mix.ele_tag = (int16) BsGetBits(bs, LEN_TAG);
-
-  p->stereo_mix.present = (int16) BsGetBits(bs, 1);
-  if(p->stereo_mix.present == 1)
-    p->stereo_mix.ele_tag = (int16) BsGetBits(bs, LEN_TAG);
-
-  p->matrix_mix.present = (int16) BsGetBits(bs, 1);
-  if(p->matrix_mix.present == 1)
-  {
-    p->matrix_mix.ele_tag = (int16) BsGetBits(bs, LEN_MMIX_IDX);
-    p->matrix_mix.pseudo_enab = (int16) BsGetBits(bs, LEN_PSUR_ENAB);
-  }
-
-  for(i = 0; i < p->front.num_ele; i++)
-  {
-    p->front.ele_is_cpe[i] = (int16) BsGetBits(bs, LEN_ELE_IS_CPE);
-    p->front.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  for(i = 0; i < p->side.num_ele; i++)
-  {
-    p->side.ele_is_cpe[i] = (int16) BsGetBits(bs, LEN_ELE_IS_CPE);
-    p->side.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  for(i = 0; i < p->back.num_ele; i++)
-  {
-    p->back.ele_is_cpe[i] = (int16) BsGetBits(bs, LEN_ELE_IS_CPE);
-    p->back.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  for(i = 0; i < p->lfe.num_ele; i++)
-  {
-    p->lfe.ele_is_cpe[i] = 0;
-    p->lfe.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  for(i = 0; i < p->data.num_ele; i++)
-  {
-    p->data.ele_is_cpe[i] = 0;
-    p->data.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  for(i = 0; i < p->coupling.num_ele; i++)
-  {
-    p->coupling.ele_is_cpe[i] = (int16) BsGetBits(bs, LEN_ELE_IS_CPE);
-    p->coupling.ele_tag[i] = (int16) BsGetBits(bs, LEN_TAG);
-  }
-
-  BsByteAlign(bs);
-
-  p->num_comment_bytes = (int16) BsGetBits(bs, LEN_COMMENT_BYTES);
-  BsSkipNBits(bs, p->num_comment_bytes << 3);
-
-  return (p->tag);
-}
-
-/**
- * Saves the start position of the channel element within the AAC frame.
- */
-static void
-SaveSBRChannelElementPos(SbrBitStream *sbrStream, uint32 bitOffset, uint32 ele_id)
-{
-  if(sbrStream->NrElements < MAX_NR_ELEMENTS)
-  {
-    /*-- Save starting position of the channel element. --*/
-    sbrStream->sbrElement[sbrStream->NrElements].elementOffset = bitOffset - 3;  
-    sbrStream->sbrElement[sbrStream->NrElements].ElementID = ele_id;
-  }
-}
-
-/**
- * Saves the length of the channel element within the AAC frame.
- */
-static void
-SaveSBRChannelElementLen(SbrBitStream *sbrStream, uint32 presentPos)
-{
-  if(sbrStream->NrElements < MAX_NR_ELEMENTS)
-  {
-    /*-- Save length of the channel element. --*/
-    sbrStream->sbrElement[sbrStream->NrElements].chElementLen = 
-      presentPos - sbrStream->sbrElement[sbrStream->NrElements].elementOffset;
-  }
-}
-/**************************************************************************
-  Title        : CountAACChunkLength
-
-  Purpose      : Counts the number of bytes reserved for the payload part of
-                 current AAC frame. This functions should only be called if
-                 no other methods exist to determine the payload legth
-                 (e.g., ADIF does not include this kind of information).
-
-  Usage        : y = CountAACChunkLength(bs, aac, bytesInFrame)
-
-  Input        : bs           - input bitstream
-                 aac          - AAC decoder parameters
-  
-  Output       : y            - status of operation
-                 bytesInFrame - # of bytes reserved for this frame
-
-  Author(s)    : Juha Ojanpera
-  *************************************************************************/
-
-EXPORT_C int16
-CountAACChunkLength(TBitStream *bs, CAACAudDec *aac, int16 *bytesInFrame)
-{
-  uint32 bitsRead;
-  int16 frameStatus;
-
-  /*-- Save the status of input bitstream. --*/
-  bitsRead = BsGetBitsRead(bs);
-
-  /*-- Parse the frame. --*/
-  frameStatus = (!GetAACGlobalGains(bs, aac, 15, NULL, NULL)) ? (int16) 0 : (int16) 1;
-  ResetMCInfo(aac->mc_info);
-
-  /*-- Determine the # of bytes for this frame. --*/
-  bitsRead = BsGetBitsRead(bs) - bitsRead;
-  *bytesInFrame = (int16) ((bitsRead >> 3) + ((bitsRead & 0x7) ? 1 : 0));
-
-  return (frameStatus);
-}
-
-/**************************************************************************
-  Title        : GetAACGlobalGains
-
-  Purpose      : Extracts 'global_gain' bitstream elements from the specified
-                 AAC data buffer.
-
-  Usage        : y = GetAACGlobalGains(bs, aac, nBufs, globalGain, globalGainPos)
-
-  Input        : bs            - input bitstream
-                 aac           - AAC decoder handle
-                 nBufs         - # of gain buffers present
-  
-  Output       : y             - # of gain elements extracted
-                 globalGain    - 'global_gain' elements
-                 globalGainPos - position location (in bits) of each gain value.
-                                 This information is used when storing the gain 
-                                 elements back to bitstream.
-
-  Author(s)    : Juha Ojanpera
-  *************************************************************************/
-
-EXPORT_C uint8
-GetAACGlobalGains(TBitStream* bs, CAACAudDec *aac, uint8 nBufs, uint8 *globalGain, uint32 *globalGainPos)
-{
-  uint8 numGains;
-  uint8 loopControl;
-  TProgConfig progCfg;
-  CMC_Info *mip = aac->mc_info;
-  uint32 ele_id, prevEleID, bufBitOffset;
-
-  numGains = 0;
-  loopControl = 0;
-  prevEleID = ID_END;
-  bufBitOffset = BsGetBitsRead(bs);
-
-  /*-- Reset some modules. --*/
-  ResetMCInfo(mip);
-
-  /*-- No SBR elements present by default. --*/
-  if(aac->sbrStream)
-    aac->sbrStream->NrElements = 0;
-
-  /*-- Loop until termination code found. --*/
-  while((ele_id = BsGetBits(bs, LEN_SE_ID)) != ID_END)
-  {
-    int16 parserErr;
-
-    if(loopControl > 64) break;
-
-    /*-- Get audio syntactic element. --*/
-    switch(ele_id)
-    {
-      /*-- Single and lfe channel. --*/
-      case ID_SCE:
-      case ID_LFE:
-        if((numGains + 1) > nBufs) break;
-
-        if(aac->sbrStream)
-          SaveSBRChannelElementPos(aac->sbrStream, BsGetBitsRead(bs) - bufBitOffset, ele_id);
-
-        if(globalGain)
-          parserErr = GetSCEGain(aac, bs, &globalGain[numGains], &globalGainPos[numGains], bufBitOffset);
-        else
-          parserErr = GetSCE(aac, bs, mip, NULL, NULL, 0);
-
-        if(parserErr < 0)
-          goto f_out;
-        numGains += 1;
-
-        if(aac->sbrStream)
-          SaveSBRChannelElementLen(aac->sbrStream, BsGetBitsRead(bs));
-        break;
-
-      /*-- Channel pair element. --*/
-      case ID_CPE:
-        if((numGains + 2) > nBufs) break;
-        if(aac->sbrStream)
-          SaveSBRChannelElementPos(aac->sbrStream, BsGetBitsRead(bs) - bufBitOffset, ele_id);
-
-        if(globalGain)
-          parserErr = GetCPEGain(aac, bs, &globalGain[numGains], &globalGainPos[numGains], bufBitOffset);
-        else
-          parserErr = GetCPE(aac, bs, mip, NULL, NULL, 0);
-
-        if(parserErr < 0)
-          goto f_out;
-        numGains += 2;
-
-        if(aac->sbrStream)
-          SaveSBRChannelElementLen(aac->sbrStream, BsGetBitsRead(bs));
-        break;
-
-      /*-- Coupling channel. --*/
-      case ID_CCE:
-        if(GetCCE(aac, bs, mip, aac->ccInfo) < 0)
-          goto f_out;
-        break;
-
-      /*-- Data element. --*/
-      case ID_DSE:
-        loopControl++;
-        GetDSE(bs);
-        break;
-
-      /*-- Program config element. --*/
-      case ID_PCE:
-        loopControl++;
-        GetPCE(bs, &progCfg);
-        break;
-
-      /*-- Fill element. --*/
-      case ID_FIL:
-        loopControl++;
-        TInt error;
-        TRAP( error, aac->GetFIL(bs, prevEleID) );
-        if (error != KErrNone)
-            goto f_out;
-        break;
-    
-      default:
-        goto f_out;
-    }
-
-    prevEleID = ele_id;
-
-    bufBitOffset = BsGetBitsRead(bs) - bufBitOffset;
-  }
-
-  BsByteAlign(bs);
-
-f_out:
-  
-  return (numGains);
-}
-
-/*
- * Stores 'global_gain' bitstream elements to AAC data buffer.
- */
-INLINE void 
-SetAACGain(TBitStream* bs, uint32 gainPos, uint8 globalGains)
-{  
-  BsSkipNBits(bs, gainPos); 
-  BsPutBits(bs, LEN_SCL_PCM, globalGains); 
-}
-
-/*
- * Saves modified 'global_gain' bitstream elements to specified AAC data buffer.
- */
-EXPORT_C void
-SetAACGlobalGains(TBitStream* bs, uint8 numGains, uint8 *globalGain, uint32 *globalGainPos)
-{
-  int16 i;
-  TBitStream bsIn;
-
-  BsSaveBufState(bs, &bsIn);
-
-  /*-- Store the gain element back to bitstream. --*/ 
-  for(i = 0; i < numGains; i++)
-    SetAACGain(bs, globalGainPos[i], globalGain[i]);
-
-  
-}
-
-/*
- * Retrieves sample rate index corresponding to the specified sample rate.
- */
-INLINE uint8
-GetSampleRateIndex(int32 sampleRate)
-{
-  uint8 sIndex = 0xF;
-
-  switch(sampleRate)
-  {
-    case 96000:
-      sIndex = 0x0;
-      break;
-
-    case 88200:
-      sIndex = 0x1;
-      break;
-
-    case 64000:
-      sIndex = 0x2;
-      break;
-
-    case 48000:
-      sIndex = 0x3;
-      break;
-
-    case 44100:
-      sIndex = 0x4;
-      break;
-
-    case 32000:
-      sIndex = 0x5;
-      break;
-
-    case 24000:
-      sIndex = 0x6;
-      break;
-
-    case 22050:
-      sIndex = 0x7;
-      break;
-
-    case 16000:
-      sIndex = 0x8;
-      break;
-
-    case 12000:
-      sIndex = 0x9;
-      break;
-
-    case 11025:
-      sIndex = 0xa;
-      break;
-
-    case 8000:
-      sIndex = 0xb;
-      break;
-  }
-
-  return (sIndex);
-}
-
-INLINE int16
-WriteGASpecificConfig(TBitStream *bsOut, int16 bitsWritten, int16 frameLen)
-{ 
-  /*-- Frame length flag (1024-point or 960-point MDCT). --*/
-  bitsWritten += 1;
-  BsPutBits(bsOut, 1, (frameLen == LN2) ? 0 : 1);
-  
-  /*-- No core coder. --*/
-  bitsWritten += 1;
-  BsPutBits(bsOut, 1, 0);
-  
-  /*-- No extension flag. --*/
-  bitsWritten += 1;
-  BsPutBits(bsOut, 1, 0);
-  
-  return (bitsWritten);
-}
-
-
-
-EXPORT_C int16
-AACGetMP4ConfigInfo(int32 sampleRate, uint8 profile, uint8 nChannels, 
-                    int16 frameLen, uint8 *pBuf, uint8 nBytesInBuf)
-{
-  TBitStream bsOut;
-  int16 nConfigBytes, bitsWritten;
-
-  BsInit(&bsOut, pBuf, nBytesInBuf);
-
-  /*-- Object type. --*/
-  bitsWritten = 5;
-  BsPutBits(&bsOut, 5, profile + 1);
-
-  /*-- Sample rate index. --*/
-  bitsWritten += 4;
-  BsPutBits(&bsOut, 4, GetSampleRateIndex(sampleRate));
-  if(GetSampleRateIndex(sampleRate) == 0xF)
-  {
-    bitsWritten += 24;
-    BsPutBits(&bsOut, 24, sampleRate);
-  }
-  
-  /*-- # of channels. --*/
-  bitsWritten += 4;
-  BsPutBits(&bsOut, 4, nChannels);
-
-  /*-- Write GA specific info. --*/
-  bitsWritten = WriteGASpecificConfig(&bsOut, bitsWritten, frameLen);
-
-  nConfigBytes = int16 ((bitsWritten & 7) ? (bitsWritten >> 3) + 1 : (bitsWritten >> 3));
-
-  return (nConfigBytes);
-}
-
-/*
- * Saves modified 'global_gain' bitstream elements to specified AAC data buffer.
- */
-EXPORT_C void
-SetAACPlusGlobalGains(TBitStream* bs, TBitStream* bsOut, CAACAudDec *aac, int16 gainChangeValue, 
-                  uint8 numGains, uint8 *globalGain, uint32 *globalGainPos)
-    {
-    int16 i;
-    TBitStream bsIn;
-
-    BsSaveBufState(bs, &bsIn);
-
-    /*-- Store the gain element back to bitstream. --*/ 
-    for(i = 0; i < numGains; i++)
-        {
-        SetAACGain(bs, globalGainPos[i], globalGain[i]);
-        }
-        
-
-    if(aac->sbrStream && aac->sbrDecInfo)
-          {
-    
-        if(aac->sbrStream->NrElements)
-            {
-              ParseSBR(&bsIn, bsOut, aac->sbrDecInfo, aac->sbrStream, gainChangeValue);
-            }
-      
-      
-        }
-
-      }
-
-
-EXPORT_C uint8
-IsAACParametricStereoEnabled(CAACAudDec *aac)
-    {
-
-    return (IsSBRParametricStereoEnabled(aac->sbrDecInfo, aac->sbrStream));
-
-    }
-
-EXPORT_C uint8
-IsAACSBREnabled(CAACAudDec *aac)
-    {
-
-    return (IsSBREnabled(aac->sbrStream));
-
-
-    }