videoeditorengine/h263decoder/src/decmbs.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/h263decoder/src/decmbs.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,186 @@
+/*
+* 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:  
+* Multiple scan-order macroblock decoding functions.
+*
+*/
+
+
+/*
+ * Includes
+ */
+#include "h263dConfig.h"
+#include "decmbs.h"
+#include "viddemux.h"
+/* MVE */
+#include "MPEG4Transcoder.h"
+
+
+/*
+ * Global functions
+ */
+
+/* {{-output"dmbsGetAndDecodeIMBsInScanOrder.txt"}} */
+/*
+ * dmbsGetAndDecodeIMBsInScanOrder
+ *
+ * Parameters:
+ *    numMBsToDecode             the number of macroblocks to decode
+ *    inParam                    input parameters
+ *    inOutParam                 input/output parameters, these parameters
+ *                               may be modified in the function
+ *    quant                      array for storing quantization parameters
+ *
+ * Function:
+ *    This function gets and decodes a requested number of INTRA frame
+ *    macroblocks in scan order.
+ *
+ * Returns:
+ *    >= 0                       the function was successful
+ *    < 0                        an error occured
+ *
+ */
+
+int dmbsGetAndDecodeIMBsInScanOrder(
+   const dmbIFrameMBInParam_t *inParam,
+   dmbIFrameMBInOutParam_t *inOutParam,
+   int *quant, CMPEG4Transcoder *hTranscoder)
+/* {{-output"dmbsGetAndDecodeIMBsInScanOrder.txt"}} */
+{
+   int currMBNum;
+   int yWidth = inParam->pictParam->lumMemWidth;
+   int uvWidth = yWidth / 2;
+   int ret = 0;
+   dmbIFrameMBInParam_t dmbi;
+
+   memcpy(&dmbi, inParam, sizeof(dmbIFrameMBInParam_t));
+
+   for (currMBNum = 0; currMBNum < inParam->numMBsInSegment; currMBNum++) {
+
+      hTranscoder->BeginOneMB(currMBNum + inParam->numMBsInSegment * inParam->yPosInMBs);
+
+      ret = dmbGetAndDecodeIFrameMB(&dmbi, inOutParam, 0, hTranscoder);
+      if ( ret < 0)
+         return DMBS_ERR;
+      else if ( ret == DMB_BIT_ERR ) {
+         break;
+      }
+
+      /* Store quantizer and increment array index */
+      *quant = inOutParam->quant;
+      quant++;
+
+      if ( inOutParam->yMBInFrame != NULL )
+        {
+          inOutParam->yMBInFrame += 16;
+          inOutParam->uBlockInFrame += 8;
+          inOutParam->vBlockInFrame += 8;
+        }
+      dmbi.xPosInMBs++;
+
+      if (dmbi.xPosInMBs == inParam->pictParam->numMBsInMBLine) {
+          if ( inOutParam->yMBInFrame != NULL )
+            {
+                inOutParam->yMBInFrame += 15 * yWidth;
+                inOutParam->uBlockInFrame += 7 * uvWidth;
+                inOutParam->vBlockInFrame += 7 * uvWidth;
+            }
+         dmbi.xPosInMBs = 0;
+         dmbi.yPosInMBs++;
+      }
+   }
+     
+   hTranscoder->H263OneGOBSliceEnded(dmbi.yPosInMBs * inParam->numMBsInSegment);
+   
+   return DMBS_OK;
+}
+
+
+/* {{-output"dmbsGetAndDecodePMBsInScanOrder.txt"}} */
+/*
+ * dmbsGetAndDecodePMBsInScanOrder
+ *
+ * Parameters:
+ *    numMBsToDecode             the number of macroblocks to decode
+ *    inParam                    input parameters
+ *    inOutParam                 input/output parameters, these parameters
+ *                               may be modified in the function
+ *    quant                      array for storing quantization parameters
+ *
+ * Function:
+ *    This function gets and decodes a requested number of INTER frame
+ *    macroblocks in scan order.
+ *
+ * Returns:
+ *    >= 0                       the function was successful
+ *    < 0                        an error occured
+ *
+ */
+
+int dmbsGetAndDecodePMBsInScanOrder(
+   const dmbPFrameMBInParam_t *inParam,
+   dmbPFrameMBInOutParam_t *inOutParam,
+   int *quant, CMPEG4Transcoder *hTranscoder)
+/* {{-output"dmbsGetAndDecodePMBsInScanOrder.txt"}} */
+{
+   int currMBNum;
+   int yWidth = inParam->pictParam->lumMemWidth;
+   int uvWidth = yWidth / 2;
+   int ret = 0;
+   dmbPFrameMBInParam_t dmbi;
+
+   memcpy(&dmbi, inParam, sizeof(dmbPFrameMBInParam_t));
+
+   for (currMBNum = 0; currMBNum < inParam->numMBsInSegment; currMBNum++) {
+         
+      hTranscoder->BeginOneMB(currMBNum + inParam->numMBsInSegment * inParam->yPosInMBs);
+
+      ret = dmbGetAndDecodePFrameMB(&dmbi, inOutParam, 0, hTranscoder);
+      if (ret < 0)
+        return DMBS_ERR;
+      else if ( ret == DMB_BIT_ERR ) {
+        break;
+      }
+         
+      /* Store quantizer and increment array index */
+      *quant = inOutParam->quant;
+      quant++;
+      
+      if ( inOutParam->yMBInFrame != NULL )
+        {
+          inOutParam->yMBInFrame += 16;
+          inOutParam->uBlockInFrame += 8;
+          inOutParam->vBlockInFrame += 8;
+        }
+      dmbi.xPosInMBs++;
+
+      if (dmbi.xPosInMBs == inParam->pictParam->numMBsInMBLine) {
+          if ( inOutParam->yMBInFrame != NULL )
+            {
+             inOutParam->yMBInFrame += 15 * yWidth;
+             inOutParam->uBlockInFrame += 7 * uvWidth;
+             inOutParam->vBlockInFrame += 7 * uvWidth;
+            }
+         dmbi.xPosInMBs = 0;
+         dmbi.yPosInMBs++;
+      }
+   }
+     
+   hTranscoder->H263OneGOBSliceEnded(dmbi.yPosInMBs * inParam->numMBsInSegment);
+   
+   return DMBS_OK;
+     
+}
+// End of File