diff -r 000000000000 -r 951a5db380a0 videoeditorengine/h263decoder/src/decmbs.cpp --- /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