--- /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_ */