videoeditorengine/mp3aacManipLib/AACGain/src/sbr_codec.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- a/videoeditorengine/mp3aacManipLib/AACGain/src/sbr_codec.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,748 +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:
-*
-*/
-
-
-/*
-  \file
-  \brief SBR codec implementation $Revision: 1.1.1.1.4.1 $
-*/
-
-/**************************************************************************
-  sbr_codec.cpp - SBR codec implementation.
- 
-  Author(s): Juha Ojanpera
-  Copyright (c) 2004 by Nokia Research Center, Multimedia Technologies.
-  *************************************************************************/
-
-/*-- Project Headers. --*/
-#include "sbr_codec.h"
-#include "env_extr.h"
-#include "sbr_rom.h"
-#include "sbr_bitmux.h"
-
-struct SBR_Decoder_Instance
-{
-  SbrFrameData *frameData[2];
-  SbrHeaderData *sbrHeader[2];
-  FreqBandData *freqBandData[2];
-
-  SbrExtensionData *sbrExtData;
-
-};
-
-
-FLOAT 
-FloatFR_logDualis(int16 a) 
-{ 
-  return (logDualisTable[a]); 
-}
-
-FLOAT 
-FloatFR_getNumOctaves(int16 a, int16 b) 
-{
-  return (FloatFR_logDualis(b) - FloatFR_logDualis(a));
-}
-
-int16
-ReadSBRExtensionData(TBitStream *bs, SbrBitStream *streamSBR, 
-                     int16 extension_type, int16 prev_element, 
-                     int16 dataCount)
-{
-  int16 i, sbrPresent;
-
-  sbrPresent = 0;
-  if(!(prev_element == SBR_ID_SCE || prev_element == SBR_ID_CPE))
-    return (sbrPresent);
-
-  if(!(extension_type == SBR_EXTENSION || extension_type == SBR_EXTENSION_CRC))
-    return (sbrPresent);
-
-  if(dataCount < MAX_SBR_BYTES && streamSBR->NrElements < MAX_NR_ELEMENTS)
-  {
-    streamSBR->sbrElement[streamSBR->NrElements].Data[0] = (uint8) BsGetBits(bs, 4);
-
-    for(i = 1; i < dataCount; i++)
-      streamSBR->sbrElement[streamSBR->NrElements].Data[i] = (uint8) BsGetBits(bs, 8);
-
-    streamSBR->sbrElement[streamSBR->NrElements].ExtensionType = extension_type;
-    streamSBR->sbrElement[streamSBR->NrElements].Payload = dataCount;
-    streamSBR->NrElements += 1;
-    sbrPresent = 1;
-  }
-
-  return (sbrPresent);
-}
-
-SbrBitStream *
-CloseSBRBitStream(SbrBitStream *Bitstr)
-{
-  if(Bitstr)
-  {
-    int16 i;
-
-    for(i = 0; i < MAX_NR_ELEMENTS; i++)
-    {
-      if(Bitstr->sbrElement[i].Data != 0)
-        delete[] Bitstr->sbrElement[i].Data;
-      Bitstr->sbrElement[i].Data = NULL;
-    }
-
-    
-    delete Bitstr;
-    Bitstr = NULL;
-  }
-
-  return (NULL);
-}
-
-SbrBitStream *
-OpenSBRBitStreamL(void)
-{
-  int16 i;
-  SbrBitStream *Bitstr;
-
-  /*-- Create SBR bitstream handle. --*/
-  Bitstr = (SbrBitStream *) new (ELeave) SbrBitStream[1];
-  CleanupStack::PushL(Bitstr);
-
-  ZERO_MEMORY(Bitstr, sizeof(SbrBitStream));
-
-  /*-- Create payload handle for each supported element. --*/
-  for(i = 0; i < MAX_NR_ELEMENTS; i++)
-  {
-    Bitstr->sbrElement[i].Data = (uint8 *) new (ELeave) uint8[MAX_SBR_BYTES];
-    CleanupStack::PushL(Bitstr->sbrElement[i].Data);
-
-    ZERO_MEMORY(Bitstr->sbrElement[i].Data, MAX_SBR_BYTES);
-  }
-
-  CleanupStack::Pop(MAX_NR_ELEMENTS + 1); /*-- 'Bitstr->sbrElement[i].Data' + 'Bitstr' --*/
-
-  return (Bitstr);
-}
-
-/*!
-  \brief     Set up SBR decoder
-
-  \return    Handle
-*/
-SBR_Decoder *
-OpenSBRDecoderL(int32 sampleRate, int16 samplesPerFrame, uint8 isStereo, uint8 isDualMono)
-{
-  uint8 nPops;
-  SBR_Decoder *sbrDecoder;
-
-  /*-- Create main handle. --*/
-  sbrDecoder = (SBR_Decoder *) new (ELeave) SBR_Decoder[1];
-  CleanupStack::PushL(sbrDecoder); nPops = 1;
-
-  ZERO_MEMORY(sbrDecoder, sizeof(SBR_Decoder));
-
-  /*-- Create frame data for mono or left channel. --*/
-  sbrDecoder->frameData[0] = (SbrFrameData *) new (ELeave) SbrFrameData[1];
-  CleanupStack::PushL(sbrDecoder->frameData[0]); nPops++;
-
-  ZERO_MEMORY(sbrDecoder->frameData[0], sizeof(SbrFrameData));
-
-  /*-- Create frame data for right channel. --*/
-  if(isStereo)
-  {
-    sbrDecoder->frameData[1] = (SbrFrameData *) new (ELeave) SbrFrameData[1];
-    CleanupStack::PushL(sbrDecoder->frameData[1]); nPops++;
-
-    ZERO_MEMORY(sbrDecoder->frameData[1], sizeof(SbrFrameData));
-  }
-
-  /*-- Create header data. --*/
-  sbrDecoder->sbrHeader[0] = (SbrHeaderData *) new (ELeave) SbrHeaderData[1];
-  CleanupStack::PushL(sbrDecoder->sbrHeader[0]); nPops++;
-
-  ZERO_MEMORY(sbrDecoder->sbrHeader[0], sizeof(SbrHeaderData));
-
-  /*
-   * Create header data for dual channel if so needed. Remember that in
-   * dual channel mode individual channels are not jointly coded,
-   * each channel element is coded separately. Thus, also header data 
-   * can change between frames of the individual channels.
-   */
-  if(isDualMono)
-  {
-    sbrDecoder->sbrHeader[1] = (SbrHeaderData *) new (ELeave) SbrHeaderData[1];
-    CleanupStack::PushL(sbrDecoder->sbrHeader[1]); nPops++;
-
-    ZERO_MEMORY(sbrDecoder->sbrHeader[1], sizeof(SbrHeaderData));
-  }
-
-  /*-- Create frequency band tables for mono or left channel. --*/
-  sbrDecoder->freqBandData[0] = (FreqBandData *) new (ELeave) FreqBandData[1];
-  CleanupStack::PushL(sbrDecoder->freqBandData[0]); nPops++;
-
-  ZERO_MEMORY(sbrDecoder->freqBandData[0], sizeof(FreqBandData));
-
-  /*-- Create frequency band data for dual channel. --*/
-  if(isDualMono)
-  {
-    sbrDecoder->freqBandData[1] = (FreqBandData *) new (ELeave) FreqBandData[1];
-    CleanupStack::PushL(sbrDecoder->freqBandData[1]); nPops++;
-
-    ZERO_MEMORY(sbrDecoder->sbrHeader[1], sizeof(FreqBandData));
-  }
-
-  /*-- Create extension data handle. --*/
-  sbrDecoder->sbrExtData = (SbrExtensionData *) new (ELeave) SbrExtensionData[1];
-  CleanupStack::PushL(sbrDecoder->sbrExtData); nPops++;
-
-  ZERO_MEMORY(sbrDecoder->sbrExtData, sizeof(SbrExtensionData));
-
-  /*
-   * Create data buffer for extension data. Data for parametric stereo 
-   * will be stored here. Can exist only in mono mode.
-   */
-  if(!isStereo && !isDualMono)
-  {
-    sbrDecoder->sbrExtData->extDataBufLen = 128;
-    sbrDecoder->sbrExtData->extensioData = (uint8 *) new (ELeave) uint8[sbrDecoder->sbrExtData->extDataBufLen];
-    CleanupStack::PushL(sbrDecoder->sbrExtData->extensioData); nPops++;
-
-    ZERO_MEMORY(sbrDecoder->sbrExtData->extensioData, sbrDecoder->sbrExtData->extDataBufLen);
-  }
-
-  /*-- Initialize header(s) with default values. --*/
-  initHeaderData(sbrDecoder->sbrHeader[0], sbrDecoder->freqBandData[0], sampleRate, samplesPerFrame);
-  if(isDualMono)
-    initHeaderData(sbrDecoder->sbrHeader[1], sbrDecoder->freqBandData[1], sampleRate, samplesPerFrame);
-
-  CleanupStack::Pop(nPops);
-
-  return (sbrDecoder);
-}
-
-/*!
-  \brief     Close SBR decoder resources
-
-  \return    NULL
-*/
-
-SBR_Decoder *
-CloseSBR(SBR_Decoder *sbrDecoder)
-{
-  if(sbrDecoder)
-  {
-    if(sbrDecoder->frameData[0] != 0)
-      delete sbrDecoder->frameData[0];
-    sbrDecoder->frameData[0] = NULL;
-
-    if(sbrDecoder->frameData[1] != 0)
-      delete sbrDecoder->frameData[1];
-    sbrDecoder->frameData[1] = NULL;
-
-    if(sbrDecoder->sbrHeader[0] != 0)
-      delete sbrDecoder->sbrHeader[0];
-    sbrDecoder->sbrHeader[0] = NULL;
-
-    if(sbrDecoder->sbrHeader[1] != 0)
-      delete sbrDecoder->sbrHeader[1];
-    sbrDecoder->sbrHeader[1] = NULL;
-
-    if(sbrDecoder->freqBandData[0] != 0)
-      delete sbrDecoder->freqBandData[0];
-    sbrDecoder->freqBandData[0] = NULL;
-
-    if(sbrDecoder->freqBandData[1] != 0)
-      delete sbrDecoder->freqBandData[1];
-    sbrDecoder->freqBandData[1] = NULL;
-
-    if(sbrDecoder->sbrExtData != 0)
-    {      
-      if(sbrDecoder->sbrExtData->extensioData != 0)
-        delete[] sbrDecoder->sbrExtData->extensioData;
-      sbrDecoder->sbrExtData->extensioData = NULL;
-     
-      delete sbrDecoder->sbrExtData;
-    }
-    sbrDecoder->sbrExtData = NULL;
-
-    delete sbrDecoder;
-    sbrDecoder = NULL;
-  }
-
-  return (NULL);
-}
-
-int32
-SBR_WritePayload(TBitStream *bs, SbrFrameData *frameData[2], 
-                 SbrHeaderData *hHeaderData, SbrExtensionData *sbrExtData,
-                 uint8 headerStatus, uint8 isStereo, uint8 writeFlag)
-{
-  int32 bitsWritten;
-
-  /*-- Write header flag. --*/
-  bitsWritten = 1;
-  if(writeFlag) BsPutBits(bs, 1, headerStatus);
-
-  /*-- Write header data. --*/
-  if(headerStatus)
-    bitsWritten += SBR_WriteHeaderData(hHeaderData, bs, writeFlag);
-
-  /*-- Write payload data. --*/
-  if(hHeaderData->syncState == SBR_ACTIVE)
-  {
-    if(isStereo)
-      bitsWritten += SBR_WriteCPE(hHeaderData, frameData[0], frameData[1], sbrExtData, bs, writeFlag);
-    else
-      bitsWritten += SBR_WriteSCE(hHeaderData, frameData[0], sbrExtData, bs, 1, writeFlag);
-  }
-
-  return (bitsWritten);
-}
-
-INLINE int32
-WriteSBR(TBitStream *bs, SbrFrameData *frameData[2], SbrHeaderData *hHeaderData, 
-         SbrExtensionData *sbrExtData, uint8 isStereo, uint8 headerPresent, 
-         uint8 writeFlag)
-{
-  int32 bitsWritten;
-
-  bitsWritten = 0;
-
-  /*-- Write extension tag. --*/
-  bitsWritten += 4;
-  if(writeFlag) BsPutBits(bs, 4, SBR_EXTENSION);
-
-  /*-- Write actual SBR payload. --*/
-  bitsWritten += SBR_WritePayload(bs, frameData, hHeaderData, sbrExtData, headerPresent, isStereo, writeFlag);
-
-  /*-- Byte align. --*/
-  if(bitsWritten & 0x7)
-  {
-    uint8 bitsLeft = (uint8) (8 - (bitsWritten & 0x7));
-
-    bitsWritten += bitsLeft;      
-    if(writeFlag) BsPutBits(bs, bitsLeft, 0);
-  }
-
-  return (bitsWritten);
-}
-
-/*
- * Writes dummy payload data.
- */
-INLINE int32 
-WriteDummyPayload(TBitStream *bs, int32 nDummyBytes)
-{
-  int32 i, nBitsWritten;
-
-  nBitsWritten = 4;
-  BsPutBits(bs, 4, 0);
-
-  nBitsWritten += 4;
-  BsPutBits(bs, 4, 0);
-  for(i = 0; i < (nDummyBytes - 1); i++)
-  {
-    nBitsWritten += 8;
-    BsPutBits(bs, 8, 0xA5);
-  }
-
-  return (nBitsWritten);
-}
-
-/*
- * Writes the length of AAC Fill Element (FIL) as specified in the standard.
- */
-INLINE int32 
-WriteAACFilLength(TBitStream *bs, int32 nFilBytes)
-{
-  int32 cnt, nBitsWritten;
-
-  nBitsWritten = 0;
-  cnt = (nFilBytes >= 15) ? 15 : nFilBytes;
-
-  nBitsWritten += 4;
-  BsPutBits(bs, 4, cnt);
-  if(cnt == 15)
-  {
-    int32 diff;
-
-    diff = nFilBytes - 15 + 1;
-
-    nBitsWritten += 8;
-    BsPutBits(bs, 8, diff);
-  }
-
-  return (nBitsWritten);
-}
-
-int32
-WriteSBRExtensionData2(TBitStream *bsOut, SbrFrameData *frameData[2], 
-                       SbrHeaderData *hHeaderData, SbrExtensionData *sbrExtData, 
-                       uint8 isStereo, uint8 headerPresent)
-{
-  int32 bitsWritten, nFilBytes;
-
-  /*-- Write fill element code. --*/
-  BsPutBits(bsOut, 3, 0x6);
-
-  /*-- Count SBR part. --*/
-  bitsWritten = WriteSBR(NULL, frameData, hHeaderData, sbrExtData, isStereo, headerPresent, 0);
-  nFilBytes = bitsWritten >> 3;
-
-  /*-- Write length of FIL element. --*/
-  WriteAACFilLength(bsOut, nFilBytes);
-
-  /*-- Write SBR data. --*/
-  if(nFilBytes > 0)
-  {
-    bitsWritten = WriteSBR(bsOut, frameData, hHeaderData, sbrExtData, isStereo, headerPresent, 1);
-    nFilBytes -= bitsWritten >> 3;
-  }
-
-  /*-- Write dummy data if needed. --*/
-  if(nFilBytes > 0)
-  {
-    /*-- Write fill element code. --*/
-    BsPutBits(bsOut, 3, 0x6);
-
-    /*-- Write length of FIL element. --*/
-    bitsWritten += WriteAACFilLength(bsOut, nFilBytes);
-
-    WriteDummyPayload(bsOut, nFilBytes);
-  }
-
-  return (BsGetBitsRead(bsOut));
-}
-
-int32
-WriteSBRExtensionData(TBitStream *bsIn, TBitStream *bsOut, int16 bitOffset,
-                      SBR_Decoder *sbrDecoder, 
-                      SbrHeaderData *hHeaderData,
-                      uint8 isStereo, 
-                      uint8 headerPresent)
-{
-  int32 bitsWritten; 
-
-  /*-- Locate start position for SBR data within the buffer. --*/
-  BsCopyBits(bsIn, bsOut, bitOffset);
-
-  bitsWritten = BsGetBitsRead(bsOut);
-
-  WriteSBRExtensionData2(bsOut, sbrDecoder->frameData, hHeaderData, sbrDecoder->sbrExtData, isStereo, headerPresent);
-
-  bitsWritten = BsGetBitsRead(bsOut) - bitsWritten;
-
-  return (bitsWritten);
-}
-
-int16
-WriteSBRSilenceElement(SBR_Decoder *sbrDecoder, TBitStream *bsOut, uint8 isStereo)
-{
-  int32 bitsWritten;
-
-  bitsWritten = BsGetBitsRead(bsOut);
-
-  WriteSBRExtensionData2(bsOut, sbrDecoder->frameData, sbrDecoder->sbrHeader[0], sbrDecoder->sbrExtData, isStereo, 1);
-
-  bitsWritten = BsGetBitsRead(bsOut) - bitsWritten;
-
-  return (bitsWritten);
-}
-
-void
-InitSBRSilenceData(SBR_Decoder *sbrDecoder, uint8 isStereo, uint8 isParametricStereo)
-{
-  sbrDecoder->sbrHeader[0]->startFreq = 15;
-  sbrDecoder->sbrHeader[0]->stopFreq = 14;
-
-  sbrDecoder->frameData[0]->frameInfo.nEnvelopes = 1;
-  sbrDecoder->frameData[0]->frameInfo.nNoiseEnvelopes = 1;
-  if(isStereo)
-  {
-    sbrDecoder->frameData[1]->frameInfo.nEnvelopes = 1;
-    sbrDecoder->frameData[1]->frameInfo.nNoiseEnvelopes = 1;
-  }
-
-  sbrDecoder->sbrExtData->writePsData = (uint8) ((isParametricStereo) ? 1 : 0);
-
-  resetFreqBandTables(sbrDecoder->sbrHeader[0]);
-  sbrDecoder->sbrHeader[0]->syncState = SBR_ACTIVE;
-}
-
-int16
-GenerateSBRSilenceDataL(uint8 *OutBuffer, int16 OutBufferSize, int32 sampleRate, 
-                        uint8 isStereo, uint8 isParametricStereo)
-{
-  int16 sbrBits;
-  TBitStream bsOut;
-  SBR_Decoder *sbrDecoder;
-
-  sbrDecoder = OpenSBRDecoderL(sampleRate, 1024, isStereo, 0);
-
-  InitSBRSilenceData(sbrDecoder, isStereo, isParametricStereo);
-
-  BsInit(&bsOut, OutBuffer, OutBufferSize);
-
-  sbrBits = (int16) WriteSBRExtensionData2(&bsOut, sbrDecoder->frameData, sbrDecoder->sbrHeader[0], sbrDecoder->sbrExtData, isStereo, 1);
-
-  return (sbrBits);
-}
-
-int16
-WriteSBRExtensionSilenceData(TBitStream *bsOut, uint8 *SbrBuffer, 
-                             int16 SbrBits, uint8 writeTerminationCode)
-{
-  TBitStream bsSbr;
-  int16 bitsWritten;
-
-  /*-- Initialize bitstream parser. --*/
-  BsInit(&bsSbr, SbrBuffer, (SbrBits + 8) >> 3);
-
-  /*-- Write the silence data. --*/
-  BsCopyBits(&bsSbr, bsOut, SbrBits);
-
-  /*-- Write termination code. --*/
-  if(writeTerminationCode)
-    BsPutBits(bsOut, 3, 0x7);
-
-  bitsWritten = BsGetBitsRead(bsOut);
-
-  if(writeTerminationCode)
-  {
-    /*-- Byte align. --*/
-    if(bitsWritten & 0x7)
-    {
-      int16 bitsLeft = 8 - (bitsWritten & 0x7);
-
-      bitsWritten += bitsLeft;
-      BsPutBits(bsOut, bitsLeft, 0);
-    }
-  }
-
-  return (bitsWritten);
-}
-
-uint8
-ParseSBRPayload(SBR_Decoder *self, SbrHeaderData *hHeaderData, 
-                SbrElementStream *sbrElement, int16 decVal,
-                uint8 isStereo)
-{
-  TBitStream bs;
-
-  /*-- Initialize bitstream. --*/
-  BsInit(&bs, sbrElement->Data, sbrElement->Payload);
-
-  /*-- Remove invalid data from bit buffer. --*/
-  BsGetBits(&bs, 4);
-
-  /*-- CRC codeword present? --*/
-  if(sbrElement->ExtensionType == SBR_EXTENSION_CRC)
-    BsGetBits(&bs, 10);
-
-  /*-- Header present? --*/
-  sbrElement->headerStatus = (uint8) BsGetBits(&bs, 1);
-
-  /*-- Read header data. --*/
-  if(sbrElement->headerStatus) 
-  {
-    SBR_HEADER_STATUS headerStatus;
-    
-    headerStatus = sbrGetHeaderData(hHeaderData, &bs);
-    if(headerStatus == HEADER_RESET) 
-    {
-      int16 err;
-
-      /*-- Reset values. --*/
-      err = resetFreqBandTables(hHeaderData);
-      if(err == 0) hHeaderData->syncState = SBR_ACTIVE;
-    }
-  }
-
-  /*-- Read payload data. --*/
-  if(hHeaderData->syncState == SBR_ACTIVE) 
-  {
-    /*-- Read channel pair element related data. --*/
-    if(isStereo)
-      sbrGetCPE(hHeaderData, self->frameData[0], self->frameData[1], self->sbrExtData, &bs, decVal);
-
-    /*-- Read mono data. --*/
-    else
-      sbrGetSCE(hHeaderData, self->frameData[0], self->sbrExtData, &bs, decVal, 1);
-  }
-
-  return (1);
-}
-
-/*!
-  \brief     SBR bitstream parsing
-
-  \return    Number of bytes written to output bitstream
-*/
-int16
-ParseSBR(TBitStream *bsIn, TBitStream *bsOut, SBR_Decoder *self, 
-         SbrBitStream *Bitstr, int16 decVal)
-{
-  int32 i, bitsWritten = BsGetBitsRead(bsOut);
-
-  /*
-   * Write frame bits from the start of frame till 
-   * the start of 1st channel element. 
-   */
-  BsCopyBits(bsIn, bsOut, Bitstr->sbrElement[0].elementOffset);
-
-  if(Bitstr->NrElements) 
-  {
-    int16 SbrFrameOK, dualMono;
-
-    SbrFrameOK = 1;
-    dualMono = (Bitstr->NrElements == 2) ? 1 : 0;
-
-    for(i = 0; i < Bitstr->NrElements; i++) 
-    {
-      uint8 stereo;
-      SbrElementStream *sbrElement;
-
-      sbrElement = &Bitstr->sbrElement[i];
-      
-      if(sbrElement->Payload < 1)
-        continue;
-
-      stereo = 0;
-
-      switch(sbrElement->ElementID) 
-      {
-        case SBR_ID_SCE:
-          stereo = 0;
-          break;
-
-        case SBR_ID_CPE:
-          stereo = 1;
-          break;
-
-        default:
-          SbrFrameOK = 0;
-          break;
-      }
-
-      if(SbrFrameOK) 
-      {
-        ParseSBRPayload(self, self->sbrHeader[dualMono ? i : 0], sbrElement, decVal, stereo);
-
-        WriteSBRExtensionData(bsIn, bsOut, sbrElement->chElementLen, self,
-                              self->sbrHeader[dualMono ? i : 0],
-                              stereo, sbrElement->headerStatus);
-
-        if(i < (Bitstr->NrElements - 1))
-        {
-          int32 endElement, startNextElement;
-
-          endElement = sbrElement->elementOffset + sbrElement->chElementLen;
-          startNextElement = Bitstr->sbrElement[i + 1].elementOffset;
-
-          BsSkipNBits(bsIn, startNextElement - endElement);
-        }
-      }
-    }
-
-    /*-- Write termination code. --*/
-    BsPutBits(bsOut, 3, 0x7);
-
-    bitsWritten = BsGetBitsRead(bsOut) - bitsWritten;
-
-    /*-- Byte align. --*/
-    if(bitsWritten & 0x7)
-    {
-      uint8 bitsLeft = (uint8) (8 - (bitsWritten & 0x7));
-      
-      bitsWritten += bitsLeft;
-      BsPutBits(bsOut, bitsLeft, 0);
-    }
-  }
-
-  return (int16) (bitsWritten >> 3);
-}
-
-uint8
-IsSBRParametricStereoEnabled(SBR_Decoder *self, SbrBitStream *Bitstr)
-{
-  uint8 isParamStereoPresent;
-
-  isParamStereoPresent = 0;
-
-  if(self && Bitstr->NrElements == 1) 
-  {
-    SbrElementStream *sbrElement;
-
-    sbrElement = &Bitstr->sbrElement[0];
-
-    if(sbrElement->Payload > 0 && sbrElement->ElementID == SBR_ID_SCE)
-    {
-      ParseSBRPayload(self, self->sbrHeader[0], sbrElement, 0, 0);
-
-      if(self->sbrExtData->extensionDataPresent)
-        if(self->sbrExtData->extension_id == SBR_PARAMETRIC_STEREO_ID)
-          isParamStereoPresent = 1;
-    }
-  }
-
-  return (isParamStereoPresent);
-}
-
-uint8
-IsSBREnabled(SbrBitStream *Bitstr)
-{
-  uint8 isSBR;
-
-  isSBR = (Bitstr && Bitstr->NrElements) ? 1 : 0;
-
-  return (isSBR);
-}
-
-int16
-WriteSBRSilence(TBitStream *bsIn, TBitStream *bsOut, SbrBitStream *streamSBR,
-                uint8 *SbrBuffer, int16 SbrBits)
-{
-  int32 i;
-
-  /*
-   * Write frame bits from the start of frame till 
-   * the start of 1st channel element. 
-   */
-  BsCopyBits(bsIn, bsOut, streamSBR->sbrElement[0].elementOffset);
-
-  /*-- Write channel element. --*/
-  BsCopyBits(bsIn, bsOut, streamSBR->sbrElement[0].chElementLen);
-
-  for(i = 0; i < streamSBR->NrElements; i++)
-  {
-    uint8 writeEndCode = (i == (streamSBR->NrElements - 1)) ? 1 : 0;
-
-    WriteSBRExtensionSilenceData(bsOut, SbrBuffer, SbrBits, writeEndCode);
-
-    if(i < (streamSBR->NrElements - 1))
-    {
-      int32 endElement, startNextElement;
-      
-      endElement = streamSBR->sbrElement[i].elementOffset + streamSBR->sbrElement[i].chElementLen;
-      startNextElement = streamSBR->sbrElement[i + 1].elementOffset;
-
-      BsSkipNBits(bsIn, startNextElement - endElement);
-
-      BsCopyBits(bsIn, bsOut, streamSBR->sbrElement[i + 1].chElementLen);
-    }
-  }
-
-  return (int16) (BsGetBitsRead(bsOut) >> 3);
-}