diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/h263decoder/src/decpich_mpeg.cpp --- a/videoeditorengine/h263decoder/src/decpich_mpeg.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,417 +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: -* Picture header decoding functions (MPEG-4). -* -*/ - - - -#include "h263dConfig.h" -#include "mpegcons.h" -#include "sync.h" -#include "decpich.h" -#include "debug.h" -#include "vdeims.h" -#include "vdeimb.h" -#include "viddemux.h" - - -/* - * Global functions - */ - -/* - * dphGetMPEGVolHeader - * - * - * Parameters: - * hInstance instance data - * - * Function: - * This function decodes the Video Object Header and the VOL Header - * and initializes the fields of vdcInstance which are set in these - * headers. Check and reports (generating error messages) if the header - * shows a configuration on feature which is not supported by the - * Simple Video Object Profile of MPEG4 - * - * Returns: - * VDE_OK if the function was successful - * VDE_ERROR if a fatal error, from which the decoder - * cannot be restored, has occured - * - */ - -int dphGetMPEGVolHeader(dphInOutParam_t *inOutParam, CMPEG4Transcoder *hTranscoder) -{ - vdcInstance_t *instance = inOutParam->vdcInstance; - bibBuffer_t *inBuffer = inOutParam->inBuffer; - int bitErrorIndication = 0; - vdxVolHeader_t volHeader; - - /* read the Stream headers from the bitstream */ - if ((vdxGetVolHeader(inBuffer, &volHeader, &bitErrorIndication, 0, 0, 0, hTranscoder) != VDX_OK) || - (bitErrorIndication != 0)) { - return DPH_ERR; - } - - /* copy the useful VOL parameters to pictureParam or the core data structure */ - instance->pictureParam.vo_id = volHeader.vo_id; - instance->pictureParam.vol_id = volHeader.vol_id; - instance->pictureParam.time_increment_resolution = volHeader.time_increment_resolution; - - /* MVE */ - instance->pictureParam.fixed_vop_rate = volHeader.fixed_vop_rate; - - instance->pictureParam.lumWidth = volHeader.lumWidth; - instance->pictureParam.lumHeight = volHeader.lumHeight; - - if (volHeader.lumWidth%16) - instance->pictureParam.lumMemWidth = (((volHeader.lumWidth >>4/*/16*/) + 1) <<4/** 16*/); - else - instance->pictureParam.lumMemWidth = volHeader.lumWidth; - - if (volHeader.lumHeight%16) - instance->pictureParam.lumMemHeight = (((volHeader.lumHeight >>4/*/16*/) + 1) <<4/** 16*/); - else - instance->pictureParam.lumMemHeight = volHeader.lumHeight; - - instance->pictureParam.error_res_disable = volHeader.error_res_disable; - instance->pictureParam.data_partitioned = volHeader.data_partitioned; - instance->pictureParam.reversible_vlc = volHeader.reversible_vlc; - - /* copy the got user data to the core data structure */ - if (volHeader.user_data != NULL) { - instance->user_data = (char *) malloc(MAX_USER_DATA_LENGTH); - - volHeader.user_data_length = - ((instance->user_data_length + volHeader.user_data_length) >= MAX_USER_DATA_LENGTH) ? - (MAX_USER_DATA_LENGTH - instance->user_data_length) : volHeader.user_data_length; - - memcpy( - instance->user_data + instance->user_data_length, - volHeader.user_data, - volHeader.user_data_length); - - instance->user_data_length += volHeader.user_data_length; - - free(volHeader.user_data); - } - - return DPH_OK; -} - -/* {{-output"dphGetMPEGVopHeader.txt"}} */ -/* - * dphGetMPEGVopHeader - * - * - * Parameters: - * inOutParam input/output parameters, these parameters - * may be modified in the function - * outParam output parameters - * bitErrorIndication bit error indication, see biterr.h for - * the possible values - * - * Function: - * This function gets and decodes an MPEG Vop header which should start - * with a VOP start_code at the current position of the bit buffer. - * At first, the function reads the picture header fields from the bitstream. - * Then, it checks whether the values of the fields are supported. - * An unsupported value is interpreted as a bit error. Finally, - * the function updates VDC instance data and output parameters - * (according to the new picture header). - * - * Returns: - * >= 0 the function was successful - * < 0 an error occured - * - */ - -int dphGetMPEGVopHeader( - const dphInParam_t *inParam, - dphInOutParam_t *inOutParam, - dphOutParam_t *outParam, - int *bitErrorIndication) -/* {{-output"dphGetMPEGVopHeader.txt"}} */ -{ - bibBuffer_t *inBuffer = inOutParam->inBuffer; - u_char fPrevIntraGot; /* Non-zero if an INTRA frame has been decoded - before the current frame */ - vdxGetVopHeaderInputParam_t picHdrIn; - vdxVopHeader_t picHeader; - vdcInstance_t *instance = inOutParam->vdcInstance; - vdcPictureParam_t *pictureParam = &instance->pictureParam; - int fInterFrame; /* non-zero = INTER frame, 0 = INTRA frame */ - int ret = DPH_OK, curr_mod_time_base=0; - int16 error = 0; - int32 currFrameNum=0; - - /* In normal case read the picture header from the bitstream. - This function can be also called just to initialize the default - picture header parameters and allocate image buffers, but not read - the picture header from bitstream. This is used when the picture - header has been lost (e.g. packet loss) but decoding is continued */ - - if (inParam->fReadBits) { - - /* - * Get picture header - */ - - picHdrIn.time_increment_resolution = pictureParam->time_increment_resolution; - - /* MVE */ - int dummy1, dummy2, dummy3, dummy4; /* not used for processing */ - ret = vdxGetVopHeader(inBuffer, &picHdrIn, &picHeader, - &dummy1, &dummy2, &dummy3, &dummy4, - bitErrorIndication); - - if ( ret < 0 ) - return DPH_ERR; - else if ( ret > 0 ) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } else { - ret = DPH_OK; - } - - /* - * Check picture header validity - */ - - /* Local parameters needed in validity check (and possibly afterwards) */ - fPrevIntraGot = instance->fIntraGot; - fInterFrame = (picHeader.coding_type == VDX_VOP_TYPE_P); - - - if (picHeader.time_base_incr < 0 || picHeader.time_base_incr > 60) { - if ( *bitErrorIndication ) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } - } - - curr_mod_time_base = pictureParam->mod_time_base + picHeader.time_base_incr; - - currFrameNum = (int) ((curr_mod_time_base + - ((double) picHeader.time_inc) / ((double) pictureParam->time_increment_resolution)) * - 30.0 + 0.001); - - if ((currFrameNum <= instance->frameNum) && - (instance->frameNum > 0)) { - if (*bitErrorIndication) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } else { - /* this can happen if a previous picture header is lost and it had - mod_time_base increase information. */ - int i; - int32 tryFrameNum=0; - for (i=1;i<5;i++) { - tryFrameNum = (int) (((curr_mod_time_base+i) + - ((double) picHeader.time_inc) / ((double) pictureParam->time_increment_resolution)) * - 30.0 + 0.001); - if (tryFrameNum > instance->frameNum) { - currFrameNum = tryFrameNum; - curr_mod_time_base += i; - ret = DPH_OK; - break; - } - } - if (i==5) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } - } - } - - /* If no INTRA frame has ever been decoded and the current frame is INTER */ - if (!fPrevIntraGot && fInterFrame) { - deb("ERROR. No I-vop before a P-vop\n"); - return DPH_ERR_NO_INTRA; - - } - - /* fcode can have only the valid values 1..7 */ - if(picHeader.fcode_forward == 0) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } - - /* quant can not be zero */ - if(picHeader.quant == 0) { - ret = DPH_OK_BUT_BIT_ERROR; - goto updateInstanceData; - } - - } /* end fReadBits */ - - /* Now, the picture header is considered to be error-free, - and its contents are used to manipulate instance data */ - -updateInstanceData: - - /* - * Update instance data and output parameters - */ - - /* some parameters need to be set if error has been detected, for initializing */ - if (!inParam->fReadBits || (ret == DPH_OK_BUT_BIT_ERROR)) { - picHeader.rounding_type = 0; - picHeader.fcode_forward = 1; - picHeader.coding_type = 1; - } else { - /* Update frame numbers */ - pictureParam->time_base_incr = picHeader.time_base_incr; - pictureParam->mod_time_base = curr_mod_time_base; - pictureParam->time_inc = picHeader.time_inc; - instance->frameNum = currFrameNum; - } - - /* Update picture parameters */ - pictureParam->trd = (instance->frameNum % 256) - pictureParam->tr; - pictureParam->tr = instance->frameNum % 256; - - pictureParam->pictureType = picHeader.coding_type; - - if (!picHeader.vop_coded) { - return DPH_OK_BUT_NOT_CODED; - } - - /* NO reference picture selection */ - outParam->trp = -1; - - /* No PB Frames allowed */ - instance->frameNumForBFrame = -1; - - /* Note: If no INTRA has been got the function has already returned */ - instance->fIntraGot = 1; - - pictureParam->intra_dc_vlc_thr = picHeader.intra_dc_vlc_thr; - pictureParam->fcode_forward = picHeader.fcode_forward; - - outParam->pquant = picHeader.quant; - - /* Initialize for only 1 GOB */ - pictureParam->numMBLinesInGOB = pictureParam->lumMemHeight / 16; - pictureParam->numMBsInMBLine = pictureParam->lumMemWidth / 16; - - pictureParam->numGOBs = 1; - pictureParam->fLastGOBSizeDifferent = 0; - pictureParam->numMBsInGOB = - pictureParam->numMBsInMBLine * pictureParam->numMBLinesInGOB; - pictureParam->numMBsInLastGOB = pictureParam->numMBsInGOB; - - /* Rounding type */ - pictureParam->rtype = picHeader.rounding_type; - - /* NO channel Multiplexing */ - pictureParam->fSplitScreenIndicator = 0; - pictureParam->fDocumentCameraIndicator = 0; - pictureParam->fFullPictureFreezeRelease = 0; - pictureParam->fPLUSPTYPE = 0; - pictureParam->cpm = 0; - - /* All the Annexes are switched off */ - pictureParam->fSAC = 0; - pictureParam->fRPR = 0; - pictureParam->fRRU = 0; - pictureParam->fCustomSourceFormat = 0; - pictureParam->fAIC = 0; - pictureParam->fDF = 0; - pictureParam->fSS = 0; - pictureParam->fRPS = 0; - pictureParam->fISD = 0; - pictureParam->fAIV = 0; - pictureParam->fMQ = 0; - pictureParam->fUMVLimited = 0; - - /* Unrestricted MV allowed - OBMC NOT allowed */ - pictureParam->fUMV = 1; - pictureParam->fAP = 0; - pictureParam->fMVsOverPictureBoundaries = 1; - - /* Initialize motion vector count module */ - mvcStart( &instance->mvcData, - ((instance->pictureParam.lumMemWidth >>4 /*/ 16*/) - 1), - pictureParam->lumWidth, - pictureParam->lumHeight, &error); - /* Note: This assumes that the memory for frame->mvcData is filled with 0 - in the first time the function is called. - (This is ensured by setting the instance data to zero when it is - initialized in vdcOpen.) */ - if (error) { - deb("mvcStart failed.\n"); - return DPH_ERR; - } - - /* Initialize once to count parameters for the mvc module */ - { - int r_size, scale_factor; - - instance->mvcData.f_code = pictureParam->fcode_forward; - r_size = pictureParam->fcode_forward - 1; - scale_factor = (1 << r_size); - instance->mvcData.range = 160 * scale_factor; - } - - /* Start, initialize the Advanced Intra Coding module */ - aicStart(&instance->aicData, pictureParam->numMBsInMBLine, &error); - if (error) { - deb("aicStart failed.\n"); - return DPH_ERR; - } - - /* Get image buffers */ - { - vdeIms_t *store = instance->imageStore; - vdeImsItem_t *imsItem; - vdeImb_t *imb; - int width, height; - - vdeImsSetYUVNeed(store, inParam->fNeedDecodedFrame); - - if (vdeImsGetFree(store, instance->pictureParam.lumMemWidth, - instance->pictureParam.lumMemHeight, - &instance->currFrame) < 0) - goto errGetFreeP; - imsItem = instance->currFrame; - - if (vdeImsStoreItemToImageBuffer(imsItem, &imb) < 0) - goto errAfterGetFreeP; - - if (vdeImbYUV(imb, &outParam->currYFrame, - &outParam->currUFrame, &outParam->currVFrame, - &width, &height) < 0) - goto errAfterGetFreeP; - } - - return ret; - - /* Error condition handling, - release everything in reverse order */ - errAfterGetFreeP: - - vdeImsPutFree(instance->imageStore, instance->currFrame); - errGetFreeP: - - instance->currFrame = NULL; - instance->bFrame = NULL; - - return DPH_ERR; -} -// End of File