videoeditorengine/h263decoder/src/MPEG4Transcoder.cpp
changeset 9 d87d32eab1a9
parent 0 951a5db380a0
--- a/videoeditorengine/h263decoder/src/MPEG4Transcoder.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4335 +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:  
-* Implementation for MPEG4(H263) video transcoder. Operations may include:
-* 1. Bitstream Copying 
-* 2. BlackAndWhite Effect
-* 3. MPEG4 to VDT_RESYN (Simple profile)
-* 4. H.263 -> MPEG4 (Open Loop structure, no MV refinement)
-* 5. MPEG4 -> H263, partial implemented 
-*
-* We call functions 2~5 as transcoding functions since they involve MB level data processing
-*    
-* Note:
-* When RVLC is used and errors occur during  forward decoding, 
-* We don't do backward transcoding, the rest of the data is discarded, 
-*
-*/
-
-
-
-/* 
-* Includes
-*/
-#include "MPEG4Transcoder.h"
-#include "debug.h"
-
-/* Print macro */
-#ifdef _DEBUG
-#include <e32svr.h>
-#define PRINT(x) RDebug::Print x
-#else
-#define PRINT(x)
-#endif
-
-/* 
-* Defines and Typedefs
-*/
-typedef unsigned int         uint32;
-
-#define EInternalAssertionFailure 1000
-#define VDT_NO_DATA(a, b, c, d) ((a) == (c) && (b) == (d))
-
-const int KDataNotValid = -1; 
-const int KMpeg4VopTimeIncrementResolutionLength = 16; 
-const int KOutputMpeg4TimeIncResolution = 30000;
-const int KShortHeaderMpeg4VosSize = 14; 
-const int KH263ToMpeg4VosSize = 28; 
-
-
-
-/*Bit stream formating*/
-#define WRITE32(op, x) sPutBits((op), 16, ((uint32)(x)) >> 16);       \
-sPutBits((op), 16, (x) & 0x0000ffff)
-
-/* 
-* Constants 
-*/
-#ifdef _DEBUG
-const TUint KInitialBufferSize = 200000; /* MPEG4 Simple Visual Profile (Levels 0,1,2,3) initial frame data buffer size vga support */
-#endif
-                                                                                /* 
-                                                                                * Function Declarations 
-*/
-
-//Static Functions 
-
-static void sStuffBitsH263(bibBuffer_t *outBuffer);
-static TVedVideoBitstreamMode sGetMPEG4Mode(int error_resilience_disable, int dp, int rvlc);
-static int sFindCBP(int *mbdata, int fUseIntraDCVLC);
-
-
-
-void vdtPutInterMBCMT(bibBuffer_t *outBuffer, int coeffStart, int *coeff, int *numTextureBits, int svh);
-void vdtPutIntraMBCMT(bibBuffer_t *outBuffer, int *coeff, int *numTextureBits, int index,  int skipDC, int skipAC);
-void vbmEncodeMVDifferential(int32 mvdx, int32 mvdy, int32 fCode, bibBuffer_t *outBuffer);
-void vbmGetH263IMCBPC(int lDQuant, int vopCodingType, int colorEffect, int cbpy, int& mcbpcVal, int& len);
-void vbmGetH263PMCBPC(int lDQuant, int colorEffect, int cbpy, int& mcbpcVal, int& len);
-tBool vbmMVOutsideBound(tMBPosition *mbPos, tMotionVector* bestMV, tBool halfPixel);
-void vbmMvPrediction(tMBInfo *mbi, int32 mBCnt, tMotionVector *predMV,  int32 mbinWidth);
-void vbmPutInterMB(tMBPosition* mbPos, bibBuffer_t *outBuf, dmdPParam_t *paramMB, tMotionVector *initPred, 
-                                     int32 noOfPredictors, u_int32 vopWidth, u_int32 vopHeight, int32 searchRange, 
-                                     int32 mbNo, int32* numTextureBits, int16 colorEffect, tMBInfo *mbsinfo);
-
-void sPutBits (bibBuffer_t *buf, int numBits, unsigned int value);  //forward decl
-
-/* 
-* Function Definitions 
-*/
-
-/*
-* sStuffBitsH263
-*
-* Parameters: 
-*    outBuffer    output buffer
-*
-* Function:
-*    This function stuffs bits for H.263 format
-* Returns:
-*    None
-* Error codes:
-*    None.
-*
-*/
-static void sStuffBitsH263(bibBuffer_t *outBuffer)
-{
-    const int stuffingBits[8][2] = { {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0}, {7,0}, {0,0} };
-    
-    VDTASSERT(outBuffer->baseAddr);
-    
-    /* find the number of stuffing bits to insert in the output buffer */
-    int bi = outBuffer->bitIndex;
-    int newNumBits = stuffingBits[bi][0]; 
-    int newValue = stuffingBits[bi][1]; 
-    sPutBits(outBuffer, newNumBits, newValue);
-        
-    return;
-}
-
-
-
-/*
-* sGetMPEG4Mode
-*
-* Parameters: 
-*    
-*
-* Function:
-*    This function gets the mode of the MPEG-4 bitstream
-* Returns:
-*    Nothing
-* Error codes:
-*    None.
-*
-*/
-static TVedVideoBitstreamMode sGetMPEG4Mode(int error_resilience_disable, int dp, int rvlc)
-{
-    TVedVideoBitstreamMode mode = EVedVideoBitstreamModeUnknown;
-    int combination = ((!error_resilience_disable) << 2) | (dp << 1) | rvlc;
-    switch (combination)
-    {
-        case 0:
-            mode = EVedVideoBitstreamModeMPEG4Regular;
-            break;
-        case 2:
-            mode = EVedVideoBitstreamModeMPEG4DP;
-            break;
-        case 3:
-            mode = EVedVideoBitstreamModeMPEG4DP_RVLC;
-            break;
-        case 4:
-            mode = EVedVideoBitstreamModeMPEG4Resyn;
-            break;
-        case 6:
-            mode = EVedVideoBitstreamModeMPEG4Resyn_DP;
-            break;
-        case 7:
-            mode = EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC;
-            break;
-        default:
-            mode = EVedVideoBitstreamModeUnknown;
-    }
-    
-    return mode;
-}
-
-
-/* {{-output"vdtGetVideoBitstreamInfo.txt"}} */
-/*
-* sFindCBP
-*
-* Parameters: 
-*    mbdata          Contains the actual MB data to be quantized
-*    fUseIntraDCVLC  ON for INTRA, OFF for INTER
-*
-* Function:
-*    This function finds the coded bit pattern of the MB 
-* Returns:
-*    Coded Block Pattern.
-* Error codes:
-*    None.
-*
-*/
-static int sFindCBP(int *mbdata, int fUseIntraDCVLC)
-{
-    int coeffCnt;
-    int *block;
-    int blkCnt;
-    int cbpFlag = 0;
-    int codedBlockPattern = 0;
-
-    for (blkCnt = 0; blkCnt < 6; blkCnt++)
-    {   
-        cbpFlag = 0;
-        codedBlockPattern <<= 1;
-        block = &mbdata[blkCnt * BLOCK_COEFF_SIZE];
-        for (coeffCnt = fUseIntraDCVLC; coeffCnt < BLOCK_COEFF_SIZE;
-             coeffCnt++)
-             {
-                 if (block[coeffCnt])
-                 {
-                     cbpFlag = 1;
-                     codedBlockPattern |= cbpFlag;
-                     break;
-                 }
-             }
-    }
-    
-    return codedBlockPattern;
-}   
-
-
-
-
-
-
-/* {{-output"sPutBits.txt"}} */
-/*
-* sPutBits
-*
-* Parameters:
-*          outBuf           output buffer
-*           numBits         number of bits to output
-*           value           new value
-*
-* Function:
-*    This function puts some bits to the output buffer
-* Returns:
-*    Nothing.
-* Error codes:
-*    None.
-*
-*/
-void sPutBits (bibBuffer_t *buf, int numBits, unsigned int value)
-{
-    
-    bibEditParams_t edParam;
-    
-    edParam.curNumBits = edParam.newNumBits = numBits;
-    edParam.StartByteIndex = edParam.StartBitIndex = 0; /* used for source buffer only  */
-    edParam.newValue = value;                           /* use value 128, encoded as codeword "1111 1111" = 255 */
-    
-    CopyBufferEdit((bibBuffer_t*)NULL, buf, &edParam, 0); 
-}
-
-
-
-/*
-* GetTimeIncPosition
-*    
-*
-* Parameters:
-*    hInstance                  instance handle
-*
-* Function:
-*    Calculates the time increment position for the current VOP.
-*
-* Returns:
-*    VDX error codes
-*    
-*/
-
-int GetTimeIncPosition(
-   bibBuffer_t *inBuffer,
-   const vdxGetVopHeaderInputParam_t *inpParam,
-   vdxVopHeader_t *header,
-   int * ModuloByteIndex,
-   int * ModuloBitIndex,
-   int * ByteIndex,
-   int * BitIndex,
-   int *bitErrorIndication)
-/* {{-output"vdxGetVopHeader.txt"}} */
-{
-  /* Get VOP header */
-    int ret = vdxGetVopHeader(inBuffer, inpParam, header, 
-        ModuloByteIndex, ModuloBitIndex, ByteIndex, BitIndex,
-        bitErrorIndication);
-    
-    return ret;
-    
-}
-
-
-
-/*
-* CopyEditVop
-*    
-*
-* Parameters:
-*    hInstance                  instance handle
-*
-* Function:
-*    This function copies the VOP header with edited time stamps of the VOP.
-*
-* Returns:
-*    TX error codes
-*/
-
-int CopyEditVop(vdeHInstance_t hInstance, int aNrOfBytesToSkip, bibBuffer_t * inBuffer, 
-                 vdeDecodeParamters_t *aDecoderInfo)
-{
-    PRINT((_L("CopyEditVop() begin")));
-    int StartByteIndex = 0;
-    int StartBitIndex = 7;
-    int16 error;
-    int sncCode;
-    int timeIncByteIndex, timeIncBitIndex;
-    int moduloBaseByteIndex, moduloBaseBitIndex;
-    int vopheaderBitLeft;
-    int numBitChange = 0;
-    int increaseBytes = 0;
-    int stuffingLength = 0;
-
-    tMPEG4TimeParameter * timeStamp = aDecoderInfo->aMPEG4TimeStamp;
-    MPEG4TimeParameter CurNewTimeCode;
-
-    int outTirDecreased = 0;
-    int outputTimeResolution = *aDecoderInfo->aMPEG4TargetTimeResolution;
-    int numOutputTrBits;
-    for (numOutputTrBits = 1; ((outputTimeResolution-1) >> numOutputTrBits) != 0; numOutputTrBits++)
-        {
-        }
-
-    int num_bits;
-    vdxGetVopHeaderInputParam_t inpParam;
-    vdxVopHeader_t vopheader;
-    int bitErrorIndication;
-    vdeInstance_t * vdeTemp = (vdeInstance_t *)hInstance;
-    bibBuffer_t *outBuffer = vdeTemp->outBuffer;
-    bibBufferEdit_t * bufEdit = vdeTemp->bufEdit;
-    
-    int FrameSizeInByte = outBuffer->numBytesRead;
-    bibRewindBits(bibNumberOfFlushedBits(inBuffer),inBuffer,&error);
-    bibRewindBits(bibNumberOfFlushedBits(outBuffer),outBuffer,&error);
-    if ( aNrOfBytesToSkip > 0 )
-        {
-        // VOS header is already in the beginning of the output buffer
-        bibForwardBits(aNrOfBytesToSkip<<3, outBuffer);
-        // need to also skip the VOS header from input
-        }
-    bufEdit->copyMode = CopyWhole; /* CopyWhole - default */
-
-    /* record position */
-    StartByteIndex = inBuffer->numBytesRead;
-    StartBitIndex = inBuffer->bitIndex;
-
-    /* get time increment resolution */
-    vdcInstance_t * vdcTemp = (vdcInstance_t *)(vdeTemp->vdcHInstance);
-    int currentTimeIncResolution = vdcTemp->pictureParam.time_increment_resolution > 0? vdcTemp->pictureParam.time_increment_resolution : outputTimeResolution;
-    inpParam.time_increment_resolution = currentTimeIncResolution;
-
-    /* find the next vop start code */
-    do 
-    {
-        sncCode = sncSeekMPEGStartCode(inBuffer, vdcTemp->pictureParam.fcode_forward, vdcTemp->pictureParam.error_res_disable, 0, &error);
-        bibForwardBits(32,inBuffer); // one start code is found, move on  
-        if(inBuffer->bitsLeft <= 0) 
-        {
-            return TX_ERR;  // did not find any sync code --- vop is corrupted
-        }
-    }
-    while (sncCode != SNC_VOP);
-    bibRewindBits(32,inBuffer, &error);  // go back 
-
-    // if we have VOS header in the input, we are now just after it. If aNrOfBytesToSkip > 0, we should not copy it
-    // however, aNrOfBytesToSkip refers to output buffer, so we should not use it when skipping the input
-    if ( aNrOfBytesToSkip > 0 )
-        {
-        StartByteIndex = inBuffer->numBytesRead;
-        StartBitIndex = inBuffer->bitIndex;
-        }
-
-    /* read vop header */
-    GetTimeIncPosition(inBuffer, &inpParam, &vopheader, 
-        &moduloBaseByteIndex, &moduloBaseBitIndex, &timeIncByteIndex, 
-        &timeIncBitIndex, &bitErrorIndication);
-
-    /* record the header end; */
-    vopheaderBitLeft = inBuffer->bitsLeft;
-
-    /* copy-edit the part from the begin to the end of modulo base */
-    CurNewTimeCode = *timeStamp;
-
-    if (CurNewTimeCode.modulo_time_base != vopheader.time_base_incr)
-    {
-        if (!bufEdit->editParams)
-        {
-            bufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-            if(!bufEdit->editParams)
-            {
-                //Memory not available 
-                return TX_ERR; //indicating error;
-            }
-            else
-            {
-                bufEdit->numChanges = 1;
-            }
-        }
-        bufEdit->copyMode = CopyWithEdit; /* CopyWithEdit */
-        bufEdit->editParams->curNumBits = vopheader.time_base_incr + 1;
-        bufEdit->editParams->newNumBits = CurNewTimeCode.modulo_time_base + 1;
-        bufEdit->editParams->newValue = ((1 << CurNewTimeCode.modulo_time_base) - 1) << 1;
-        bufEdit->editParams->StartByteIndex = moduloBaseByteIndex;
-        bufEdit->editParams->StartBitIndex = moduloBaseBitIndex;
-        numBitChange += bufEdit->editParams->newNumBits - bufEdit->editParams->curNumBits;
-    }
-    else
-    {
-        bufEdit->copyMode = CopyWhole; /* CopyWithEdit */
-    }
-    /* set the end of copy point */
-    bibRewindBits((inBuffer->numBytesRead<<3)+7-inBuffer->bitIndex,inBuffer,&error);
-    bibForwardBits((moduloBaseByteIndex<<3)+7-moduloBaseBitIndex+vopheader.time_base_incr+2, inBuffer);
-      
-    /* copy data */
-    CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
-    StartByteIndex=inBuffer->getIndex;
-    StartBitIndex=inBuffer->bitIndex;
-    bufEdit->copyMode = CopyWhole; /* CopyWhole */
-
-    /* copy and edit until the end of Vop header */
-    if (currentTimeIncResolution != outputTimeResolution /* && volheader.time_increment_resolution != 30 */
-        || vopheader.time_inc != CurNewTimeCode.time_inc)
-    {
-        for (num_bits = 1; ((currentTimeIncResolution-1) >> num_bits) != 0; num_bits++) 
-            {
-            }
-        /* prepare editing position */
-        if (!bufEdit->editParams)
-        {
-            bufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-            if(!bufEdit->editParams)
-            {
-                //Memory not available 
-                return TX_ERR; //indicating error no memory;
-            }
-            else
-            {
-                bufEdit->numChanges = 1;
-            }
-            
-        }
-        bufEdit->copyMode = CopyWithEdit; /* CopyWithEdit */
-        bufEdit->editParams->StartByteIndex = timeIncByteIndex;
-        bufEdit->editParams->StartBitIndex = timeIncBitIndex;
-        bufEdit->editParams->curNumBits = num_bits;
-        bufEdit->editParams->newNumBits = numOutputTrBits;
-        bufEdit->editParams->newValue = vopheader.time_inc;
-
-        /* update time increment */
-        if (vopheader.time_inc != CurNewTimeCode.time_inc)
-        {
-            /*bufEdit->editParams->newValue = (int)(vopheader.time_inc * (float)outputTimeResolution /
-            (float)currentTimeIncResolution + 0.5); //CurNewTimeCode.time_inc;
-            */
-            bufEdit->editParams->newValue = CurNewTimeCode.time_inc;
-        }
-        numBitChange += bufEdit->editParams->newNumBits - bufEdit->editParams->curNumBits;
-    }
-
-    /* set the copy end point to the end of vop header */
-    bibForwardBits(inBuffer->bitsLeft - vopheaderBitLeft, inBuffer);
-
-    /* copy data */
-    CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
-    StartByteIndex=inBuffer->getIndex;
-    StartBitIndex=inBuffer->bitIndex;
-    
-    if ( vdcTemp->pictureParam.error_res_disable && (inBuffer->bitsLeft > 40) )   // 40 as below to avoid negative values below
-        {
-        // there are no VP headers => no need to search for VP start codes => can jump to the end.
-        // 40 = 5 bytes; in the end there is a start code that has 4 bytes
-        bibForwardBits( inBuffer->bitsLeft-40 ,inBuffer);
-        }
-
-    PRINT((_L("CopyEditVop() seek sync")));
-    /* find the next resync marker */
-    sncCode = sncSeekMPEGStartCode(inBuffer, vopheader.fcode_forward, vdcTemp->pictureParam.error_res_disable, 0, &error);
-    if ( sncCode == SNC_NO_SYNC )
-        {
-        PRINT((_L("CopyEditVop() sync NOT found, interrupt the copying and return")));
-        return TX_ERR;
-        }
-    PRINT((_L("CopyEditVop() sync found")));
-
-    /* record next resync position */
-    int resyncBitsLeft = inBuffer->bitsLeft;
-        
-    /* rewind stuffing bits */
-    sncRewindStuffing(inBuffer, &error);        
-    
-    if (!bufEdit->editParams)
-    {
-        bufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-        if(!bufEdit->editParams)
-        {
-            //Memory not available 
-            return TX_ERR; //indicating error no memory;
-        }
-        else
-        {
-            bufEdit->numChanges = 1;
-        }
-    }
-
-    /* record position */
-    bufEdit->editParams->StartByteIndex = inBuffer->getIndex;
-    bufEdit->editParams->StartBitIndex = inBuffer->bitIndex;
-
-    /* calculate new stuffing bits */
-    bufEdit->editParams->curNumBits = inBuffer->bitsLeft - resyncBitsLeft;
-    /* calculate number of bits/bytes changed */
-    if (numBitChange<0)
-    {
-        outTirDecreased = 1;
-        numBitChange = -numBitChange;
-    }
-    int numByteChange = numBitChange >> 3;
-
-    if (outTirDecreased)
-    {
-        increaseBytes -= numByteChange;
-        stuffingLength = bufEdit->editParams->curNumBits + (numBitChange - (numByteChange << 3));
-        if (stuffingLength > 8)
-        {
-            stuffingLength -= 8;
-            increaseBytes --;
-        }
-    }
-    else
-    {
-        increaseBytes += numByteChange;
-        stuffingLength = bufEdit->editParams->curNumBits - (numBitChange - (numByteChange << 3));
-        if (stuffingLength <= 0)
-        {
-            stuffingLength += 8;
-            increaseBytes ++;
-        }
-    }
-        
-    /* adjust the output buffer size */
-    if (increaseBytes != 0)
-    {
-        outBuffer->size += increaseBytes;
-        if (increaseBytes>=0)
-        {
-            outBuffer->bitsLeft += (increaseBytes << 3);
-        }
-        else
-        {
-            outBuffer->bitsLeft -= ((-increaseBytes) << 3);
-        }
-    }
-
-    /* update edit statistics */
-    bufEdit->editParams->newNumBits = stuffingLength;
-    bufEdit->editParams->newValue = stuffingLength>0?(1<<(stuffingLength-1))-1:0;
-    if (stuffingLength != bufEdit->editParams->curNumBits)
-    {
-        bufEdit->copyMode = CopyWithEdit;
-    }
-
-    bibForwardBits(bufEdit->editParams->curNumBits, inBuffer);
-    /* copy data */
-    CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
-    /* record position */
-    StartByteIndex = inBuffer->getIndex;
-    StartBitIndex = inBuffer->bitIndex;
-        
-    do
-    {
-        /* if it is the start of a video packet, copy it with edit */
-        if (sncCode == SNC_VIDPACK )
-        {
-            /* copy video packet with edit */
-            int retVal = CopyEditVideoPacket(inBuffer, outBuffer, bufEdit, vdcTemp, aDecoderInfo, &vopheader, 
-                &sncCode, &StartByteIndex, &StartBitIndex);
-            if(retVal<0)
-            {
-                //error inside function return error
-                return TX_ERR;
-            }
-        }
-        else if (sncCode == SNC_EOB || sncCode == SNC_EOS || sncCode == SNC_GOV)
-        {
-            // since it is EOB, so end of sequence has occurred, so no more data, so exit       
-            break;
-        }
-    } 
-    while(sncCode != SNC_VOP);
-
-    /* copy the rest of bits */
-    if ((int)inBuffer->numBytesRead < FrameSizeInByte)
-    {
-        bufEdit->copyMode = CopyWhole;
-        bibForwardBits((FrameSizeInByte-StartByteIndex)<<3, inBuffer);
-        CopyStream(inBuffer,outBuffer,bufEdit,StartByteIndex,StartBitIndex);
-    }
-
-    PRINT((_L("CopyEditVop() end")));
-    return TX_OK;
-    }
-
-
-/*
-* CopyEditVideoPacket
-*    
-*
-* Parameters:
-*
-* Function:
-*    This function copies the video packet with edited time stamps, if HEC is enabled
-*
-* Returns:
-*    TX error codes
-*/
-
-int CopyEditVideoPacket(bibBuffer_t* aInBuffer, 
-                        bibBuffer_t* aOutBuffer, 
-                        bibBufferEdit_t* aBufEdit, 
-                        vdcInstance_t * aVdcTemp,
-                        vdeDecodeParamters_t* aDecoderInfo, 
-                        vdxVopHeader_t* aVopheader, 
-                        int* aSncCode, 
-                        int* aStartByteIndex, 
-                        int* aStartBitIndex)
-{
-    int16 error = 0;
-    int value = 0;
-    int bitsGot = 0;
-    int num_bits = 0;
-    int *bitErrorIndication = 0;
-    int numOutputTrBits = 0;
-    int resyncMarkerLength = 0;
-    int numMBs = 0;
-    int mbNumberLength = 0;
-    int startByteIndex = *aStartByteIndex;
-    int startBitIndex  = *aStartBitIndex;
-    int currentTimeIncResolution = 0;
-    int outputTimeResolution = 0;
-    MPEG4TimeParameter curNewTimeCode;
-    MPEG4TimeParameter* timeStamp = aDecoderInfo->aMPEG4TimeStamp;
-
-    int numBitChange = 0;
-    int increaseBytes = 0;
-    int stuffingLength = 0;
-    int outTirDecreased = 0;
-
-    currentTimeIncResolution = aVdcTemp->pictureParam.time_increment_resolution > 0? aVdcTemp->pictureParam.time_increment_resolution : 30000;
-    outputTimeResolution = *aDecoderInfo->aMPEG4TargetTimeResolution;
-    for (numOutputTrBits=1; ((outputTimeResolution-1)>>numOutputTrBits)!=0; numOutputTrBits++)
-        {
-        }
-    /* evaluate resync marker length */
-    resyncMarkerLength = (aVopheader->coding_type == 0 ? 17 : 16+aVopheader->fcode_forward);
-    /* evaluate MB number length */
-    numMBs = ((aVdcTemp->pictureParam.lumWidth+15)>>4) * ((aVdcTemp->pictureParam.lumHeight+15)>>4);
-    for (mbNumberLength = 1; ((numMBs-1) >> mbNumberLength) != 0; mbNumberLength++)
-        {
-        }
-
-    value = bibGetBits(resyncMarkerLength, aInBuffer, &bitsGot, bitErrorIndication, &error);    // resync marker
-    value = bibGetBits(mbNumberLength, aInBuffer, &bitsGot, bitErrorIndication, &error);    // mb number
-    value = bibGetBits(5, aInBuffer, &bitsGot, bitErrorIndication, &error); // quant scale
-    value = bibGetBits(1, aInBuffer, &bitsGot, bitErrorIndication, &error); // header extension code
-    
-    /* if HEC enabled, copy edit time increment fields in the video packet */
-    if (value == 1) 
-    {
-        /* copy-edit the part from the begin to the end of modulo base */
-        curNewTimeCode = *timeStamp;
-        
-        if (curNewTimeCode.modulo_time_base != aVopheader->time_base_incr)
-        {
-            if (!aBufEdit->editParams)
-            {
-                aBufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-                if(!aBufEdit->editParams)
-                {
-                    //Memory not available 
-                    return TX_ERR; //indicating error no memory;
-                }
-                else
-                {
-                    aBufEdit->numChanges = 1;
-                }
-            }
-            aBufEdit->copyMode = CopyWithEdit; /* CopyWithEdit */
-            aBufEdit->editParams->curNumBits = aVopheader->time_base_incr + 1;
-            aBufEdit->editParams->newNumBits = curNewTimeCode.modulo_time_base + 1;
-            aBufEdit->editParams->newValue = ((1 << curNewTimeCode.modulo_time_base) - 1) << 1;
-            aBufEdit->editParams->StartByteIndex = aInBuffer->getIndex;
-            aBufEdit->editParams->StartBitIndex = aInBuffer->bitIndex;
-            numBitChange += aBufEdit->editParams->newNumBits - aBufEdit->editParams->curNumBits;
-        } 
-        else
-        {
-            aBufEdit->copyMode = CopyWhole; /* CopyWithEdit */
-        }
-        /* set the end of copy point */
-        bibForwardBits(aVopheader->time_base_incr+2, aInBuffer); // includes one bit for Marker
-        
-        /* copy data */
-        CopyStream(aInBuffer,aOutBuffer,aBufEdit,startByteIndex,startBitIndex);
-        startByteIndex = aInBuffer->getIndex;
-        startBitIndex  = aInBuffer->bitIndex;
-        aBufEdit->copyMode = CopyWhole; /* CopyWhole */
-        
-        /* copy and edit 'time increment' field */
-        if (currentTimeIncResolution != outputTimeResolution /* && volheader.time_increment_resolution != 30 */
-            || aVopheader->time_inc != curNewTimeCode.time_inc)
-        {
-            for (num_bits = 1; ((currentTimeIncResolution-1) >> num_bits) != 0; num_bits++)
-                {
-                }
-            
-            /* prepare editing position */
-            if (!aBufEdit->editParams)
-            {
-                aBufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-                if(!aBufEdit->editParams)
-                {
-                    //Memory not available 
-                    return TX_ERR; //indicating error no memory;
-                }
-                else
-                {
-                    aBufEdit->numChanges = 1;
-                } 
-            } 
-            aBufEdit->copyMode = CopyWithEdit; /* CopyWithEdit */
-            aBufEdit->editParams->StartByteIndex = aInBuffer->getIndex;
-            aBufEdit->editParams->StartBitIndex = aInBuffer->bitIndex;
-            aBufEdit->editParams->curNumBits = num_bits;
-            aBufEdit->editParams->newNumBits = numOutputTrBits;
-            aBufEdit->editParams->newValue = aDecoderInfo->aMPEG4TimeStamp->time_inc;
-    
-            /* move to end position of 'time increment' field */
-            bibForwardBits(num_bits, aInBuffer);    // move to end of 'time increment' field
-            /* update time increment */
-            if (aVopheader->time_inc != curNewTimeCode.time_inc)
-            {
-                aBufEdit->editParams->newValue = curNewTimeCode.time_inc;
-            }
-            numBitChange += aBufEdit->editParams->newNumBits - aBufEdit->editParams->curNumBits;
-        } 
-       
-        /* copy time increment field with edit */
-        CopyStream(aInBuffer,aOutBuffer,aBufEdit,startByteIndex,startBitIndex);
-        startByteIndex=aInBuffer->getIndex;
-        startBitIndex=aInBuffer->bitIndex;
-        
-    }
-
-    /* copy rest of video packet */
-    
-    /* find the next resync marker */
-    *aSncCode = sncSeekMPEGStartCode(aInBuffer, aVopheader->fcode_forward, 0 /* VPs used*/, 0, &error);
-
-    /* record next resync position */
-    int resyncBitsLeft = aInBuffer->bitsLeft;
-        
-    /* rewind stuffing bits */
-    sncRewindStuffing(aInBuffer, &error);       
-        
-    if (!aBufEdit->editParams)
-    {
-        aBufEdit->editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-        if(!aBufEdit->editParams)
-        { 
-            //Memory not available 
-            return TX_ERR; //indicating error no memory;
-        }
-        else
-        {
-            aBufEdit->numChanges = 1;
-        }
-    }
-
-    /* record position */
-    aBufEdit->editParams->StartByteIndex = aInBuffer->getIndex;
-    aBufEdit->editParams->StartBitIndex = aInBuffer->bitIndex;
-        
-    /* calculate new stuffing bits */
-    aBufEdit->editParams->curNumBits = aInBuffer->bitsLeft - resyncBitsLeft;
-
-    /* calculate number of bits/bytes changed */
-    if (numBitChange<0)
-    {
-        outTirDecreased = 1;
-        numBitChange = -numBitChange;
-    }
-    int numByteChange = numBitChange >> 3;
-        
-    /* evaluate change in buffer size */
-    if (outTirDecreased)
-    {
-        increaseBytes -= numByteChange;
-        stuffingLength = aBufEdit->editParams->curNumBits + (numBitChange - (numByteChange << 3));
-        if (stuffingLength > 8)
-        {
-            stuffingLength -= 8;
-            increaseBytes --;
-        }
-    }
-    else
-    {
-        increaseBytes += numByteChange;
-        stuffingLength = aBufEdit->editParams->curNumBits - (numBitChange - (numByteChange << 3));
-        if (stuffingLength <= 0)
-        {
-            stuffingLength += 8;
-            increaseBytes ++;
-        }
-    }
-        
-    /* adjust the output buffer size */
-    if (increaseBytes != 0)
-    {
-        aOutBuffer->size += increaseBytes;
-        if (increaseBytes>=0)
-        {
-            aOutBuffer->bitsLeft += (increaseBytes << 3);
-        }
-        else
-        {
-            aOutBuffer->bitsLeft -= ((-increaseBytes) << 3);
-        }
-    }
-    /* update edit statistics */
-    aBufEdit->editParams->newNumBits = stuffingLength;
-    aBufEdit->editParams->newValue = stuffingLength>0?(1<<(stuffingLength-1))-1:0;
-    if (stuffingLength != aBufEdit->editParams->curNumBits)
-    {
-        aBufEdit->copyMode = CopyWithEdit; // copy with edit
-    }
-    else 
-    {
-        aBufEdit->copyMode = CopyWhole; // copy whole 
-    }
-        
-    bibForwardBits(aBufEdit->editParams->curNumBits, aInBuffer);
-    /* copy video packet with stuffing bits edited */
-    CopyStream(aInBuffer, aOutBuffer, aBufEdit, startByteIndex, startBitIndex);
-    /* record position */
-    startByteIndex = aInBuffer->getIndex;
-    startBitIndex  = aInBuffer->bitIndex;
-        
-    /* update position for return */
-    *aStartByteIndex = startByteIndex;
-    *aStartBitIndex  = startBitIndex;
-
-    return TX_OK;
-}
-
-
-/*
-* sPutBits
-*
-* Parameters:
-*      outBuf           output buffer
-*           numBits         number of bits to output
-*           value           new value
-*
-* Function:
-*    Wrapper to sPutBits
-* Returns:
-*    None.
-* Error codes:
-*    None.
-*
-*/
-void vdtPutBits (void *buf,  int numBits, unsigned int value)
-{
-    /* must be in this type! "void" is used here only because of the interface with vlb.cpp */
-    sPutBits ((bibBuffer_t *)(buf),  numBits, value);
-}
-
-
-
-/* {{-output"vdtCopyBuffer.txt"}} */
-/*
-* vdtCopyBuffer
-*
-* Parameters:
-*
-* Function:
-*    This function copies some data from source buffer to destination buffer
-* Returns:
-*    None.
-* Error codes:
-*    None.
-*
-*/
-void vdtCopyBuffer(bibBuffer_t *SrcBuffer,bibBuffer_t *DestBuffer,
-                                     int ByteStart,int BitStart, int ByteEnd, int BitEnd)
-{
-    int startByteIndex = SrcBuffer->getIndex;
-    int startBitIndex  = SrcBuffer->bitIndex;
-    int bitsLeft = SrcBuffer->bitsLeft;
-    int numBytesRead = SrcBuffer->numBytesRead;
-    
-    CopyBuffer(SrcBuffer,DestBuffer, ByteStart, BitStart, ByteEnd, BitEnd);
-    
-    /* recover the postion */
-    SrcBuffer->getIndex = startByteIndex ;
-    SrcBuffer->bitIndex = startBitIndex;
-    SrcBuffer->bitsLeft = bitsLeft;
-    SrcBuffer->numBytesRead = numBytesRead;
-}
-
-
-
-
-/* {{-output"vdtStuffBitsMPEG4.txt"}} */
-/*
-* vdtStuffBitsMPEG4
-*
-* Parameters:
-*          outBuf           output buffer
-*
-* Function:
-*    This function puts some stuffing bits to the output buffer
-*   bits need to be stuffed in the output buffer at the end of vp in all cases (bw or not)
-* Returns:
-*    None.
-* Error codes:
-*    None.
-*
-*/
-void vdtStuffBitsMPEG4(bibBuffer_t *outBuffer)
-{
-    const int stuffingBits[8][2] = { {1,0}, {2,1}, {3,3}, {4,7}, {5,15}, {6,31}, {7,63}, {8,127} };
-  VDTASSERT(outBuffer->baseAddr);
-    
-    /* find the number of stuffing bits to insert in the output buffer */
-    int bi = outBuffer->bitIndex;
-    int newNumBits = stuffingBits[bi][0]; 
-    int newValue = stuffingBits[bi][1]; 
-    sPutBits(outBuffer, newNumBits, newValue);
-        
-    return;
-}
-
-
-/*************************************************************/
-
-
-/* {{-output"sResetH263IntraDcUV.txt"}} */
-/*
-* sResetH263IntraDcUV
-*
-* Parameters: output buffer
-*             uValue
-*             vValue
-*
-* Function:
-*    This function reset the chrominace INTRADC when black and white color effect is applied 
-* Returns:
-*    none
-* Error codes:
-*    None.
-*
-*/
-inline void sResetH263IntraDcUV(bibBuffer_t *DestBuffer, TInt uValue, TInt vValue)
-{
-    /* For the Color Effects Fill the U and V buffers with the 
-    corresponding color values */
-   
-    sPutBits(DestBuffer, 8, uValue);
-    sPutBits(DestBuffer, 8, vValue);
-}
-
-
-/* {{-output"vdtGetPMBBlackAndWhiteMCBPC.txt"}} */
-/*
-* vdtGetPMBBlackAndWhiteMCBPC
-*
-* Parameters: 
-*
-* Function:
-*    This function compute the new mcbpc for black and white effect *
-* Returns:
-*    the length of the input mcbpc.
-* Error codes:
-*    None.
-*
-*/
-int vdtGetPMBBlackAndWhiteMCBPC(int& new_len, int& new_val, int mcbpc)
-{
-    int cur_index, new_index, cur_len;
-        
-    const tVLCTable sCBPCPType[21] = 
-    {
-    {1, 1}, {3, 4}, {2, 4}, {5, 6},
-    {3, 3}, {7, 7}, {6, 7}, {5, 9}, 
-    {2, 3}, {5, 7}, {4, 7}, {5, 8},
-    {3, 5}, {4, 8}, {3, 8}, {3, 7},
-    {4, 6}, {4, 9}, {3, 9}, {2, 9}, 
-    {1, 9}
-    };
-    
-     /* evaluate MCBPC parameters */
-    int cur_cbpc = mcbpc & 3;       
-    int new_cbpc = 0;       // cpbc=0 indicates chroma is 0
-    int mbType; 
-    
-    mbType = mcbpc / 4;
-    /* evaluate indices in table */
-    cur_index = mbType * 4 + cur_cbpc;  
-    new_index = mbType * 4 + new_cbpc;  
-    
-    /* retrieve values */
-    cur_len = sCBPCPType[cur_index].length;
-    new_len = sCBPCPType[new_index].length;
-    new_val = sCBPCPType[new_index].code;
-    
-    return cur_len;
-}
-
-
-/* {{-output"vdtGetIMBBlackAndWhiteMCBPC.txt"}} */
-/*
-* vdtGetIMBBlackAndWhiteMCBPC
-*
-* Parameters: None
-*
-* Function:
-*    This function compute the new mcbpc for black and white effect
-* Returns:
-*    the length of the input mcbpc.
-* Error codes:
-*    None.
-*
-*/
-int vdtGetIMBBlackAndWhiteMCBPC(int& new_len, int& new_val, int mcbpc)
-{
-    int cur_index, new_index, cur_len;
-    
-    const tVLCTable sCBPCIType[9] = 
-    {
-    {1, 1}, {1, 3}, {2, 3}, {3, 3}, {1, 4},
-    {1, 6}, {2, 6}, {3, 6}, {1, 9}
-    };
-    
-    /* evaluate MCBPC parameters */
-    int cur_cbpc = mcbpc & 3;       
-    int new_cbpc = 0;       // cpbc=0 indicates chroma is 0
-    int mbType = (mcbpc <4)?3:4;
-    
-    /* evaluate indices in table */
-    cur_index = (mbType == 3 ? 0 : 4) + cur_cbpc;   
-    new_index = (mbType == 3 ? 0 : 4) + new_cbpc;   
-    
-    /* retrieve values */
-    cur_len = sCBPCIType[cur_index].length;
-    new_len = sCBPCIType[new_index].length;
-    new_val = sCBPCIType[new_index].code;
-    
-    return cur_len;
-}
-
-
-
-
-
-/* {{-output"vdtGetVideoBitstreamInfo.txt"}} */
-/*
-* vdtGetVideoBitstreamInfo
-*
-* Parameters: 
-*
-* Function:
-*    This function provides the bitstream info to the processor *
-* Returns:
-*    VDE error codes
-* Error codes:
-*    None.
-*
-*/
-int vdtGetVideoBitstreamInfo(bibBuffer_t *inBuffer, vdeDecodeParamters_t *aInfoOut, int *aByteIndex, int *aBitIndex)
-{
-    int numBitsGot,
-    bitErrorIndication = 0;
-    int16 error = 0;
-    u_int32 bits;
-    int timeResolution = 0;
-    TVedVideoBitstreamMode streamMode = EVedVideoBitstreamModeUnknown;
-    vdxVolHeader_t volHeader;  
-    volHeader.user_data = NULL;
-    
-    bits = bibShowBits(32, inBuffer, &numBitsGot, &bitErrorIndication, &error);
-    if (error)
-    {
-        streamMode = EVedVideoBitstreamModeUnknown;
-        goto exitFunction;
-    }
-    /* If PSC */
-    if ((bits >> 10) == 32) {
-        streamMode = EVedVideoBitstreamModeH263;
-    } 
-
-    /* Else check for Visual Sequence, Visual Object or Video Object start code */
-    else if ((bits == MP4_VOS_START_CODE) || 
-        (bits == MP4_VO_START_CODE) ||
-        ((bits >> MP4_VID_ID_CODE_LENGTH) == MP4_VID_START_CODE) ||
-        ((bits >> MP4_VOL_ID_CODE_LENGTH) == MP4_VOL_START_CODE)) 
-    {
-        
-        /* read the Stream headers from the bitstream */
-        if ((vdxGetVolHeader(inBuffer, &volHeader, &bitErrorIndication, 1, aByteIndex, aBitIndex, NULL) != 0) ||
-            (bitErrorIndication != 0)) 
-        {
-            goto exitFunction;
-        }   
-
-        timeResolution = volHeader.time_increment_resolution;
-        streamMode = sGetMPEG4Mode(volHeader.error_res_disable, volHeader.data_partitioned, volHeader.reversible_vlc);
-        bits = bibShowBits(22, inBuffer, &numBitsGot, &bitErrorIndication, &error);
-        if (error)
-            goto exitFunction;
-        
-      /* Check if H.263 PSC follows the VOL header, in which case this is 
-        MPEG-4 with short header and is decoded as H.263 */
-        if ( bits == 32 ) 
-        {
-            streamMode = EVedVideoBitstreamModeMPEG4ShortHeader;
-        }
-    }
-
-    /* Else no H.263 and no MPEG-4 start code detected  */
-    else {
-        streamMode = EVedVideoBitstreamModeUnknown;
-    }
-    
-exitFunction:
-    /* copy the got user data to the core data structure */
-    if (volHeader.user_data != NULL) 
-    {
-        free(volHeader.user_data);
-    }
-    
-    bibRewindBits( bibNumberOfFlushedBits( inBuffer ), inBuffer, &error );
-    aInfoOut->streamMode = streamMode;
-    aInfoOut->iTimeIncrementResolution = timeResolution;
-    return TX_OK;
-}
-
-
-
-
-
-/* {{-output"vdtGetVideoBitstreamInfo.txt"}} */
-/*
-* sQuantizeMB
-*
-* Parameters: 
-*    mbdata          Contains the actual MB data to be quantized
-*    oldQuant: 
-*    newQuant:
-*    intra
-*
-* Function:
-*    This function requantizes the AC/DCT data for one MB, used in MPEG4 -> H263 transcoding 
-* Returns:
-*    Coded Block Pattern.
-* Error codes:
-*    None.
-*
-*/
-static void sQuantizeMB(int *mbdata, int oldQuant, int newQuant, int intra, int colorEffect)
-{
-#define  SIGN(x)          (((x)<0) ? -1:1 )
-    int   coeffCnt;
-    int   *block;
-    int   blkCnt;
-    
-    for (blkCnt = 0; blkCnt < (colorEffect ? 4 : 6); blkCnt++)
-    {   
-        block = &mbdata[blkCnt * BLOCK_COEFF_SIZE];
-        for (coeffCnt = (intra == VDX_MB_INTRA); coeffCnt < BLOCK_COEFF_SIZE;
-             coeffCnt++)
-             {
-                 if (block[coeffCnt])
-                 {
-                     int level = abs(block[coeffCnt]);
-                     int sign = SIGN(block[coeffCnt]);
-                     int rcoeff;
-                     // dequantize 
-                     if ((oldQuant % 2) == 1)
-                         rcoeff = oldQuant * ((level << 1) + 1);
-                     else
-                         rcoeff = oldQuant * ((level << 1) + 1) - 1;
-                     
-                     rcoeff = min (2047, max (-2048, sign * rcoeff));
-                     
-                     // requantize
-                     if (intra == VDX_MB_INTRA)
-                     {
-                         level = (abs (rcoeff)) / (newQuant << 1);
-                     }
-                     else
-                     {
-                         level = (abs (rcoeff) - (newQuant >> 1)) / (newQuant << 1);
-                         /* clipping to [-127,+127] */
-                     }
-                     
-                     /* clipping to [-127,+127] */
-                     block[coeffCnt] = min (127, max (-127, sign * level));
-                 }
-                 else
-                 {
-                     /* Nothing */
-                 }
-             }
-    }
-    return ;
-}   
-
-
-
-
-/* {{-output"vdtGetVideoBitstreamInfo.txt"}} */
-/*
-* vdtChangeVosHeaderRegResyncL
-*
-* Parameters: 
-*
-* Function:
-*    This function finds the error resillence bit and change it if necessary
-*      to make it Regular Resynchronization mode 
-* Returns:
-*    ETrue if buffer changed.
-* Error codes:
-*    None
-*
-*/
-TBool vdtChangeVosHeaderRegResyncL(TPtrC8& aInputBuffer, TUint aBufferSize)
-{
-    int16   errorCode = 0;             /* return code for bib functions */
-    bibBuffer_t *buffer;                   /* input buffer */
-    
-    /* Create bit buffer */
-    buffer = bibCreate((TAny*)aInputBuffer.Ptr(), aBufferSize, &errorCode);
-    if (!buffer || errorCode)
-        return EFalse;
-     
-    int startByte = 0, startBit = 7;
-    vdeDecodeParamters_t decInfo; 
-    vdtGetVideoBitstreamInfo(buffer, &decInfo, &startByte, &startBit);
-     
-    if (decInfo.streamMode == EVedVideoBitstreamModeMPEG4Regular)
-    {
-        char *temp = (char *) (TAny*)aInputBuffer.Ptr();
-        unsigned char patern[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
-        temp[startByte] &= patern[startBit]; // change the error resillence bit to 0;
-        
-        /* Delete bit buffer */
-        bibDelete(buffer, &errorCode);
-        return ETrue;
-    }
-    else
-    {
-      /* Delete bit buffer */
-        bibDelete(buffer, &errorCode);
-        return EFalse;
-    }
-}
-
-/*
-* CMPEG4Transcoder
-*
-* Parameters: 
-*
-* Function:
-*    Constructor
-*
-*/
-CMPEG4Transcoder::CMPEG4Transcoder(const vdeInstance_t *aVDEInstance, bibBuffer_t *aInBuffer, bibBuffer_t *aOutBuffer)
-{
-    VDTASSERT(aVDEInstance); 
-    VDTASSERT(aInBuffer);
-    VDTASSERT(aOutBuffer);
-    
-    /* passing the arguments */
-    iVDEInstance = aVDEInstance;
-    iInBuffer  = aInBuffer;
-    iOutBuffer = aOutBuffer;
-    
-    /* Color Toning */
-    iMBType      = NULL;
-    iCurQuant    = 0;
-    iColorEffect = aVDEInstance->iColorEffect;
-    iColorToneU  = aVDEInstance->iColorToneU;
-    iColorToneV  = aVDEInstance->iColorToneV;
-    iRefQuant    = aVDEInstance->iRefQp;
-    iDcScaler    = GetMpeg4DcScalerUV(iRefQuant);
-        
-    iDoModeTranscoding = EFalse;
-    iDoTranscoding = (iColorEffect || iDoModeTranscoding);
-    iTargetFormat = EVedVideoTypeMPEG4SimpleProfile;
-    iStuffingBitsUsed = 0;
-    
-    /* default values */
-    iLastMBNum = -1;
-    iCurMBNum = 0;
-
-    /* initialize here but will be changed later to proper value */
-    iOutputMpeg4TimeIncResolution = KOutputMpeg4TimeIncResolution;  
-
-    iNumMBsInOneVOP = (iVDEInstance->lumHeight * iVDEInstance->lumWidth) >> 8;  // /256
-    iMBsinWidth = iVDEInstance->lumWidth >> 4; 
-    iNumMBsInGOB = iVDEInstance->lumWidth >> 4; 
-    
-
-    iMBList = NULL;
-    iH263DCData = NULL;
-    h263mbi = NULL;
-
-    
-    iH263MBVPNum = NULL;
-    iErrorResilienceStartByteIndex = KDataNotValid;
-    iErrorResilienceStartBitIndex  = KDataNotValid;
-    
-    iVideoPacketNumInMPEG4 = 0; // the video packet number this MB belongs to, NOTE: the first GOB doesn't have a GOB header
-    iCurMBNumInVP = -1;
-    fFirstFrameInH263 = EFalse;
-    
-    return;
-}
-
-/*
-* ~CMPEG4Transcoder
-*
-* Parameters: 
-*
-* Function:
-*    Destructor
-*
-*/
-CMPEG4Transcoder::~CMPEG4Transcoder()
-{
-    if (iCurIMBinstance)
-    {
-        free(iCurIMBinstance);
-    }
-    if (iCurPMBinstance)
-    {
-        free(iCurPMBinstance);
-    }
-    if (bufEdit.editParams)
-    {
-        free(bufEdit.editParams);
-    }
-    
-    // for H263
-    if (iH263MBVPNum)
-    {
-        free(iH263MBVPNum);
-    }
-    
-    // for color toning
-    if (iMBType)
-    {
-        free(iMBType);
-    }
-
-
-    
-    if (iH263DCData)
-    {
-        for (int i = 0; i < iNumMBsInOneVOP; i++)
-        {
-            free(iH263DCData[i]);
-        }
-        free(iH263DCData);
-    }
-
-    if ( ( (iTargetFormat == EVedVideoTypeH263Profile0Level10) || 
-           (iTargetFormat == EVedVideoTypeH263Profile0Level45) ) &&
-           iBitStreamMode != EVedVideoBitstreamModeMPEG4ShortHeader &&
-           iBitStreamMode != EVedVideoBitstreamModeH263 &&
-           h263mbi)
-    {
-        free(h263mbi);
-    }
-    
-    if ( iOutBuffer )
-        {
-        
-        PRINT((_L("CMPEG4Transcoder: finish one frame successfully, buffer size %d"), 
-           iOutBuffer->getIndex));
-        }
-        
-#ifdef _DEBUG
-    if (iOutBuffer->getIndex > KInitialBufferSize)
-    {
-        PRINT((_L("CMPEG4Transcoder: Output buffer size from engine is not big enough! check KInitialBufferSize")));
-        
-    }
-#endif
-    if ( iOutBuffer )
-        {
-        VDTASSERT(iOutBuffer->getIndex < KInitialBufferSize);
-        }
-}
-
-/*
-* H263EscapeCoding
-*
-* Parameters: 
-*
-* Function:
-*    Indicates whether escape vlc coding is used in one block
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263EscapeCoding(int aIndex, int fEscapeCodeUsed)
-{
-    iEscapeCodeUsed[aIndex] = fEscapeCodeUsed;
-}
-
-/*
-* SetTranscoding
-*
-* Parameters: 
-*
-* Function:
-*    Indicates whether we need to do MPEG4 bitstream transcoding
-* Returns:
-*    TX error codes
-* Error codes:
-*    None
-*
-*/
-int CMPEG4Transcoder::SetTranscoding(vdeDecodeParamters_t *aDecoderInfo)
-{
-    iColorEffect = aDecoderInfo->aColorEffect;
-    iColorToneU = aDecoderInfo->aColorToneU; 
-    iColorToneV = aDecoderInfo->aColorToneV;
-    iBitStreamMode = (TVedVideoBitstreamMode)aDecoderInfo->streamMode;
-    
-    iTargetFormat = aDecoderInfo->aOutputVideoFormat; 
-    iDoModeTranscoding = aDecoderInfo->fModeChanged ? ETrue: EFalse;
-    iDoTranscoding = (iColorEffect || iDoModeTranscoding);
-
-    /* set to proper value */
-    iOutputMpeg4TimeIncResolution = *(aDecoderInfo->aMPEG4TargetTimeResolution); 
-
-    /* allocate buffer for MPEG4 - > H263 transcoding */
-    /* the following is used if spatial domain processing is not done */
-        
-    if ( ( (iTargetFormat == EVedVideoTypeH263Profile0Level10) ||
-           (iTargetFormat == EVedVideoTypeH263Profile0Level45) ) &&
-           iBitStreamMode != EVedVideoBitstreamModeMPEG4ShortHeader &&
-           iBitStreamMode != EVedVideoBitstreamModeH263)
-    {
-        h263mbi = (tMBInfo*) malloc (sizeof(tMBInfo) * iNumMBsInOneVOP);
-        if (!h263mbi) 
-        {
-            PRINT((_L("CMPEG4Transcoder::SetTranscoding - h263mbi creation failed")));
-            deb("CMPEG4Transcoder::SetTranscoding - h263mbi creation failed\n");
-
-            return TX_ERR;
-        }
-        memset(h263mbi, 0, sizeof(tMBInfo) * iNumMBsInOneVOP);
-    }
-    
-    return TX_OK;
-}
-
-
-
-
-/*
-* BeginOneVideoPacket
-*
-* Parameters: 
-*
-* Function:
-*    Records the position before one Video packet is processed
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::BeginOneVideoPacket(dvpVPInParam_t *aVPin)
-{
-    VDTASSERT(iInBuffer); 
-    VDTASSERT(aVPin);
-    
-    iCurVPIn = aVPin;
-    iVPStartByteIndex = iInBuffer->getIndex;
-    iVPStartBitIndex  = iInBuffer->bitIndex;
-    
-    iCurMBNumInVP = -1;
-
-    iStuffingBitsUsed = 0;
-    
-    iVopCodingType = aVPin->pictParam->pictureType;
-    iBitStreamMode = sGetMPEG4Mode(aVPin->pictParam->error_res_disable,
-        aVPin->pictParam->data_partitioned, aVPin->pictParam->reversible_vlc);
-}
-
-
-/*
-* sConstructH263PicHeader
-*
-* Parameters: 
-*        lBitOut                output buffer
-*        quant                quant value to be put in header
-*           picType             VDX_VOP_TYPE_P or VDX_VOP_TYPE_I
-*           tr                      time increament
-* Function:
-*    Writes the pic header into bit-stream for one MPEG4 frame
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void sConstructH263PicHeader(bibBuffer_t *lBitOut, int picType, int quant, int tr, int aVOPNotCoded, int aFormat)
-
-{
-    if (aVOPNotCoded)
-    {
-        return;
-    }
-    /* ShortVideoStartMarker */
-    sPutBits(lBitOut, 22, SHORT_VIDEO_START_MARKER);
-    /* TemporalReference */
-    sPutBits(lBitOut, 8, (tr & 0x000000ff));
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* Zero Bit */
-    sPutBits(lBitOut, 1, 0);
-    /* SplitScreenIndicator = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* DocumentCameraIndicator = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* FullPictureFreezeRelease = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* Source Fromat */
-    sPutBits(lBitOut, 3, aFormat);
-    /* PictureCodingType 0 for intra, 1 for inter */
-    sPutBits(lBitOut, 1, picType == VDX_VOP_TYPE_P);
-    /* UMV= 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* SAC = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* Advanced Prediction = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* PB frame = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* VOPQuant */
-    sPutBits(lBitOut, 5, quant);
-    /* ZeroBIt */
-    sPutBits(lBitOut, 1, 0);
-    /* Pei = 0 */
-    sPutBits(lBitOut, 1, 0);        
-}
-
-
-/*
-* VOPHeaderEnded
-*
-* Parameters: 
-*
-* Function:
-*    Copy the VOP Header to output buffer
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::VOPHeaderEnded(int aStartByteIndex, int aStartBitIndex, 
-    int aQuant, int aPicType, int aFrameNum, int aVOPNotCoded)
-{
-    const int KNumMbInSqcif = 48; 
-    const int KNumMbInQcif = 99; 
-    const int KNumMbInCif = 396; 
-
-    if (iTargetFormat == EVedVideoTypeH263Profile0Level10 || iTargetFormat == EVedVideoTypeH263Profile0Level45)
-    {
-        int sourceFormat = 2; // qcif
-        /* note: other formate not supported */
-        if (iNumMBsInOneVOP == KNumMbInSqcif)  /* sqcif */
-        {
-            sourceFormat = 1;  // sqcif
-        }
-        else if (iNumMBsInOneVOP == KNumMbInQcif) /* qcif */
-        {
-            sourceFormat = 2;  // qcif
-        }
-        else if (iNumMBsInOneVOP == KNumMbInCif) /* cif */
-        {
-            sourceFormat = 3;  // cif
-        }
-        sConstructH263PicHeader(iOutBuffer, aPicType, aQuant, 0, aVOPNotCoded, sourceFormat);
-        PRINT((_L("CMPEG4Transcoder: MPEG4 -> H263: picture header generated")));
-    }
-  /* Copy the VOP header */
-  else 
-    {
-        bufEdit.copyMode = CopyWhole; // whole
-        CopyStream(iInBuffer,iOutBuffer,&bufEdit,aStartByteIndex,aStartBitIndex);
-    }
-  iPreQuant = aQuant;
-  iStuffingBitsUsed = 0;
-
-  iCurQuant = aQuant;
-  /* Color Toning */
-  if (!aFrameNum || !iRefQuant)
-  {
-     iRefQuant = iCurQuant;
-     iDcScaler = GetMpeg4DcScalerUV(iRefQuant); 
-  }
-
-}
-
-
-/*
-* VOPEnded
-*
-* Parameters: 
-*
-* Function:
-*    This function is called when one VOP has ended
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::VOPEnded()
-{
-    /* check if MBs are lost */
-    int dataPartitioned = (iBitStreamMode == EVedVideoBitstreamModeMPEG4DP_RVLC || iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC 
-        || iBitStreamMode == EVedVideoBitstreamModeMPEG4DP ||  iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP);
-    
-    if (iLastMBNum != iNumMBsInOneVOP - 1 && !(dataPartitioned && !iDoModeTranscoding))
-    {
-        for (int i = iLastMBNum+1; i < iNumMBsInOneVOP; i++)
-        {
-            /* output  1 bit COD */
-            sPutBits (iOutBuffer, 1, 1);
-        }
-    }
-    
-    iLastMBNum = iNumMBsInOneVOP - 1; 
-    /* bits need to be stuffed in the output buffer at the end VOP */
-    if (!dataPartitioned && iTargetFormat == EVedVideoTypeMPEG4SimpleProfile)
-    {
-        if (!iStuffingBitsUsed)
-        {
-            vdtStuffBitsMPEG4(iOutBuffer);
-        }
-        iStuffingBitsUsed = 1;
-    }
-    else if (iTargetFormat == EVedVideoTypeH263Profile0Level10 || iTargetFormat == EVedVideoTypeH263Profile0Level45)
-    {
-        sStuffBitsH263(iOutBuffer);
-    }
-    
-  PRINT((_L("CMPEG4Transcoder: VOPEnded. color effect: %d, format convert %d, do transcoding: %d streammode: %d, outputformat: %d "), 
-       iColorEffect, iDoModeTranscoding, iDoTranscoding, iBitStreamMode, iTargetFormat));
-}
-
-/*
-* AfterOneVideoPacketHeader
-*
-* Parameters: 
-*
-* Function:
-*    This function is called after retreiving the VP
-*    Records the position before the content of the video packet is processed
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::AfterVideoPacketHeader(dvpVPInOutParam_t *aVPInfo)
-{
-    VDTASSERT(aVPInfo); 
-    iCurVPInOut = aVPInfo;
-    
-    iVPHeaderEndByteIndex = iInBuffer->getIndex;
-    iVPHeaderEndBitIndex  = iInBuffer->bitIndex;
-    
-    /* Color Toning */
-    iCurQuant = aVPInfo->quant; 
-    
-    /* Copy the VP header to output stream. Note; the first VP does not have a VP header */
-    if (iTargetFormat == EVedVideoTypeMPEG4SimpleProfile)
-    {
-       bufEdit.copyMode = CopyWhole; /* whole */
-         CopyStream(iInBuffer,iOutBuffer,&bufEdit,iVPStartByteIndex,iVPStartBitIndex);
-    }
-}
-
-
-/*
-* OneVPEnded
-*
-* Parameters: 
-*
-* Function:
-*    This function is called after one VP  contents are retrieved
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::OneVPEnded()
-{
-    if (!iDoTranscoding)
-    {
-        /* no transcoding, copy whole content VP */
-        bufEdit.copyMode = CopyWhole; 
-        CopyStream(iInBuffer,iOutBuffer,&bufEdit,iVPHeaderEndByteIndex,iVPHeaderEndBitIndex);
-        iStuffingBitsUsed = 1;// also stuffing is copied
-    }
-    else
-    {
-        int dataPartitioned = (iBitStreamMode == EVedVideoBitstreamModeMPEG4DP_RVLC || iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC 
-            || iBitStreamMode == EVedVideoBitstreamModeMPEG4DP ||  iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP);
-        int nextExpectedMBNum = iCurVPInOut->currMBNum;
-        
-        if (dataPartitioned && !iDoModeTranscoding)
-        {
-        /* if data is partitioned and we are not doing format transcoding,
-        not coded MBs info is already in data partition 1
-            */
-        }
-        else
-        {
-            /* MBs are lost or not coded,  */
-            for (int i = iLastMBNum+1; i < nextExpectedMBNum; i++)
-            {
-                /* output  1 bit COD */
-                sPutBits (iOutBuffer, 1, 1);
-            }
-        }
-        
-        iLastMBNum = nextExpectedMBNum - 1; 
-        /* bits need to be stuffed in the output buffer at the end of vp in all cases (bw or not) */
-        if (iTargetFormat == EVedVideoTypeMPEG4SimpleProfile) 
-        {
-            if (!iStuffingBitsUsed)
-            {
-                vdtStuffBitsMPEG4(iOutBuffer);
-            }
-            iStuffingBitsUsed = 1;
-        }
-    }
-}
-
-
-
-/*
-* BeginOneMB
-*
-* Parameters: 
-*
-* Function:
-*    Records the position before one MB is processed
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::BeginOneMB(int aMBNum)
-{
-    VDTASSERT(iInBuffer); 
-    
-    iMBStartByteIndex = iInBuffer->getIndex;
-    iMBStartBitIndex  = iInBuffer->bitIndex;
-    iCurMBNum = aMBNum;
-    
-    // Color Toning
-    iCurMBNumInVP++;
-    
-    if ((iBitStreamMode == EVedVideoBitstreamModeMPEG4ShortHeader || iBitStreamMode == EVedVideoBitstreamModeH263) && iDoModeTranscoding)
-    {
-       /* H263 -> MPEG4  */
-       VDTASSERT(iH263MBVPNum);
-         iH263MBVPNum[iCurMBNum]= iVideoPacketNumInMPEG4;
-    }
-}
-
-/*
-* BeginOneBlock
-*
-* Parameters: 
-*
-* Function:
-*    Records the position before one block in MB is processed
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::BeginOneBlock(int aBlockIndex)
-{
-    VDTASSERT(aBlockIndex >= 0 && aBlockIndex < 6); 
-    
-    iBlockStartByteIndex[aBlockIndex] = iInBuffer->getIndex;
-    iBlockStartBitIndex[aBlockIndex]  = iInBuffer->bitIndex;
-}
-
-
-/*
-* OneIMBDataStarted
-*
-* Parameters: 
-*
-* Function:
-*    This function is called after the MB header is read; start one IMB, 
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::OneIMBDataStarted(vdxIMBListItem_t *aMBInstance)
-{
-    VDTASSERT(aMBInstance); 
-    VDTASSERT(iCurIMBinstance);
-    iMBCodingType = VDX_MB_INTRA;
-    iVopCodingType = VDX_VOP_TYPE_I;
-    iMBType[iCurMBNum] = iMBCodingType;
-
-    
-    memcpy(iCurIMBinstance, aMBInstance, sizeof(vdxIMBListItem_t)); 
-}
-
-/*
-* OnePMBDataStarted
-*
-* Parameters: 
-*
-* Function:
-*    This function is called after the MB header is read; start one PMB, 
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::OnePMBDataStarted(vdxPMBListItem_t *aMBInstance)
-{
-    VDTASSERT(aMBInstance); 
-    VDTASSERT(iCurPMBinstance);
-    
-    iMBCodingType = aMBInstance->mbClass;
-    iVopCodingType = VDX_VOP_TYPE_P;
-    iMBType[iCurMBNum] = iMBCodingType;
-
-    memcpy(iCurPMBinstance, aMBInstance, sizeof(vdxPMBListItem_t)); 
-}
-
-
-
-/*
-* OneIMBDataStartedDataPartitioned
-*
-* Parameters: 
-*
-* Function:
-*    Add one IMB instance, It is done after parsing Part1 and Part2 before the block data for current MB
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::OneIMBDataStartedDataPartitioned(vdxIMBListItem_t *aMBInstance, dlst_t *aMBList, int aCurrMBNumInVP, int aMBNum)
-{
-    VDTASSERT(aMBInstance); // at this point, the instance should not be null
-    VDTASSERT(aMBList);
-    
-    memcpy(iCurIMBinstance, aMBInstance, sizeof(vdxIMBListItem_t)); 
-    iCurMBNumInVP = aCurrMBNumInVP;
-    iCurMBNum = aMBNum;
-    iMBList = aMBList;
-    iMBCodingType = VDX_MB_INTRA;
-    iVopCodingType = VDX_VOP_TYPE_I;
-    iMBType[iCurMBNum] = iMBCodingType;
-    
-    if (!iCurMBNumInVP && iDoTranscoding) 
-    {
-        if (!iDoModeTranscoding)
-        {
-          /* We are not doing bitstream transcoding,  
-            we have color effect here and need to reconstruct data partitions.
-            */
-            ReconstructIMBPartitions();
-        }
-    }
-}
-
-/*
-* OnePMBDataStartedDataPartitioned
-*
-* Parameters: 
-*
-* Function:
-*    Add one IMB instance, It is done after parsing Part1 and Part2 before the block data for current MB
-*    Note: PMB may be INTRA coded.
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::OnePMBDataStartedDataPartitioned(vdxPMBListItem_t *aMBInstance, dlst_t *aMBList, int aCurrMBNumInVP, int aMBNum)
-{
-    VDTASSERT(aMBInstance); /* at this point, the instance should not be null */
-    VDTASSERT(aMBList);
-    
-    memcpy(iCurPMBinstance, aMBInstance, sizeof(vdxPMBListItem_t)); 
-    iCurMBNumInVP = aCurrMBNumInVP;
-    iCurMBNum = aMBNum;
-    iMBList = aMBList;
-    iMBCodingType = aMBInstance->mbClass;
-    iVopCodingType = VDX_VOP_TYPE_P;
-    iMBType[iCurMBNum] = iMBCodingType;
-    
-    if (!aMBInstance->fCodedMB && iDoModeTranscoding)
-    {
-        /* this MB is not coded and need to be converted to target mode,
-        out put the possible MB stuffing bits and COD
-        */
-        /* MB stuffing bits if they exsit */
-        vdtCopyBuffer(iInBuffer, iOutBuffer,
-            aMBInstance->DataItemStartByteIndex[11], aMBInstance->DataItemStartBitIndex[11],
-            aMBInstance->DataItemEndByteIndex[11], aMBInstance->DataItemEndBitIndex[11]);
-        /* It is a not-coded MB, output  1 bit COD (it always exists in P frame) */
-        sPutBits (iOutBuffer, 1, 1);
-        iLastMBNum = iCurMBNum;
-    }
-    else if (!iCurMBNumInVP && iDoTranscoding) 
-    {
-        if (!iDoModeTranscoding)
-        {
-        /* We are not doing bitstream transcoding, 
-        we have color effect here and need to reconstruct data partitions.
-            */
-            ReconstructPMBPartitions();
-        }
-    }
-}
-
-
-
-/*
-* TranscodingOneMB
-*
-* Parameters: 
-*
-* Function:
-*    Transcoding one MB, which may include dequantization, requantization , and re-encoding
-* Returns:
-*    DMD error codes since called from decmbdct
-*
-*/
-int CMPEG4Transcoder::TranscodingOneMB(dmdPParam_t *aParam = NULL)
-{
-/* Because it has block data, this MB must be a coded MB,
-which means the position indicated by iMBStartByteIndex and iMBStartBitIndex starts with a MCBPC 
-    */
-    VDTASSERT(!(!iCurPMBinstance->fCodedMB && iMBCodingType == VDX_MB_INTER));
-    
-    if (!iDoTranscoding)
-        {
-        iLastMBNum = iCurMBNum; // need to update the variable to avoid marking this as noncoded MB
-        return TX_OK;
-        }
-    
-    int dataPartitioned = (iBitStreamMode == EVedVideoBitstreamModeMPEG4DP_RVLC || iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC 
-        || iBitStreamMode == EVedVideoBitstreamModeMPEG4DP ||  iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP);
-    
-    if (dataPartitioned)
-    {
-        /* since we need to handle MB stuffing bits, which are handle outside the transcoder in other modes,
-        not coded MBs and MB stuffing bits are handled in OnePMBDataStartedDataPartitioned, 
-             ReconstuctI/PMBPartitios or ConstructRegularMPEG4MBData
-        */
-    }
-    else if(iCurMBNum != iLastMBNum + 1 )
-    {
-        /* if previous MBs are lost or not coded, we copy one MB with COD = 1; */
-        for (int i = 0 ; i < iCurMBNum - iLastMBNum - 1; i++)
-        {
-            /* output  1 bit COD */
-            sPutBits (iOutBuffer, 1, 1);
-        }
-    }
-    
-    int newMCBPCLen = 0;
-    int newMCBPC = 0;
-    int oldMCBPCLen = 0;
-    
-    /* determine whether to change mcbpc */
-    if (iColorEffect)
-    {
-        if (iVopCodingType == VDX_VOP_TYPE_P) 
-        {
-            oldMCBPCLen = vdtGetPMBBlackAndWhiteMCBPC(newMCBPCLen, newMCBPC, iCurPMBinstance->mcbpc);
-        }
-        else
-        {
-            oldMCBPCLen = vdtGetIMBBlackAndWhiteMCBPC(newMCBPCLen, newMCBPC, iCurIMBinstance->mcbpc);
-        }
-    }
-    
-
-    
-    if (iDoModeTranscoding && ( (iTargetFormat == EVedVideoTypeH263Profile0Level10) ||
-                                (iTargetFormat == EVedVideoTypeH263Profile0Level45) ) )
-    {
-        if ( ConstructH263MBData(aParam, newMCBPCLen, newMCBPC) != VDC_OK )
-            {
-            return TX_ERR;
-            }
-    }
-    else /* possible H263->MPEG4 transcoding */
-        
-    {
-        /* MPEG4 with VDT_RESYN and VDT_REGULAR, we only do bitstream copying */
-        if ( iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn || iBitStreamMode == EVedVideoBitstreamModeMPEG4Regular ||
-            ((iBitStreamMode ==EVedVideoBitstreamModeMPEG4ShortHeader || iBitStreamMode == EVedVideoBitstreamModeH263) && !iDoModeTranscoding) )
-        {
-        /* the MB stuffing is taken card of outside in file viddemux.cpp
-        we only need to output COD, MCBPC
-            */
-            int mcbpcStartByteIndex, mcbpcStartBitIndex;
-            
-            if (iVopCodingType == VDX_VOP_TYPE_I)
-            {
-                mcbpcStartByteIndex = iCurIMBinstance->DataItemStartByteIndex[0];
-                mcbpcStartBitIndex = iCurIMBinstance->DataItemStartBitIndex[0];
-            }
-            else
-            {
-                mcbpcStartByteIndex = iCurPMBinstance->DataItemStartByteIndex[0];
-                mcbpcStartBitIndex = iCurPMBinstance->DataItemStartBitIndex[0];
-                /* It is a coded MB, output  1 bit COD (it always exists in P frame) */
-                sPutBits (iOutBuffer, 1, 0);
-            }
-            
-            if (!iColorEffect)
-            {
-                bufEdit.copyMode = CopyWhole; /* whole */
-                CopyStream(iInBuffer,iOutBuffer,&bufEdit,mcbpcStartByteIndex,mcbpcStartBitIndex);
-            }
-            else
-            {
-                /* modify mcbpc and copy only the Y data */
-                bufEdit.copyMode = CopyWithEdit; // copy with edit
-                bufEdit.editParams[0].StartByteIndex = mcbpcStartByteIndex; 
-                bufEdit.editParams[0].StartBitIndex  = mcbpcStartBitIndex; 
-                bufEdit.editParams[0].curNumBits = oldMCBPCLen; 
-                bufEdit.editParams[0].newNumBits = newMCBPCLen; 
-                bufEdit.editParams[0].newValue = newMCBPC; 
-                CopyStream(iInBuffer,iOutBuffer,&bufEdit,mcbpcStartByteIndex,mcbpcStartBitIndex);
-                
-                /* disgard the UV data */
-                int16 errorCode = 0;
-                int bitsToRewind = ((iInBuffer->getIndex << 3) + 7  - iInBuffer->bitIndex) 
-                                     - ((iBlockStartByteIndex[4] << 3) + 7 - iBlockStartBitIndex[4]);
-                bibRewindBits(bitsToRewind, iOutBuffer, &errorCode );
-                
-                if (iMBCodingType == VDX_MB_INTRA)
-                {
-                    if (iBitStreamMode == EVedVideoBitstreamModeMPEG4ShortHeader || iBitStreamMode == EVedVideoBitstreamModeH263)
-                    {
-                        sResetH263IntraDcUV(iOutBuffer, iColorToneU, iColorToneV);                        
-                    }
-                    else
-                    {
-                        ResetMPEG4IntraDcUV();
-                    }
-                }
-            }
-        }
-
-        else if ((iBitStreamMode == EVedVideoBitstreamModeMPEG4ShortHeader || iBitStreamMode == EVedVideoBitstreamModeH263) && iDoModeTranscoding)
-        {
-            H263ToMPEG4MBData(newMCBPCLen, newMCBPC);
-        }
-        
-        else /* data partitioned */
-        {
-            if (iDoModeTranscoding)
-            {
-                /* for data partitioned bitstream, we do the bitstream rearrangement  */
-                ConstructRegularMPEG4MBData(newMCBPCLen, newMCBPC);
-            }
-            else
-            {
-                /* copy the ACs or DCTs */
-                bufEdit.copyMode = CopyWhole; // whole
-                CopyStream(iInBuffer,iOutBuffer,&bufEdit,iBlockStartByteIndex[0],iBlockStartBitIndex[0]);
-                if (iColorEffect)
-                {
-                    /* discard U V data */
-                    int16 errorCode = 0;
-                    int bitsToRewind = ((iInBuffer->getIndex << 3) + 7  - iInBuffer->bitIndex) 
-                                             - ((iBlockStartByteIndex[4] << 3) + 7 - iBlockStartBitIndex[4]);
-                    bibRewindBits(bitsToRewind, iOutBuffer, &errorCode );
-                }
-            }
-        }
-
-    }
-    iLastMBNum = iCurMBNum;
-    return TX_OK;
-}
-
-
-
-
-/*
-* ReconstructIMBPartitions
-*
-* Parameters: 
-*
-* Function:
-*    Recontruct the partitions for color effect when we are not doing format transcoding
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ReconstructIMBPartitions()
-{
-    vdxIMBListItem_t *MBinstance;
-     int *dataItemStartByteIndex;
-     int *dataItemStartBitIndex;
-     int *dataItemEndByteIndex;
-     int *dataItemEndBitIndex;
-     int newMCBPCLen = 0;
-     int newMCBPC = 0;
-     
-     VDTASSERT(iMBList);
-     
-     for (dlstHead(iMBList, (void **) &MBinstance); 
-     MBinstance != NULL; 
-     dlstNext(iMBList, (void **) &MBinstance))
-      {
-         dataItemStartByteIndex = MBinstance->DataItemStartByteIndex;
-         dataItemStartBitIndex  = MBinstance->DataItemStartBitIndex;
-         dataItemEndByteIndex   = MBinstance->DataItemEndByteIndex;
-         dataItemEndBitIndex    = MBinstance->DataItemEndBitIndex;
-         // MB stuffing bits if they exsit
-         vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[11], dataItemStartBitIndex[11],
-             dataItemEndByteIndex[11], dataItemEndBitIndex[11]);
-         
-         /* MCBPC    */
-         if (iColorEffect)
-         {
-             /* MCBPC Changed. Ignore the old value (not used) */
-             vdtGetIMBBlackAndWhiteMCBPC(newMCBPCLen, newMCBPC, MBinstance->mcbpc);
-             sPutBits(iOutBuffer, newMCBPCLen, newMCBPC);
-         }
-         else
-         {
-             vdtCopyBuffer(iInBuffer, iOutBuffer,
-                 dataItemStartByteIndex[0], dataItemStartBitIndex[0],
-                 dataItemEndByteIndex[0], dataItemEndBitIndex[0]);
-         }
-         
-         /* DQUANT, if it exsits */
-         vdtCopyBuffer(iInBuffer, iOutBuffer,
-                   dataItemStartByteIndex[1], dataItemStartBitIndex[1],
-                     dataItemEndByteIndex[1], dataItemEndBitIndex[1]);
-         
-         /* INTRA DCs */
-         if (!iColorEffect)
-         {
-             vdtCopyBuffer(iInBuffer, iOutBuffer,
-                 dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                 dataItemEndByteIndex[4], dataItemEndBitIndex[4]);
-         }
-         else
-         {
-             if (!(VDT_NO_DATA(dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                 dataItemEndByteIndex[4], dataItemEndBitIndex[4])))   
-             {
-                 vdtCopyBuffer(iInBuffer, iOutBuffer,
-                     dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                     dataItemStartByteIndex[8], dataItemStartBitIndex[8]);
-                 ResetMPEG4IntraDcUV();
-             }
-         }
-     }
-     
-     /* DC marker */
-     sPutBits(iOutBuffer, DC_MARKER_LENGTH, DC_MARKER);
-     
-   for (dlstHead(iMBList, (void **) &MBinstance); 
-     MBinstance != NULL; 
-     dlstNext(iMBList, (void **) &MBinstance))
-      {
-         dataItemStartByteIndex = MBinstance->DataItemStartByteIndex;
-         dataItemStartBitIndex  = MBinstance->DataItemStartBitIndex;
-         dataItemEndByteIndex   = MBinstance->DataItemEndByteIndex;
-         dataItemEndBitIndex    = MBinstance->DataItemEndBitIndex;
-         
-         /* ac_pred_flag */
-         vdtCopyBuffer(iInBuffer, iOutBuffer,
-                   dataItemStartByteIndex[3], dataItemStartBitIndex[3],
-                     dataItemEndByteIndex[3], dataItemEndBitIndex[3]);
-         
-         /* CBPY */
-         vdtCopyBuffer(iInBuffer, iOutBuffer,
-                   dataItemStartByteIndex[2], dataItemStartBitIndex[2],
-                     dataItemEndByteIndex[2], dataItemEndBitIndex[2]);
-      }
-     
-      /* make sure the head of the list is reset */
-      dlstHead(iMBList, (void **) &MBinstance);
-}
-
-/*
-* ReconstructPMBPartitions
-*
-* Parameters: 
-*
-* Function:
-*    Recontruct the partitions for color effect when we are not doing format transcoding
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ReconstructPMBPartitions()
-{
-    vdxPMBListItem_t *MBinstance;
-    int *dataItemStartByteIndex;
-    int *dataItemStartBitIndex;
-    int *dataItemEndByteIndex;
-    int *dataItemEndBitIndex;
-    int newMCBPCLen = 0;
-    int newMCBPC = 0;
-     
-    VDTASSERT(iMBList);
-     
-  for (dlstHead(iMBList, (void **) &MBinstance); 
-    MBinstance != NULL; 
-    dlstNext(iMBList, (void **) &MBinstance))
-    {
-        dataItemStartByteIndex = MBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = MBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = MBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = MBinstance->DataItemEndBitIndex;
-        
-        /* MB stuffing bits if they exsit */
-        vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[11], dataItemStartBitIndex[11],
-            dataItemEndByteIndex[11], dataItemEndBitIndex[11]);
-        
-        if (MBinstance->fCodedMB)
-        {
-            /* output  1 bit COD, coded */
-            sPutBits (iOutBuffer, 1, 0);
-            
-            /* MCBPC     */
-            if (iColorEffect)
-            {
-                /* MCBPC Changed, ignore the return value */
-                vdtGetPMBBlackAndWhiteMCBPC(newMCBPCLen, newMCBPC, MBinstance->mcbpc);
-                sPutBits(iOutBuffer, newMCBPCLen, newMCBPC);
-            }
-            else
-            {
-                vdtCopyBuffer(iInBuffer, iOutBuffer,
-                    dataItemStartByteIndex[0], dataItemStartBitIndex[0],
-                    dataItemEndByteIndex[0], dataItemEndBitIndex[0]);
-            }
-            
-            /* MVs, if they exist */
-            vdtCopyBuffer(iInBuffer, iOutBuffer,
-                dataItemStartByteIndex[10], dataItemStartBitIndex[10],
-                dataItemEndByteIndex[10], dataItemEndBitIndex[10]);
-        }
-        else
-        {
-            /* output  1 bit COD, not coded */
-            sPutBits (iOutBuffer, 1, 1);
-        }
-    }
-     
-    /* MM marker */
-    sPutBits(iOutBuffer, MOTION_MARKER_LENGTH, MOTION_MARKER);
-     
-    for (dlstHead(iMBList, (void **) &MBinstance); 
-    MBinstance != NULL; 
-    dlstNext(iMBList, (void **) &MBinstance))
-    {
-        if (MBinstance->fCodedMB)
-        {
-            dataItemStartByteIndex = MBinstance->DataItemStartByteIndex;
-            dataItemStartBitIndex  = MBinstance->DataItemStartBitIndex;
-            dataItemEndByteIndex   = MBinstance->DataItemEndByteIndex;
-            dataItemEndBitIndex    = MBinstance->DataItemEndBitIndex;
-            
-            /* ac_pred_flag, if it exsits */
-            vdtCopyBuffer(iInBuffer, iOutBuffer,
-                dataItemStartByteIndex[3], dataItemStartBitIndex[3],
-                dataItemEndByteIndex[3], dataItemEndBitIndex[3]);
-            
-            /* CBPY,  */
-            vdtCopyBuffer(iInBuffer, iOutBuffer,
-                dataItemStartByteIndex[2], dataItemStartBitIndex[2],
-                dataItemEndByteIndex[2], dataItemEndBitIndex[2]);
-            /* DQUANT, if it exsits */
-            vdtCopyBuffer(iInBuffer, iOutBuffer,
-                dataItemStartByteIndex[1], dataItemStartBitIndex[1],
-                dataItemEndByteIndex[1], dataItemEndBitIndex[1]);
-            
-            /* INTRA DCs, if they exsit */
-            if (!iColorEffect)
-            {
-                vdtCopyBuffer(iInBuffer, iOutBuffer,
-                    dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                    dataItemEndByteIndex[4], dataItemEndBitIndex[4]);
-            }
-            else
-            {
-                if (!(VDT_NO_DATA(dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                    dataItemEndByteIndex[4], dataItemEndBitIndex[4])))   
-                {
-                    vdtCopyBuffer(iInBuffer, iOutBuffer,
-                        dataItemStartByteIndex[4], dataItemStartBitIndex[4],
-                        dataItemStartByteIndex[8], dataItemStartBitIndex[8]);
-                    ResetMPEG4IntraDcUV();
-                }
-            }
-        }
-    }
-     
-    /* make sure the head of the list is reset */
-    dlstHead(iMBList, (void **) &MBinstance);
-}
-
-/*
-* ResetMPEG4IntraDcUV
-*
-* Parameters: 
-*
-* Function:
-*    This function resets the DCc for U V block in INTRA MB.
-*    Inputs are valid only with Color Effect
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ResetMPEG4IntraDcUV()
-{
-    /* set INTRADC for u,v in the output buffer */
-    TInt sizeU, sizeCodeU, sizeCodeLengthU, valueU, valueCodeU, valueCodeLengthU;
-    TInt sizeV, sizeCodeV, sizeCodeLengthV, valueV, valueCodeV, valueCodeLengthV;
-    TInt curDcScaler, delta; 
-    TReal realDelta, realVal;
-    TInt mbh, mbv, mbd;  // previous MB in the horizontal, vertical and diagonal directions
-    TInt codeMB; 
-    
-    // initialize for codewords
-    sizeU = sizeCodeU = sizeCodeLengthU = valueCodeU = valueCodeLengthU = 0;
-    sizeV = sizeCodeV = sizeCodeLengthV = valueCodeV = valueCodeLengthV = 0;
-
-    // initialize for prediction
-    mbh = mbv = mbd = VDX_MB_INTER;
-    codeMB = 0;
-    
-    // NOTE: VDX_MB_INTER=1, VDX_MB_INTRA=2, NOT-CODED MB has a value of 0
-    if (iVopCodingType == VDX_VOP_TYPE_I)
-    {
-        /* encode intra DC coefficients for INTRA MBs of I-VOP if 
-           either of the following is true:
-            -
-            -
-            else, do not encode intra DC
-           (because rest of MBs have differential intra DC, which is zero)
-        */
-        if (!iCurMBNumInVP || 
-             (!(iCurMBNum%iMBsinWidth) && (iCurMBNumInVP<iMBsinWidth)))
-        {
-            codeMB = 1;
-        }
-    }
-    else if (iVopCodingType == VDX_VOP_TYPE_P)
-    {
-        if (iCurMBNumInVP>iMBsinWidth)
-        { 
-            if (iCurMBNum%iMBsinWidth)
-            {
-                mbh = iMBType[iCurMBNum-1];
-                mbd = iMBType[iCurMBNum-iMBsinWidth-1];
-            }
-            mbv = iMBType[iCurMBNum-iMBsinWidth];
-        }        
-        else if (iCurMBNumInVP==iMBsinWidth)
-        {
-            if (iCurMBNum%iMBsinWidth)
-            {
-                mbh = iMBType[iCurMBNum-1];
-            }
-            mbv = iMBType[iCurMBNum-iMBsinWidth];
-        }
-        else if (iCurMBNumInVP>0)
-        {
-            if (iCurMBNum%iMBsinWidth)
-            {
-                mbh = iMBType[iCurMBNum-1];
-            }
-        }
-      
-        // 
-        if ((mbh<VDX_MB_INTRA && mbv<VDX_MB_INTRA) ||
-            (mbd==VDX_MB_INTRA && ((mbh==VDX_MB_INTRA && mbv<VDX_MB_INTRA) || 
-            (mbh<VDX_MB_INTRA && mbv==VDX_MB_INTRA))))
-        {
-            codeMB = 1;
-        }
-    }
-
-    if (codeMB)  // if IntraDC need to be coded
-    {
-        // color-toned U,V values
-        valueU = iColorToneU;
-        valueV = iColorToneV;
-      
-        // compensate for different QP than original
-        if (iCurQuant != iRefQuant)  
-        {
-            // calculate change in dc value
-            curDcScaler = GetMpeg4DcScalerUV(iCurQuant);
-            realDelta = TReal(iDcScaler-curDcScaler)/TReal(curDcScaler);
-            if (realDelta != 0.0)
-            {
-                // U
-                realVal = realDelta*TReal(valueU);
-                delta = TInt(realVal + ((realVal<0) ? (-0.5) : (0.5)));
-                valueU += delta;
-                // V
-                realVal = realDelta*TReal(valueV);
-                delta = TInt(realVal + ((realVal<0) ? (-0.5) : (0.5)));
-                valueV += delta;
-            }
-        }
-         
-        // get codewords
-        GetMPEG4IntraDcCoeffUV(valueU, sizeU, sizeCodeU, sizeCodeLengthU, 
-        valueCodeU, valueCodeLengthU);
-        GetMPEG4IntraDcCoeffUV(valueV, sizeV, sizeCodeV, sizeCodeLengthV, 
-        valueCodeV, valueCodeLengthV);
-      
-        // code codewords
-        // U
-        sPutBits(iOutBuffer, sizeCodeLengthU, sizeCodeU); // dct_dc_coeff size
-        if (sizeCodeU != 3) // size=0
-        {
-            sPutBits(iOutBuffer, valueCodeLengthU, valueCodeU); // dct_dc_coeff differential
-            if (valueCodeLengthU>8)
-                sPutBits(iOutBuffer, 1, 1); // marker bit
-        }
-      
-        // V
-        sPutBits(iOutBuffer, sizeCodeLengthV, sizeCodeV); // dct_dc_coeff size
-        if (sizeCodeV != 3) // size=0
-        {
-            sPutBits(iOutBuffer, valueCodeLengthV, valueCodeV); // dct_dc_coeff differential
-            if (valueCodeLengthV>8)
-                sPutBits(iOutBuffer, 1, 1); // marker bit
-        }
-    }    
-    else
-    {        
-        sPutBits (iOutBuffer, 2, 3); /* U */
-        sPutBits (iOutBuffer, 2, 3); /* V */
-    }
-}
-
-
-/*
-* GetMPEG4IntraDcCoeffUV
-*
-* Parameters: 
-*     aValue   coefficient value
-*     aDCAC    pointer the reconstructed coefficients
-* Function:
-*    This function fills the reconstructed DCAC values for INTRA block.
-*    Inputs are valid only with Color Effect
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::GetMPEG4IntraDcCoeffUV(TInt aValue, TInt& aSize, 
-  TInt& aSizeCode, TInt& aSizeCodeLength, TInt& aValueCode, TInt& aValueCodeLength)
-{
-    int absVal = (aValue>=0 ? aValue : -aValue);
-    // size of aValueCode
-    for (aSize=0; absVal|0; absVal>>=1, aSize++) ;
-    if (aSize)
-    {
-        // codeword for aSize
-        if (aSize==1)
-        {
-            aSizeCode = 2;
-            aSizeCodeLength = 2;
-        }
-        else
-        {
-            aSizeCode = 1;
-            aSizeCodeLength = aSize;
-        }
-    
-        // codeword for aValue
-        aValueCode = aValue;
-        if (aValue<0)
-            aValueCode += ((1<<aSize)-1);
-        aValueCodeLength = aSize;
-    }
-    else 
-    {
-        // codeword for aSize
-        aSizeCode = 3;        // codeword for size=0
-        aSizeCodeLength = 2;
-        // no codeword for aValue
-        aValueCode = aValueCodeLength = 0;
-    }
-}
-
-
-/*
-* AddOneBlockDCACrecon
-*
-* Parameters: 
-*     aIndex   block index
-*     aDCAC    pointer the reconstructed coefficients
-* Function:
-*    This function fills the reconstructed DCAC values for INTRA block.
-*    Inputs are valid only with Color Effect
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::AddOneBlockDCACrecon(int aIndex, int *aDCAC)
-{
-    VDTASSERT(aIndex >= 0 && aIndex < 6); 
-    
-    if (aDCAC && iDoModeTranscoding && (iTargetFormat == EVedVideoTypeH263Profile0Level10 ||
-                                        iTargetFormat == EVedVideoTypeH263Profile0Level45))
-    {
-      /* we only need the reconstructed DCACs for MPEG4 -> H263 */
-      /* It is a coded block    */
-      memcpy(iDCTBlockData + (aIndex << 6), aDCAC, sizeof(int) * BLOCK_COEFF_SIZE);
-    }
-}
-
-/*
-* ConstructH263MBData
-*
-* Parameters: 
-*     aNewMCBPCLen     new length of mcbpc
-*     aNewMCBPC        new mcbpc
-* Function:
-*    This function creates a new H263 MB
-*    Inputs are valid only with Color Effect
-* Returns:
-*    VDC error codes
-*
-*/
-int CMPEG4Transcoder::ConstructH263MBData(dmdPParam_t *aParam, int /*aNewMCBPCLen*/, int /*aNewMCBPC*/)
-{
-    /* MB data part1: output MCBPC, CBPY, DQuant, MV, intra DC etc */
-    int *dataItemStartByteIndex;
-    int *dataItemStartBitIndex;
-    int *dataItemEndByteIndex;
-    int *dataItemEndBitIndex;
-    int quant, dquant;
-    int codedBlockPattern = 0;
-    
-    const unsigned int sDquant[5] = 
-    {
-        1, 0, (unsigned int)65536, 2, 3
-    };
-    
-  if (iVopCodingType == VDX_VOP_TYPE_P) 
-    {
-        dataItemStartByteIndex = iCurPMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurPMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurPMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurPMBinstance->DataItemEndBitIndex;
-        quant = iCurPMBinstance->quant;
-        dquant = iCurPMBinstance->dquant;
-    }
-    else
-    {
-        dataItemStartByteIndex = iCurIMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurIMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurIMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurIMBinstance->DataItemEndBitIndex;
-        quant = iCurIMBinstance->quant;
-        dquant = iCurIMBinstance->dquant;
-    }
-    
-    if (iPreQuant != quant - dquant)
-    {
-        /* last quant in MPEG4 and H263 is different, dquant and VLCs may not be reused */
-        if (abs(quant - iPreQuant) > 2)
-        {
-            /* VLCs cannot be reused, obtain the new ones */
-            sQuantizeMB(iDCTBlockData, quant, iPreQuant, 
-                iMBCodingType, iColorEffect);
-            quant = iPreQuant;
-            dquant = 0;
-        }
-        else
-        {
-            /* VLCs can be reused, but need to change dquant and MCBPC */
-            dquant = quant - iPreQuant;
-        }
-    }
-    
-    /* MB stuffing bits if they exsit */
-    vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[11], dataItemStartBitIndex[11],
-        dataItemEndByteIndex[11], dataItemEndBitIndex[11]);
-    
-    if (iMBCodingType == VDX_MB_INTER) 
-    {
-        VDTASSERT(aParam);
-        tMBPosition mbPos;
-        tMotionVector mvTestOutside;
-        mbPos.x = aParam->xPosInMBs * 16; 
-        mbPos.y = aParam->yPosInMBs * 16;
-        mbPos.LeftBound = 0;
-        mbPos.RightBound = iVDEInstance->lumWidth << 1;
-        mbPos.TopBound = 0;
-        mbPos.BottomBound = iVDEInstance->lumHeight << 1;
-        mvTestOutside.mvx = (int16) ((aParam->mvx[0] << 1) / 10);
-        mvTestOutside.mvy = (int16) ((aParam->mvy[0] << 1) / 10);
-        
-        /* Three cases for MVs. 1): 4MVs -> need mapping 2). 1 outside frame MV 3) rounding type = 1 */
-        vdcInstance_t * vdcTemp = (vdcInstance_t *)(iVDEInstance->vdcHInstance);
-        
-        /* Two cases for MVs. 1): 4MVs -> need mapping 2). 1 outside frame MV */
-        if (iCurPMBinstance->numMVs == 4 || (iCurPMBinstance->numMVs == 1 && 
-            vbmMVOutsideBound(&mbPos, &mvTestOutside, 1)) || vdcTemp->pictureParam.rtype)
-        {
-            int32 numTextureBits;
-            int32 searchRange = 16;
-            tMotionVector   *initPred; 
-            (h263mbi+iCurMBNum)->QuantScale = (int16) quant;
-            (h263mbi+iCurMBNum)->dQuant = (int16) dquant;
-            
-            /* note: this buffer is also used in the diamond search and half-pixel search !!!!! 
-               which needs at least 8 points
-            */
-            initPred = (tMotionVector*) malloc(8 * sizeof (tMotionVector));
-            if(!initPred)
-            {
-                //Memory not available 
-                return TX_ERR;
-            }
-
-                        
-            for (int i = 0; i < iCurPMBinstance->numMVs ; i++)
-            {
-                (initPred + i)->mvx = (int16) (aParam->mvx[i] / 10); /* the recorded mv is multipied by 10, */
-                (initPred + i)->mvy = (int16) (aParam->mvy[i] / 10); /* the recorded mv is multipied by 10, */
-            }
-            int32 noOfPredictors = iCurPMBinstance->numMVs;
-            
-            /* perform the 4MVs -> 1MV mapping, and output this MB */
-            vbmPutInterMB(&mbPos,
-                iOutBuffer,aParam,
-                initPred, noOfPredictors,
-                (u_int32) iVDEInstance->lumWidth, (u_int32) iVDEInstance->lumHeight,
-                searchRange, iCurMBNum, &numTextureBits, 
-                (int16)iColorEffect, h263mbi);
-            /*  the MVs buffer is updated inside vbmPutInterMB */
-            
-            if (initPred)
-                free(initPred);
-        }
-        else
-        {
-            /* Here, for Inter MB with One inside Frame MV, we simply reuse the DCTs */
-            VDTASSERT(iCurPMBinstance->numMVs == 1);
-            
-            /* It is a coded MB, output 1 bit COD (it always exists in P frame) */
-            sPutBits (iOutBuffer, 1, 0);
-            int         cbpy;
-            int         mcbpcVal;
-            int         len;
-            
-            codedBlockPattern = sFindCBP(iDCTBlockData, OFF);
-            mcbpcVal = iColorEffect? 0 : (codedBlockPattern & 3);
-            cbpy = ((codedBlockPattern >> 2) & 0xf);
-            vbmGetH263PMCBPC(dquant, iColorEffect, cbpy, mcbpcVal, len);
-            sPutBits(iOutBuffer, len, mcbpcVal); //MCBPC, CBPY
-            
-            /* DQUANT, if it exsits */
-            if (dquant)
-            {
-                sPutBits(iOutBuffer, 2, sDquant[dquant + 2]);
-            }
-            /* recode MVs, one more indice exists in the MV VLC table in MPEG4
-               moreover, vop_fcode can be larger than 1 (although it may rarely happens), 
-                 so it is better to redo the VLC coding
-      */
-            /* the recorded mv is multipied by 10, in pixel unit */
-            int16 mvx = (int16) ((aParam->mvx[0] << 1) / 10); 
-            int16 mvy = (int16) ((aParam->mvy[0] << 1) / 10);
-            
-            tMotionVector   lPredMV[4];
-            tMBInfo *mbi = h263mbi + iCurMBNum;
-            
-            /* get the new predicted MV */
-            vbmMvPrediction(mbi, iCurMBNum, lPredMV, (u_int32)iMBsinWidth);
-            
-            vbmEncodeMVDifferential(mvx - lPredMV[0].mvx, mvy - lPredMV[0].mvy, 1, iOutBuffer);
-            cbpy = 32;
-            /* following is the block level data */
-            for (int i = 0; i < (iColorEffect? 4 : 6); i++)
-            {
-                int fBlockCoded = cbpy & codedBlockPattern;
-                if (fBlockCoded)
-                {
-                    /* here we do the VLC coding again */ 
-                    int numTextureBits = 0;
-                    vdtPutInterMBCMT(iOutBuffer,0, iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, ON);
-                }
-                cbpy >>= 1;
-            } 
-            
-            /* update the MVs buffer */
-            (h263mbi + iCurMBNum)->MV[0][0] = (int16) ((aParam->mvx[0] << 1) / 10); /* the recorded mv is multipied by 10 */
-            (h263mbi + iCurMBNum)->MV[0][1] = (int16) ((aParam->mvy[0] << 1) / 10); /* the recorded mv is multipied by 10 */
-            
-        }  /* end of if 4MVs */
-    }
-    else /* INTRA MB */
-    {
-        /* update the MVs buffer */
-        (h263mbi + iCurMBNum)->MV[0][0] = 0;
-        (h263mbi + iCurMBNum)->MV[0][1] = 0;
-        /* MPEG4 and H263 use different methods for INTRA MB, redo the VLC coding */
-        int         cbpy;
-        int         mcbpcVal;
-        int         len;
-        
-        codedBlockPattern = sFindCBP(iDCTBlockData, ON);
-        mcbpcVal = iColorEffect? 0 : (codedBlockPattern & 3);
-        cbpy = ((codedBlockPattern >> 2) & 0xf);
-        vbmGetH263IMCBPC(dquant, (iVopCodingType == VDX_VOP_TYPE_P), iColorEffect, cbpy, mcbpcVal, len);
-        sPutBits(iOutBuffer, len, mcbpcVal); //COD, MCBPC, CBPY
-        
-        /* DQUANT, if it exsits */
-        if (dquant)
-        {
-            sPutBits(iOutBuffer, 2, sDquant[dquant + 2]);
-        }
-        cbpy = 32;
-        
-        /* following is the block level data */
-        for (int i = 0; i < (iColorEffect? 4 : 6); i++)
-        {
-            /* requantize INTRA DC */
-            /* DC Quantization */
-            int coeff = (iDCTBlockData + i * BLOCK_COEFF_SIZE)[0] >> 3;
-            
-            if(coeff < 1) coeff = 1;
-            if(coeff > 254) coeff = 254;
-            if(coeff == 128)
-            {
-                sPutBits(iOutBuffer, 8, 255);
-            }
-            else
-            {
-                sPutBits(iOutBuffer, 8, coeff);
-            }
-            
-            (iDCTBlockData + i * BLOCK_COEFF_SIZE)[0] = coeff;
-            if(cbpy & codedBlockPattern)
-            {
-                int numTextureBits = 0;
-                vdtPutInterMBCMT(iOutBuffer,1, iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, ON);
-            }
-            cbpy >>= 1;
-        }
-    }
-    
-  if (iColorEffect && (iMBCodingType == VDX_MB_INTRA))
-    {
-        ResetH263IntraDcUV(iOutBuffer, iColorToneU, iColorToneV);        
-    }
-  iPreQuant = quant;
-  
-  return TX_OK;
-}
-
-/*
-* ConstructRegularMPEG4MBData
-*
-* Parameters: 
-*     aNewMCBPCLen     new length of mcbpc
-*     aNewMCBPC        new mcbpc
-* Function:
-*    This function rearranges the data for bitstream with data partitioning
-*    Only valid in Data Partitioned mode
-*    Inputs are valid only with Color Effect
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ConstructRegularMPEG4MBData(int aNewMCBPCLen, int aNewMCBPC)
-{
-  /* MB data part1: output MCBPC, CBPY, DQuant, MV, intra DC etc */
-    int *dataItemStartByteIndex;
-    int *dataItemStartBitIndex;
-    int *dataItemEndByteIndex;
-    int *dataItemEndBitIndex;
-    
-    if (iVopCodingType == VDX_VOP_TYPE_P) 
-    {
-        dataItemStartByteIndex = iCurPMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurPMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurPMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurPMBinstance->DataItemEndBitIndex;
-    }
-    else
-    {
-        dataItemStartByteIndex = iCurIMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurIMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurIMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurIMBinstance->DataItemEndBitIndex;
-    }
-    
-    /* MB stuffing bits if they exsit */
-    vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[11], dataItemStartBitIndex[11],
-        dataItemEndByteIndex[11], dataItemEndBitIndex[11]);
-    
-    if (iVopCodingType == VDX_VOP_TYPE_P)
-    {
-        /* It is a coded MB, output  1 bit COD (it always exists in P frame) */
-        sPutBits (iOutBuffer, 1, 0);
-    }
-    
-    /* MCBPC. NOTE: the positions do not include MCBPC stuffing bits !! */
-    if (iColorEffect)
-    {
-        /* MCBPC Changed */
-        sPutBits(iOutBuffer, aNewMCBPCLen, aNewMCBPC);
-    }
-    else
-    {
-        vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[0], dataItemStartBitIndex[0],
-            dataItemEndByteIndex[0], dataItemEndBitIndex[0]);
-    }
-    /* ac_pred_flag, if it exsits */
-    vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[3], dataItemStartBitIndex[3],
-        dataItemEndByteIndex[3], dataItemEndBitIndex[3]);
-    
-    /* CBPY */
-    vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[2], dataItemStartBitIndex[2],
-        dataItemEndByteIndex[2], dataItemEndBitIndex[2]);
-    
-    /* DQUANT, if it exsits */
-    vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[1], dataItemStartBitIndex[1],
-        dataItemEndByteIndex[1], dataItemEndBitIndex[1]);
-    
-    if (iMBCodingType == VDX_MB_INTER) 
-    {
-        /* MVs, if they exsit */
-        vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[10], dataItemStartBitIndex[10],
-            dataItemEndByteIndex[10], dataItemEndBitIndex[10]);
-    }
-    
-    /* following is the block level data */
-    for (int i = 0; i < (iColorEffect? 4 : 6); i++)
-    {
-        /* INTRA DC, if it exsits */
-        vdtCopyBuffer(iInBuffer, iOutBuffer, dataItemStartByteIndex[i + 4], dataItemStartBitIndex[i + 4],
-            dataItemEndByteIndex[i + 4], dataItemEndBitIndex[i + 4]);
-        
-        /* block data part2, AC or DCT coefficients */
-        if (iBitStreamMode == EVedVideoBitstreamModeMPEG4DP_RVLC || iBitStreamMode == EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC)
-        {
-        /* remember for data partitioning, the positions only indicate the  
-        AC or DCTs coefficients
-            */
-            if (VDT_NO_DATA(iBlockStartByteIndex[i], iBlockStartBitIndex[i],
-                iBlockEndByteIndex[i], iBlockEndBitIndex[i]))  
-            {
-                /* no coefficients,skip this block */
-                continue;
-            }
-            else
-            {
-                /* for RVLC coding, we transform the block data back to VLC */
-                int numTextureBits = 0;
-                /* redo the entropy coding, RVLC -> VLC 
-                only for AC (IMB) or DCT (PMB) coefficients
-                */
-                if (iMBCodingType == VDX_MB_INTRA)
-                {
-                    vdtPutIntraMBCMT(iOutBuffer,iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, i, 1, 0);
-                }
-                else
-                {
-                    vdtPutInterMBCMT(iOutBuffer,0, iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, OFF);
-                }
-            }
-        }
-        else /* ouput the AC or DCT coefficients */
-        {
-            bufEdit.copyMode = CopyWhole; /* CopyWhole */
-            vdtCopyBuffer(iInBuffer,iOutBuffer,
-                iBlockStartByteIndex[i],iBlockStartBitIndex[i],
-                iBlockEndByteIndex[i],iBlockEndBitIndex[i]);
-        }
-    }
-  if (iColorEffect && (iMBCodingType == VDX_MB_INTRA))
-    {
-        ResetMPEG4IntraDcUV();
-    }
-}
-
-
-
-/*
-* AddOneBlockDataToMB
-*
-* Parameters: 
-*     blockData        block data before VLC coding, in ZigZag order
-* Function:
-*    This function input one block data to current MB
-*    only here the whole MB data is retrieved (COD=0)
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::AddOneBlockDataToMB(int aBlockIndex, int *aBlockData)
-{
-    VDTASSERT(aBlockIndex >= 0 && aBlockIndex < 6); 
-    
-    
-    if (aBlockData && iDoModeTranscoding)
-    {
-      /* iDCTBlockData is only used when we need to convert the bitstream to MPEG4_RESYN
-      It is a coded block   
-        */
-      if (iMBCodingType == VDX_MB_INTRA && (iTargetFormat == EVedVideoTypeH263Profile0Level10 ||
-                                            iTargetFormat == EVedVideoTypeH263Profile0Level45))
-        {
-          /* we only need the reconstructed DCACs, skipped */
-        }
-        else
-        {
-          memcpy(iDCTBlockData + (aBlockIndex << 6), aBlockData, sizeof(int) * BLOCK_COEFF_SIZE);
-        }
-    }
-    else 
-    {
-      memset(iDCTBlockData + (aBlockIndex << 6), 0, sizeof(int) * BLOCK_COEFF_SIZE);
-    }
-    
-
-    
-    iBlockEndByteIndex[aBlockIndex] = iInBuffer->getIndex;
-    iBlockEndBitIndex[aBlockIndex] = iInBuffer->bitIndex;
-}
-
-/*
-* ErrorResilienceInfo
-*
-* Parameters: 
-*     header        VOL Header data
-* Function:
-*    This function records the position of resnc_marker_disable bit
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ErrorResilienceInfo(vdxVolHeader_t *header, int aByte, int aBit)
-{
-    if (header)
-    {
-                
-        memcpy(&iVOLHeader, header, sizeof(vdxVolHeader_t));  // save the header info
-
-    }
-    else
-    {
-        iErrorResilienceStartByteIndex = aByte;  /* save the bits position */
-        iErrorResilienceStartBitIndex  = aBit;
-    }
-}
-
-
-
-/*
-* MPEG4TimerResolution
-*
-* Parameters: 
-*     
-* Function:
-*    This function records the position of vop_time_increment_resolution bit
-* Returns:
-*    None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::MPEG4TimerResolution(int aStartByteIndex, int aStartBitIndex)
-{
-    iTimeResolutionByteIndex = aStartByteIndex;
-    iTimeResolutionBitIndex  = aStartBitIndex;
-}
-
-
-
-void CMPEG4Transcoder::ConstructVOSHeader(int aMPEG4, vdeDecodeParamters_t *aDecoderInfo)
-{
-  if (!aMPEG4 )
-  {
-    /* for H263 and MPEG4 shortheader, no vos generated */
-    if (iErrorResilienceStartByteIndex == KDataNotValid && 
-      iErrorResilienceStartBitIndex == KDataNotValid)
-    {
-      iBitStreamMode = EVedVideoBitstreamModeH263; // pure H.263
-      aDecoderInfo->vosHeaderSize = aDecoderInfo->fModeChanged? KH263ToMpeg4VosSize : 0; 
-    }
-    else
-    {
-      /* we went into the VOL layer. It is a MPEG4 bitstream with short header */
-      iBitStreamMode = EVedVideoBitstreamModeMPEG4ShortHeader; /* MPEG4 shortheader */
-      iShortHeaderEndByteIndex = iInBuffer->getIndex;
-      iShortHeaderEndBitIndex  = iInBuffer->bitIndex;
-      aDecoderInfo->vosHeaderSize = aDecoderInfo->fModeChanged? KH263ToMpeg4VosSize : KShortHeaderMpeg4VosSize; 
-    }
-    fFirstFrameInH263 = ETrue;
-  }
-  else 
-  {
-    iNumMBsInOneVOP = (iVDEInstance->lumHeight * iVDEInstance->lumWidth) / 256;
-    
-    /* even iBitStreamMode is given outside, we renew it here anyway */
-    iBitStreamMode = sGetMPEG4Mode(iVOLHeader.error_res_disable,
-      iVOLHeader.data_partitioned, iVOLHeader.reversible_vlc);
-    
-    if (iTargetFormat != EVedVideoTypeH263Profile0Level10 &&
-      iTargetFormat != EVedVideoTypeH263Profile0Level45) /* EVedVideoTypeMPEG4SimpleProfile or None */
-    {
-      /* copy from the begining of the input buffer */
-      vdtCopyBuffer(iInBuffer,iOutBuffer,0,7, iTimeResolutionByteIndex, iTimeResolutionBitIndex); 
-      /* it is 16 bits */
-      sPutBits (iOutBuffer, KMpeg4VopTimeIncrementResolutionLength, *aDecoderInfo->aMPEG4TargetTimeResolution); 
-      
-      int startByteIndex, startBitIndex;
-      startByteIndex = iTimeResolutionByteIndex + 2;
-      startBitIndex  = iTimeResolutionBitIndex;
-      
-      sPutBits(iOutBuffer, 1, MARKER_BIT);
-      /* close fixed_vop_rate */
-      sPutBits (iOutBuffer, 1, 0); /* it is 1 bit */
-      
-      int num_bits = 0;
-      vdcInstance_t * vdcTemp = (vdcInstance_t *)(iVDEInstance->vdcHInstance);
-      if (vdcTemp->pictureParam.fixed_vop_rate)
-      {
-        for (num_bits = 1; ((vdcTemp->pictureParam.time_increment_resolution-1) >> num_bits) != 0; num_bits++)
-            {
-            }
-      }
-      num_bits += 2;
-      
-      /* following is to skip the fixed_vop_rate */
-      int bitsRemain, bitShift = 0;
-      int bitsToMove = 0 ;
-      /* complete the byte */
-      if (startBitIndex != 7)
-      {
-        bitShift = startBitIndex + 1;
-        bitsToMove = (num_bits < bitShift) ? num_bits : bitShift; 
-        /* update statistics to take care of bit addition or byte completion  */
-        if (num_bits < bitShift)
-        {
-          /* bits skipped but byte not completed */
-          startBitIndex -= bitsToMove;
-        }
-        else
-        {
-          /* byte completed */
-          startByteIndex ++;
-          startBitIndex = 7;
-        }
-      }
-      /* full bytes to skip */
-      startByteIndex += ((num_bits - bitsToMove) >> 3);
-      bitsRemain = (num_bits - bitsToMove) % 8;
-      
-      /* the remaining bits */
-      startBitIndex = ( bitsRemain != 0) ? 7 - bitsRemain : startBitIndex;
-
-      
-      /* check if we have user data in the end of VOL; it cannot be copied as such but needs to be byte aligned */
-      /* first need to rewind the input buffer to be able to seek in it */
-      int16 error = 0;
-      int curByteIndex = iInBuffer->getIndex;
-      int curBitIndex = iInBuffer->bitIndex;
-      int bits = ((curByteIndex - iTimeResolutionByteIndex)<<3) + (7-curBitIndex);
-      bibRewindBits(bits, iInBuffer, &error);
-      int sncCode = sncSeekMPEGStartCode(iInBuffer, 
-          vdcTemp->pictureParam.fcode_forward, 1 /* don't check VOPs */, 1 /* check for user data*/, &error);
-        
-      /* record next resync position */
-      int resyncByteIndex = iInBuffer->getIndex;
-        
-      int stuffBits = 0;
-      int userDataExists = 0;
-      if ( sncCode == SNC_USERDATA )
-      {
-        /* copy only until this sync code, and copy the rest separately in the end. */
-        userDataExists = 1;
-      }
-      else
-      {
-        /* No UD */
-        /* restore the original pointers in iInBuffer */
-        iInBuffer->getIndex = curByteIndex;
-        iInBuffer->bitIndex = curBitIndex;
-      }
-      
-      if (iDoModeTranscoding || aDecoderInfo->fHaveDifferentModes)
-      {
-        /* close the error resilience tools, change the bitstream to regular MPEG4 with resyn marker */
-        int numBits = iVOLHeader.data_partitioned ? 3 : 2;
-        
-        bufEdit.copyMode = CopyWithEdit; 
-        bufEdit.editParams[0].StartByteIndex = iErrorResilienceStartByteIndex; 
-        bufEdit.editParams[0].StartBitIndex = iErrorResilienceStartBitIndex; 
-        bufEdit.editParams[0].curNumBits = numBits; 
-        bufEdit.editParams[0].newNumBits = 2;  
-        bufEdit.editParams[0].newValue = 0;  /* new codeword: resyn, no dp, no rvlc */
-        CopyStream(iInBuffer,iOutBuffer,&bufEdit, startByteIndex,startBitIndex); /* copy from vop_time_increment_resolution */
-
-        /* rewind stuffing bits */
-        int16 error;
-        sncRewindStuffing(iOutBuffer, &error);        
-
-        // stuff bits in outbuffer for next start code   
-        vdtStuffBitsMPEG4(iOutBuffer);
-      }
-      else
-      {
-      
-        /* rewind stuffing bits */
-        sncRewindStuffing(iInBuffer, &error);        
-        
-        /* record the number of bits rewinded - can be from 0 to 8 */
-        /* note that iInBuffer must be byte aligned before rewinding */
-        if (iInBuffer->bitIndex == 7) // full byte rewind
-        { 
-          stuffBits = ( (int)(iInBuffer->getIndex) < resyncByteIndex) ? 8 : 0;
-        }
-        else 
-        {
-          stuffBits = iInBuffer->bitIndex + 1;
-        }
-          
-        /* copy the rest of VOS until the first VOP (or UD) */
-        bufEdit.copyMode = CopyWhole; 
-        vdtCopyBuffer(iInBuffer,iOutBuffer, startByteIndex,startBitIndex,
-          resyncByteIndex, iInBuffer->bitIndex); 
-        
-        // stuff bits in outbuffer for next start code   
-        vdtStuffBitsMPEG4(iOutBuffer);
-        
-        // move inbuffer pointer back to original value
-        bibForwardBits(stuffBits, iInBuffer);
-      }
-      
-      
-      if ( userDataExists )
-      {
-        /* seek for VOP start code */
-        int sncCode = sncSeekMPEGStartCode(iInBuffer, 
-          vdcTemp->pictureParam.fcode_forward, vdcTemp->pictureParam.error_res_disable, 0, &error);
-        
-        /* rewind stuffing bits */
-        sncRewindStuffing(iInBuffer, &error);        
-        
-        // record the number of bits rewinded - can be from 0 to 8
-        // note that iInBuffer must be byte aligned before rewinding
-        if (iInBuffer->bitIndex == 7) // full byte rewind
-        { 
-          stuffBits = ( (int)(iInBuffer->getIndex) < resyncByteIndex) ? 8 : 0;
-        }
-        else 
-        {
-          stuffBits = iInBuffer->bitIndex + 1;
-        }
-        
-        bufEdit.copyMode = CopyWhole; 
-        vdtCopyBuffer(iInBuffer,iOutBuffer, resyncByteIndex, 7,
-          iInBuffer->getIndex, iInBuffer->bitIndex); 
-        
-        // stuff bits in outbuffer for next start code   
-        vdtStuffBitsMPEG4(iOutBuffer);
-        
-        // move inbuffer pointer back to original value
-        bibForwardBits(stuffBits, iInBuffer);
-        
-        
-        
-      }
-      
-      aDecoderInfo->vosHeaderSize = iOutBuffer->getIndex;
-    }
-        
-    PRINT((_L("CMPEG4Transcoder: ConstructVOSHeader. resyn: %d, data partitioned: %d, rvlc: %d, resolution: %d"),
-      iVOLHeader.error_res_disable, iVOLHeader.data_partitioned, iVOLHeader.reversible_vlc,
-      aDecoderInfo->iTimeIncrementResolution));
-  }
-  PRINT((_L("CMPEG4Transcoder:  streammode: %d, outputformat: %d, vos size : %d"), 
-    iBitStreamMode, iTargetFormat, aDecoderInfo->vosHeaderSize));
-}
-
-
-
-
-/****************************************************************
-*                                                               *
-*    Functions for H.263, or H.263 -> MPEG4 (only baseline H.263) *
-*                                                               *
-*****************************************************************/
-
-
-/* Luminance block dc-scaler value corresponding to QP values of 0-31 */
-const u_int8 sLumDCScalerTbl[32] = 
-{   
-       0,  8,  8,  8,  8, 10, 12, 14, 
-    16, 17, 18, 19, 20, 21, 22, 23, 
-    24, 25, 26, 27, 28, 29, 30, 31, 
-    32, 34, 36, 38, 40, 42, 44, 46 
-};
-
-/* Chrominance block dc-scaler value corresponding to QP values of 0-31 */
-const u_int8 sChrDCScalerTbl[32] = 
-{   
-       0,  8,  8,  8,  8,  9,  9, 10, 
-    10, 11, 11, 12, 12, 13, 13, 14, 
-    14, 15, 15, 16, 16, 17, 17, 18, 
-    18, 19, 20, 21, 22, 23, 24, 25 
-};
-
-/*
-* sGetMPEG4INTRADCValue
-*
-* Parameters: 
-*     intraDC      reconstructed intra DC from H263
-*     QP           quantion factor
-*     blockNum     block number (0 to 5)
-*     currMBNum    current MB number
-*     mbinWidth    number of MBs in picure width
-*     dcData       matrix to store the INTRA DC values
-*     mbVPNumber   matrix recording the video packet number for each MB
-*     
-* Function:
-*    This function gets the new intra DC for MPEG4
-* Returns:
-*     INTRA DC to put into MPEG4 bitstream
-* Error codes:
-*    None
-*
-*/
-int sGetMPEG4INTRADCValue(int intraDC, int blockNum, int currMBNum,
-                                                    int32 QP, int32 mbinWidth, int **dcData, int *mbVPNumber)
-{
-    int tempDCScaler;
-    int blockA = 0, blockB = 0, blockC = 0;
-    int gradHor, gradVer, predDC;
-    
-    VDTASSERT(currMBNum >= 0);
-    VDTASSERT(QP <= 31);
-    
-  /* Prediction blocks A (left), B (above-left), and C (above) */
-    switch (blockNum)
-    {
-        case 0:
-        case 4:
-        case 5:
-      /* Y0, U, and V blocks */
-            if (((currMBNum % mbinWidth) == 0) || /* Left edge */
-                (mbVPNumber[currMBNum - 1] != mbVPNumber[currMBNum]))
-            {
-                blockA = 1024; /* fixed value for H263 */
-            }
-            else
-            {
-                blockA = dcData[currMBNum - 1][blockNum > 3? blockNum : 1];
-            }
-            
-            if (((currMBNum / mbinWidth) == 0) || /* Top Edge */
-                ((currMBNum % mbinWidth) == 0) || /* Left Edge */
-                (mbVPNumber[currMBNum - mbinWidth - 1] != mbVPNumber[currMBNum]))
-            {
-                blockB = 1024;
-            }
-            else
-            {
-                blockB = dcData[currMBNum - mbinWidth - 1][blockNum > 3? blockNum : 3];
-            }
-            
-            if (((currMBNum / mbinWidth) == 0) || /* Top Edge */
-                (mbVPNumber[currMBNum - mbinWidth] != mbVPNumber[currMBNum]))
-            {
-                blockC = 1024;
-            }
-            else
-            {
-                blockC = dcData[currMBNum - mbinWidth][blockNum > 3? blockNum : 2];
-            }
-            break;
-            
-        case 1:
-            /* Y1 block */
-            blockA = dcData[currMBNum][0];
-            
-            if (((currMBNum / mbinWidth) == 0) || /* Top Edge */
-                (mbVPNumber[currMBNum - mbinWidth] != mbVPNumber[currMBNum]))
-            {
-                blockB = 1024;
-                blockC = 1024;
-            }
-            else
-            {
-                blockB = dcData[currMBNum - mbinWidth][2];
-                blockC = dcData[currMBNum - mbinWidth][3];
-            }
-            break;
-            
-        case 2:
-            /* Y2 block */
-            
-            if (((currMBNum % mbinWidth) == 0) || /* Left Edge */
-                (mbVPNumber[currMBNum - 1] != mbVPNumber[currMBNum]))
-            {
-                blockA = 1024;
-                blockB = 1024;
-            }
-            else
-            {
-                blockA = dcData[currMBNum  - 1][3];
-                blockB = dcData[currMBNum  - 1][1];
-            }
-            
-            blockC = dcData[currMBNum][0];
-            break;
-            
-        case 3:
-            /* Y3 block */
-            
-            blockA = dcData[currMBNum][2];
-            blockB = dcData[currMBNum][0];
-            blockC = dcData[currMBNum][1];
-            break;
-
-        default:
-            break;
-    }
-    
-    gradHor = blockB - blockC;
-    gradVer = blockA - blockB;
-    
-    if ((abs(gradVer)) < (abs(gradHor))) 
-    {
-        /* Vertical prediction (from C) */
-        predDC = blockC;
-    }
-    else 
-    {
-        /* Horizontal prediction (from A) */
-        predDC = blockA;
-    }
-    
-  /* DC quantization */
-  if (blockNum < 4) /* Luminance Block */
-  {
-        intraDC += (sLumDCScalerTbl[QP] >> 1);
-        intraDC /= sLumDCScalerTbl[QP];
-        
-        /* update the DC data matrix
-        note: for INTER MB, the entry is already preset to 1024!!
-        */
-        dcData[currMBNum][blockNum] = intraDC * sLumDCScalerTbl[QP];
-  }
-  else            /* Chrominance block */
-  {
-        intraDC += (sChrDCScalerTbl[QP] >> 1);
-        intraDC /= sChrDCScalerTbl[QP];
-        /* update the DC data matrix
-        note: for INTER MB, the entry is already preset to 1024!!
-        */
-        dcData[currMBNum][blockNum] = intraDC * sChrDCScalerTbl[QP];
-  }
-    /* DC prediction */
-  tempDCScaler = (blockNum<4)? sLumDCScalerTbl[QP] : sChrDCScalerTbl[QP];
-    
-  return (intraDC - ((predDC + tempDCScaler/2) / tempDCScaler));
-}
-
-/*
-* sPutVOLHeader
-*
-* Parameters: 
-*     bitOut       pointer to the output buffer
-*     aWidth       picture width
-*     aHeight      picture height
-*     aTimerResolution timer resolution for MPEG4
-*     
-* Function:
-*    This function writes the VOL header into bit-stream
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-inline void sPutVOLHeader(bibBuffer_t* bitOut, int aWidth, int aHeight, int aTimerResolution)
-{
-    bibBuffer_t     *lBitOut;
-    uint32          vop_time_increment_resolution;
-    
-    lBitOut = bitOut;
-    WRITE32(lBitOut, (uint32)VIDEO_OBJECT_LAYER_START_CODE);
-    /* RandomAccessibleVol == 1 means all VOP's can be decoded independently */
-    sPutBits(lBitOut, 1, 0);
-    /* VideoObjectTypeIndication = SIMPLE OBJECT */
-    sPutBits(lBitOut, 8, SIMPLE_OBJECT);
-    /* IsObjectLayerIdentifier */
-    sPutBits(lBitOut, 1, 0);
-    /* AspectRatioInfo */
-    sPutBits(lBitOut, 4, ASPECT_RATIO_INFO);
-    /* vol_control_parameters = 1 */
-    sPutBits(lBitOut, 1, 1);
-    /* Chroma Format */
-    sPutBits(lBitOut, 2, CHROMA_FORMAT);
-    /* LowDelay = 1; */
-    sPutBits(lBitOut, 1, 1);
-    /* vbvParameters = 0; */
-    sPutBits(lBitOut, 1, 0);
-    /* VideoObjectLayerShape == RECTANGULAR */
-    sPutBits(lBitOut, 2, RECTANGULAR);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* VopTimeIncrementResolution */
-    vop_time_increment_resolution = aTimerResolution;
-    sPutBits(lBitOut, 16, vop_time_increment_resolution);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);    
-    /* FixedVOPRate = 0, not fixed */
-    sPutBits(lBitOut, 1, 0);    
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* VideoObjectLayerWidth */
-    sPutBits(lBitOut, 13, aWidth);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* VideoObjectLayerHeight */
-    sPutBits(lBitOut, 13, aHeight);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* Interlaced = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* ObmcDisable= 1 */
-    sPutBits(lBitOut, 1, 1);
-    /* SpriteEnable = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* Not8Bit = 0 */
-    sPutBits(lBitOut, 1, 0);
-    /* QuantType = H263 (0) */
-    sPutBits(lBitOut, 1, H263);
-    /* Complexity Estimation Disable = 1 */
-    sPutBits(lBitOut, 1, 1);
-    /* ResyncMarkerDisable */
-    sPutBits(lBitOut, 1, 0); /* H263 is converted to resyn_marker MPEG4 in video editor */
-    /* DataPartioned */
-    sPutBits(lBitOut, 1, 0); /* always 0 for H263 */
-    /* Reversible VLC  closed */
-    /* Scalability = 0 */
-    sPutBits(lBitOut, 1, 0);
-    vdtStuffBitsMPEG4(lBitOut);
-    
-    return;
-}
-
-
-/*
-* sPutGOVHeader
-*
-* Parameters: 
-*     bitOut       pointer to the output buffer
-*     aModuloTimeBase  time base for MPEG4
-*     
-* Function:
-*    This function writes the group of VOP(GOV) header into bit-stream
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-inline void sPutGOVHeader(bibBuffer_t *bitOut, int aModuloTimeBase)
-{
-    int32 time_code_hours;
-    int32 time_code_minutes;
-    int32 time_code_seconds;
-    
-    WRITE32(bitOut, (uint32)GROUP_OF_VOP_START_CODE);
-    time_code_seconds = aModuloTimeBase;
-    time_code_minutes = time_code_seconds / 60;
-    time_code_hours   = time_code_minutes / 60;    
-    time_code_minutes = time_code_minutes - (time_code_hours * 60);
-    time_code_seconds = time_code_seconds - (time_code_minutes * 60)
-        - (time_code_hours * 3600);
-    
-    sPutBits(bitOut, 5, time_code_hours);
-    sPutBits(bitOut, 6, time_code_minutes);
-    sPutBits(bitOut, 1, MARKER_BIT);
-    sPutBits(bitOut, 6, time_code_seconds);
-    
-    /* ClosedGov */
-    sPutBits(bitOut, 1, 0);
-    /* Broken Link */
-    sPutBits(bitOut, 1, 0);
-    
-    /* Stuff bits */
-    vdtStuffBitsMPEG4(bitOut);
-    
-    return;
-}
-
-/*
-* sConstructMPEG4VOSHeaderForH263
-*
-* Parameters: 
-*     bitOut       pointer to the output buffer
-*     aWidth       picture width
-*     aHeight      picture height
-*     
-* Function:
-*    This function writes the MPEG4 VOS header into bit-stream
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void sConstructMPEG4VOSHeaderForH263(bibBuffer_t *bitOut, int aWidth, int aHeight, int aOutputMpeg4TimeRes)
-{
-    /* visual object sequence header */
-    WRITE32(bitOut, (uint32)VISUAL_OBJECT_SEQUENCE_START_CODE);
-    
-    /* This is for testing for level 0,3 */
-    uint32 level = 8;   /* level 0 for QCIF or less */
-    if(aWidth > 176 || aHeight > 144)   /* level 2 for greater than QCIF */
-        level = 2;
-    sPutBits(bitOut, 8, level); /* simple profile, level 0 for H263 */
-    
-    /* visual object header begins */
-    WRITE32(bitOut, (uint32)VISUAL_OBJECT_START_CODE);
-    /* IsVisualObjectIdentifier = 0 */
-    sPutBits(bitOut, 1, 0);
-    /* VisualObjectType = VIDEO_OBJECT */
-    sPutBits(bitOut, 4, VISUAL_OBJECT);
-    /* VideoSignalType = 0 */
-    sPutBits(bitOut, 1, 0);
-    
-    vdtStuffBitsMPEG4(bitOut);
-    WRITE32(bitOut, (uint32)VIDEO_OBJECT_START_CODE);
-    
-    /* Writes the VOL header into bit-stream , for baseline H263 TR is marked with 29.97fps. ->? */
-    sPutVOLHeader(bitOut, aWidth, aHeight, aOutputMpeg4TimeRes);
-    
-    /* Writes GOV , time base is 0 */
-    sPutGOVHeader(bitOut, 0);
-    
-    return;
-}
-
-
-/*
-* sPutVideoPacketHeader
-*
-* Parameters: 
-*     lBitOut      output buffer
-*     mbNo         Macroblock number
-*     quantiserScale quant value to be put in header
-*     aMBsInVOP    # of MBs in one VOP
-*     
-* Function:
-*    This function writes the video packet header information into bit-stream
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-inline void sPutVideoPacketHeader(bibBuffer_t *lBitOut, int32 mbNo, 
-                                                                    int16 quantiserScale,
-                                                                    int aMBsInVOP)
-{
-    int32   lResyncMarkerLength = 17;
-    int32   lMBNoResolution;
-    
-    /* ResyncMarker */
-    int fCode = 1; /*always 1 for H263 */
-    lResyncMarkerLength = 16 + fCode; 
-    sPutBits(lBitOut, lResyncMarkerLength, 1);
-    
-    --aMBsInVOP;
-    lMBNoResolution = 1;
-    while( (aMBsInVOP =
-        aMBsInVOP >> 1) > 0 )
-    {
-        lMBNoResolution++;
-    }
-    sPutBits(lBitOut, lMBNoResolution, mbNo);
-    
-    /* QuantScale */ 
-    sPutBits(lBitOut, 5, quantiserScale);
-    /* HEC */
-    sPutBits(lBitOut, 1, 0); /* always 0 for H263 */
-    
-    return;
-}
-
-/*
-* sConstructVOPHeaderForH263
-*
-* Parameters: 
-*     lBitOut      output buffer
-*     prevQuant    quant value to be put in header
-*     aVOPType     picture coding type
-*     aVOPTimeIncrement  time increament
-*     
-* Function:
-*    This function writes the VOP header into bit-stream for one H263 frame
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-
-void sConstructVOPHeaderForH263(bibBuffer_t *lBitOut, int prevQuant, int aVOPType, int aVOPTimeIncrement,int aOutputMpeg4TimeRes)
-{
-    WRITE32(lBitOut, (uint32)VOP_START_CODE);
-    /* VOPType, 0 for Intra and 1 for inter */
-    sPutBits(lBitOut, 2, aVOPType);
-    
-    /* H263 TR is marked with 29.97fps */
-    /* Modulo Time Base */
-    int outputTimerResolution = aOutputMpeg4TimeRes;
-    while ((unsigned)aVOPTimeIncrement >= (unsigned) outputTimerResolution)
-    {
-        sPutBits(lBitOut, 1, 1);
-        aVOPTimeIncrement -= outputTimerResolution; 
-    }
-    sPutBits(lBitOut, 1, 0);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);   
-    /* VopTimeIncrement */
-    int numOutputTrBits;
-    for (numOutputTrBits = 1; ((outputTimerResolution-1) >> numOutputTrBits) != 0; numOutputTrBits++)
-        {
-        }
-    int VOPIncrementResolutionLength = numOutputTrBits;
-    sPutBits(lBitOut, VOPIncrementResolutionLength, aVOPTimeIncrement);
-    /* Marker Bit */
-    sPutBits(lBitOut, 1, MARKER_BIT);
-    /* VOPCoded */
-    sPutBits(lBitOut, 1, 1); /* always 1 for H263 */
-    /* VOPRoundingType */
-    if(aVOPType == P_VOP)
-    {
-        sPutBits(lBitOut, 1, 0); /* always 0 for H263 */
-    }
-    /* IntraDCVLCThreshold */
-    sPutBits(lBitOut, 3, 0); /* always 0 for H263 */
-    /* VOPQuant */
-    sPutBits(lBitOut, 5, prevQuant);
-    /* VOPFcodeForwad */
-    if(aVOPType == P_VOP)
-    {
-        sPutBits(lBitOut, 3, 1); /* always 1 for H263 */
-    }
-    
-    return;
-}
-
-
-
-/*
-* H263PictureHeaderEndedL
-*
-* Parameters: 
-*     
-* Function:
-*    This function is called after one H263 picture header is parsed
-*    Note: the input header is only valid inside this function
-* Returns:
-*    VDC error codes
-* Error codes:
-*    None
-*
-*/
-int CMPEG4Transcoder::H263PictureHeaderEnded(dphOutParam_t *aH263PicHeader, dphInOutParam_t *aInfo)
-{
-    VDTASSERT(aH263PicHeader);  
-    
-    // asad
-    if (!aInfo->vdcInstance->frameNum || !iRefQuant)
-    {
-        iRefQuant = aH263PicHeader->pquant;
-        iDcScaler = GetMpeg4DcScalerUV(iRefQuant); 
-    }
-    
-    if (!iDoModeTranscoding )
-    {
-        
-       /* Copy the header to output stream */
-       bufEdit.copyMode = CopyWhole; /* CopyWhole */
-         
-         if ( (iTargetFormat == EVedVideoTypeH263Profile0Level10 || iTargetFormat == EVedVideoTypeH263Profile0Level45) && 
-               fFirstFrameInH263 && iBitStreamMode == EVedVideoBitstreamModeMPEG4ShortHeader)
-         {
-             /* we don't need the VOS header, remove it */
-             PRINT((_L("CMPEG4Transcoder: MPEG4 shortheader VOS removed")));
-             
-             CopyStream(iInBuffer,iOutBuffer,&bufEdit,iShortHeaderEndByteIndex,iShortHeaderEndBitIndex);
-             fFirstFrameInH263 = EFalse;
-         }
-         else
-         {
-           /* copy from the begining of the input buffer, 
-              including the VOS header for MPEG4 shortheader if its mode is not being changed
-             */
-             CopyStream(iInBuffer,iOutBuffer,&bufEdit,0,7);
-         }
-    }
-    
-
-    
-    else
-    {
-        /* H263 Picture Header -> MPEG4 VOP Header mapping
-           information about this frame
-        */
-        iMBsinWidth = aInfo->vdcInstance->pictureParam.lumWidth >> 4;
-        
-        iNumMBsInOneVOP = (aInfo->vdcInstance->pictureParam.lumWidth >> 4) *
-            (aInfo->vdcInstance->pictureParam.lumHeight >> 4);
-        
-        iNumMBsInGOB = aInfo->vdcInstance->pictureParam.numMBsInGOB;
-        
-        /* create the intraDC matrix for DC prediction */
-        VDTASSERT(!iH263DCData);
-        VDTASSERT(!iH263MBVPNum);
-        
-        iH263DCData = (int **)malloc(iNumMBsInOneVOP * sizeof(int));
-        if (!iH263DCData) 
-        {
-            deb("CMPEG4Transcoder::ERROR - iH263DCData creation failed\n");
-            return TX_ERR;
-        }
-        
-        for (int i = 0; i < iNumMBsInOneVOP; i++)
-        {
-            iH263DCData[i] = (int *) malloc(6 * sizeof(int)); /* six blocks in one MB */
-            VDTASSERT(iH263DCData[i]);
-            if (!iH263DCData[i]) 
-            {
-                deb("CMPEG4Transcoder::ERROR - iH263DCData[i] creation failed\n");
-
-                for(int k=0; k<i; k++)
-                {
-                    free (iH263DCData[k]); 
-                }
-                if (iH263DCData) 
-                {
-                    free(iH263DCData);
-                }
-
-                return TX_ERR;
-            }
-
-            
-            /* initialize each entry to 1024 for DC prediction */
-            for (int j = 0; j < 6; j++)
-            {
-                iH263DCData[i][j] = 1024;
-            }
-        }
-        
-        iH263MBVPNum = (int *) malloc(iNumMBsInOneVOP * sizeof(int));
-        if (!iH263MBVPNum) 
-        {
-            deb("CMPEG4Transcoder::ERROR - iH263MBVPNum creation failed\n");
-            return TX_ERR;
-        }
-        
-        memset(iH263MBVPNum, 0, iNumMBsInOneVOP * sizeof(int));
-        int pictureType = aInfo->vdcInstance->pictureParam.pictureType == VDX_PIC_TYPE_I? I_VOP : P_VOP;
-        
-        if (fFirstFrameInH263)
-        {
-            /* first frame, construct the VOS header */
-            sConstructMPEG4VOSHeaderForH263(iOutBuffer,
-                aInfo->vdcInstance->pictureParam.lumWidth,
-                aInfo->vdcInstance->pictureParam.lumHeight, 
-                iOutputMpeg4TimeIncResolution);
-            fFirstFrameInH263 = EFalse;
-            
-            PRINT((_L("CMPEG4Transcoder: H263 -> MPEG VOS generated")));
-        }
-        sConstructVOPHeaderForH263(iOutBuffer, aH263PicHeader->pquant, pictureType, aH263PicHeader->trp == -1 ? 0 : aH263PicHeader->trp,iOutputMpeg4TimeIncResolution);
-
-        
-    PRINT((_L("CMPEG4Transcoder: H263 -> MPEG4: transcoding one picture")));
-    }
-    
-    
-    PRINT((_L("CMPEG4Transcoder: H263PictureHeaderEndedL. color effect: %d, format convert %d, do transcoding: %d streammode: %d, outputformat: %d "), 
-       iColorEffect, iDoModeTranscoding, iDoTranscoding,
-         iBitStreamMode, iTargetFormat));
-    
-    return TX_OK;
-}
-
-/*
-* H263GOBSliceHeaderEnded
-*
-* Parameters: 
-*     
-* Function:
-*    This function is called after one H263 GOB or Slice header is parsed
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263GOBSliceHeaderEnded(vdxGOBHeader_t *aH263GOBHeader, vdxSliceHeader_t */*aH263SliceHeader*/)
-{
-    iGOBSliceHeaderEndByteIndex = iInBuffer->getIndex;
-    iGOBSliceHeaderEndBitIndex  = iInBuffer->bitIndex;  
-    
-    if (aH263GOBHeader)
-    {
-        /* not the first GOB (no header), we have stuffing bits ahead
-        since we only store the position of GBSC not including 
-        the stuffing bits, we may need to insert the stuffing bits here
-        if we have color effect, we have done the stuffing at the end of last GOB
-        see functin: H263OneGOBSliceWithHeaderEnded
-        */
-        sStuffBitsH263(iOutBuffer); 
-    }
-    
-    if (!iDoModeTranscoding)
-    {
-       /* Copy the header to output stream */
-       bufEdit.copyMode = CopyWhole; // whole
-         CopyStream(iInBuffer,iOutBuffer,&bufEdit,iGOBSliceStartByteIndex,iGOBSliceStartBitIndex);
-         
-    }
-
-    else
-    {
-        /* H263 GOB (Slice) Header -> MPEG4 VP Header mapping */
-        if (!VDT_NO_DATA((int)iInBuffer->getIndex, iInBuffer->bitIndex, iGOBSliceStartByteIndex, iGOBSliceStartBitIndex) &&
-            aH263GOBHeader)
-        {
-            /* sPutVideoPacketHeader */
-            sPutVideoPacketHeader(iOutBuffer, aH263GOBHeader->gn * iNumMBsInGOB, (short)aH263GOBHeader->gquant, iNumMBsInOneVOP);
-        }
-    }
-        
-    // one slice ended, new video packet starting
-    iCurMBNumInVP = -1;
-    
-}
-
-
-/*
-* H263GOBSliceHeaderBegin
-*
-* Parameters: 
-*     
-* Function:
-*    This function is called before one H263 GOB or Slice header is parsed
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263GOBSliceHeaderBegin()
-{
-    /* position not include the stuffing bits ahead of the GBSC ! */
-    iGOBSliceStartByteIndex = iInBuffer->getIndex;
-    iGOBSliceStartBitIndex  = iInBuffer->bitIndex;
-    iStuffingBitsUsed = 0;
-}
-
-
-/*
-* H263GOBSliceHeaderBegin
-*
-* Parameters: 
-*     
-* Function:
-*    This function is called after one H263 GOB or Slice ends
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263OneGOBSliceEnded(int nextExpectedMBNum)
-{
-    if (iDoTranscoding)
-    {
-        /* MBs are lost or not coded, for H263 and H263->MPEG4 both */
-        for (int i = iLastMBNum+1; i < nextExpectedMBNum; i++)
-        {
-            /* output  1 bit COD */
-            sPutBits (iOutBuffer, 1, 1);
-        }
-        iLastMBNum = nextExpectedMBNum - 1; 
-    }
-}
-
-
-/*
-* H263OneGOBSliceWithHeaderEnded
-*
-* Parameters: 
-*     
-* Function:
-*    This function is called after GOB (Slice) that has GOB header (except the first GOB) ends
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263OneGOBSliceWithHeaderEnded()
-{
-    if (!iDoTranscoding)
-    {
-       bufEdit.copyMode = CopyWhole; /* CopyWhole */
-         CopyStream(iInBuffer,iOutBuffer,&bufEdit,
-             iGOBSliceHeaderEndByteIndex,iGOBSliceHeaderEndBitIndex);
-    }
-    else
-    {
-
-        if (iDoModeTranscoding)
-        {
-            /* for H263 to MPEG4, it implies that one video packet is finished */
-            vdtStuffBitsMPEG4(iOutBuffer);
-        }
-        else
-
-        {
-            /* stuffing occurs outside at the end of one GOB/slice withe header or end of frame, check in file core.cpp */
-            sStuffBitsH263(iOutBuffer); 
-        }
-        iVideoPacketNumInMPEG4 ++;
-    }
-
-    // one slice ended, new video packet starting
-    iCurMBNumInVP = -1; // 0
-
-}
-
-
-
-/*
-* H263ToMPEG4MBData
-*
-* Parameters: 
-*     
-* Function:
-*    This function transcodes one H263 MB to one MPEG4 MB
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::H263ToMPEG4MBData(int aNewMCBPCLen, int aNewMCBPC)
-{
-    /* MB data part1: output MCBPC, CBPY, DQuant, MV, intra DC etc */
-    int *dataItemStartByteIndex;
-    int *dataItemStartBitIndex;
-    int *dataItemEndByteIndex;
-    int *dataItemEndBitIndex;
-    int quant, cbpy, cbpc;
-    
-    if (iVopCodingType == VDX_VOP_TYPE_P) 
-    {
-        dataItemStartByteIndex = iCurPMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurPMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurPMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurPMBinstance->DataItemEndBitIndex;
-        quant = iCurPMBinstance->quant;
-        cbpy  = iCurPMBinstance->cbpy;
-        cbpc  = iCurPMBinstance->cbpc;
-    }
-    else
-    {
-        dataItemStartByteIndex = iCurIMBinstance->DataItemStartByteIndex;
-        dataItemStartBitIndex  = iCurIMBinstance->DataItemStartBitIndex;
-        dataItemEndByteIndex   = iCurIMBinstance->DataItemEndByteIndex;
-        dataItemEndBitIndex    = iCurIMBinstance->DataItemEndBitIndex;
-        quant = iCurIMBinstance->quant;
-        cbpy  = iCurIMBinstance->cbpy;
-        cbpc  = iCurIMBinstance->cbpc;
-    }
-    
-    /* COD and MCBPC, (for I frame, it is MCBPC, for P frame it is COD and MCBPC) */
-    if (iVopCodingType == VDX_VOP_TYPE_P)
-    {
-        /* It is a coded MB, output  1 bit COD (it always exists in P frame) */
-        sPutBits (iOutBuffer, 1, 0);
-    }
-    
-    if (iColorEffect)
-    {
-        /* MCBPC Changed */
-        sPutBits(iOutBuffer, aNewMCBPCLen, aNewMCBPC);
-    }
-    else
-    {
-        /* remember the positions do not include the possible stuffing MCBPC bits */
-        vdtCopyBuffer(iInBuffer, iOutBuffer,
-            dataItemStartByteIndex[0], dataItemStartBitIndex[0],
-            dataItemEndByteIndex[0], dataItemEndBitIndex[0]);
-    }
-    
-    /* ac_pred_flag  */
-    if (iMBCodingType == VDX_MB_INTRA) 
-    {
-        sPutBits(iOutBuffer, 1, 0);// it is closed for H263 INTRA MB
-    }
-    
-    /* CBPY */
-    vdtCopyBuffer(iInBuffer, iOutBuffer,
-        dataItemStartByteIndex[2], dataItemStartBitIndex[2],
-        dataItemEndByteIndex[2], dataItemEndBitIndex[2]);
-    
-    /* DQUANT, if it exsits */
-    vdtCopyBuffer(iInBuffer, iOutBuffer,
-        dataItemStartByteIndex[1], dataItemStartBitIndex[1],
-        dataItemEndByteIndex[1], dataItemEndBitIndex[1]);
-    
-    if (iMBCodingType == VDX_MB_INTER) 
-    {
-        /* MVs, if they exsit */
-        vdtCopyBuffer(iInBuffer, iOutBuffer,
-            dataItemStartByteIndex[10], dataItemStartBitIndex[10],
-            dataItemEndByteIndex[10], dataItemEndBitIndex[10]);
-    }
-    
-    /* following is the block level data */
-    for (int i = 0; i < (iColorEffect? 4 : 6); i++)
-    {
-        if (iMBCodingType == VDX_MB_INTRA) 
-        {
-            int fBlockCoded = 0;
-            if (i < 4)
-            {
-                fBlockCoded = vdxIsYCoded(cbpy, i + 1);
-            }
-            else if (i == 4)
-            {
-                fBlockCoded = vdxIsUCoded(cbpc);
-            }
-            else 
-            {
-                fBlockCoded = vdxIsVCoded(cbpc);
-            }
-            
-            /* Difference between H263 and MPEG4 :
-               0. DC quantization is different, DC need to be dequantized and requantized
-                  Note:  for ACs, here we only support H263 quantization in MPEG4, we can copy them
-                        1. DC prediction is used in MPEG4
-                        2. They use different VLC table for INTRA AC coefficient
-            */
-            /* reconstuct INTRA DC */
-            int intraDC = (iDCTBlockData + i * BLOCK_COEFF_SIZE)[0]; /* it is already dequantized in funcion vdxGetIntraDCTBlock */
-            
-            /* INTRA quantization and prediction */
-            (iDCTBlockData + i * BLOCK_COEFF_SIZE)[0] = sGetMPEG4INTRADCValue(intraDC,
-                i, iCurMBNum, quant, iMBsinWidth,iH263DCData, iH263MBVPNum);
-            
-            /* recoding the INTRA block */
-            int numTextureBits = 0;
-            
-            vdtPutIntraMBCMT(iOutBuffer,iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, i, 0, 1); /* DC coding */
-            
-            if (fBlockCoded)
-            {
-                vdtPutIntraMBCMT(iOutBuffer,iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, i, 1, 0); /*encode ACs */
-            }
-            
-        }
-        
-        else if (!(VDT_NO_DATA(iBlockStartByteIndex[i], iBlockStartBitIndex[i],
-            iBlockEndByteIndex[i], iBlockEndBitIndex[i])))
-        {
-            
-        /* 4. same VLC table for DCTs in H263 and MPEG4, but with different Escape Coding type. 
-        see 7.4.1.3. in MPEG4 draft
-            */
-            if (iEscapeCodeUsed[i])
-            {
-                int numTextureBits = 0;
-                vdtPutInterMBCMT(iOutBuffer,0, iDCTBlockData + i * BLOCK_COEFF_SIZE, &numTextureBits, OFF);
-            }
-            else
-            {
-                bufEdit.copyMode = CopyWhole; /* CopyWhole */
-                vdtCopyBuffer(iInBuffer,iOutBuffer,
-                    iBlockStartByteIndex[i],iBlockStartBitIndex[i],
-                    iBlockEndByteIndex[i],iBlockEndBitIndex[i]);
-            }
-        }
-    }
-    
-  if (iColorEffect && (iMBCodingType == VDX_MB_INTRA))
-    {
-        ResetMPEG4IntraDcUV();
-    }
-}
-
-
-
-/*
-* NeedDecodedYUVFrame
-*
-* Parameters: 
-*     
-* Function:
-*    This function indicates if whether we need the decoded frame 
-* Returns:
-*     ETrue if we need the decoded frame
-* Error codes:
-*    None
-*
-*/
-int CMPEG4Transcoder::NeedDecodedYUVFrame()
-{
-    if ( (iTargetFormat == EVedVideoTypeH263Profile0Level10 || iTargetFormat == EVedVideoTypeH263Profile0Level45) &&
-        iBitStreamMode !=EVedVideoBitstreamModeMPEG4ShortHeader && iBitStreamMode != EVedVideoBitstreamModeH263)
-        return ETrue;
-    else
-        return EFalse;
-}
-
-/*
-* NewL
-*
-* Parameters: 
-*     
-* Function:
-*    Symbian two-phased constructor 
-* Returns:
-*     pointer to constructed object, or NULL
-* Error codes:
-*    None
-*
-*/
-CMPEG4Transcoder* CMPEG4Transcoder::NewL(const vdeInstance_t *aVDEInstance, bibBuffer_t *aInBuffer, bibBuffer_t *aOutBuffer)
-{
-    CMPEG4Transcoder *self = new (ELeave) CMPEG4Transcoder(aVDEInstance, aInBuffer, aOutBuffer);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);
-    
-    return self;
-}
-
-
-/*
-* ConstructL
-*
-* Parameters: 
-*     
-* Function:
-*    Symbian 2nd phase constructor (can leave)
-* Returns:
-*     None
-* Error codes:
-*    None
-*
-*/
-void CMPEG4Transcoder::ConstructL()
-{
-    
-    /* Create one IMB Instance  */
-    iCurIMBinstance = (vdxIMBListItem_t *) malloc(sizeof(vdxIMBListItem_t));
-    if (!iCurIMBinstance) 
-    {
-        deb("CMPEG4Transcoder::ERROR - iCurIMBinstance creation failed\n");
-        User::Leave(KErrNoMemory);
-       
-    }
-    memset(iCurIMBinstance, 0, sizeof(vdxIMBListItem_t));
-    
-    /* Create one PMBInstance */
-    iCurPMBinstance = (vdxPMBListItem_t *) malloc(sizeof(vdxPMBListItem_t));
-    if (!iCurPMBinstance) 
-    {
-        deb("CMPEG4Transcoder::ERROR - iCurPMBinstance creation failed\n");
-        User::Leave(KErrNoMemory);
-       
-    }
-    memset(iCurPMBinstance, 0, sizeof(vdxPMBListItem_t));
-    
-    /* initialize the edit buffer */
-    bufEdit.editParams = (bibEditParams_t *) malloc(sizeof(bibEditParams_t));
-    VDTASSERT(bufEdit.editParams);
-    if (!bufEdit.editParams) 
-    {
-        deb("CMPEG4Transcoder::ERROR - bufEdit.editParams creation failed\n");
-        User::Leave(KErrNoMemory);
-       
-    }else{
-        bufEdit.numChanges = 1;
-    }
-    
-    if (!iMBType)
-    {
-        iMBType = (u_char *) malloc(iNumMBsInOneVOP * sizeof(u_char));
-        if (!iMBType) 
-        {
-            deb("CMPEG4Transcoder::ERROR - iMBType creation failed\n");
-            User::Leave(KErrNoMemory);
-        }
-        memset(iMBType, VDX_MB_INTER, iNumMBsInOneVOP * sizeof(u_char));
-    }    
-    
-}
-
-
-/*
-* GetMpeg4DcScaler
-*
-* Parameters: 
-*     
-*  aQP            Quantization parameter
-*
-* Function:
-*    Evaluates Chrominance DC Scaler from QP for MPEG4
-* Returns:
-*    int DC scaler value
-* Error codes:
-*    None
-*
-*/
-int CMPEG4Transcoder::GetMpeg4DcScalerUV(int aQP)
-{
-    if (aQP>=1 && aQP<=4)
-        return (8);
-    else if (aQP>=5 && aQP<=24)
-        return ((aQP+13)/2);
-    else if (aQP>=25 && aQP<=31)
-        return (aQP-6);
-    else 
-        return (0);  // error 
-}
-
-
-void CMPEG4Transcoder::AfterMBLayer(int aUpdatedQp)
-{
-  iCurQuant = aUpdatedQp;
-}
-
-
-
-
-/* End of File */