www.pudn.com > JM60.ZIP > erc_api.h


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2001, International Telecommunications Union, Geneva 
* 
* DISCLAIMER OF WARRANTY 
* 
* These software programs are available to the user without any 
* license fee or royalty on an "as is" basis. The ITU disclaims 
* any and all warranties, whether express, implied, or 
* statutory, including any implied warranties of merchantability 
* or of fitness for a particular purpose.  In no event shall the 
* contributor or the ITU be liable for any incidental, punitive, or 
* consequential damages of any kind whatsoever arising from the 
* use of these programs. 
* 
* This disclaimer of warranty extends to the user of these programs 
* and user's customers, employees, agents, transferees, successors, 
* and assigns. 
* 
* The ITU does not represent or warrant that the programs furnished 
* hereunder are free of infringement of any third-party patents. 
* Commercial implementations of ITU-T Recommendations, including 
* shareware, may be subject to royalty fees to patent holders. 
* Information regarding the ITU-T patent policy is available from 
* the ITU Web site at http://www.itu.int. 
* 
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY. 
************************************************************************ 
*/ 
 
/*! 
 ************************************************************************ 
 * \file  erc_api.h 
 * 
 * \brief 
 *      External (still inside video decoder) interface for error concealment module 
 * 
 * \author 
 *      - Ari Hourunranta                 
 *      - Ye-Kui Wang                    
 * 
 ************************************************************************ 
 */ 
 
 
#ifndef _ERC_API_H_ 
#define _ERC_API_H_ 
 
#include "erc_globals.h" 
 
/* 
* Defines 
*/ 
 
/* If the average motion vector of the correctly received macroblocks is less than the  
threshold, concealByCopy is used, otherwise concealByTrial is used. */ 
#define MVPERMB_THR 8  
 
/* used to determine the size of the allocated memory for a temporal Region (MB) */ 
#define DEF_REGION_SIZE 384  /* 8*8*6 */  
 
#define ERC_BLOCK_OK                3 
#define ERC_BLOCK_CONCEALED         2 
#define ERC_BLOCK_CORRUPTED         1 
#define ERC_BLOCK_EMPTY             0 
 
#define mabs(a) ( (a) < 0 ? -(a) : (a) ) 
#define mmax(a,b) ((a) > (b) ? (a) : (b)) 
#define mmin(a,b) ((a) < (b) ? (a) : (b)) 
 
/* 
* Functions to convert MBNum representation to blockNum 
*/ 
 
#define xPosYBlock(currYBlockNum,picSizeX) \ 
((currYBlockNum)%((picSizeX)>>3)) 
 
#define yPosYBlock(currYBlockNum,picSizeX) \ 
((currYBlockNum)/((picSizeX)>>3)) 
 
#define xPosMB(currMBNum,picSizeX) \ 
((currMBNum)%((picSizeX)>>4)) 
 
#define yPosMB(currMBNum,picSizeX) \ 
((currMBNum)/((picSizeX)>>4)) 
 
#define MBxy2YBlock(currXPos,currYPos,comp,picSizeX) \ 
((((currYPos)<<1)+((comp)>>1))*((picSizeX)>>3)+((currXPos)<<1)+((comp)&1)) 
 
#define MBNum2YBlock(currMBNum,comp,picSizeX) \ 
MBxy2YBlock(xPosMB((currMBNum),(picSizeX)),yPosMB((currMBNum),(picSizeX)),(comp),(picSizeX)) 
 
 
/* 
* typedefs 
*/ 
 
/* segment data structure */ 
typedef struct ercSegment_s 
{ 
  int      startMBPos; 
  int      endMBPos; 
  int      fCorrupted; 
} ercSegment_t; 
 
/* Error detector & concealment instance data structure */ 
typedef struct ercVariables_s 
{ 
  /*  Number of macroblocks (size or size/4 of the arrays) */ 
  int   nOfMBs; 
  /* Number of segments (slices) in frame */ 
  int     nOfSegments; 
   
  /*  Array for conditions of Y blocks */ 
  int     *yCondition; 
  /*  Array for conditions of U blocks */ 
  int     *uCondition; 
  /*  Array for conditions of V blocks */ 
  int     *vCondition; 
   
  /* Array for Slice level information */ 
  ercSegment_t *segments; 
  int     currSegment; 
   
  /* Conditions of the MBs of the previous frame */ 
  int   *prevFrameYCondition; 
   
  /* Flag telling if the current segment was found to be corrupted */ 
  int   currSegmentCorrupted; 
  /* Counter for corrupted segments per picture */ 
  int   nOfCorruptedSegments; 
   
  /* State variables for error detector and concealer */ 
  int   concealment; 
   
} ercVariables_t; 
 
/* 
* External function interface 
*/ 
 
void ercInit(int pic_sizex, int pic_sizey, int flag); 
ercVariables_t *ercOpen( void ); 
void ercReset( ercVariables_t *errorVar, int nOfMBs, int numOfSegments, int32 picSizeX ); 
void ercClose( ercVariables_t *errorVar ); 
void ercSetErrorConcealment( ercVariables_t *errorVar, int value ); 
 
void ercStartSegment( int currMBNum, int segment, u_int32 bitPos, ercVariables_t *errorVar ); 
void ercStopSegment( int currMBNum, int segment, u_int32 bitPos, ercVariables_t *errorVar ); 
void ercMarkCurrSegmentLost(int32 picSizeX, ercVariables_t *errorVar ); 
void ercMarkCurrSegmentOK(int32 picSizeX, ercVariables_t *errorVar ); 
void ercMarkCurrMBConcealed( int currMBNum, int comp, int32 picSizeX, ercVariables_t *errorVar ); 
 
int ercConcealIntraFrame( frame *recfr, int32 picSizeX, int32 picSizeY, ercVariables_t *errorVar ); 
int ercConcealInterFrame( frame *recfr, objectBuffer_t *object_list,  
                         int32 picSizeX, int32 picSizeY, ercVariables_t *errorVar ); 
 
#endif