diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/h263decoder/inc/MPEG4Transcoder.h --- a/videoeditorengine/h263decoder/inc/MPEG4Transcoder.h Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,366 +0,0 @@ -/* -* 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: -* Definition for CMPEG4Transcoder, a class for MPEG4 transcoder -* working at video packet level or MB level. -* -*/ - - - -#ifndef __VMPEG4TRANSCODER_H__ -#define __VMPEG4TRANSCODER_H__ - - -/* - * Includes (header files are copied from core_mpeg.cpp) - */ -#include - -#include -#include "h263dConfig.h" -#include "vdc263.h" -#include "core.h" -#include "debug.h" -#include "decblock.h" /* for dblFree and dblLoad */ -#include "decvp_mpeg.h" -#include "h263dapi.h" /* for H263D_BC_MUX_MODE_SEPARATE_CHANNEL and H263D_ERD_ */ -#include "vdeimb.h" -#include "viddemux.h" -#include "vdxint.h" -#include "vde.h" -#include "vdemain.h" -#include "biblin.h" -#include "mpegcons.h" -#include "h263dmai.h" -#include "decpich.h" -#include "decmbdct.h" -#include "common.h" -#include "sync.h" -#include "vdcaic.h" -#include "zigzag.h" -#include "debug.h" - -#ifndef VDTASSERT -// An assertion macro wrapper to clean up the code a bit -#define VDTASSERT(x) __ASSERT_DEBUG(x, User::Panic(_L("CMPEG4Transcoder"), EInternalAssertionFailure)) -#endif - - - -/* Get information about video bitstream */ -int vdtGetVideoBitstreamInfo(bibBuffer_t *inBuffer, vdeDecodeParamters_t *aInfoOut, int *aByteIndex, int *aBitIndex); - -/* Finds the error resilience bit in MPEG-4 VOL and change it, if necessary, to make it Regular Resynchronization mode */ -TBool vdtChangeVosHeaderRegResyncL(TPtrC8& aInputBuffer, TUint aBufferSize); - - -#define DefaultTimeIncResolution 3000/1001 - -// unify error codes -#define TX_OK H263D_OK -#define TX_ERR H263D_ERROR - -/* -* CopyEditVop -* -* -* Parameters: -* hInstance instance handle -* -* Function: -* This function copies the VOP header with edited time stamps of the VOP. -* -* Params -* @param hInstance is handle instance itself -* @param aNrBytesToSkip number of bytes to jump over in the beginning of output buffer (e.g. MPEG4 VOS header) -* @param inBuffer is the input buffer -* @param aDecoderInfo structure with decode params -*/ - -int CopyEditVop(vdeHInstance_t hInstance, int aNrOfBytesToSkip, bibBuffer_t * inBuffer, vdeDecodeParamters_t *aDecoderInfo); - - - - -/* -* CopyEditVideoPacket -* -* -* Parameters: -* -* Function: -* This function copies the video packet with edited time stamps, if HEC is enabled -* -* Returns: -* Success or failure -*/ -int CopyEditVideoPacket(bibBuffer_t* inBuffer, - bibBuffer_t* outBuffer, - bibBufferEdit_t* aBufEdit, - vdcInstance_t * vdcTemp, - vdeDecodeParamters_t *aDecoderInfo, - vdxVopHeader_t* vopheader, - int* aSncCode, - int* startByteIndex, - int* startBitIndex); - - - - - -/* - * Classes - */ - -/* General transcoding class - * contains all necessary transcoding information - * accessible from various points in the decoder module - */ -class CMPEG4Transcoder : public CBase -{ -public: - - static CMPEG4Transcoder* NewL (const vdeInstance_t *aVDEInstance, bibBuffer_t *aInBuffer, bibBuffer_t *aOutBuffer); - - /* Destructor */ - ~CMPEG4Transcoder(); - - /* Indicates whether we need to do MPEG4 bitstream transcoding */ - int SetTranscoding(vdeDecodeParamters_t *aDecoderInfo); - - /* Copy the VOP Header to output buffer */ - void VOPHeaderEnded(int aStartByteIndex, int aStartBitIndex, - int aQuant, int aPicType, int aFrameNum, int aVOPNotCoded); - /* One VOP ended */ - void VOPEnded(); - /* Record the position before one video packet is processed */ - void BeginOneVideoPacket(dvpVPInParam_t *aVPin); - /* Record the position before the content of the video packet is processed (called after retreiving the video packet) */ - void AfterVideoPacketHeader(dvpVPInOutParam_t *aVPInfo); - /* Called after one video packet's contents are retrieved */ - void OneVPEnded(); - /* Add one IMB instance for I macroblock */ - void OneIMBDataStartedDataPartitioned(vdxIMBListItem_t *aMBInstance, dlst_t *aMBList, int aCurrMBNumInVP, int aMBNum); - /* Add one PMB instance for P macroblock */ - void OnePMBDataStartedDataPartitioned(vdxPMBListItem_t *aMBInstance, dlst_t *aMBList, int aCurrMBNumInVP, int aMBNum); - /* Records the position of vop_time_increment_resolution bit */ - void MPEG4TimerResolution(int aStartByteIndex, int aStartBitIndex); - /* Creates a new H263 macroblock */ - int ConstructH263MBData(dmdPParam_t *aParam, int aNewMCBPCLen, int aNewMCBPC); - /* Transcode one H263 MB to one MPEG4 MB */ - void H263ToMPEG4MBData(int aNewMCBPCLen, int aNewMCBPC); - /* fills the reconstructed DCAC values for INTRA block */ - void AddOneBlockDCACrecon(int aIndex, int *aDCAC); - /* Record MB parameters before the content of the MB is processed (called after retreiving the MB layer) */ - void AfterMBLayer(int aUpdatedQp); - /* returns first frame QP */ - inline int GetRefQP() { return iRefQuant; } - - - /* returns 1 if we need the decoded frame */ - int NeedDecodedYUVFrame(); - /* Record the position before one MB is processed */ - void BeginOneMB(int aMBNum); - /* Record the position before one block in MB is processed */ - void BeginOneBlock(int aIndex); - /* Start one IMB (called after the MB header is read) */ - void OneIMBDataStarted(vdxIMBListItem_t *aMBInstance); - /* Start one PMB (called after the MB header is read) */ - void OnePMBDataStarted(vdxPMBListItem_t *aMBInstance); - /* Input one block data to current MB */ - void AddOneBlockDataToMB(int aBlockIndex, int *aBlockData); - /* Indicates if escape vlc coding is used in one block */ - void H263EscapeCoding(int aIndex, int fEscapeCodeUsed); - /* Records the position of resnc_marker_disable bit */ - void ErrorResilienceInfo(vdxVolHeader_t *header, int aByte, int aBit); - /* Constructs the VOS header */ - void ConstructVOSHeader(int aMPEG4, vdeDecodeParamters_t *aDecoderInfo); - /* Called after one H263 GOB or slice header is parsed */ - void H263GOBSliceHeaderEnded(vdxGOBHeader_t *aH263GOBHeader, vdxSliceHeader_t *aH263SliceHeader); - /* Called after one H263 picture header is parsed */ - int H263PictureHeaderEnded(dphOutParam_t *aH263PicHeader, dphInOutParam_t *aInfo); - /* Called before one H.63 GOB or slice header is parsed */ - void H263GOBSliceHeaderBegin(); - /* Called after one H263 GOB or Slice ends */ - void H263OneGOBSliceEnded(int nextExpectedMBNum); - /* Called after one GOB (slice) that has GOB header (except the first GOB) ends */ - void H263OneGOBSliceWithHeaderEnded(); - /* Transcodes one macroblock (may include dequantization, requantization, and re-encoding) */ - int TranscodingOneMB(dmdPParam_t *aParam); - -private: - /* Constructors */ - CMPEG4Transcoder(const vdeInstance_t *aVDEInstance, bibBuffer_t *aInBuffer, bibBuffer_t *aOutBuffer); - - /*Constructl to allocate necessary resources*/ - void ConstructL(); - - // main functions to perform transcoding for one macroblock - /* Transcode MB - rearranges data partitioned bitstream data to regular */ - void ConstructRegularMPEG4MBData(int aNewMCBPCLen, int aNewMCBPC); - /* Resets the DCs for U/V blocks in intra MB */ - void ResetMPEG4IntraDcUV(); - /* Recontruct IMB partitions for color effect when we are not doing format transcoding */ - void ReconstructIMBPartitions(); - /* Recontruct PMB partitions for color effect when we are not doing format transcoding */ - void ReconstructPMBPartitions(); - /* Evaluate Chrominance DC Scaler from QP for MPEG4 */ - int GetMpeg4DcScalerUV(int aQP); - /* Evaluate IntraDC Coefficients for U,V blocks for MPEG4 */ - void GetMPEG4IntraDcCoeffUV(TInt aValue, TInt& aSize, TInt& aSizeCode, - TInt& aSizeCodeLength, TInt& aValueCode, TInt& aValueCodeLength); - - - -private: - - /* Output data buffer */ - bibBuffer_t *iOutBuffer; - /* Operation modes */ - TVedVideoBitstreamMode iBitStreamMode; - - /* - When we do mode translation for MPEG4, the target mode may be MPEG4Resyn or H263 - but for H263, when we do mode translation, the target mode is always MPG4Resyn - */ - -/* Member variables */ - - /* Indicates the direction for MPEG4 mode translation */ - int iTargetFormat; - - /* Input data buffer */ - bibBuffer_t *iInBuffer; - - /* Indicates if we need to do transcoding for current MB */ - int iDoTranscoding; - - /* Indicates if we need to do MPEG4 bitstream conversion */ - int iDoModeTranscoding; - - /* Special Effect (Black and White) paramter */ - int iColorEffect; - - /* color tone U,V value parameter */ - TInt iColorToneU; - TInt iColorToneV; - - /* Information we know about this frame and MB */ - - /* current VOP coding type */ - int iVopCodingType; - - /* number of MBs in one VOP */ - int iNumMBsInOneVOP; - - /* indicates if stuffing bits have been used */ - int8 iStuffingBitsUsed; - - - /* Only valid with resync_marker - Information includes: - MB number, quant_scale, StartByteIndex, StartBitIndex ... - */ - /* Contains CurMBNum, quant, frame number, etc */ - dvpVPInOutParam_t *iCurVPInOut; - /* Contains picture type, etc */ - dvpVPInParam_t *iCurVPIn; - /* VOL header */ - vdxVolHeader_t iVOLHeader; - - /* position pointers at different levels */ - int iVPStartByteIndex, iVPStartBitIndex; - int iVPHeaderEndByteIndex, iVPHeaderEndBitIndex; - int iTimeResolutionByteIndex, iTimeResolutionBitIndex; - /* Array to store the DCT data */ - int iDCTBlockData[BLOCK_COEFF_SIZE * 6]; /* YUV components */ - int **iH263DCData; /* Intra DC matrix for H263 -> MPEG4 transcoding */ - - dlst_t *iMBList; - tMBInfo* h263mbi; /* one frame MB information for MPEG4 to H263 transcoding */ - int iPreQuant; /* last QUANT, used in MPEG4 to H263 transcoding */ - - /* used for color toning for MPEG4 */ - u_char *iMBType; /* array indicating MB type for all MBs in VOP */ - int iRefQuant; /* reference QP derived from 1st VOP of MPEG4 */ - int iCurQuant; /* current QP */ - int iDcScaler; /* DC Scaler for iRefQuant */ - - - int *iH263MBVPNum; /* matrix recording the video packet number for each MB */ - - int iShortHeaderEndByteIndex , iShortHeaderEndBitIndex; - - /* iMBStartByteIndex, iMBStartBitIndex also record the postion - right after the VP header when video packet is used - */ - int iMBStartByteIndex, iMBStartBitIndex; - - /* Positions of each block data including INTRA DC if it exists - except for data partioning, in which it only indicates the ACs or DCTs - */ - int iBlockStartByteIndex[6], iBlockStartBitIndex[6]; - int iBlockEndByteIndex[6], iBlockEndBitIndex[6]; - int iErrorResilienceStartByteIndex, iErrorResilienceStartBitIndex; - - /*Added for Time Res 30000 */ - int iOutputMpeg4TimeIncResolution; - - /* Processing data member */ - const vdeInstance_t *iVDEInstance; - - /* Instance for current processing MB */ - vdxIMBListItem_t *iCurIMBinstance; - vdxPMBListItem_t *iCurPMBinstance; - - /* Temporary edit buffer */ - bibBufferEdit_t bufEdit; - - /* Current and last processed MB */ - int iCurMBNum; - - /* Last output MB number */ - int iLastMBNum; - - /* current MB number in current video packet */ - int iCurMBNumInVP; - - /* MB coding type: INTRA or INTER */ - int iMBCodingType; - - /* Specific members only for H.263! */ - int iGOBSliceStartByteIndex; - int iGOBSliceStartBitIndex; - int iGOBSliceHeaderEndByteIndex; - int iGOBSliceHeaderEndBitIndex; - - /* Index of video packet in MPEG4 */ - int iVideoPacketNumInMPEG4; - /* Number of MBs in picture width */ - int iMBsinWidth; - /* Number of MBs in one GOB */ - int iNumMBsInGOB; - /* Indicates if its the first frame */ - unsigned char fFirstFrameInH263; - /* Indicates if escape vlc coding is used */ - int iEscapeCodeUsed[6]; - -}; - - - -#endif /* __VMPEG4TRANSCODER_H__ */ -