videoeditorengine/mp3aacManipLib/src/Mp3API.cpp
changeset 0 951a5db380a0
--- /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);
+}
+
+
+