www.pudn.com > JM.rar > global.h


 
/*! 
 ************************************************************************ 
 *  \file 
 *     global.h 
 *  \brief 
 *     global definitions for for H.264 decoder. 
 *  \author 
 *     Copyright (C) 1999  Telenor Satellite Services,Norway 
 *                         Ericsson Radio Systems, Sweden 
 * 
 *     Inge Lille-Langøy                
 * 
 *     Telenor Satellite Services 
 *     Keysers gt.13                       tel.:   +47 23 13 86 98 
 *     N-0130 Oslo,Norway                  fax.:   +47 22 77 79 80 
 * 
 *     Rickard Sjoberg                  
 * 
 *     Ericsson Radio Systems 
 *     KI/ERA/T/VV 
 *     164 80 Stockholm, Sweden 
 * 
 ************************************************************************ 
 */ 
#ifndef _GLOBAL_H_ 
#define _GLOBAL_H_ 
 
#include                               //!< for FILE 
#include  
#include  
#include "defines.h" 
#include "parsetcommon.h" 
 
#ifdef WIN32 
#define  snprintf _snprintf 
#define  open     _open 
#define  close    _close 
#define  read     _read 
#define  write    _write 
#define  lseek    _lseeki64 
#define  fsync    _commit 
#define  OPENFLAGS_WRITE _O_WRONLY|_O_CREAT|_O_BINARY|_O_TRUNC 
#define  OPEN_PERMISSIONS _S_IREAD | _S_IWRITE 
#define  OPENFLAGS_READ  _O_RDONLY|_O_BINARY 
#else 
#define  OPENFLAGS_WRITE O_WRONLY|O_CREAT|O_TRUNC 
#define  OPENFLAGS_READ  O_RDONLY 
#define  OPEN_PERMISSIONS S_IRUSR | S_IWUSR 
#endif 
 
 
typedef unsigned char   byte;                   //!<  8 bit unsigned 
typedef int             int32; 
typedef unsigned int    u_int32; 
 
#define imgpel unsigned short 
 
#if defined(WIN32) && !defined(__GNUC__) 
  typedef __int64   int64; 
# define INT64_MIN        (-9223372036854775807i64 - 1i64) 
#else 
  typedef long long int64; 
# define INT64_MIN        (-9223372036854775807LL - 1LL) 
#endif 
 
 
pic_parameter_set_rbsp_t *active_pps; 
seq_parameter_set_rbsp_t *active_sps; 
 
// global picture format dependend buffers, mem allocation in decod.c ****************** 
int  **refFrArr;                                //!< Array for reference frames of each block 
 
imgpel **imgY_ref;                                //!< reference frame find snr 
imgpel ***imgUV_ref; 
 
int  ReMapRef[20]; 
// B pictures 
int  Bframe_ctr; 
int  frame_no; 
 
int  g_nFrame; 
 
// For MB level frame/field coding 
int  TopFieldForSkip_Y[16][16]; 
int  TopFieldForSkip_UV[2][16][16]; 
 
int  InvLevelScale4x4Luma_Intra[6][4][4]; 
int  InvLevelScale4x4Chroma_Intra[2][6][4][4]; 
 
int  InvLevelScale4x4Luma_Inter[6][4][4]; 
int  InvLevelScale4x4Chroma_Inter[2][6][4][4]; 
 
int  InvLevelScale8x8Luma_Intra[6][8][8]; 
 
int  InvLevelScale8x8Luma_Inter[6][8][8]; 
 
int  *qmatrix[8]; 
 
#define ET_SIZE 300      //!< size of error text buffer 
char errortext[ET_SIZE]; //!< buffer for error message for exit with error() 
 
/*********************************************************************** 
 * T y p e    d e f i n i t i o n s    f o r    T M L 
 *********************************************************************** 
 */ 
 
