videoeditorengine/h263decoder/src/decpich_mpeg.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 7 4c409de21d23
--- 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