videoeditorengine/h263decoder/src/decmb.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- a/videoeditorengine/h263decoder/src/decmb.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,731 +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:  
-* Macroblock decoding functions.
-*
-*/
-
-
-/* 
- * Includes 
- */
-#include "h263dConfig.h"
-#include "decmb.h"
-#include "viddemux.h"
-#include "decmbdct.h"
-#include "errcodes.h"
-/* MVE */
-#include "MPEG4Transcoder.h"
-
-/*
- * Global functions
- */
-
-/* {{-output"dmbGetAndDecodeIFrameMB.txt"}} */
-/*
- * dmbGetAndDecodeIFrameMB
- *    
- *
- * Parameters:
- *    inParam                    input parameters
- *    inOutParam                 input/output parameters, these parameters
- *                               may be modified in the function
- *    fMPEG4                     flag indicating if H.263 ("0") or MPEG-4 ("1")
- *                               specific block decoding should be used
- *
- * Function:
- *    This function gets the coding parameters of a macroblock belonging
- *    to an INTRA frame (from the bitstream) and decodes the macroblock.
- *
- * Returns:
- *    >= 0                       the function was successful
- *    < 0                        an error occured when accessing bit buffer
- *
- */
-    
-int dmbGetAndDecodeIFrameMB(
-   const dmbIFrameMBInParam_t *inParam,
-   dmbIFrameMBInOutParam_t *inOutParam,
-   u_char fMPEG4, CMPEG4Transcoder *hTranscoder)
-/* {{-output"dmbGetAndDecodeIFrameMB.txt"}} */
-{
-   int
-      bitErrorIndication = 0, 
-                        /* Carries bit error indication information returned
-                           by the video demultiplexer module */
-      ret = 0;          /* Used to check return values of function calls */
-
-   vdxGetIMBLayerInputParam_t 
-      vdxIn;            /* Input parameters for vdxGetIMBLayer */
-
-   vdxIMBLayer_t 
-      mbLayer;          /* Macroblock layer data */
-
-   int
-      rightOfBorder,    /* There is a border on the left of the current MB */
-      downOfBorder;     /* There is a border on top of the current MB */
-
-   int StartByteIndex = inOutParam->StartByteIndex;
-   int StartBitIndex  = inOutParam->StartBitIndex;
-
-   inOutParam->fCodedMBs[inParam->yPosInMBs * 
-      inParam->pictParam->numMBsInMBLine + inParam->xPosInMBs] = 1;
-   inOutParam->numOfCodedMBs++;
-
-   /* Get MB layer parameters */
-   
-   vdxIn.fMQ = inParam->pictParam->fMQ;
-   vdxIn.quant = inOutParam->quant;
-   vdxIn.fAIC = inParam->pictParam->fAIC;
-   vdxIn.fMPEG4 = fMPEG4;
-
-   ret = vdxGetIMBLayer(inParam->inBuffer, inParam->outBuffer, inParam->bufEdit, inParam->iColorEffect,&StartByteIndex, &StartBitIndex, 
-            inParam->iGetDecodedFrame, &vdxIn, &mbLayer, 
-            &bitErrorIndication, hTranscoder);
-
-   if ( ret <0 )
-      goto error;
-   else if ( ret == VDX_OK_BUT_BIT_ERROR )
-      goto bitError;
-   
-   /* Store output parameters */
-   inOutParam->quant = mbLayer.quant;
-   
-   /* Get block layer parameters and decode them */
-
-
-   if(fMPEG4) {
-       dmdMPEGIParam_t dmdIn;
-
-   
-       dmdIn.inBuffer = inParam->inBuffer;
-       dmdIn.outBuffer = inParam->outBuffer;
-       dmdIn.bufEdit = inParam->bufEdit;
-       dmdIn.iColorEffect = inParam->iColorEffect;
-       dmdIn.iGetDecodedFrame = inParam->iGetDecodedFrame;
-
-       dmdIn.cbpy = mbLayer.cbpy;
-       dmdIn.cbpc = mbLayer.cbpc;
-       dmdIn.quant = mbLayer.quant;
-       dmdIn.yWidth = inParam->pictParam->lumMemWidth;
-       dmdIn.yMBInFrame = inOutParam->yMBInFrame;
-       dmdIn.uBlockInFrame = inOutParam->uBlockInFrame;
-       dmdIn.vBlockInFrame = inOutParam->vBlockInFrame;
-
-       dmdIn.xPosInMBs = inParam->xPosInMBs;
-       dmdIn.yPosInMBs = inParam->yPosInMBs;
-       dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-       dmdIn.numMBLinesInGOB = inParam->pictParam->numMBLinesInGOB;
-       dmdIn.pictureType = inParam->pictParam->pictureType;
-
-       inOutParam->aicData->ACpred_flag = mbLayer.ac_pred_flag;
-       dmdIn.aicData = inOutParam->aicData;
-  
-       dmdIn.switched = 
-           aicIntraDCSwitch(inParam->pictParam->intra_dc_vlc_thr,mbLayer.quant);
-  
-       dmdIn.data_partitioned = 0;
-       dmdIn.reversible_vlc = 0;
-  
-       dmdIn.currMBNum = inOutParam->currMBNum;
-  
-       dmdIn.fTopOfVP = (u_char) (inOutParam->currMBNumInVP < inParam->pictParam->numMBsInMBLine);
-       dmdIn.fLeftOfVP = (u_char) (inOutParam->currMBNumInVP == 0);
-       dmdIn.fBBlockOut = (u_char) (inOutParam->currMBNumInVP <= inParam->pictParam->numMBsInMBLine);
-  
-       ret = dmdGetAndDecodeMPEGIMBBlocks(&dmdIn, hTranscoder);
-
-       if ( ret < 0 )
-         goto error;
-       else if ( ret == DMD_BIT_ERR )
-         goto bitError;
-  
-   } else 
-
-   {
-      dmdIParam_t dmdIn;
-              
-      /* Store the coding type of the MB*/
-      if ( inParam->pictParam->fAIC )  {
-         mvcSetBorders(
-            NULL, 
-            inParam->xPosInMBs,
-            inParam->yPosInMBs,
-            (inParam->pictParam->fSS)?inParam->sliceStartMB:-1,  /* If Annex K is not in use, set to -1 */
-            inParam->pictParam->numMBsInMBLine, 
-            &rightOfBorder, 
-            &downOfBorder);
-      }
-         
-  
-      dmdIn.inBuffer = inParam->inBuffer;
-
-
-      dmdIn.outBuffer = inParam->outBuffer;
-      dmdIn.bufEdit = inParam->bufEdit;
-      dmdIn.iColorEffect = inParam->iColorEffect;
-      dmdIn.iGetDecodedFrame = inParam->iGetDecodedFrame;
-      dmdIn.StartByteIndex = inOutParam->StartByteIndex;
-      dmdIn.StartBitIndex  = inOutParam->StartBitIndex;
-
-
-      dmdIn.cbpy = mbLayer.cbpy;
-      dmdIn.cbpc = mbLayer.cbpc;
-      dmdIn.quant = mbLayer.quant;
-      dmdIn.yWidth = inParam->pictParam->lumMemWidth;
-      dmdIn.yMBInFrame = inOutParam->yMBInFrame;
-      dmdIn.uBlockInFrame = inOutParam->uBlockInFrame;
-      dmdIn.vBlockInFrame = inOutParam->vBlockInFrame;
-
-      dmdIn.xPosInMBs = inParam->xPosInMBs;
-      dmdIn.yPosInMBs = inParam->yPosInMBs;
-      dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-      dmdIn.numMBLinesInGOB = inParam->pictParam->numMBLinesInGOB;
-      dmdIn.pictureType = inParam->pictParam->pictureType;
-
-      dmdIn.predMode = mbLayer.predMode;
-      dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-      dmdIn.fGOBHeaderPresent = inParam->fGOBHeaderPresent;
-      dmdIn.rightOfBorder = rightOfBorder;
-      dmdIn.downOfBorder = downOfBorder;
-      dmdIn.sumBEI = 0;
-
-      if (!inParam->pictParam->fAIC) 
-         ret = dmdGetAndDecodeIMBBlocks(&dmdIn, hTranscoder);
-      else
-        {
-        // not supported
-        goto error;
-        }
-
-      inOutParam->StartByteIndex = dmdIn.StartByteIndex;
-      inOutParam->StartBitIndex = dmdIn.StartBitIndex;
-
-
-      if ( ret < 0 )
-         goto error;
-      else if ( ret == DMD_BIT_ERR )
-         goto bitError;
-   }
-
-   return DMB_OK;
-
-bitError:
-
-   inOutParam->fCodedMBs[inParam->yPosInMBs * 
-      inParam->pictParam->numMBsInMBLine + inParam->xPosInMBs] = 0;
-   inOutParam->numOfCodedMBs--;
-   return DMB_BIT_ERR;
-
-error:
-   return DMB_ERR;
-}
-    
-    
-/* {{-output"dmbGetAndDecodePFrameMB.txt"}} */
-/*
- * dmbGetAndDecodePFrameMB
- *    
- *
- * Parameters:
- *    inParam                    input parameters
- *    inOutParam                 input/output parameters, these parameters
- *                               may be modified in the function
- *    fMPEG4                     flag indicating if H.263 ("0") or MPEG-4 ("1")
- *                               specific block decoding should be used
- *
- * Function:
- *    This function gets the coding parameters of a macroblock belonging
- *    to an INTER frame (from the bitstream) and decodes the macroblock.
- *
- * Returns:
- *    >= 0                       the function was successful
- *    < 0                        an error occured when accessing bit buffer
- *
- */
-
-int dmbGetAndDecodePFrameMB(
-   const dmbPFrameMBInParam_t *inParam,
-   dmbPFrameMBInOutParam_t *inOutParam,
-   u_char fMPEG4, CMPEG4Transcoder *hTranscoder)
-/* {{-output"dmbGetAndDecodePFrameMB.txt"}} */
-{
-   int
-      bitErrorIndication = 0, 
-                        /* Carries bit error indication information returned
-                           by the video demultiplexer module */
-      sumBEI = 0,       /* Sum (bit-wise OR) of bit error indications for the whole MB */
-      ret,              /* Used to check return values of function calls */
-      mbPos,            /* the position of the current macroblock, 
-                           -1 = the leftmost MB of the image, 
-                           0 = MB is not in the border of the image, 
-                           1 = rightmost MB of the image */
-      cbpy,             /* Coced block pattern for luminance */
-      xPosInMBs,        /* Current macroblock position in x-direction 
-                           in units of macroblocks starting from zero */
-      yPosInMBs,        /* Current macroblock position in y-direction 
-                           in units of macroblocks starting from zero */
-      numMBsInMBLine,   /* The number of macroblocks in one line */
-      yHeight,          /* Luminance image height in pixels */
-      uvHeight,         /* Chrominance image height in pixels */
-      yWidth,           /* Luminance image width in pixels */
-      uvWidth,          /* Chrominance image width in pixels */
-      mbNum,            /* Macroblock number within a picture starting
-                           from zero in the top-left corner and
-                           increasing in scan-order */
-      quant;            /* Current quantization parameter */
-
-   /* Motion vectors for P-macroblock */
-   int mvx[4];
-   int mvy[4];
-
-
-   /* MVE */
-   int StartByteIndex = inOutParam->StartByteIndex;
-   int StartBitIndex  = inOutParam->StartBitIndex;
-
-   int16 
-      error = 0;        /* Used for return value of vdcmvc module */
-
-   u_char 
-      fourMVs,          /* Flag which tells if four motion vectors is
-                           present in the current macroblock */
-      mbNotCoded;       /* == 1 if current macro block is not coded */
-
-   vdxGetPPBMBLayerInputParam_t 
-      vdxIn;            /* Input parameters for vdxGetPPBMBLayer */
-
-   vdxPPBMBLayer_t 
-      mbLayer;          /* Macroblock layer data */
-   int
-      rightOfBorder,    /* There is a border on the left of the current MB */
-      downOfBorder;     /* There is a border on top of the current MB */
-
-   /* Add assertions here */
-
-   xPosInMBs = inParam->xPosInMBs;
-   yPosInMBs = inParam->yPosInMBs;
-   numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-   mbNum = yPosInMBs * numMBsInMBLine + xPosInMBs;
-   yHeight = inParam->pictParam->lumMemHeight;
-   uvHeight = (yHeight >>1 /*/ 2*/);
-   yWidth = inParam->pictParam->lumMemWidth;
-   uvWidth = (yWidth >>1 /*/ 2*/);
-
-   /* mbPos, needed in blcCopyPredictionMB */
-   if (inParam->pictParam->fSS) {
-      if (xPosInMBs == numMBsInMBLine - 1)
-         if (mbNum == inParam->sliceStartMB)
-            mbPos = 2;
-         else
-            mbPos = 1;
-      else if (mbNum == inParam->sliceStartMB) 
-         /* if this is the first MB of the slice but not the last MB of the MB line */
-         mbPos = -1;
-      else if (xPosInMBs == 0)
-         mbPos = -1;
-      else
-         mbPos = 0;  
-   }
-   else  {
-      if (xPosInMBs == 0)
-         mbPos = -1;
-      else if (xPosInMBs == numMBsInMBLine - 1)
-         mbPos = 1;
-      else
-         mbPos = 0;
-   }
-
-   /* Get MB layer parameters */
-   vdxIn.pictureType = inParam->pictParam->pictureType;
-   vdxIn.fPLUSPTYPE = inParam->pictParam->fPLUSPTYPE;
-   vdxIn.fUMV = inParam->pictParam->fUMV;
-   vdxIn.fDF = inParam->pictParam->fDF;
-   vdxIn.fMQ = inParam->pictParam->fMQ;
-   vdxIn.fCustomSourceFormat = inParam->pictParam->fCustomSourceFormat;
-   vdxIn.fAIC = inParam->pictParam->fAIC;
-   vdxIn.quant = inOutParam->quant;
-   vdxIn.fFirstMBOfPicture = (yPosInMBs == 0 && xPosInMBs == 0);
-
-   vdxIn.fMPEG4 = fMPEG4;
-
-   if (fMPEG4) {
-       vdxIn.fAP = 1;
-       vdxIn.f_code = inParam->pictParam->fcode_forward;
-   } else 
-
-   {
-       vdxIn.fAP = inParam->pictParam->fAP;
-   }
-
-
-   int mbType=3;    // default
-   ret = vdxGetPPBMBLayer(inParam->inBuffer, inParam->outBuffer, inParam->bufEdit, inParam->iColorEffect,&StartByteIndex, &StartBitIndex,
-         inParam->iGetDecodedFrame, &mbType, &vdxIn, &mbLayer, &bitErrorIndication,
-         hTranscoder);
-
-   if ( ret < 0 )
-      goto error;
-   else if ( ret == VDX_OK_BUT_BIT_ERROR ) {
-      goto bitError;
-   }
-   /* PB macroblock */
-   if  ((inParam->pictParam->pictureType == VDX_PIC_TYPE_PB) ||
-         (inParam->pictParam->pictureType == VDX_PIC_TYPE_IPB)) {
-
-        // PB not supported
-        goto error;
-   }  /* if (PB macroblock) */
-
-   sumBEI |= bitErrorIndication;
-
-   inOutParam->quant = quant = mbLayer.quant;
-
-   cbpy = mbLayer.cbpy;
-   fourMVs = (u_char) (mbLayer.numMVs == 4);
-
-   if(!fMPEG4) {
-      mvcSetBorders(
-         inOutParam->mvcData, 
-         xPosInMBs,
-         yPosInMBs,
-         (inParam->pictParam->fSS)?inParam->sliceStartMB:-1,  /* If Annex K is not in use, set to -1 */
-         numMBsInMBLine, 
-         &rightOfBorder, 
-         &downOfBorder);
-   }
-
-   if (mbLayer.fCodedMB) {
-      int currMVNum;
-
-      /* Decode motion vectors */
-      mbNotCoded = 0;
-      inOutParam->fCodedMBs[mbNum] = 1;
-      inOutParam->numOfCodedMBs++;
-
-      for (currMVNum = 0; currMVNum < mbLayer.numMVs; currMVNum++) {
-
-          if(fMPEG4)
-              mvcCalcMPEGMV(
-                  inOutParam->mvcData,
-                  mbLayer.mvdx[currMVNum], mbLayer.mvdy[currMVNum],
-                  &mvx[currMVNum], &mvy[currMVNum],
-                  (u_char) currMVNum, fourMVs,
-                  (u_char) (inOutParam->currMBNumInVP < inParam->pictParam->numMBsInMBLine),
-                  (u_char) (inOutParam->currMBNumInVP == 0), 
-                  (u_char) (inOutParam->currMBNumInVP < (inParam->pictParam->numMBsInMBLine-1)),
-                  xPosInMBs,
-                  yPosInMBs,
-                  inParam->pictParam->tr,
-                  (mbLayer.mbClass == VDX_MB_INTRA) ? MVC_MB_INTRA : MVC_MB_INTER,
-                  &error);    
-          else {
-             mvcCalcMV(
-                  inOutParam->mvcData, 
-                  mbLayer.mvdx[currMVNum], mbLayer.mvdy[currMVNum],
-                  &mvx[currMVNum], &mvy[currMVNum],
-                  (u_char) currMVNum, 
-                  (u_char) (mbLayer.numMVs == 4),
-                  (u_char) inParam->pictParam->fUMV,
-                  (u_char) ((inParam->pictParam->fSS)?1:inParam->fGOBHeaderPresent),
-                  xPosInMBs,
-                  yPosInMBs,
-                  inParam->pictParam->tr,
-                  (mbLayer.mbClass == VDX_MB_INTRA) ? 
-                        MVC_MB_INTRA : MVC_MB_INTER,
-                  &error,
-                  inParam->pictParam->fPLUSPTYPE,
-                  inParam->pictParam->fUMVLimited);
-          }
-
-          /* If motion vector points illegally outside the picture,
-             there may be two reasons for it:
-             1) bit error has occured and corrupted MVD, or
-             2) encoder (e.g. /UBC) does not follow the standard.
-             Since we assume that encoders may violate this feature relatively
-             frequently, the decoder considers these cases as bit errors
-             only if the demultiplexer indicates a similar condition.
-             Note that there may be a very improbable situation where
-             the demultiplexer error indication has failed (it reports
-             no errors even though there are errors), and these bit errors
-             would cause an illegal motion vector. Now, we won't detect
-             these cases. */
-          if (error == ERR_MVC_MVPTR && bitErrorIndication)
-               goto bitError;
-          else if (error && error != ERR_MVC_MVPTR)
-               goto error;
-      }
-
-      if (mbLayer.numMVs == 1) {
-         mvx[1] = mvx[2] = mvx[3] = mvx[0];
-         mvy[1] = mvy[2] = mvy[3] = mvy[0];
-      }
-   }
-
-   else {
-      mbNotCoded = 1;
-      /* Motion vectors to 0 */
-      mvx[0] = mvx[1] = mvx[2] = mvx[3] =
-         mvy[0] = mvy[1] = mvy[2] = mvy[3] = 0;
-      mvcMarkMBNotCoded(
-         inOutParam->mvcData, 
-         xPosInMBs,
-         yPosInMBs,
-         inParam->pictParam->tr);
-      inOutParam->fCodedMBs[mbNum] = 0;
-      cbpy = 0;
-      fourMVs = (u_char) (fMPEG4 ? fourMVs : inParam->pictParam->fAP);
-   }
-  
-   
-  
-   /* If INTER MB */
-   if (mbNotCoded || mbLayer.mbClass == VDX_MB_INTER) {
-       dmdPParam_t dmdIn;
-       blcCopyPredictionMBParam_t blcCopyParam;
-       
-       dmdIn.inBuffer = inParam->inBuffer;
-
-
-       dmdIn.outBuffer = inParam->outBuffer;
-       dmdIn.bufEdit = inParam->bufEdit;
-       dmdIn.iColorEffect = inParam->iColorEffect;
-       dmdIn.iGetDecodedFrame = inParam->iGetDecodedFrame;
-       dmdIn.StartByteIndex = inOutParam->StartByteIndex;
-       dmdIn.StartBitIndex  = inOutParam->StartBitIndex;
-       dmdIn.mbType = mbType; 
-
-       dmdIn.cbpy = cbpy;
-       dmdIn.cbpc = mbLayer.cbpc;
-       dmdIn.quant = quant;
-       dmdIn.refY = inParam->refY;
-       dmdIn.refU = inParam->refU;
-       dmdIn.refV = inParam->refV;
-       dmdIn.currYMBInFrame = inOutParam->yMBInFrame;
-       dmdIn.currUBlkInFrame = inOutParam->uBlockInFrame;
-       dmdIn.currVBlkInFrame = inOutParam->vBlockInFrame;
-       dmdIn.uvBlkXCoord = xPosInMBs * 8;
-       dmdIn.uvBlkYCoord = yPosInMBs * 8;
-       dmdIn.uvWidth = uvWidth;
-       dmdIn.uvHeight = uvHeight;
-       dmdIn.mvcData = inOutParam->mvcData;
-       dmdIn.mvx = mvx;
-       dmdIn.mvy = mvy;
-       dmdIn.mbPlace = mbPos;
-       dmdIn.fAdvancedPrediction = inParam->pictParam->fAP;
-       dmdIn.fMVsOverPictureBoundaries =
-           inParam->pictParam->fMVsOverPictureBoundaries;
-       dmdIn.diffMB = inOutParam->diffMB;
-       dmdIn.rcontrol = inParam->pictParam->rtype;
-
-      dmdIn.fourMVs = fourMVs;
-      dmdIn.reversible_vlc = 0;
-
-      dmdIn.xPosInMBs = xPosInMBs;
-      dmdIn.yPosInMBs = yPosInMBs;
-      dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-
-      /* Copy blcCopyPredictionMB parameters from input parameters */
-      memcpy(&blcCopyParam, &(dmdIn.refY), sizeof(blcCopyPredictionMBParam_t));
-      /* Note: In order to operate properly, this memcpy requires that
-            the structure members are in the same order and allocate the same
-            amount of space. This is not guaranteed in C! */
-            
-      if (inParam->iGetDecodedFrame || hTranscoder->NeedDecodedYUVFrame())
-      {
-           /* Do motion compensation */
-           if (blcCopyPredictionMB(&blcCopyParam) < 0) {
-               /* MV was illegal => caused by bitError */
-               goto bitError;
-           }
-      }
-
-
-      if (fMPEG4) {
-        /* Update the AIC module data, marking the MB as Inter (quant=0) */
-        aicBlockUpdate (inOutParam->aicData, inOutParam->currMBNum, 0, NULL, 0, 0);
-      }
-
-
-      /* Store new CBPY */
-      inOutParam->diffMB->cbpy = cbpy;
-
-      /* If some prediction error blocks are coded */
-      if (mbLayer.fCodedMB) {
-          /* Decode prediction error blocks */
-
-          if (fMPEG4) {
-              ret = dmdGetAndDecodeMPEGPMBBlocks(&dmdIn, hTranscoder);
-          } else 
-
-          {
-              ret = dmdGetAndDecodePMBBlocks(&dmdIn, hTranscoder);
-          }
-
-          
-          inOutParam->StartByteIndex = dmdIn.StartByteIndex;
-          inOutParam->StartBitIndex = dmdIn.StartBitIndex;
-
-
-          if ( ret < 0)
-               goto error;
-          else if ( ret == DMD_BIT_ERR ) {
-               goto bitError;
-          }
-      }
-
-      else  // for the case when the MB is not coded 
-      {
-        /* nothing here */
-      }
-
-
-   }  /* if (INTER block ) */
-   
-   /* Else block layer decoding of INTRA macroblock */
-   else {
-        
-       if (inParam->pictParam->pictureType != VDX_PIC_TYPE_PB) 
-           mvcMarkMBIntra(inOutParam->mvcData, xPosInMBs, yPosInMBs, 
-           inParam->pictParam->tr);
-       
-       inOutParam->diffMB->cbpy = 0;
-       
-       /* Get block layer parameters and decode them */
-       
-       if(fMPEG4) {
-             dmdMPEGIParam_t dmdIn;
-             
-             dmdIn.inBuffer = inParam->inBuffer;
-
-             /* MVE */
-             dmdIn.outBuffer = inParam->outBuffer;
-             dmdIn.bufEdit = inParam->bufEdit;
-             dmdIn.iColorEffect = inParam->iColorEffect;
-             dmdIn.iGetDecodedFrame = inParam->iGetDecodedFrame;
-
-             dmdIn.cbpy = cbpy;
-             dmdIn.cbpc = mbLayer.cbpc;
-             dmdIn.quant = quant;
-             dmdIn.yWidth = yWidth;
-             dmdIn.yMBInFrame = inOutParam->yMBInFrame;
-             dmdIn.uBlockInFrame = inOutParam->uBlockInFrame;
-             dmdIn.vBlockInFrame = inOutParam->vBlockInFrame;
-             
-             dmdIn.xPosInMBs = inParam->xPosInMBs;
-             dmdIn.yPosInMBs = inParam->yPosInMBs;
-             dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-             dmdIn.numMBLinesInGOB = inParam->pictParam->numMBLinesInGOB;
-             dmdIn.pictureType = inParam->pictParam->pictureType;
-             
-             
-             inOutParam->aicData->ACpred_flag = mbLayer.ac_pred_flag;
-             dmdIn.aicData = inOutParam->aicData;
-             
-             dmdIn.switched = 
-                 aicIntraDCSwitch(inParam->pictParam->intra_dc_vlc_thr,mbLayer.quant);
-             
-             dmdIn.data_partitioned = 0;
-             dmdIn.reversible_vlc = 0;
-             
-             dmdIn.currMBNum = inOutParam->currMBNum;
-             
-             dmdIn.fTopOfVP = (u_char) 
-                 (inOutParam->currMBNumInVP < inParam->pictParam->numMBsInMBLine ||
-                 !aicIsBlockValid(inOutParam->aicData, inOutParam->currMBNum-inParam->pictParam->numMBsInMBLine));
-             dmdIn.fLeftOfVP = (u_char)
-                 (inOutParam->currMBNumInVP == 0 || 
-                 inParam->xPosInMBs == 0 ||
-                 !aicIsBlockValid(inOutParam->aicData, inOutParam->currMBNum-1));
-             dmdIn.fBBlockOut = (u_char) 
-                 (inOutParam->currMBNumInVP <= inParam->pictParam->numMBsInMBLine ||
-                 inParam->xPosInMBs == 0 ||
-                 !aicIsBlockValid(inOutParam->aicData, inOutParam->currMBNum-inParam->pictParam->numMBsInMBLine-1));
-         
-             ret = dmdGetAndDecodeMPEGIMBBlocks(&dmdIn, hTranscoder);
-             
-             if ( ret < 0 )
-                 goto error;
-             else if ( ret == DMD_BIT_ERR )
-                 goto bitError;
-                 
-       } else 
-
-       {
-             dmdIParam_t dmdIn;
-             
-             dmdIn.inBuffer = inParam->inBuffer;           
-             
-             dmdIn.outBuffer = inParam->outBuffer;
-             dmdIn.bufEdit = inParam->bufEdit;
-             dmdIn.iColorEffect = inParam->iColorEffect; 
-             dmdIn.iGetDecodedFrame = inParam->iGetDecodedFrame;
-             dmdIn.StartByteIndex = inOutParam->StartByteIndex;
-             dmdIn.StartBitIndex  = inOutParam->StartBitIndex;
-             
-             dmdIn.cbpy = cbpy;
-             dmdIn.cbpc = mbLayer.cbpc;
-             dmdIn.quant = quant;
-             dmdIn.yWidth = yWidth;
-             dmdIn.yMBInFrame = inOutParam->yMBInFrame;
-             dmdIn.uBlockInFrame = inOutParam->uBlockInFrame;
-             dmdIn.vBlockInFrame = inOutParam->vBlockInFrame;
-             
-             dmdIn.xPosInMBs = inParam->xPosInMBs;
-             dmdIn.yPosInMBs = inParam->yPosInMBs;
-             dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-             dmdIn.numMBLinesInGOB = inParam->pictParam->numMBLinesInGOB;
-             dmdIn.pictureType = inParam->pictParam->pictureType;
-             
-             dmdIn.predMode = mbLayer.predMode;
-             dmdIn.numMBsInMBLine = inParam->pictParam->numMBsInMBLine;
-             dmdIn.fGOBHeaderPresent = (inParam->pictParam->fSS)?1:inParam->fGOBHeaderPresent;
-             dmdIn.rightOfBorder = rightOfBorder;
-             dmdIn.downOfBorder = downOfBorder;
-             
-             if (!inParam->pictParam->fAIC)
-                 ret = dmdGetAndDecodeIMBBlocks(&dmdIn, hTranscoder);
-             else
-                {
-                // not supported
-                goto error;
-                }
-             
-             inOutParam->StartByteIndex = dmdIn.StartByteIndex;
-             inOutParam->StartBitIndex = dmdIn.StartBitIndex;
-             
-             if ( ret < 0 )
-                 goto error;
-             else if ( ret == DMD_BIT_ERR )
-                 goto bitError;
-       }
-   }
-   
-   
-   
-   return DMB_OK;
-
-bitError:
-   if ( inOutParam->fCodedMBs[mbNum] ) {
-      inOutParam->fCodedMBs[mbNum] = 0;
-      inOutParam->numOfCodedMBs--;
-   }
-   return DMB_BIT_ERR;
-
-error:
-   return DMB_ERR;
-}
-
-// End of File