//! Data Partitioning Modes 
typedef enum 
{ 
  PAR_DP_1,    //!< no data partitioning is supported 
  PAR_DP_3,    //!< data partitioning with 3 partitions 
} PAR_DP_TYPE; 
 
 
//! Output File Types 
typedef enum 
{ 
  PAR_OF_ANNEXB,   //!< Current TML description 
  PAR_OF_RTP,   //!< RTP Packet Output format 
//  PAR_OF_IFF    //!< Interim File Format 
} PAR_OF_TYPE; 
 
//! Boolean Type 
/*typedef enum { 
  FALSE, 
  TRUE 
} Boolean; 
*/ 
//! definition of H.264 syntax elements 
typedef enum { 
  SE_HEADER, 
  SE_PTYPE, 
  SE_MBTYPE, 
  SE_REFFRAME, 
  SE_INTRAPREDMODE, 
  SE_MVD, 
  SE_CBP_INTRA, 
  SE_LUM_DC_INTRA, 
  SE_CHR_DC_INTRA, 
  SE_LUM_AC_INTRA, 
  SE_CHR_AC_INTRA, 
  SE_CBP_INTER, 
  SE_LUM_DC_INTER, 
  SE_CHR_DC_INTER, 
  SE_LUM_AC_INTER, 
  SE_CHR_AC_INTER, 
  SE_DELTA_QUANT_INTER, 
  SE_DELTA_QUANT_INTRA, 
  SE_BFRAME, 
  SE_EOS, 
  SE_TRANSFORM_SIZE_FLAG, 
  SE_MAX_ELEMENTS //!< number of maximum syntax elements, this MUST be the last one! 
} SE_type;        // substituting the definitions in element.h 
 
 
typedef enum { 
  INTER_MB, 
  INTRA_MB_4x4, 
  INTRA_MB_16x16 
} IntraInterDecision; 
 
typedef enum { 
  BITS_TOTAL_MB, 
  BITS_HEADER_MB, 
  BITS_INTER_MB, 
  BITS_CBP_MB, 
  BITS_COEFF_Y_MB, 
  BITS_COEFF_UV_MB, 
  MAX_BITCOUNTER_MB 
} BitCountType; 
 
typedef enum { 
  NO_SLICES, 
  FIXED_MB, 
  FIXED_RATE, 
  CALLBACK, 
  FMO 
} SliceMode; 
 
 
typedef enum { 
  UVLC, 
  CABAC 
} SymbolMode; 
 
typedef enum { 
 LIST_0=0, 
 LIST_1=1 
} Lists; 
 
 
typedef enum { 
  FRAME, 
  TOP_FIELD, 
  BOTTOM_FIELD 
} PictureStructure;           //!< New enum for field processing 
 
 
typedef enum { 
  P_SLICE = 0, 
  B_SLICE, 
  I_SLICE, 
  SP_SLICE, 
  SI_SLICE 
} SliceType; 
 
/*********************************************************************** 
 * D a t a    t y p e s   f o r  C A B A C 
 *********************************************************************** 
 */ 
 
//! struct to characterize the state of the arithmetic coding engine 
typedef struct 
{ 
  unsigned int    Dlow, Drange; 
  unsigned int    Dvalue; 
  unsigned int    Dbuffer; 
  int             Dbits_to_go; 
  byte            *Dcodestrm; 
  int             *Dcodestrm_len; 
} DecodingEnvironment; 
 
typedef DecodingEnvironment *DecodingEnvironmentPtr; 
 
//! struct for context management 
typedef struct 
{ 
  unsigned short state;         // index into state-table CP   
  unsigned char  MPS;           // Least Probable Symbol 0/1 CP 
} BiContextType; 
 
typedef BiContextType *BiContextTypePtr; 
 
 
/********************************************************************** 
 * C O N T E X T S   F O R   T M L   S Y N T A X   E L E M E N T S 
 ********************************************************************** 
 */ 
 
