videoeditorengine/mp3aacManipLib/inc/mstream.h
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/mp3aacManipLib/inc/mstream.h	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,666 @@
+/*
+* 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:
+*
+*/
+
+
+#ifndef MP_STREAM_H_
+#define MP_STREAM_H_
+
+/**************************************************************************
+  External Objects Needed
+  *************************************************************************/
+
+/*-- Project Headers --*/
+#include "nok_bits.h"
+#include "defines.h"
+#include "param.h"
+#include "mp3def.h"
+#include "auddef.h"
+#include <e32base.h>
+
+
+
+/**************************************************************************
+  External Objects Provided
+  *************************************************************************/
+
+/**************************************************************************
+                Common structure definitions for all layers
+  *************************************************************************/
+
+/*
+   Purpose:     Parent structure for error checking.
+   Explanation: The number of bits that are protected varies between different 
+                versions (MPEG-1, MPEG-2). */
+class TCRC_Check
+{
+public:
+  uint8 crc_payload[CRC_MAX_PAYLOAD]; /* Protected bits.         */
+  uint16 bufLen;                       /* Length of 'crc_payload' */
+  int16 crc;                         /* CRC error-check word.   */
+
+};
+
+/*
+   Purpose:     Parent structure for mp1, mp2, and mp3 header.
+   Explanation: - */
+
+class TMPEG_Header
+{
+public:
+  uint32 header; // Header bits. 
+
+};
+
+/*
+   Purpose:     Parent Structure for mp1, mp2, and mp3 frames.
+   Explanation: - */
+class TMPEG_Frame
+{
+public:
+  uint8 *scale_factors;           /* Scale factor of each subband and group. */
+  int16 *quant;                  /* Quantized spectral data for this frame. */
+  int16 *ch_quant[MAX_CHANNELS]; /* Channel pointers.                       */
+
+};
+
+ /*
+   Purpose:     Parent Structure for mp1, mp2, and mp3 buffer.
+   Explanation: - */
+class TMPEG_Buffer
+{
+public:
+  FLOAT *synthesis_buffer[MAX_CHANNELS]; /* Samples for windowing.     */
+  int16 buf_idx[MAX_CHANNELS];           /* Start index for windowing. */
+  int16 dct_idx[MAX_CHANNELS];           /* DCT buffer index.          */
+  FLOAT *reconstructed;                  /* Dequantized samples.       */
+  FLOAT *ch_reconstructed[MAX_CHANNELS]; /* Channel pointers.          */
+
+};
+
+ /*
+   Purpose:     Parent Structure for frame detection.
+   Explanation: - */
+class TSyncInfoMix
+{
+public:
+  int16 sync_length;       /* Length of sync word.                    */
+  int16 sync_word;         /* Synchronization word.                   */
+  int16 sync_mask;         /* Bitmask for sync word detection.        */
+  MIX_SYNC_STATUS sync_status; /* Which layer we supposed to be decoding. */
+
+};
+
+/**************************************************************************
+               Structure definitions applicable only to layer III
+  *************************************************************************/
+/*
+   Purpose:     Parent Structure for layer III Granule Info.
+   Explanation: - */
+class TGranule_Info
+{
+public:
+  uint8 global_gain;
+  uint8 flags;
+  uint8 table_select[3];
+  uint8 subblock_gain[3];
+  uint8 region0_count;
+  uint8 region1_count;
+  int32 part2_3_length;
+  int32 big_values;
+  int32 scalefac_compress;
+  MP3_WINDOW_TYPE block_mode;
+  int16 zero_part_start;
+
+};
+
+/*
+   Purpose:     Parent Structure for layer III Scale Factors.
+   Explanation: - */
+class CIII_Scale_Factors : public CBase
+{
+
+public:
+
+  uint8 *scalefac_long;     /* Scalefactors for long blocks.  */
+  uint8 *scalefac_short[3]; /* Scalefactors for short blocks. */
+
+
+};
+
+/*
+   Purpose:     Parent Structure for layer III Channel Info.
+   Explanation: - */
+class CIII_Channel_Info : public CBase
+{
+public:
+
+  static CIII_Channel_Info* NewL();
+  ~CIII_Channel_Info();
+  TGranule_Info *gr_info[2];     /* Granule info for this channel. */
+  CIII_Scale_Factors *scale_fac; /* Scalefactors for this channel. */
+
+private:
+   void ConstructL();
+   CIII_Channel_Info();
+
+};
+
+/*
+   Purpose:     Structure to hold MPEG-2 IS stereo positions.
+   Explanation: - */
+class TIS_Info
+{
+public:
+  int16 is_len[3];
+  int16 nr_sfb[3];
+
+};
+
+/*
+   Purpose:     Structure to hold scalefactor band tables
+                and related parameters.
+   Explanation: - */
+class CIII_SfbData : public CBase
+{
+public:
+
+  static CIII_SfbData* NewL();
+  ~CIII_SfbData();
+
+  /* Scalefactor band boundaries for long and short blocks. */
+  int16* sfbOffsetLong;
+  int16* sfbOffsetShort;
+
+  /* Scalefactor band widths for short blocks. */
+  int16* sfbWidthShort;
+
+  int16 *sfbLong;  /* Pointer to long sfb offset table.  */
+  int16 *sfbShort; /* Pointer to short sfb offset table. */
+  int16 *sfbWidth; /* Pointer to short sfb width table.  */
+  int16 bandLimit; /* # of spectral bins to be decoded.  */ 
+
+private:
+    void ConstructL();
+    CIII_SfbData();
+
+};
+
+/*
+   Purpose:     Structure to map the file parameters into
+                total length, average bitrate, etc.
+   Explanation: - */
+class TMP_BrInfo
+{
+public:
+  BOOL vbr;          /* TRUE for VBR files, FALSE otherwise.        */
+  BOOL tmp;          /* Used for counting the verage bitrate.       */
+  BOOL true_br;      /* The 'start_br' represents the true bitrate. */
+  BOOL free_br;      /* Free format flag.                           */
+  uint32 cum_br;     /* Cumulative bitrate.                         */
+  uint32 cum_frames; /* Cumulative # of frames.                     */
+  uint16 start_br;   /* Initial and/or average bitrate.             */
+  
+};
+
+/*
+   Purpose:     Parent Structure for Layer III Side Information.
+   Explanation: - */
+class CIII_Side_Info : public CBase
+{
+public:
+
+  static CIII_Side_Info* NewL();
+  ~CIII_Side_Info();
+
+  /*-- Side information read from the bit stream. --*/
+  uint8 private_bits;
+  uint8 scfsi[2][4];
+  int32 main_data_begin;
+  CIII_Channel_Info *ch_info[MAX_CHANNELS];
+
+  /*-- General side information. --*/
+  StereoMode *s_mode_long;    /* Stereo modes for long blocks.               */
+  StereoMode *s_mode_short[3];/* Stereo modes for short blocks.              */
+  
+  int16 max_gr;               /* Number of granules within each stream frame.*/
+  BOOL ms_stereo;             /* MS (Mid/Side) stereo used.                  */
+  BOOL is_stereo;             /* Intensity stereo used.                      */
+  BOOL lsf;                   /* MPEG-2 LSF stream present.                  */
+  BOOL mpeg25;                /* MPEG-2.5 stream present.                    */
+  int16 sb_limit;
+  TIS_Info is_info;
+  CIII_SfbData* sfbData;
+
+private:
+  void ConstructL();
+  CIII_Side_Info();
+
+};
+
+/*
+   Purpose:     Parent Structure for Huffman Decoding.
+   Explanation: This structure can be used if dynamic memory allocation
+                is not available or if memory consumption is important.
+                At worst we have to process the number of codewords equal to
+                the size of the codebook. */
+class CHuffman : public CBase
+{
+public:
+  int16 tree_len;        /* Size of the Huffman tree.                      */
+  int16 linbits;         /* Number of extra bits.                          */
+  const int16 *codeword;       /* Huffman codewords.                             */
+  const int16 *packed_symbols; /* x, y and length of the corresponding codeword. */
+
+};
+
+/*
+   Purpose:     Structure for buffer handling.
+   Explanation: - */
+class CMCUBuf : public CBase
+{
+public:
+
+   static CMCUBuf* NewL(TInt aBufLen);
+  ~CMCUBuf();
+
+  TBitStream *bs;      /* Bitstream parser.                 */
+  uint32 bufOffset;   /* Current file or buffer offset.    */
+  uint32 bufLen;      /* Length of 'mcuBufbits', in bytes. */
+  uint32 writeIdx;    /* Write index of the buffer.        */
+  uint32 readSlots;   /* Bytes read from the buffer.       */
+  uint8 *mcuBufbits;  /* Buffer for the compressed bits.   */
+
+private:
+    
+    void ConstructL(TInt aBufLen);
+    CMCUBuf();
+
+};
+
+/*
+   Purpose:     More definitions for the buffer handling.
+   Explanation: - */
+typedef enum StreamMode
+{
+  IS_UNKNOWN,
+  IS_FILE,
+  IS_STREAM,
+  READ_MODE,
+  WRITE_MODE,
+  APPEND_MODE
+
+} StreamMode;
+
+
+/*
+   Purpose:     Structure implementing ring buffer.
+   Explanation: - */
+class CRingBuffer : public CBase
+{
+public:
+  TBitStream *bs;    /* Bit parser for the 'bitBuffer'.  */
+  uint32 bufLen;    /* Length of 'bitBuffer', in bytes. */
+  uint32 readIdx;   /* Read index.                      */
+  uint8 *bitBuffer; /* Buffer holding encoded data.     */
+
+};
+
+/*
+   Purpose:     Layer 3 bitstream formatter (encoder side).
+                The header+side info and payload are in separate
+        buffers. The output mp3 frames are a combination
+        of these two buffers.
+   Explanation: - */
+class CL3FormatBitstream : public CBase
+{
+public:
+    static CL3FormatBitstream* NewL(uint16 sideInfoEntries, 
+            uint16 sideInfoBytes, uint32 dataBytesBuffer);
+
+
+    ~CL3FormatBitstream();
+
+    void L3FormatBitstreamAddMainDataEntry(uint16 dataBytes);
+    void L3FormatBitstreamAddMainDataBits(uint32 dataBits);
+    uint32 L3WriteOutFrame(uint8 *outBuf);
+  /* Number of bits present in 'frameData'. */
+  uint32 numDataBits;
+
+  /* Number of bytes reserved for payload part of the frame. */
+  uint16 *payloadBytes;
+
+  /* Read index to field 'payloadBytes'. */
+  uint16 payloadReadIdx;
+
+  /* Write index to field 'payloadBytes'. */
+  uint16 payloadWriteIdx;
+
+  /* Number of items in field 'payloadBytes'. */
+  uint16 numPayloads;
+
+  /* Payload data for layer 3 frames. */
+  CRingBuffer *frameData;
+
+
+  /* Number of frames present in 'frameHeader'. */
+  uint32 framesPresent;
+
+  /* Number of bytes reserved for side info per frame (fixed value). */
+  uint16 sideInfoBytes;
+
+  /* Buffer holding header and side info frames. */
+  CRingBuffer *frameHeader;
+  
+private:
+    
+    void ConstructL(uint16 sideInfoEntries, uint16 sideInfoBytes, uint32 dataBytesBuffer);
+    CL3FormatBitstream();
+};
+
+/*
+   Purpose:     Bitrate of the mixer.
+   Explanation: - */
+class TL3BitRate
+{
+public:
+  /*-- Bitrate of mixed stream and index of the rate. --*/
+  uint16 bitRate;
+  uint8 bitRateIdx;
+
+  /*-- Status of padding bit in frame header. --*/
+  uint8 padding;
+  
+  /*-- Number of bytes available for a frame. --*/
+  uint16 frameBytes;
+  
+  /*-- Fractional part of the bytes reserved for each frame. --*/
+  FLOAT frac_SpF;
+  FLOAT slot_lag;
+
+};
+
+class THuffmanData
+{
+public:
+  /* # of bits reserved for 'hufWord'. */
+  uint8 hufBits;
+  /* total # of bits reserved for codeword + sign bits + linbits. */
+  uint8 hufBitsCount;
+  /* Huffman codeword. */
+  uint16 hufWord;
+
+};
+
+/*
+   Purpose:     Huffman table parameters for layer 3.
+   Explanation: - */
+class CHuffmanCodTab : public CBase
+{
+public:
+  uint8 xlen;
+  uint8 ylen;
+  uint8 linbits;
+  uint8 xoffset;
+  uint16 linmax;
+  THuffmanData *hData;
+
+};
+
+/*
+   Purpose:     # of pair and quadruple tables.
+   Explanation: - */
+#define L3HUFPAIRTBLS  (31)
+#define L3HUFFQUADTBLS ( 2)
+
+/*
+   Purpose:     Parent structure to hold layer 3 Huffman 
+                coding parameters.
+   Explanation: - */
+class CL3HuffmanTab : public CBase
+{
+public:
+
+    static CL3HuffmanTab* NewL();
+    ~CL3HuffmanTab();
+
+    THuffmanData *quadTable[L3HUFFQUADTBLS];  // Tables 32 - 33. 
+    CHuffmanCodTab *pairTable[L3HUFPAIRTBLS]; // Tables 1 - 31.  
+
+    CHuffmanCodTab* tree;
+
+private:
+    CL3HuffmanTab();
+    void ConstructL();
+
+};
+
+/*
+   Purpose:     Helper parameters for mp3 mixer.
+   Explanation: - */
+class CL3MixerHelper : public CBase
+{
+public:
+  /*-------- Encoding related parameters. --------*/
+
+  /*-- Scalefactor encoding patterns for LSF streams. --*/
+  uint8 blkNum;
+  uint8 slen[4];
+  uint8 blkTypeNum;
+  int16 numRegions;
+
+  /*-- Huffman tables for layer 3. --*/
+  CL3HuffmanTab *l3Huf;
+  
+  /*-- Bitstream formatter for layer 3 encoder. --*/
+  CL3FormatBitstream *l3bs;
+  
+  /*-- Window sequence of previous frame. --*/
+  MP3_WINDOW_TYPE winTypeOld[MAX_CHANNELS];
+  
+  /*-- Window sequence of previous frame (source stream). --*/
+  uint32 winTypeIdx;
+  MP3_WINDOW_TYPE *winTypeCurrentFrame;
+  MP3_WINDOW_TYPE *winTypePreviousFrame;
+  MP3_WINDOW_TYPE *winTypePrt[MAX_CHANNELS];
+  MP3_WINDOW_TYPE _winTypeOld1[2 * MAX_CHANNELS];
+  MP3_WINDOW_TYPE _winTypeOld2[2 * MAX_CHANNELS];
+
+  /*-- Overlap buffer for MDCT. --*/
+  FLOAT** L3EncOverlapBuf;//[MAX_CHANNELS][MAX_MONO_SAMPLES];
+  FLOAT* L3EncOverlapBufMem;
+
+  /*-- Granule parameters of previous frame. --*/
+  TGranule_Info *grInfoSave[MAX_CHANNELS];
+
+  
+  /*-- Scalefactors of previous frame. --*/
+  CIII_Scale_Factors *scaleFacSave[MAX_CHANNELS];
+
+  /*-- Spectrum limit of previous frame. --*/
+  int16 specBinsPresent;
+
+  /*-- Scalefactor selection information of previous frame. --*/
+  BOOL IsScfsi;
+  uint8 scfsi[2][4];
+  
+  /*-- Number of bits unused (bit reservoir). --*/
+  uint32 bitPool;
+ 
+  /*-- Level adjustment for the spectrum to be mixed. --*/
+  FLOAT mixGain;
+  
+  /*-- Level adjustment for the mixed spectrum. --*/
+  FLOAT overallGain;
+
+  /*-- Level adjustment for the global gain. --*/
+  int16 gainDec;
+
+  /*-- Number of spectral bins to be mixed. --*/
+  int16 mixSpectralBins;
+
+
+  /*-------- Bitrate related parameters. --------*/
+  
+  /*-- Bytes reserved for side info. --*/
+  int16 sideInfoBytes;
+
+  /*-- Bitrate mappings. --*/
+  BOOL needVBR;
+  uint32 brIdx;
+  TL3BitRate *l3br;
+  TL3BitRate *_l3br[2];
+  TL3BitRate l3brLong;
+  TL3BitRate l3brShort;
+  uint32 numFramesLong;
+  uint32 numFramesShort;
+
+  /*-- # of bytes reserved for the payload part of current frame. --*/
+  int16 nSlots;
+  
+  /*-- 'main_data_begin' for next frame. --*/
+  int16 main_data_begin;
+  
+  /*-- Max value of 'main_data_begin'. --*/
+  int16 max_br_value;
+  
+};
+
+
+/*
+   Purpose:     Stream seeking constants.
+   Explanation: - */
+typedef enum StreamPos
+{
+  CURRENT_POS,
+  START_POS,
+  END_POS
+
+} StreamPos;
+
+/*
+   Purpose:     Parameters of core engine.
+   Explanation: - */
+class CMP_Stream : public CBase
+{
+
+public:
+  /*-- Common to all layers. --*/
+  TBitStream *bs;
+  TMPEG_Header *header;
+  TMPEG_Header headerOld;
+  TMPEG_Frame *frame;
+  TMPEG_Buffer *buffer;
+  TSyncInfoMix syncInfo;
+  TMP_BrInfo brInfo;
+  TCRC_Check mp3_crc;
+
+  /*-- Layer III specific parameters. --*/
+  TBitStream *br;
+  CIII_Side_Info *side_info;
+  CHuffman *huffman;
+  FLOAT *spectrum[MAX_CHANNELS][SBLIMIT];
+  uint16 OverlapBufPtr[MAX_CHANNELS];
+  FLOAT OverlapBlck[2][MAX_CHANNELS][MAX_MONO_SAMPLES];
+  /*
+    Purpose:     Indices for reordering the short blocks.
+    Explanation: First row describes the destination and second row 
+                 the source index. */
+  int16 reorder_idx[2][MAX_MONO_SAMPLES];
+  
+  /*-- Common complexity reduction and output stream parameters. --*/
+  Out_Complexity *complex;
+  Out_Param *out_param;
+
+  int16 idx_increment;
+  int16 FreeFormatSlots;
+  int16 PrevSlots;
+  int32 FrameStart;
+  BOOL SkipBr;
+  BOOL WasSeeking;
+  int16 SlotTable[15];
+  int16 FrameTable[15];
+  int32 PrevStreamInfo[2];
+
+  
+};
+
+
+BOOL InitBrInfo(CMP_Stream *mp, TMP_BrInfo *brInfo);
+inline void SetBitrate(CMP_Stream *mp, int16 br)
+{ mp->brInfo.cum_br += br; mp->brInfo.cum_frames++; }
+BOOL CountAveBr(CMP_Stream *mp, TBitStream *bs_mcu, TMP_BrInfo *brInfo);
+void FinishAveBr(TMP_BrInfo *brInfo, BOOL FullCount);
+
+/* Implementations defined in module 'mstream.cpp'. */
+CMP_Stream *GetMP3HandleL(void);
+void ReleaseMP3Decoder(CMP_Stream *mp);
+int32 main_data_slots(CMP_Stream *mp);
+void decode_header(CMP_Stream *mp, TBitStream *bs);
+void  MP3DecPrepareInit(CMP_Stream *mp, Out_Param *out_param, 
+            Out_Complexity *complex, DSP_BYTE *br_buffer, 
+            uint32 br_size);
+void MP3DecCompleteInit(CMP_Stream *mp, int16 *frameBytes);
+
+/* Implementations defined in module 'mp3.cpp'. */
+SEEK_STATUS FreeFormat(CMP_Stream *mp, TBitStream *bs_mcu, 
+               ExecState *execState, int16 *nSlots);
+SEEK_STATUS SeekSync(CMP_Stream *mp, TBitStream *bs_mcu, 
+             ExecState *execState, int16 *frameBytes);
+void ReInitEngine(CMP_Stream *mp);
+void ResetEngine(CMP_Stream *mp);
+MP3_Error DecodeFrame(CMP_Stream *mp, int16 *pcm_sample, int16 idx_increment);
+int16 L3BitReservoir(CMP_Stream *mp);
+
+/* Implementations defined in module 'sfb.cpp'. */
+void III_SfbDataInit(CIII_SfbData *sfbData, TMPEG_Header *header);
+void III_BandLimit(CIII_SfbData *sfbData, uint16 binLimit);
+
+
+/*
+ * Low level implementations for the mp3 engine. 
+ */
+
+/* Implementations defined in module 'layer3.cpp'. */
+BOOL III_get_side_info(CMP_Stream *mp, TBitStream *bs);
+void III_get_scale_factors(CMP_Stream *mp, int16 gr, int16 ch);
+void init_III_reorder(int16 reorder_idx[2][MAX_MONO_SAMPLES],
+              int16 *sfb_table, int16 *sfb_width_table);
+void III_reorder(CMP_Stream *mp, int16 ch, int16 gr);
+
+/* Implementations defined in module 'mp3_q.cpp'. */
+void III_dequantize(CMP_Stream *mp, int16 gr);
+
+/* Implementations defined in module 'stereo.cpp'. */
+void III_stereo_mode(CMP_Stream *mp, int16 gr);
+
+/* Implementations defined in module 'huffman.cpp'. */
+int16 III_huffman_decode(CMP_Stream *mp, int16 gr, int16 ch, int32 part2);
+void
+pairtable(CMP_Stream *mp, int16 section_length, int16 table_num, int16 *quant);
+int16
+quadtable(CMP_Stream *mp, int16 start, int16 part2, int16 table_num, int16 *quant,
+          int16 max_sfb_bins);
+
+void init_huffman(CHuffman *h);
+
+/*-- Include encoder interface. --*/
+#ifdef L3ENC
+//#include "l3enc.h"
+#endif /*-- L3ENC --*/
+
+#endif /* MP_STREAM_H_ */