diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/h263decoder/src/decmbdct_mpeg.cpp --- a/videoeditorengine/h263decoder/src/decmbdct_mpeg.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,381 +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: -* Prediction error block decoding functions (MPEG-4). -* -*/ - - - -/* - * Includes - */ -#include "h263dConfig.h" -#include "decmbdct.h" -#include "decblock.h" -#include "block.h" -#include "viddemux.h" -/* MVE */ -#include "MPEG4Transcoder.h" - -/* - * Global functions - */ - -/* {{-output"dmdGetAndDecodeMPEGIMBBlocks.txt"}} */ -/* - * dmdGetAndDecodeMPEGIMBBlocks - * - * - * Parameters: - * param parameters needed in this function - * - * Function: - * This function gets the DCT coefficients of an INTRA macroblock - * from the bitstream, reconstructs the corresponding - * pixel-domain blocks and puts the blocks to the output frame. - * - * Returns: - * >= 0 the function was successful - * < 0 an error occured when accessing bit buffer - * - */ - -int dmdGetAndDecodeMPEGIMBBlocks( - dmdMPEGIParam_t *param, CMPEG4Transcoder *hTranscoder) -/* {{-output"dmdGetAndDecodeMPEGIMBBlocks.txt"}} */ -{ - bibBuffer_t *inBuffer; - - bibBuffer_t - *outBuffer; /* Output bit buffer instance */ - - bibBufferEdit_t - *bufEdit; - - int colorEffect; - TBool getDecodedFrame; - - int i, j, - block[64], cWidth, bitErrorIndication = 0, ret = 0; - u_char *yBlockInFrame; - int IntraDC_size, - IntraDC_delta, - DC_coeff; - - inBuffer = param->inBuffer; - outBuffer = param->outBuffer; - bufEdit = param->bufEdit; - colorEffect = param->iColorEffect; - getDecodedFrame = param->iGetDecodedFrame; - - if ( param->yMBInFrame ) - { - yBlockInFrame = param->yMBInFrame + - ((param->reversible_vlc && param->vlc_dec_direction) ? ((/*8 **/ param->yWidth<<3) + 8) : 0); - } - else - { - yBlockInFrame = NULL; - } - cWidth = (param->yWidth >>1 /*/ 2*/); - - - /* Loop through the 4 Luminance and the 2 Chrominance blocks */ - for (j=0; j<=5; j++) - { - - /* if reversible decoding, the block numbering is reverse */ - if (param->reversible_vlc && param->vlc_dec_direction) - { - i = 5-j; - } - else - { - i=j; - } - - /* MVE */ - hTranscoder->BeginOneBlock(i); - - bitErrorIndication = 0; - - /* Get Intra DC if not switched */ - if(!param->switched) { - if (param->data_partitioned) - IntraDC_delta = param->DC[i]; - else { - ret = vdxGetIntraDC(inBuffer, outBuffer, bufEdit, colorEffect, &(param->StartByteIndex), &(param->StartBitIndex), - i, &IntraDC_size, &IntraDC_delta, &bitErrorIndication); - - if ( ret < 0 ) - return DMD_ERR; - else if ( ret == VDX_OK_BUT_BIT_ERROR ) - goto corruptedMB; - } - block[0] = IntraDC_delta; - } - - /* Get DCT coefficients */ - if (((i<4) && (vdxIsYCoded(param->cbpy, i + 1))) || - ((i==4) && (vdxIsUCoded(param->cbpc))) || - ((i==5) && (vdxIsVCoded(param->cbpc)))) - { - /* if reversible VLC, also the direction of decoding is relevant */ - if (param->reversible_vlc) - { - if (!param->vlc_dec_direction) - ret = vdxGetRVLCDCTBlock(inBuffer, (!param->switched), 1, block, - &bitErrorIndication); - else - ret = vdxGetRVLCDCTBlockBackwards(inBuffer, (!param->switched), 1, block, - &bitErrorIndication); - } - else - { - ret = vdxGetMPEGIntraDCTBlock(inBuffer, (!param->switched), block, - &bitErrorIndication); - } - - if ( ret < 0 ) - return DMD_ERR; - else if ( ret == VDX_OK_BUT_BIT_ERROR ) - goto corruptedMB; - - } - /* if block is not coded */ - else - { - memset(block + (!param->switched), 0, (63 + (param->switched))* sizeof(int)); - } - - /* MVE */ - hTranscoder->AddOneBlockDataToMB(i, block); - - /* DC/AC prediction: reconstruct the Intra coefficients */ - aicDCACrecon(param->aicData, param->quant, - param->fTopOfVP, param->fLeftOfVP, param->fBBlockOut, - i, block, param->currMBNum); - - /* optimized nonlinear inverse quantization for Intra DC */ - DC_coeff = (block[0] *= aicDCScaler(param->quant,(i<4)?1:2)); - - hTranscoder->AddOneBlockDCACrecon(i, block); - - /* Update the AIC module data, with the current MB */ - aicBlockUpdate (param->aicData, param->currMBNum, i, block, - param->quant, DC_coeff); - - - if(getDecodedFrame || hTranscoder->NeedDecodedYUVFrame()) - { - /* inverse quantization and IDCT */ - dblIdctAndDequant(block, param->quant, 1); - - if (i<4) - { - blcBlockToFrame(block, yBlockInFrame, param->yWidth); - if (param->reversible_vlc && param->vlc_dec_direction) - { - yBlockInFrame -= 8; - if (i == 2) - yBlockInFrame -= ((/*8 **/ param->yWidth<<3) - 16); - } - else - { - yBlockInFrame += 8; - if (i & 1) - yBlockInFrame += ((/*8 **/ param->yWidth<<3) - 16); - } - } - else - { - blcBlockToFrame(block, ((i==4)? param->uBlockInFrame : param->vBlockInFrame) , cWidth); - } - - } - - } - /* for blocks */ - - if ( hTranscoder->TranscodingOneMB(NULL) != TX_OK ) - { - return DMD_ERR; - } - - return DMD_OK; - -corruptedMB: - - return DMD_BIT_ERR; -} - -/* {{-output"dmdGetAndDecodeMPEGPMBBlocks.txt"}} */ - -/* without the possibility to decode only Y component (#ifdef H263D_LUMINANCE_ONLY) */ -/* - * dmdGetAndDecodeMPEGPMBBlocks - * - * - * Parameters: - * param parameters needed in this function - * - * Function: - * This function gets the DCT coefficients of an INTER macroblock - * from the bitstream, reconstructs the corresponding - * pixel-domain blocks and adds the blocks to the prediction frame. - * - * Returns: - * >= 0 the function was successful - * < 0 an error occured when accessing bit buffer - * - */ - -int dmdGetAndDecodeMPEGPMBBlocks( - dmdPParam_t *param, CMPEG4Transcoder *hTranscoder) -/* {{-output"dmdGetAndDecodeMPEGPMBBlocks.txt"}} */ -{ - int i, j, - bitErrorIndication = 0, /* Carries bit error indication information returned - by the video demultiplexer module */ - ret = 0; - - bibBuffer_t *inBuffer; - - TBool getDecodedFrame; - - inBuffer = param->inBuffer; - getDecodedFrame = param->iGetDecodedFrame; - - int yWidth, block[64]; - u_char *yBlockInFrame; - int chrQuant; - - int fEscapeCodeUsed = 0; - - /* Find out the value of QP for chrominance block. */ - chrQuant = param->quant; - - yWidth = param->uvWidth <<1 /** 2*/; - if ( param->currYMBInFrame ) - { - yBlockInFrame = param->currYMBInFrame + - ((param->reversible_vlc && param->vlc_dec_direction) ? ((/*8 **/ yWidth<<3) + 8) : 0); - } - else - { - yBlockInFrame = NULL; - } - - /* Loop through the 4 Luminance and the 2 Chrominance blocks */ - for (j=0; j<=5; j++) { - - /* if reversible decoding, the block numbering is reverse */ - if (param->reversible_vlc && param->vlc_dec_direction) - { - i = 5-j; - } - else - { - i=j; - } - - /* MVE */ - hTranscoder->BeginOneBlock(i); - - if (((i<4) && (vdxIsYCoded(param->cbpy, i + 1))) || - ((i==4) && (vdxIsUCoded(param->cbpc))) || - ((i==5) && (vdxIsVCoded(param->cbpc)))) - { - - /* Get DCT coefficients */ - if (param->reversible_vlc) - { - if (!param->vlc_dec_direction) - ret = vdxGetRVLCDCTBlock(inBuffer, 0, 0, block, - &bitErrorIndication); - else - ret = vdxGetRVLCDCTBlockBackwards(inBuffer, 0, 0, block, - &bitErrorIndication); - } - else - { - ret = vdxGetDCTBlock(inBuffer, 0, 1, block, - &bitErrorIndication, 0, param->quant, &fEscapeCodeUsed); - } - if ( ret < 0 ) - return DMD_ERR; - else if ( ret == VDX_OK_BUT_BIT_ERROR ) - return DMD_BIT_ERR; - - hTranscoder->AddOneBlockDataToMB(i, block); - if(getDecodedFrame || hTranscoder->NeedDecodedYUVFrame()) // we need the YUV frames. - { - - /* IDCT & dequant */ - dblIdctAndDequant(block, ((i<4)?param->quant:chrQuant), 0); - - if (i<4) - { - - blcAddBlock(block, yBlockInFrame, - yWidth, 0, 0, 0); - } - else - { - /* U or V component */ - - blcAddBlock(block, ((i==4)? param->currUBlkInFrame : param->currVBlkInFrame), param->uvWidth, 0, 0, 0); - } - } - - } - - /* MVE */ - else - { - /* this block is not coded */ - hTranscoder->AddOneBlockDataToMB(i, NULL); - } - - - if ((i<4) && yBlockInFrame) - { - if (param->reversible_vlc && param->vlc_dec_direction) { - yBlockInFrame -= 8; - if (i == 2) - yBlockInFrame -= ((/*8 **/ yWidth<<3) - 16); - } else { - yBlockInFrame += 8; - if (i & 1) - yBlockInFrame += ((/*8 **/ yWidth<<3) - 16); - } - - } - else //u,v - { - /* nothing here */ - } - } - - - /* MVE */ - if ( hTranscoder->TranscodingOneMB(param) != TX_OK ) - { - return DMD_ERR; - } - return DMD_OK; -} -// End of File