#define NUM_MB_TYPE_CTX  11 
#define NUM_B8_TYPE_CTX  9 
#define NUM_MV_RES_CTX   10 
#define NUM_REF_NO_CTX   6 
#define NUM_DELTA_QP_CTX 4 
#define NUM_MB_AFF_CTX 4 
#define NUM_TRANSFORM_SIZE_CTX 3 
 
 
typedef struct 
{ 
  BiContextType mb_type_contexts [4][NUM_MB_TYPE_CTX]; 
  BiContextType b8_type_contexts [2][NUM_B8_TYPE_CTX]; 
  BiContextType mv_res_contexts  [2][NUM_MV_RES_CTX]; 
  BiContextType ref_no_contexts  [2][NUM_REF_NO_CTX]; 
  BiContextType delta_qp_contexts[NUM_DELTA_QP_CTX]; 
  BiContextType mb_aff_contexts  [NUM_MB_AFF_CTX]; 
  BiContextType transform_size_contexts [NUM_TRANSFORM_SIZE_CTX]; 
 
} MotionInfoContexts; 
 
#define NUM_IPR_CTX    2 
#define NUM_CIPR_CTX   4 
#define NUM_CBP_CTX    4 
#define NUM_BCBP_CTX   4 
#define NUM_MAP_CTX   15 
#define NUM_LAST_CTX  15 
#define NUM_ONE_CTX    5 
#define NUM_ABS_CTX    5 
 
 
typedef struct 
{ 
  BiContextType  ipr_contexts [NUM_IPR_CTX]; 
  BiContextType  cipr_contexts[NUM_CIPR_CTX];  
  BiContextType  cbp_contexts [3][NUM_CBP_CTX]; 
  BiContextType  bcbp_contexts[NUM_BLOCK_TYPES][NUM_BCBP_CTX]; 
  BiContextType  map_contexts [NUM_BLOCK_TYPES][NUM_MAP_CTX]; 
  BiContextType  last_contexts[NUM_BLOCK_TYPES][NUM_LAST_CTX]; 
  BiContextType  one_contexts [NUM_BLOCK_TYPES][NUM_ONE_CTX]; 
  BiContextType  abs_contexts [NUM_BLOCK_TYPES][NUM_ABS_CTX]; 
  BiContextType  fld_map_contexts [NUM_BLOCK_TYPES][NUM_MAP_CTX]; 
  BiContextType  fld_last_contexts[NUM_BLOCK_TYPES][NUM_LAST_CTX]; 
} TextureInfoContexts; 
 
 
//*********************** end of data type definition for CABAC ******************* 
 
/*********************************************************************** 
 * N e w   D a t a    t y p e s   f o r    T M L 
 *********************************************************************** 
 */ 
 
struct img_par; 
struct inp_par; 
struct stat_par; 
 
/*! Buffer structure for decoded referenc picture marking commands */ 
typedef struct DecRefPicMarking_s 
{ 
  int memory_management_control_operation; 
  int difference_of_pic_nums_minus1; 
  int long_term_pic_num; 
  int long_term_frame_idx; 
  int max_long_term_frame_idx_plus1; 
  struct DecRefPicMarking_s *Next; 
} DecRefPicMarking_t; 
 
//! Syntaxelement 
typedef struct syntaxelement 
{ 
  int           type;                  //!< type of syntax element for data part. 
  int           value1;                //!< numerical value of syntax element 
  int           value2;                //!< for blocked symbols, e.g. run/level 
  int           len;                   //!< length of code 
  int           inf;                   //!< info part of UVLC code 
  unsigned int  bitpattern;            //!< UVLC bitpattern 
  int           context;               //!< CABAC context 
  int           k;                     //!< CABAC context for coeff_count,uv 
 
#if TRACE 
  #define       TRACESTRING_SIZE 100           //!< size of trace string 
  char          tracestring[TRACESTRING_SIZE]; //!< trace string 
#endif 
 
  //! for mapping of UVLC to syntaxElement 
  void    (*mapping)(int len, int info, int *value1, int *value2); 
  //! used for CABAC: refers to actual coding method of each individual syntax element type 
  void  (*reading)(struct syntaxelement *, struct inp_par *, struct img_par *, DecodingEnvironmentPtr); 
 
} SyntaxElement; 
 
