diff -r 000000000000 -r 951a5db380a0 videoeditorengine/mp3aacManipLib/src/Mp3API.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/mp3aacManipLib/src/Mp3API.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,409 @@ +/* +* 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: +* +*/ + + + +#include "Mp3API.h" +#include "mpif.h" +#include "mpaud.h" +#include "mpheader.h" +#include "mp3tool.h" + + + + +// Exception handler for FLOATS +void handler(TExcType /*aType*/) +{ +#ifndef __WINS__ +// CMp3Mix::WriteL(_L("Exception cought!!!")); +#endif + +} + +//const int16 Kmp3BufSize = 8; + +EXPORT_C CMp3Edit* CMp3Edit::NewL() + { + + CMp3Edit* self = new (ELeave) CMp3Edit(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + + } + +void CMp3Edit::ConstructL() + { + + } + + +EXPORT_C CMp3Edit::~CMp3Edit() + { + + } + +CMp3Edit::CMp3Edit() + { + + } + + +EXPORT_C uint32 +CMp3Edit::FileLengthInMs(TMpTransportHandle *tHandle, int32 fileSize) const + { + return MP_FileLengthInMs(tHandle, fileSize); + } + +EXPORT_C int32 +CMp3Edit::GetSeekOffset(TMpTransportHandle *tHandle, int32 seekPos) const + { + return MP_GetSeekOffset(tHandle, seekPos); + } + +EXPORT_C int32 +CMp3Edit::GetFrameTime(TMpTransportHandle *tHandle) const + { + return MP_GetFrameTime(tHandle); + } + +EXPORT_C void +CMp3Edit::InitTransport(TMpTransportHandle *tHandle) const + { + + mpInitTransport(tHandle); + } + +EXPORT_C int16 +CMp3Edit::SeekSync(TMpTransportHandle *tHandle, uint8 *syncBuf, + uint32 syncBufLen, int16 *readBytes, + int16 *frameBytes, int16 *headerBytes, + uint8 initMode) const + + { + + return MP_SeekSync(tHandle, syncBuf, + syncBufLen, readBytes, + frameBytes, headerBytes, + initMode); + } + +EXPORT_C int16 +CMp3Edit::FreeMode(TMpTransportHandle *tHandle, uint8 *syncBuf, + uint32 syncBufLen, int16 *readBytes, + int16 *frameBytes, int16 *headerBytes) const + { + return MP_FreeMode(tHandle, syncBuf, + syncBufLen, readBytes, + frameBytes, headerBytes); + } + +EXPORT_C int16 +CMp3Edit::EstimateBitrate(TMpTransportHandle *tHandle, uint8 isVbr) const + { + return MP_EstimateBitrate(tHandle, isVbr) ; + + } + + + +/* + * Saves modified 'global_gain' bitstream elements to specified layer I/II/III data buffer. + */ +EXPORT_C void +CMp3Edit::SetMPGlobalGains(TBitStream *bs, uint8 numGains, uint8 *globalGain, uint32 *gainPos) +{ + int16 i; + + /*-- Store the gain element back to bitstream. --*/ + for(i = 0; i < numGains; i++) + { + BsSkipNBits(bs, gainPos[i]); + BsPutBits(bs, 8, globalGain[i]); + } +} + + + +EXPORT_C uint8 +CMp3Edit::GetMPGlobalGains(TBitStream *bs, TMpTransportHandle *tHandle, uint8 *globalGain, uint32 *gainPos) +{ + uint32 bufBitOffset; + uint8 numGains, nVersion, nChannels; + + numGains = 0; + nVersion = (uint8) version(&tHandle->header); + nChannels =(uint8) channels(&tHandle->header); + + bufBitOffset = BsGetBitsRead(bs); + + /*-- Get the gain for each channel and granule. --*/ + switch(nVersion) + { + /*-- MPEG-1. --*/ + case 1: + switch(nChannels) + { + /* + * Mono frame consists of 2 granules. + */ + case 1: + numGains = 2; + + /*-- Left channel, granules 0 and granule 1. --*/ + BsSkipNBits(bs, 0x27); + gainPos[0] = BsGetBitsRead(bs) - bufBitOffset; + globalGain[0] = (uint8) BsGetBits(bs, 8); + BsSkipNBits(bs, 0x33); + gainPos[1] = 0x33; + globalGain[1] = (uint8) BsGetBits(bs, 8); + break; + + /* + * Two channels, 2 granules. + */ + case 2: + numGains = 4; + + /*-- Left and right channel, granule 0. --*/ + BsSkipNBits(bs, 0x29); + gainPos[0] = BsGetBitsRead(bs) - bufBitOffset; + globalGain[0] = (uint8) BsGetBits(bs, 8); + BsSkipNBits(bs, 0x33); + gainPos[1] = 0x33; + globalGain[1] = (uint8) BsGetBits(bs, 8); + + /*-- Left and right channel, granule 1. --*/ + BsSkipNBits(bs, 0x33); + gainPos[2] = 0x33; + globalGain[2] = (uint8) BsGetBits(bs, 8); + BsSkipNBits(bs, 0x33); + gainPos[3] = 0x33; + globalGain[3] = (uint8) BsGetBits(bs, 8); + break; + } + break; + + /*-- MPEG-2 LSF and MPEG-2.5. --*/ + default: + switch(nChannels) + { + /* + * Mono channel, 1 granule. + */ + case 1: + numGains = 1; + BsSkipNBits(bs, 0x1E); + gainPos[0] = BsGetBitsRead(bs) - bufBitOffset; + globalGain[0] = (uint8) BsGetBits(bs, 8); + break; + + /* + * Two channels, 1 granule. + */ + case 2: + numGains = 2; + BsSkipNBits(bs, 0x1F); + gainPos[0] = BsGetBitsRead(bs) - bufBitOffset; + globalGain[0] = (uint8) BsGetBits(bs, 8); + BsSkipNBits(bs, 0x37); + gainPos[1] = 0x37; + globalGain[1] = (uint8) BsGetBits(bs, 8); + break; + } + break; + } + + + return (numGains); +} + +EXPORT_C CMPAudDec* CMPAudDec::NewL() + { + CMPAudDec* self = new (ELeave) CMPAudDec(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + + + } + +CMPAudDec::CMPAudDec() + { + + + } + +EXPORT_C CMPAudDec::~CMPAudDec() + { + + + int16 i; + + /* --Scalefactors. --*/ + if (frame->scale_factors != 0) delete[] frame->scale_factors; + + /*-- Quantized samples. --*/ + if (frame->quant != 0) delete[] frame->quant; + + /*-- Huffman codebooks. --*/ + if (huffman != 0) delete[] huffman; + + /*-- Layer III side info. --*/ + if(side_info) + { + for(i = 0; i < MAX_CHANNELS; i++) + { + int16 j; + + if(side_info->ch_info[i]) + { + if (side_info->ch_info[i]->scale_fac != 0) delete side_info->ch_info[i]->scale_fac; + + for(j = 0; j < 2; j++) + if (side_info->ch_info[i]->gr_info[j] != 0) delete side_info->ch_info[i]->gr_info[j]; + } + if (side_info->ch_info[i] != 0) delete side_info->ch_info[i]; + } + + if (side_info->s_mode_long != 0) delete[] side_info->s_mode_long; + + for(i = 0; i < 3; i++) + if (side_info->s_mode_short[i] != 0) delete[] side_info->s_mode_short[i]; + + if (side_info != 0) delete side_info; + } + + if (frame != 0) delete frame; + if (bitReserv != 0) delete[] bitReserv; + + + + } + +void CMPAudDec::ConstructL() + { + + int16 i, j, groups; + + /*-- Create handle. --*/ + + /*-- Create bit reservoir buffer. --*/ + bitReserv = new (ELeave) uint8[4 * MAX_BITRESER_SIZE]; + ZERO_MEMORY(bitReserv, 4 * MAX_BITRESER_SIZE * sizeof(uint8)); + + BsInit(&br, bitReserv, 4 * MAX_BITRESER_SIZE); + + /*-- Create frame parameters. --*/ + frame = new (ELeave) TMPEG_Frame; + + /*-- Create side info parameters. --*/ + side_info = CIII_Side_Info::NewL(); + + /*-- Create scalefactors. --*/ + frame->scale_factors = new (ELeave) uint8[MAX_CHANNELS * SBLIMIT * 3]; + ZERO_MEMORY(frame->scale_factors, MAX_CHANNELS * SBLIMIT * 3 * sizeof(uint8)); + + + /*-- Create L3 side info. --*/ + for(i = 0; i < MAX_CHANNELS; i++) + { + + side_info->ch_info[i] = CIII_Channel_Info::NewL(); + + for(j = 0; j < 2; j++) + { + side_info->ch_info[i]->gr_info[j] = new (ELeave) TGranule_Info; + + } + } + + side_info->s_mode_long = new (ELeave) StereoMode[22]; + + ZERO_MEMORY(side_info->s_mode_long, 22 * sizeof(StereoMode)); + + for(i = 0; i < 3; i++) + { + side_info->s_mode_short[i] = new (ELeave) StereoMode[13]; //GET_CHUNK(13 * sizeof(StereoMode)); + ZERO_MEMORY(side_info->s_mode_short[i], 13 * sizeof(StereoMode)); + } + + /*-- Initialize scalefactors. --*/ + for(i = j = 0; i < MAX_CHANNELS; i++) + { + uint8 idx[] = {0, 23, 36, 49, 62, 85, 98, 111}; + + CIII_Scale_Factors *scale_fac; + + side_info->ch_info[i]->scale_fac = new (ELeave) CIII_Scale_Factors(); + + scale_fac = side_info->ch_info[i]->scale_fac; + + scale_fac->scalefac_long = frame->scale_factors + idx[j++]; + scale_fac->scalefac_short[0] = frame->scale_factors + idx[j++]; + scale_fac->scalefac_short[1] = frame->scale_factors + idx[j++]; + scale_fac->scalefac_short[2] = frame->scale_factors + idx[j++]; + } + + groups = MAX_MONO_SAMPLES * MAX_CHANNELS; + + /*-- Create buffer for quantized samples. --*/ + frame->quant = new (ELeave) int16[groups + 10];//(int16 *) GET_CHUNK((groups + 10) * sizeof(int16)); + + ZERO_MEMORY(frame->quant, (groups + 10) * sizeof(int16)); + + for(i = 0; i < MAX_CHANNELS; i++) + frame->ch_quant[i] = frame->quant + i * MAX_MONO_SAMPLES; + + /*-- Create Huffman handle. --*/ + huffman = new (ELeave) CHuffman[33];// *) GET_CHUNK(33 * sizeof(CHuffman)); + + /*-- Get the Huffman codebooks. --*/ + InitL3Huffman(huffman); + + } + + /*-- Initializes MPEG Layer I/II/III decoder handle. --*/ +EXPORT_C void +CMPAudDec::Init(TMpTransportHandle *aMpFileFormat) +{ + mpFileFormat = aMpFileFormat; + + /*-- MPEG-1 --*/ + if(version(&mpFileFormat->header) == MPEG_AUDIO_ID) + { + side_info->lsf = FALSE; + side_info->max_gr = 2; + } + + /*-- MPEG-2 LSF or MPEG-2.5 --*/ + else + { + side_info->lsf = TRUE; + side_info->max_gr = 1; + } + + /*-- Get the scalefactor band related parameters. --*/ + III_SfbDataInit(side_info->sfbData, &mpFileFormat->header); +} + + +