diff -r 000000000000 -r 951a5db380a0 videoeditorengine/mp3aacManipLib/inc/mstream.h --- /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 + + + +/************************************************************************** + 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_ */