--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/h263decoder/inc/MPEG4Transcoder.h Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,366 @@
+/*
+* 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 <e32base.h>
+
+#include <vedcommon.h>
+#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__ */
+