//! Macroblock 
typedef struct macroblock 
{ 
  int           qp; 
  int           slice_nr; 
  int           delta_quant;          //!< for rate control 
   
  struct macroblock   *mb_available_up;   //!< pointer to neighboring MB (CABAC) 
  struct macroblock   *mb_available_left; //!< pointer to neighboring MB (CABAC) 
 
  // some storage of macroblock syntax elements for global access 
  int           mb_type; 
  int           mvd[2][BLOCK_MULTIPLE][BLOCK_MULTIPLE][2];      //!< indices correspond to [forw,backw][block_y][block_x][x,y] 
  int           cbp; 
  int64       cbp_blk ; 
  unsigned long cbp_bits; 
 
  int           is_skip; 
 
  int           i16mode; 
  int           b8mode[4]; 
  int           b8pdir[4]; 
  int           ei_flag; 
 
  int           LFDisableIdc; 
  int           LFAlphaC0Offset; 
  int           LFBetaOffset; 
 
  int           c_ipred_mode;       //!< chroma intra prediction mode 
  int           mb_field; 
 
  int           skip_flag; 
 
  int mbAddrA, mbAddrB, mbAddrC, mbAddrD; 
  int mbAvailA, mbAvailB, mbAvailC, mbAvailD; 
 
  int           luma_transform_size_8x8_flag; 
  int           NoMbPartLessThan8x8Flag; 
} Macroblock; 
 
//! Bitstream 
typedef struct 
{ 
  // CABAC Decoding 
  int           read_len;           //!< actual position in the codebuffer, CABAC only 
  int           code_len;           //!< overall codebuffer length, CABAC only 
  // UVLC Decoding 
  int           frame_bitoffset;    //!< actual position in the codebuffer, bit-oriented, UVLC only 
  int           bitstream_length;   //!< over codebuffer lnegth, byte oriented, UVLC only 
  // ErrorConcealment 
  byte          *streamBuffer;      //!< actual codebuffer for read bytes 
  int           ei_flag;            //!< error indication, 0: no error, else unspecified error 
} Bitstream; 
 
//! DataPartition 
typedef struct datapartition 
{ 
 
  Bitstream           *bitstream; 
  DecodingEnvironment de_cabac; 
 
  int     (*readSyntaxElement)(SyntaxElement *, struct img_par *, struct inp_par *, struct datapartition *); 
          /*!< virtual function; 
               actual method depends on chosen data partition and 
               entropy coding method  */ 
} DataPartition; 
 
//! Slice 
typedef struct 
{ 
  int                 ei_flag;       //!< 0 if the partArr[0] contains valid information 
  int                 qp; 
  int                 slice_qp_delta; 
  int                 picture_type;  //!< picture type 
  PictureStructure    structure;     //!< Identify picture structure type 
  int                 start_mb_nr;   //!< MUST be set by NAL even in case of ei_flag == 1 
  int                 max_part_nr; 
  int                 dp_mode;       //!< data partioning mode 
  int                 next_header; 
//  int                 last_mb_nr;    //!< only valid when entropy coding == CABAC 
  DataPartition       *partArr;      //!< array of partitions 
  MotionInfoContexts  *mot_ctx;      //!< pointer to struct of context models for use in CABAC 
  TextureInfoContexts *tex_ctx;      //!< pointer to struct of context models for use in CABAC 
   
  int                 ref_pic_list_reordering_flag_l0; 
  int                 *remapping_of_pic_nums_idc_l0; 
  int                 *abs_diff_pic_num_minus1_l0; 
  int                 *long_term_pic_idx_l0; 
  int                 ref_pic_list_reordering_flag_l1; 
  int                 *remapping_of_pic_nums_idc_l1; 
  int                 *abs_diff_pic_num_minus1_l1; 
  int                 *long_term_pic_idx_l1; 
 
  int     (*readSlice)(struct img_par *, struct inp_par *); 
 
  int                 LFDisableIdc;     //!< Disable loop filter on slice 
  int                 LFAlphaC0Offset;  //!< Alpha and C0 offset for filtering slice 
  int                 LFBetaOffset;     //!< Beta offset for filtering slice 
 
  int                 pic_parameter_set_id;   //!