diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/mp3aacManipLib/AACGain/src/sbr_codec.cpp --- 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); -}