global.h
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:52k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ************************************************************************
  3.  *  file
  4.  *     global.h
  5.  *
  6.  *  brief
  7.  *     global definitions for H.264 encoder.
  8.  *
  9.  *  author
  10.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  11.  *
  12.  ************************************************************************
  13.  */
  14. #ifndef _GLOBAL_H_
  15. #define _GLOBAL_H_
  16. #include <memory.h>
  17. #include "win32.h"
  18. #include "defines.h"
  19. #include "parsetcommon.h"
  20. #include "ifunctions.h"
  21. #include "frame.h"
  22. #include "nalucommon.h"
  23. /***********************************************************************
  24.  * T y p e    d e f i n i t i o n s    f o r    T M L
  25.  ***********************************************************************
  26.  */
  27. #if (IMGTYPE == 0)
  28.   typedef byte imgpel;
  29.   typedef unsigned short distpel;
  30. #else
  31.   typedef unsigned short imgpel;
  32.   typedef int distpel;
  33. #endif
  34. enum {
  35.   YUV400 = 0,
  36.   YUV420 = 1,
  37.   YUV422 = 2,
  38.   YUV444 = 3
  39. } color_formats;
  40. typedef enum
  41. {
  42.   // YUV
  43.   PLANE_Y = 0,  // PLANE_Y
  44.   PLANE_U = 1,  // PLANE_Cb
  45.   PLANE_V = 2,  // PLANE_Cr
  46.   // RGB
  47.   PLANE_G = 0,
  48.   PLANE_B = 1,
  49.   PLANE_R = 2,
  50. } ColorPlane;
  51. enum {
  52.   LIST_0 = 0,
  53.   LIST_1 = 1,
  54.   BI_PRED = 2,
  55.   BI_PRED_L0 = 3,
  56.   BI_PRED_L1 = 4
  57. };
  58. enum {
  59.   ERROR_SAD = 0,
  60.   ERROR_SSE = 1,
  61.   ERROR_SATD = 2,
  62.   ERROR_PSATD = 3
  63. };
  64. enum {
  65.   ME_Y_ONLY = 0,
  66.   ME_YUV_FP = 1,
  67.   ME_YUV_FP_SP = 2
  68. };
  69. enum {
  70.   DISTORTION_MSE = 0
  71. };
  72. //! Data Partitioning Modes
  73. typedef enum
  74. {
  75.   PAR_DP_1,   //!< no data partitioning is supported
  76.   PAR_DP_3    //!< data partitioning with 3 partitions
  77. } PAR_DP_TYPE;
  78. //! Output File Types
  79. typedef enum
  80. {
  81.   PAR_OF_ANNEXB,    //!< Annex B byte stream format
  82.   PAR_OF_RTP       //!< RTP packets in outfile
  83. } PAR_OF_TYPE;
  84. //! Field Coding Types
  85. typedef enum
  86. {
  87.   FRAME_CODING,
  88.   FIELD_CODING,
  89.   ADAPTIVE_CODING,
  90.   FRAME_MB_PAIR_CODING
  91. } CodingType;
  92. //! definition of H.264 syntax elements
  93. typedef enum
  94. {
  95.   SE_HEADER,
  96.   SE_PTYPE,
  97.   SE_MBTYPE,
  98.   SE_REFFRAME,
  99.   SE_INTRAPREDMODE,
  100.   SE_MVD,
  101.   SE_CBP,
  102.   SE_LUM_DC_INTRA,
  103.   SE_CHR_DC_INTRA,
  104.   SE_LUM_AC_INTRA,
  105.   SE_CHR_AC_INTRA,
  106.   SE_LUM_DC_INTER,
  107.   SE_CHR_DC_INTER,
  108.   SE_LUM_AC_INTER,
  109.   SE_CHR_AC_INTER,
  110.   SE_DELTA_QUANT,
  111.   SE_BFRAME,
  112.   SE_EOS,
  113.   SE_MAX_ELEMENTS  //!< number of maximum syntax elements
  114. } SE_type;         // substituting the definitions in elements.h
  115. typedef enum
  116. {
  117.   INTER_MB,
  118.   INTRA_MB_4x4,
  119.   INTRA_MB_16x16
  120. } IntraInterDecision;
  121. typedef enum
  122. {
  123.   BITS_HEADER,
  124.   BITS_TOTAL_MB,
  125.   BITS_MB_MODE,
  126.   BITS_INTER_MB,
  127.   BITS_CBP_MB,
  128.   BITS_COEFF_Y_MB,
  129.   BITS_COEFF_UV_MB,
  130.   BITS_COEFF_CB_MB,  
  131.   BITS_COEFF_CR_MB,
  132.   BITS_DELTA_QUANT_MB,
  133.   BITS_STUFFING,
  134.   MAX_BITCOUNTER_MB
  135. } BitCountType;
  136. typedef enum
  137. {
  138.   NO_SLICES,
  139.   FIXED_MB,
  140.   FIXED_RATE,
  141.   CALL_BACK,
  142. } SliceMode;
  143. typedef enum
  144. {
  145.   CAVLC,
  146.   CABAC
  147. } SymbolMode;
  148. typedef enum
  149. {
  150.   FULL_SEARCH      = -1,
  151.   FAST_FULL_SEARCH =  0,
  152.   UM_HEX           =  1,
  153.   UM_HEX_SIMPLE    =  2,
  154.   EPZS             =  3
  155. } SearchType;
  156. typedef enum
  157. {
  158.   FRAME,
  159.   TOP_FIELD,
  160.   BOTTOM_FIELD
  161. } PictureStructure;           //!< New enum for field processing
  162. typedef enum
  163. {
  164.   P_SLICE = 0,
  165.   B_SLICE = 1,
  166.   I_SLICE = 2,
  167.   SP_SLICE = 3,
  168.   SI_SLICE = 4,
  169.   NUM_SLICE_TYPES = 5
  170. } SliceType;
  171. //Motion Estimation levels
  172. typedef enum
  173. {
  174.   F_PEL,   //!< Full Pel refinement
  175.   H_PEL,   //!< Half Pel refinement
  176.   Q_PEL    //!< Quarter Pel refinement
  177. } MELevel;
  178. typedef enum
  179. {
  180.   FAST_ACCESS = 0,    //!< Fast/safe reference access
  181.   UMV_ACCESS = 1      //!< unconstrained reference access
  182. } REF_ACCESS_TYPE;
  183. typedef enum
  184. {
  185.   IS_LUMA = 0,
  186.   IS_CHROMA = 1
  187. } Component_Type;
  188. typedef enum
  189. {
  190.   RC_MODE_0 = 0,
  191.   RC_MODE_1 = 1,
  192.   RC_MODE_2 = 2,
  193.   RC_MODE_3 = 3
  194. } RCModeType;
  195. /***********************************************************************
  196.  * D a t a    t y p e s   f o r  C A B A C
  197.  ***********************************************************************
  198.  */
  199. //! struct to characterize the state of the arithmetic coding engine
  200. typedef struct
  201. {
  202.   unsigned int  Elow, Erange;
  203.   unsigned int  Ebuffer;
  204.   unsigned int  Ebits_to_go;
  205.   unsigned int  Echunks_outstanding;
  206.   int           Epbuf;
  207.   byte          *Ecodestrm;
  208.   int           *Ecodestrm_len;
  209.   int           C;
  210.   int           E;
  211. } EncodingEnvironment;
  212. typedef EncodingEnvironment *EncodingEnvironmentPtr;
  213. //! struct for context management
  214. typedef struct
  215. {
  216.   unsigned long  count;
  217.   unsigned short state;         // index into state-table CP
  218.   unsigned char  MPS;           // Least Probable Symbol 0/1 CP  
  219. } BiContextType;
  220. typedef BiContextType *BiContextTypePtr;
  221. /**********************************************************************
  222.  * 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
  223.  **********************************************************************
  224.  */
  225. #define NUM_MB_TYPE_CTX  11
  226. #define NUM_B8_TYPE_CTX  9
  227. #define NUM_MV_RES_CTX   10
  228. #define NUM_REF_NO_CTX   6
  229. #define NUM_DELTA_QP_CTX 4
  230. #define NUM_MB_AFF_CTX 4
  231. #define NUM_TRANSFORM_SIZE_CTX 3
  232. typedef struct
  233. {
  234.   BiContextType mb_type_contexts [3][NUM_MB_TYPE_CTX];
  235.   BiContextType b8_type_contexts [2][NUM_B8_TYPE_CTX];
  236.   BiContextType mv_res_contexts  [2][NUM_MV_RES_CTX];
  237.   BiContextType ref_no_contexts  [2][NUM_REF_NO_CTX];
  238.   BiContextType delta_qp_contexts   [NUM_DELTA_QP_CTX];
  239.   BiContextType mb_aff_contexts     [NUM_MB_AFF_CTX];
  240.   BiContextType transform_size_contexts   [NUM_TRANSFORM_SIZE_CTX];
  241. } MotionInfoContexts;
  242. #define NUM_IPR_CTX    2
  243. #define NUM_CIPR_CTX   4
  244. #define NUM_CBP_CTX    4
  245. #define NUM_BCBP_CTX   4
  246. #define NUM_MAP_CTX   15
  247. #define NUM_LAST_CTX  15
  248. #define NUM_ONE_CTX    5
  249. #define NUM_ABS_CTX    5
  250. typedef struct
  251. {
  252.   BiContextType  ipr_contexts [NUM_IPR_CTX];
  253.   BiContextType  cipr_contexts[NUM_CIPR_CTX];
  254.   BiContextType  cbp_contexts [3][NUM_CBP_CTX];
  255.   BiContextType  bcbp_contexts[NUM_BLOCK_TYPES][NUM_BCBP_CTX];
  256. #if ENABLE_FIELD_CTX
  257.   BiContextType  map_contexts [3][NUM_BLOCK_TYPES][NUM_MAP_CTX];
  258.   BiContextType  last_contexts[3][NUM_BLOCK_TYPES][NUM_LAST_CTX];
  259. #else
  260.   BiContextType  map_contexts [1][NUM_BLOCK_TYPES][NUM_MAP_CTX];
  261.   BiContextType  last_contexts[1][NUM_BLOCK_TYPES][NUM_LAST_CTX];
  262. #endif
  263.   BiContextType  one_contexts [NUM_BLOCK_TYPES][NUM_ONE_CTX];
  264.   BiContextType  abs_contexts [NUM_BLOCK_TYPES][NUM_ABS_CTX];
  265. } TextureInfoContexts;
  266. //*********************** end of data type definition for CABAC *******************
  267. //! Pixel position for checking neighbors
  268. typedef struct pix_pos
  269. {
  270.   int  available;
  271.   int  mb_addr;
  272.   int  x;
  273.   int  y;
  274.   int  pos_x;
  275.   int  pos_y;
  276. } PixelPos;
  277. //! Buffer structure for decoded reference picture marking commands
  278. typedef struct DecRefPicMarking_s
  279. {
  280.   int memory_management_control_operation;
  281.   int difference_of_pic_nums_minus1;
  282.   int long_term_pic_num;
  283.   int long_term_frame_idx;
  284.   int max_long_term_frame_idx_plus1;
  285.   struct DecRefPicMarking_s *Next;
  286. } DecRefPicMarking_t;
  287. //! Syntax Element
  288. typedef struct syntaxelement
  289. {
  290.   int                 type;           //!< type of syntax element for data part.
  291.   int                 value1;         //!< numerical value of syntax element
  292.   int                 value2;         //!< for blocked symbols, e.g. run/level
  293.   int                 len;            //!< length of code
  294.   int                 inf;            //!< info part of UVLC code
  295.   unsigned int        bitpattern;     //!< UVLC bitpattern
  296.   int                 context;        //!< CABAC context
  297. #if TRACE
  298.   #define             TRACESTRING_SIZE 100            //!< size of trace string
  299.   char                tracestring[TRACESTRING_SIZE];  //!< trace string
  300. #endif
  301.   //!< for mapping of syntaxElement to UVLC
  302.   void    (*mapping)(int value1, int value2, int* len_ptr, int* info_ptr);
  303. } SyntaxElement;
  304. //! Macroblock
  305. typedef struct macroblock
  306. {
  307.   short               slice_nr;
  308.   short               delta_qp;
  309.   int                 qp;                         //!< QP luma  
  310.   int                 qpc[2];                     //!< QP chroma
  311.   int                 qp_scaled[MAX_PLANE];       //!< QP scaled for all comps.
  312.   int                 qpsp ;
  313.   int                 bitcounter[MAX_BITCOUNTER_MB];
  314.   int                 mb_type;
  315.   short               mvd[2][BLOCK_MULTIPLE][BLOCK_MULTIPLE][2];          //!< indices correspond to [list][block_y][block_x][x,y]
  316.   int                 cbp ;
  317.   short               b8mode[4];
  318.   short               b8pdir[4];
  319.   int                 c_ipred_mode;      //!< chroma intra prediction mode
  320.   char                IntraChromaPredModeFlag;
  321.   byte                mb_field;
  322.   int                 is_field_mode;
  323.   int                 list_offset;
  324.   int                 mbAddrA, mbAddrB, mbAddrC, mbAddrD, mbAddrX;
  325.   int                 mbAvailA, mbAvailB, mbAvailC, mbAvailD;
  326.   int                 all_blk_8x8;
  327.   int                 luma_transform_size_8x8_flag;
  328.   int                 NoMbPartLessThan8x8Flag;
  329.   int                 DFDisableIdc;
  330.   int                 DFAlphaC0Offset;
  331.   int                 DFBetaOffset;
  332.   int                 skip_flag;
  333.   char                intra_pred_modes[MB_BLOCK_PARTITIONS];
  334.   char                intra_pred_modes8x8[MB_BLOCK_PARTITIONS];           //!< four 8x8 blocks in a macroblock
  335.   int64               cbp_blk ;    //!< 1 bit set for every 4x4 block with coefs (not implemented for INTRA)
  336.   int64               cbp_bits[3];
  337.   int64               cbp_bits_8x8[3];
  338.   short               bipred_me[4]; //!< bi prediction ME type for a 8x8 block (0 : not used, 1: type 1, 2: type 2)
  339.   // rate control
  340.   double              actj;               // macroblock activity measure for macroblock j
  341.   int                 prev_qp;
  342.   int                 prev_dqp;
  343.   int                 prev_cbp;
  344.   struct macroblock   *mb_available_up;   //!< pointer to neighboring MB (CABAC)
  345.   struct macroblock   *mb_available_left; //!< pointer to neighboring MB (CABAC)
  346. } Macroblock;
  347. //! Bitstream
  348. typedef struct
  349. {
  350.   int             byte_pos;           //!< current position in bitstream;
  351.   int             bits_to_go;         //!< current bitcounter
  352.   
  353.   int             stored_byte_pos;    //!< storage for position in bitstream;
  354.   int             stored_bits_to_go;  //!< storage for bitcounter
  355.   int             byte_pos_skip;      //!< storage for position in bitstream;
  356.   int             bits_to_go_skip;    //!< storage for bitcounter
  357.   int             write_flag;         //!< Bitstream contains data and needs to be written
  358.   byte            byte_buf;           //!< current buffer for last written byte
  359.   byte            stored_byte_buf;    //!< storage for buffer of last written byte
  360.   byte            byte_buf_skip;      //!< current buffer for last written byte
  361.   byte            *streamBuffer;      //!< actual buffer for written bytes
  362. #if TRACE
  363.   Boolean             trace_enabled;
  364. #endif
  365. } Bitstream;
  366. //! DataPartition
  367. typedef struct datapartition
  368. {
  369.   Bitstream           *bitstream;
  370.   NALU_t              *nal_unit;
  371.   EncodingEnvironment ee_cabac;
  372.   EncodingEnvironment ee_recode;
  373. } DataPartition;
  374. //! Slice
  375. typedef struct
  376. {
  377.   int                 picture_id;
  378.   int                 qp;
  379.   int                 qs;
  380.   int                 picture_type; //!< picture type
  381.   int                 start_mb_nr;
  382.   int                 max_part_nr;  //!< number of different partitions
  383.   int                 num_mb;       //!< number of MBs in the slice
  384.   int                 ref_pic_list_reordering_flag_l0;
  385.   int                 *reordering_of_pic_nums_idc_l0;
  386.   int                 *abs_diff_pic_num_minus1_l0;
  387.   int                 *long_term_pic_idx_l0;
  388.   int                 ref_pic_list_reordering_flag_l1;
  389.   int                 *reordering_of_pic_nums_idc_l1;
  390.   int                 *abs_diff_pic_num_minus1_l1;
  391.   int                 *long_term_pic_idx_l1;
  392.   int                 field_ctx[3][2]; //GB
  393.   int                 symbol_mode;
  394.   Boolean             (*slice_too_big)(int bits_slice); //!< for use of callback functions
  395.   DataPartition       *partArr;     //!< array of partitions
  396.   MotionInfoContexts  *mot_ctx;     //!< pointer to struct of context models for use in CABAC
  397.   TextureInfoContexts *tex_ctx;     //!< pointer to struct of context models for use in CABAC
  398. } Slice;
  399. #define MAXSLICEPERPICTURE 100
  400. enum {
  401.   SSE              = 0,
  402.   SSE_RGB          = 1,  
  403.   PSNR             = 2,
  404.   PSNR_RGB         = 3,
  405.   SSIM             = 4,
  406.   SSIM_RGB         = 5,
  407.   MS_SSIM          = 6,
  408.   MS_SSIM_RGB      = 7,
  409.   TOTAL_DIST_TYPES = 8
  410. } distortion_types;
  411. //! DistortionParams
  412. typedef struct
  413. {
  414.   float value[3];                   //!< current frame distortion
  415.   float average[3];                 //!< average frame distortion
  416.   float avslice[NUM_SLICE_TYPES][3]; //!< average frame type distortion
  417. } DistMetric;
  418. typedef struct
  419. {
  420.   int        frame_ctr;                        //!< number of coded frames
  421.   DistMetric metric[TOTAL_DIST_TYPES];      //!< Distortion metrics
  422. } DistortionParams;
  423. typedef struct
  424. {
  425.   int   no_slices;
  426.   int   bits_per_picture;
  427.   Slice *slices[MAXSLICEPERPICTURE];
  428.   DistMetric distortion;
  429.   byte  idr_flag;
  430. } Picture;
  431. Picture *p_frame_pic;
  432. Picture **frame_pic;
  433. Picture **field_pic;
  434. Picture *frame_pic_si;
  435. #ifdef _LEAKYBUCKET_
  436. long *Bit_Buffer;
  437. #endif
  438. // global picture format dependend buffers, mem allocation in image.c
  439. imgpel **pImgOrg[MAX_PLANE];
  440. imgpel **pCurImg;            //!< Reference image. Luma for other profiles, can be any component for 4:4:4
  441. int    **imgY_sub_tmp;       //!< Y picture temporary component (Quarter pel)
  442. int **PicPos;
  443. unsigned int log2_max_frame_num_minus4;
  444. unsigned int log2_max_pic_order_cnt_lsb_minus4;
  445. unsigned int max_frame_num;
  446. unsigned int max_pic_order_cnt_lsb;
  447. time_t  me_tot_time,me_time;
  448. pic_parameter_set_rbsp_t *active_pps;
  449. seq_parameter_set_rbsp_t *active_sps;
  450. int dsr_new_search_range; //!<Dynamic Search Range.
  451. //////////////////////////////////////////////////////////////////////////
  452. // B pictures
  453. // motion vector : forward, backward, direct
  454. byte  MBPairIsField;     //!< For MB level field/frame coding tools
  455. //Weighted prediction
  456. int ***wp_weight;  // weight in [list][index][component] order
  457. int ***wp_offset;  // offset in [list][index][component] order
  458. int ****wbp_weight;  // weight in [list][fwd_index][bwd_idx][component] order
  459. int luma_log_weight_denom;
  460. int chroma_log_weight_denom;
  461. int wp_luma_round;
  462. int wp_chroma_round;
  463. // global picture format dependend buffers, mem allocation in image.c (field picture)
  464. imgpel   **img_org_top[MAX_PLANE];
  465. imgpel   **img_org_bot[MAX_PLANE];
  466. imgpel   **img_org_frm[MAX_PLANE];
  467. imgpel   **imgY_com;               //!< Encoded luma images
  468. imgpel  ***imgUV_com;              //!< Encoded croma images
  469. char    ***direct_ref_idx;           //!< direct mode reference index buffer
  470. char    **direct_pdir;              //!< direct mode reference index buffer
  471. // Buffers for rd optimization with packet losses, Dim. Kontopodis
  472. byte **pixel_map;   //!< Shows the latest reference frame that is reliable for each pixel
  473. byte **refresh_map; //!< Stores the new values for pixel_map
  474. int intras;         //!< Counts the intra updates in each frame.
  475. int  frame_no, nextP_tr_fld, nextP_tr_frm;
  476. int64 tot_time;
  477. #define ET_SIZE 300      //!< size of error text buffer
  478. char errortext[ET_SIZE]; //!< buffer for error message for exit with error()
  479. // Residue Color Transform
  480. char b8_ipredmode8x8[4][4], b8_intra_pred_modes8x8[16];
  481. //! Info for the "decoders-in-the-encoder" used for rdoptimization with packet losses
  482. typedef struct
  483. {
  484.   imgpel ***dec_mbY;        //!< Best decoded macroblock pixel values in RDO
  485.   imgpel ***dec_mbY8x8;     //!< Best decoded 8x8 mode pixel values in RDO
  486.   int    res_img[MAX_PLANE][16][16]; //Residual values for macroblock
  487. } Decoders;
  488. extern Decoders *decs;
  489. #define FILE_NAME_SIZE 200
  490. typedef struct
  491. {
  492.   double md;     //!< Mode decision Lambda
  493.   double me[3];  //!< Motion Estimation Lambda
  494.   int    mf[3];  //!< Integer formatted Motion Estimation Lambda
  495. } LambdaParams;
  496. // VUI Parameters
  497. typedef struct
  498. {
  499.   int aspect_ratio_info_present_flag;
  500.   int aspect_ratio_idc;
  501.   int sar_width;
  502.   int sar_height;
  503.   int overscan_info_present_flag;
  504.   int overscan_appropriate_flag;
  505.   int video_signal_type_present_flag;
  506.   int video_format;
  507.   int video_full_range_flag;
  508.   int colour_description_present_flag;
  509.   int colour_primaries;
  510.   int transfer_characteristics; 
  511.   int matrix_coefficients;
  512.   int chroma_location_info_present_flag;
  513.   int chroma_sample_loc_type_top_field;
  514.   int chroma_sample_loc_type_bottom_field;
  515.   int timing_info_present_flag;
  516.   int num_units_in_tick;
  517.   int time_scale;
  518.   int fixed_frame_rate_flag;
  519.   int nal_hrd_parameters_present_flag;
  520.   int nal_cpb_cnt_minus1;
  521.   int nal_bit_rate_scale;
  522.   int nal_cpb_size_scale;
  523.   int nal_bit_rate_value_minus1;
  524.   int nal_cpb_size_value_minus1;
  525.   int nal_vbr_cbr_flag;
  526.   int nal_initial_cpb_removal_delay_length_minus1;
  527.   int nal_cpb_removal_delay_length_minus1;
  528.   int nal_dpb_output_delay_length_minus1;
  529.   int nal_time_offset_length;
  530.   int vcl_hrd_parameters_present_flag;
  531.   int vcl_cpb_cnt_minus1;
  532.   int vcl_bit_rate_scale;
  533.   int vcl_cpb_size_scale;
  534.   int vcl_bit_rate_value_minus1;
  535.   int vcl_cpb_size_value_minus1;
  536.   int vcl_vbr_cbr_flag;
  537.   int vcl_initial_cpb_removal_delay_length_minus1;
  538.   int vcl_cpb_removal_delay_length_minus1;
  539.   int vcl_dpb_output_delay_length_minus1;
  540.   int vcl_time_offset_length;
  541.   int low_delay_hrd_flag;
  542.   int pic_struct_present_flag;
  543.   int bitstream_restriction_flag;
  544.   int motion_vectors_over_pic_boundaries_flag;
  545.   int max_bytes_per_pic_denom;
  546.   int max_bits_per_mb_denom;
  547.   int log2_max_mv_length_vertical;
  548.   int log2_max_mv_length_horizontal;
  549.   int num_reorder_frames;
  550.   int max_dec_frame_buffering;
  551. } VUIParameters;
  552. //! block 8x8 temporary RD info
  553. typedef struct 
  554. {
  555.    short  best8x8mode            [4];
  556.    char   best8x8pdir   [MAXMODE][4];
  557.    char   best8x8l0ref  [MAXMODE][4];
  558.    char   best8x8l1ref  [MAXMODE][4];
  559.    short  bipred8x8me   [MAXMODE][4];
  560. } Block8x8Info;
  561.                              
  562. //! all input parameters
  563. typedef struct
  564. {
  565.   int ProfileIDC;                    //!< value of syntax element profile_idc
  566.   int LevelIDC;                      //!< value of syntax element level_idc
  567.   int IntraProfile;                  //!< Enable Intra profiles
  568.   int no_frames;                     //!< number of frames to be encoded
  569.   int qp0;                           //!< QP of first frame
  570.   int qpN;                           //!< QP of remaining frames
  571.   int jumpd;                         //!< number of frames to skip in input sequence (e.g 2 takes frame 0,3,6,9...)
  572.   int DisableSubpelME;               //!< Disable sub-pixel motion estimation
  573.   int search_range;                  /*!< search range - integer pel search and 16x16 blocks.  The search window is
  574.                                           generally around the predicted vector. Max vector is 2xmcrange.  For 8x8
  575.                                           and 4x4 block sizes the search range is 1/2 of that for 16x16 blocks.       */
  576.   int num_ref_frames;                //!< number of reference frames to be used
  577.   int P_List0_refs;                  //!< number of reference picture in list 0 in P pictures
  578.   int B_List0_refs;                  //!< number of reference picture in list 0 in B pictures
  579.   int B_List1_refs;                  //!< number of reference picture in list 1 in B pictures
  580.   int Log2MaxFNumMinus4;             //!< value of syntax element log2_max_frame_num
  581.   int Log2MaxPOCLsbMinus4;           //!< value of syntax element log2_max_pic_order_cnt_lsb_minus4
  582.   // Input/output sequence format related variables
  583.   FrameFormat source;                   //!< source related information
  584.   FrameFormat output;                   //!< output related information
  585.   int rgb_input_flag;
  586.   int src_resize;                    //!< Control if input sequence will be resized (currently only cropping is supported)
  587.   int src_BitDepthRescale;           //!< Control if input sequence bitdepth should be adjusted
  588.   int yuv_format;                    //!< YUV format (0=4:0:0, 1=4:2:0, 2=4:2:2, 3=4:4:4)
  589.   int intra_upd;                     /*!< For error robustness. 0: no special action. 1: One GOB/frame is intra coded
  590.                                           as regular 'update'. 2: One GOB every 2 frames is intra coded etc.
  591.                                           In connection with this intra update, restrictions is put on motion vectors
  592.                                           to prevent errors to propagate from the past                                */
  593.   int blc_size[8][2];                //!< array for different block sizes
  594.   int part_size[8][2];               //!< array for different partition sizes
  595.   int slice_mode;                    //!< Indicate what algorithm to use for setting slices
  596.   int slice_argument;                //!< Argument to the specified slice algorithm
  597.   int UseConstrainedIntraPred;       //!< 0: Inter MB pixels are allowed for intra prediction 1: Not allowed
  598.   int  infile_header;                //!< If input file has a header set this to the length of the header
  599.   char infile     [FILE_NAME_SIZE];  //!< YUV 4:2:0 input format
  600.   char outfile    [FILE_NAME_SIZE];  //!< H.264 compressed output bitstream
  601.   char ReconFile  [FILE_NAME_SIZE];  //!< Reconstructed Pictures
  602.   char TraceFile  [FILE_NAME_SIZE];  //!< Trace Outputs
  603.   char StatsFile  [FILE_NAME_SIZE];  //!< Stats File
  604.   char QmatrixFile[FILE_NAME_SIZE];  //!< Q matrix cfg file
  605.   int  EnableOpenGOP;                 //!< support for open gops.
  606.   int  EnableIDRGOP;                  //!< support for open gops.
  607.   int idr_period;                    //!< IDR picture period
  608.   int intra_period;                  //!< intra picture period
  609.   int intra_delay;                   //!< IDR picture delay
  610.   int adaptive_idr_period;
  611.   int adaptive_intra_period;         //!< reinitialize start of intra period
  612.   int start_frame;                   //!< Encode sequence starting from Frame start_frame
  613.   int GenerateMultiplePPS;
  614.   int GenerateSEIMessage;
  615.   char SEIMessageText[500];
  616.   int ResendSPS;
  617.   int ResendPPS;
  618.   // B pictures
  619.   int successive_Bframe;             //!< number of B frames that will be used
  620.   int PReplaceBSlice;
  621.   int qpB;                           //!< QP for non-reference B slice coded pictures
  622.   int qpBRSOffset;                   //!< QP for reference B slice coded pictures
  623.   int direct_spatial_mv_pred_flag;   //!< Direct Mode type to be used (0: Temporal, 1: Spatial)
  624.   int directInferenceFlag;           //!< Direct Mode Inference Flag
  625.   int BiPredMotionEstimation;
  626.   int BiPredSearch[4];               //!< Use Bi prediction for modes 16x16, 16x8, 8x16, and 8x8
  627.   
  628.   int BiPredMERefinements;           //!< Number of bipred refinements
  629.   int BiPredMESearchRange;
  630.   int BiPredMESubPel;
  631.   // SP Pictures
  632.   int sp_periodicity;                //!< The periodicity of SP-pictures
  633.   int qpsp;                          //!< SP Picture QP for prediction error
  634.   int qpsp_pred;                     //!< SP Picture QP for predicted block
  635.   int si_frame_indicator;            //!< Flag indicating whether SI frames should be encoded rather than SP frames (0: not used, 1: used)
  636.   int sp2_frame_indicator;           //!< Flag indicating whether switching SP frames should be encoded rather than SP frames (0: not used, 1: used)
  637.   int sp_output_indicator;           //!< Flag indicating whether coefficients are output to allow future encoding of switchin SP frames (0: not used, 1: used)
  638.   char sp_output_filename[FILE_NAME_SIZE];    //!<Filename where SP coefficients are output
  639.   char sp2_input_filename1[FILE_NAME_SIZE];   //!<Filename of coefficients of the first bitstream when encoding SP frames to switch bitstreams
  640.   char sp2_input_filename2[FILE_NAME_SIZE];   //!<Filenames of coefficients of the second bitstream when encoding SP frames to switch bitstreams
  641.   int WeightedPrediction;            //!< Weighted prediction for P frames (0: not used, 1: explicit)
  642.   int WeightedBiprediction;          //!< Weighted prediction for B frames (0: not used, 1: explicit, 2: implicit)
  643.   int WPMethod;                      //!< WP method (0: DC, 1: LMS)
  644.   int WPMCPrecision;
  645.   int WPMCPrecFullRef;
  646.   int WPMCPrecBSlice;
  647.   int EnhancedBWeightSupport;
  648.   int ChromaWeightSupport;           //!< Weighted prediction support for chroma (0: disabled, 1: enabled)
  649.   int UseWeightedReferenceME;        //!< Use Weighted Reference for ME.
  650.   int RDPictureDecision;             //!< Perform RD optimal decision between various coded versions of same picture
  651.   int RDPictureIntra;                //!< Enabled RD pic decision for intra as well.
  652.   int RDPSliceWeightOnly;            //!< If enabled, does not check QP variations for P slices.
  653.   int RDPSliceBTest;                 //!< Tests B slice replacement for P.
  654.   int RDBSliceWeightOnly;            //!< If enabled, does not check QP variations for B slices.
  655.   int SkipIntraInInterSlices;        //!< Skip intra type checking in inter slices if best_mode is skip/direct
  656.   int BRefPictures;                  //!< B coded reference pictures replace P pictures (0: not used, 1: used)
  657.   int HierarchicalCoding;
  658.   int HierarchyLevelQPEnable;
  659.   char ExplicitHierarchyFormat[1024];//!< Explicit GOP format (HierarchicalCoding==3).
  660.   int ReferenceReorder;              //!< Reordering based on Poc distances
  661.   int PocMemoryManagement;           //!< Memory management based on Poc distances for hierarchical coding
  662.   int symbol_mode;                   //!< Specifies the mode the symbols are mapped on bits
  663.   int of_mode;                       //!< Specifies the mode of the output file
  664.   int partition_mode;                //!< Specifies the mode of data partitioning
  665.   int InterSearch[2][8];
  666.   int DisableIntra4x4;
  667.   int DisableIntra16x16;
  668.   int FastMDEnable; 
  669.   int FastIntraMD; 
  670.   int FastIntra4x4;
  671.   int FastIntra16x16;
  672.   int FastIntra8x8;
  673.   int FastIntraChroma;
  674.   int DisableIntraInInter;
  675.   int IntraDisableInterOnly;
  676.   int Intra4x4ParDisable;
  677.   int Intra4x4DiagDisable;
  678.   int Intra4x4DirDisable;
  679.   int Intra16x16ParDisable;
  680.   int Intra16x16PlaneDisable;
  681.   int ChromaIntraDisable;
  682.   int EnableIPCM;
  683.   double FrameRate;
  684.   int EPZSPattern;
  685.   int EPZSDual;
  686.   int EPZSFixed;
  687.   int EPZSTemporal;
  688.   int EPZSSpatialMem;
  689.   int EPZSBlockType;
  690.   int EPZSMinThresScale;
  691.   int EPZSMaxThresScale;
  692.   int EPZSMedThresScale;
  693.   int EPZSSubPelGrid;
  694.   int EPZSGrid;
  695.   int EPZSSubPelME;
  696.   int EPZSSubPelMEBiPred;
  697.   int EPZSSubPelThresScale;
  698.   int chroma_qp_index_offset;
  699. #ifdef _FULL_SEARCH_RANGE_
  700.   int full_search;
  701. #endif
  702. #ifdef _ADAPT_LAST_GROUP_
  703.   int last_frame;
  704. #endif
  705. #ifdef _CHANGE_QP_
  706.   int qpN2, qpB2, qp2start;
  707.   int qp02, qpBRS2Offset;
  708. #endif
  709.   int rdopt;
  710.   int Distortion[TOTAL_DIST_TYPES];
  711.   double VisualResWavPSNR;
  712.   int SSIMOverlapSize;
  713.   int DistortionYUVtoRGB;
  714.   int CtxAdptLagrangeMult;    //!< context adaptive lagrangian multiplier
  715.   int FastCrIntraDecision;
  716.   int disthres;
  717.   int nobskip;
  718. #ifdef _LEAKYBUCKET_
  719.   int NumberLeakyBuckets;
  720.   char LeakyBucketRateFile[FILE_NAME_SIZE];
  721.   char LeakyBucketParamFile[FILE_NAME_SIZE];
  722. #endif
  723.   int PicInterlace;           //!< picture adaptive frame/field
  724.   int MbInterlace;            //!< macroblock adaptive frame/field
  725.   int IntraBottom;            //!< Force Intra Bottom at GOP periods.
  726.   int LossRateA;              //!< assumed loss probablility of partition A (or full slice), in per cent, used for loss-aware R/D optimization
  727.   int LossRateB;              //!< assumed loss probablility of partition B, in per cent, used for loss-aware R/D
  728.   int LossRateC;              //!< assumed loss probablility of partition C, in per cent, used for loss-aware R/D
  729.   int NoOfDecoders;
  730.   int ErrorConcealment;       //!< Error concealment method used for loss-aware RDO (0: Copy Concealment)
  731.   int RestrictRef;
  732.   int NumFramesInELSubSeq;
  733.   int RandomIntraMBRefresh;     //!< Number of pseudo-random intra-MBs per picture
  734.   int DFSendParameters;
  735.   int DFDisableIdc[2][NUM_SLICE_TYPES];
  736.   int DFAlpha     [2][NUM_SLICE_TYPES];
  737.   int DFBeta      [2][NUM_SLICE_TYPES];
  738.   int SparePictureOption;
  739.   int SPDetectionThreshold;
  740.   int SPPercentageThreshold;
  741.   // FMO
  742.   char SliceGroupConfigFileName[FILE_NAME_SIZE];    //!< Filename for config info fot type 0, 2, 6
  743.   int num_slice_groups_minus1;           //!< "FmoNumSliceGroups" in encoder.cfg, same as FmoNumSliceGroups, which should be erased later
  744.   int slice_group_map_type;
  745.   int *top_left;                         //!< top_left and bottom_right store values indicating foregrounds
  746.   int *bottom_right;
  747.   byte *slice_group_id;                   //!< slice_group_id is for slice group type being 6
  748.   int *run_length_minus1;                //!< run_length_minus1 is for slice group type being 0
  749.   int slice_group_change_direction_flag;
  750.   int slice_group_change_rate_minus1;
  751.   int slice_group_change_cycle;
  752.   int redundant_pic_flag;   //! encoding of redundant pictures
  753.   int pic_order_cnt_type;   //! POC type
  754.   int context_init_method;
  755.   int model_number;
  756.   int Transform8x8Mode;
  757.   int ReportFrameStats;
  758.   int DisplayEncParams;
  759.   int Verbose;
  760.   //! Rate Control on JVT standard
  761.   int RCEnable;
  762.   int bit_rate;
  763.   int SeinitialQP;
  764.   unsigned int basicunit;
  765.   int channel_type;
  766.   int RCUpdateMode;
  767.   double RCIoverPRatio;
  768.   double RCBoverPRatio;
  769.   double RCISliceBitRatio;
  770.   double RCBSliceBitRatio[RC_MAX_TEMPORAL_LEVELS];
  771.   int    RCMinQP[NUM_SLICE_TYPES];
  772.   int    RCMaxQP[NUM_SLICE_TYPES];
  773.   int    RCMaxQPChange;
  774.   // Search Algorithm
  775.   SearchType SearchMode;
  776.   int UMHexDSR;//!< Dynamic Search Range
  777.   int UMHexScale;
  778. //////////////////////////////////////////////////////////////////////////
  779.   // Fidelity Range Extensions
  780.   int ScalingMatrixPresentFlag;
  781.   int ScalingListPresentFlag[12];
  782.   int cb_qp_index_offset;
  783.   int cr_qp_index_offset;
  784.   // Lossless Coding
  785.   int lossless_qpprime_y_zero_flag;
  786.   // Lambda Params
  787.   int UseExplicitLambdaParams;
  788.   int UpdateLambdaChromaME;
  789.   double LambdaWeight[6];
  790.   double FixedLambda[6];
  791.   char QOffsetMatrixFile[FILE_NAME_SIZE];        //!< Quantization Offset matrix cfg file
  792.   int  OffsetMatrixPresentFlag;                  //!< Enable Explicit Quantization Offset Matrices
  793.   int AdaptiveRounding;                          //!< Adaptive Rounding parameter based on JVT-N011
  794.   int AdaptRoundingFixed;                        //!< Global rounding for all qps
  795.   int AdaptRndPeriod;                            //!< Set period for adaptive rounding of JVT-N011 in MBs
  796.   int AdaptRndChroma;
  797.   int AdaptRndWFactor  [2][NUM_SLICE_TYPES];     //!< Weighting factors for luma component based on reference indicator and slice type
  798.   int AdaptRndCrWFactor[2][NUM_SLICE_TYPES];     //!< Weighting factors for chroma components based on reference indicator and slice type
  799.   // Fast Mode Decision
  800.   int EarlySkipEnable;
  801.   int SelectiveIntraEnable;
  802.   int DisposableP;
  803.   int DispPQPOffset;
  804.   //Redundant picture
  805.   int NumRedundantHierarchy;   //!< number of entries to allocate redundant pictures in a GOP
  806.   int PrimaryGOPLength;        //!< GOP length of primary pictures
  807.   int NumRefPrimary;           //!< number of reference frames for primary picture
  808.   // Chroma interpolation and buffering
  809.   int ChromaMCBuffer;
  810.   int ChromaMEEnable;
  811.   int ChromaMEWeight;
  812.   int MEErrorMetric[3];
  813.   int ModeDecisionMetric;
  814.   int SkipDeBlockNonRef;
  815.   // tone mapping SEI message
  816.   int ToneMappingSEIPresentFlag;
  817.   char ToneMappingFile[FILE_NAME_SIZE];    //!< ToneMapping SEI message cfg file
  818.   int separate_colour_plane_flag;
  819.   double WeightY;
  820.   double WeightCb;
  821.   double WeightCr;
  822.   
  823.   int UseRDOQuant;
  824.   int RDOQ_DC;
  825.   int RDOQ_CR;
  826.   int RDOQ_QP_Num;
  827.   int RDOQ_CP_Mode;
  828.   int RDOQ_CP_MV;
  829.   int RDOQ_Fast;
  830.   int EnableVUISupport;
  831.   // VUI parameters
  832.   VUIParameters VUI;
  833.   // end of VUI parameters
  834. } InputParameters;
  835. //! ImageParameters
  836. typedef struct
  837. {
  838.   int number;                  //!< current image number to be encoded (in first layer)  
  839.   int frm_number;
  840.   int cur_frm_number;          //!< current image number to be encoded (in all layers)
  841.   int idr_gop_number;          //!< current idr image number to be encoded
  842.   int rewind_frame;                  //!< current image number to be encoded
  843.   int pn;                      //!< picture number
  844.   int LevelIndex;              //!< mapped level idc
  845.   int MaxVmvR[6];              //!< maximum vertical motion vector
  846.   int current_mb_nr;
  847.   int current_slice_nr;
  848.   int type;
  849.   int structure;               //!< picture structure
  850.   int base_dist;
  851.   int num_ref_frames;          //!< number of reference frames to be used
  852.   int max_num_references;      //!< maximum number of reference pictures that may occur
  853.   int qp;                      //!< quant for the current frame
  854.   int qpsp;                    //!< quant for the prediction frame of SP-frame
  855.   int RCMinQP;
  856.   int RCMaxQP;
  857.   float framerate;
  858.   int width;                   //!< Number of pels
  859.   int width_padded;            //!< Width in pels of padded picture
  860.   int width_blk;               //!< Number of columns in blocks
  861.   int width_cr;                //!< Number of pels chroma
  862.   int height;                  //!< Number of lines
  863.   int height_padded;           //!< Number in lines of padded picture
  864.   int height_blk;              //!< Number of lines in blocks
  865.   int height_cr;               //!< Number of lines  chroma
  866.   int height_cr_frame;         //!< Number of lines  chroma frame
  867.   int size;                    //!< Luma Picture size in pels
  868.   int size_cr;                 //!< Chroma Picture size in pels
  869.   int subblock_x;              //!< current subblock horizontal
  870.   int subblock_y;              //!< current subblock vertical
  871.   int is_intra_block;
  872.   int is_v_block;
  873.   int mb_y_upd;
  874.   int mb_y_intra;              //!< which GOB to intra code
  875.   int block_c_x;               //!< current block chroma vertical
  876.   char **ipredmode;             //!< intra prediction mode
  877.   char **ipredmode8x8;          //!< help storage for 8x8 modes, inserted by YV
  878.   int cod_counter;             //!< Current count of number of skipped macroblocks in a row
  879.   int ***nz_coeff;             //!< number of coefficients per block (CAVLC)
  880.   int mb_x;                    //!< current MB horizontal
  881.   int mb_y;                    //!< current MB vertical
  882.   int block_x;                 //!< current block horizontal
  883.   int block_y;                 //!< current block vertical
  884.   int pix_x;                   //!< current pixel horizontal
  885.   int pix_y;                   //!< current pixel vertical
  886.   int pix_c_x;                 //!< current pixel chroma horizontal
  887.   int pix_c_y;                 //!< current pixel chroma vertical
  888.   int opix_x;                   //!< current original picture pixel horizontal
  889.   int opix_y;                   //!< current original picture pixel vertical
  890.   int opix_c_x;                 //!< current original picture pixel chroma horizontal
  891.   int opix_c_y;                 //!< current original picture pixel chroma vertical
  892.   // prediction/residual buffers   
  893.   imgpel mpr_4x4  [MAX_PLANE][9][16][16]; //!< prediction samples for   4x4 intra prediction modes
  894.   imgpel mpr_8x8  [MAX_PLANE][9][16][16]; //!< prediction samples for   8x8 intra prediction modes
  895.   imgpel mpr_16x16[MAX_PLANE][5][16][16]; //!< prediction samples for 16x16 intra prediction modes (and chroma)
  896.   imgpel mb_pred  [MAX_PLANE][16][16];    //!< current best prediction mode
  897.   int    mb_rres  [MAX_PLANE][16][16];    //!< the diff pixel values between the original macroblock/block and its prediction (reconstructed)
  898.   int    mb_ores  [MAX_PLANE][16][16];    //!< the diff pixel values between the original macroblock/block and its prediction (original)
  899.   int    (*curr_res)[16];                 //!< pointer to current residual
  900.   imgpel (*curr_prd)[16];                 //!< pointer to current prediction
  901.   int ****cofAC;               //!< AC coefficients [8x8block][4x4block][level/run][scan_pos]
  902.   int *** cofDC;               //!< DC coefficients [yuv][level/run][scan_pos]
  903.   int ***fadjust4x4;           //!< Transform coefficients for 4x4 luma. Excludes DC for I16x16
  904.   int ***fadjust8x8;           //!< Transform coefficients for 8x8 luma
  905.   int ****fadjust4x4Cr;        //!< Transform coefficients for 4x4 chroma. Excludes DC chroma.
  906.   int ****fadjust8x8Cr;        //!< Transform coefficients for 4x4 chroma within 8x8 inter blocks.
  907.   Picture       *currentPicture; //!< The coded picture currently in the works (typically p_frame_pic, field_pic[0], or field_pic[1])
  908.   Slice         *currentSlice;                                //!< pointer to current Slice data struct
  909.   Macroblock    *mb_data;                                   //!< array containing all MBs of a whole frame
  910.   Block8x8Info  *b8x8info;                                  //!< block 8x8 information for RDopt
  911.   int *quad;               //!< Array containing square values,used for snr computation  */                                         /* Values are limited to 5000 for pixel differences over 70 (sqr(5000)).
  912.   int *intra_block;
  913.   int tr;
  914.   int fld_type;                        //!< top or bottom field
  915.   byte fld_flag;
  916.   unsigned int rd_pass;
  917.   // B pictures
  918.   double b_interval;
  919.   int p_interval;
  920.   int b_frame_to_code;
  921.   int fw_mb_mode;
  922.   int bw_mb_mode;
  923.   short****** pred_mv;                 //!< motion vector predictors for all block types and all reference frames
  924.   short****** all_mv;                  //!< replaces local all_mv
  925.   short******* bipred_mv;             //!<Biprediction MVs  
  926.   
  927.   int DFDisableIdc;
  928.   int DFAlphaC0Offset;
  929.   int DFBetaOffset;
  930.   int direct_spatial_mv_pred_flag;              //!< Direct Mode type to be used (0: Temporal, 1: Spatial)
  931.   int num_ref_idx_active_list[2];
  932.   int num_ref_idx_l0_active;
  933.   int num_ref_idx_l1_active;
  934.   byte field_mode;     //!< For MB level field/frame -- field mode on flag
  935.   byte top_field;      //!< For MB level field/frame -- top field flag
  936.   int mvscale[6][MAX_REFERENCE_PICTURES];
  937.   int buf_cycle;
  938.   int i16offset;
  939.   int layer;             //!< which layer this picture belonged to
  940.   int NoResidueDirect;
  941.   int AdaptiveRounding;                          //!< Adaptive Rounding parameter based on JVT-N011
  942.   int redundant_pic_cnt; // JVT-D101
  943.   int MbaffFrameFlag;    //!< indicates frame with mb aff coding
  944.   //the following should probably go in sequence parameters
  945.   unsigned int pic_order_cnt_type;
  946.   // for poc mode 1
  947.   Boolean      delta_pic_order_always_zero_flag;
  948.   int          offset_for_non_ref_pic;
  949.   int          offset_for_top_to_bottom_field;
  950.   unsigned int num_ref_frames_in_pic_order_cnt_cycle;
  951.   int          offset_for_ref_frame[1];
  952.   //the following is for slice header syntax elements of poc
  953.   // for poc mode 0.
  954.   unsigned int pic_order_cnt_lsb;
  955.   int          delta_pic_order_cnt_bottom;
  956.   // for poc mode 1.
  957.   int          delta_pic_order_cnt[2];
  958.   int          frm_iter;   // frame variations to create (useful for multiple coding passes)
  959.   unsigned int field_picture;
  960.     signed int toppoc;      //!< poc for this frame or field
  961.     signed int bottompoc;   //!< for completeness - poc of bottom field of a frame (always = poc+1)
  962.     signed int framepoc;    //!< min (toppoc, bottompoc)
  963.     signed int ThisPOC;     //!< current picture POC
  964.   unsigned int frame_num;   //!< frame_num for this frame
  965.   unsigned int PicWidthInMbs;
  966.   unsigned int PicHeightInMapUnits;
  967.   unsigned int FrameHeightInMbs;
  968.   unsigned int PicSizeInMbs;
  969.   unsigned int FrameSizeInMbs;
  970.   //the following should probably go in picture parameters
  971.   Boolean pic_order_present_flag; // ????????
  972.   //the following are sent in the slice header
  973. //  int delta_pic_order_cnt[2];
  974.   int nal_reference_idc;
  975.   int adaptive_ref_pic_buffering_flag;
  976.   int no_output_of_prior_pics_flag;
  977.   int long_term_reference_flag;
  978.   DecRefPicMarking_t *dec_ref_pic_marking_buffer;
  979.   int model_number;
  980.   // rate control variables
  981.   int NumberofCodedMacroBlocks;
  982.   int BasicUnitQP;
  983.   int NumberofMBTextureBits;
  984.   int NumberofMBHeaderBits;
  985.   unsigned int BasicUnit;
  986.   byte write_macroblock;
  987.   byte bot_MB;
  988.   int write_mbaff_frame;
  989.   int DeblockCall;
  990.   int last_pic_bottom_field;
  991.   int last_has_mmco_5;
  992.   int pre_frame_num;
  993.   int slice_group_change_cycle;
  994.   int pic_unit_size_on_disk;
  995.   int out_unit_size_on_disk;
  996.   int bitdepth_luma;
  997.   int bitdepth_chroma;
  998.   int bitdepth_scale[2];
  999.   int bitdepth_luma_qp_scale;
  1000.   int bitdepth_chroma_qp_scale;
  1001.   int bitdepth_lambda_scale;
  1002.   int max_bitCount;
  1003.   int max_qp_delta;
  1004.   int min_qp_delta;
  1005.   // Lagrangian Parameters
  1006.   LambdaParams **lambda;
  1007.   double  **lambda_md;     //!< Mode decision Lambda
  1008.   double ***lambda_me;     //!< Motion Estimation Lambda
  1009.   int    ***lambda_mf;     //!< Integer formatted Motion Estimation Lambda
  1010.   double **lambda_mf_factor; //!< Motion Estimation Lamda Scale Factor
  1011.   unsigned int dc_pred_value_comp[MAX_PLANE]; //!< component value for DC prediction (depends on component pel bit depth)
  1012.   unsigned int dc_pred_value;                 //!< DC prediction value for current component
  1013.   int max_imgpel_value_comp      [MAX_PLANE];       //!< max value that one picture element (pixel) can take (depends on pic_unit_bitdepth)
  1014.   int max_imgpel_value_comp_sq   [MAX_PLANE];       //!< max value that one picture element (pixel) can take (depends on pic_unit_bitdepth)
  1015.   int max_imgpel_value;              //!< max value that one picture element (pixel) can take (depends on pic_unit_bitdepth)
  1016.   int num_blk8x8_uv;
  1017.   int num_cdc_coeff;
  1018.   int yuv_format;
  1019.   int P444_joined;
  1020.   int lossless_qpprime_flag;
  1021.   int mb_cr_size_x;
  1022.   int mb_cr_size_y;
  1023.   int mb_size[MAX_PLANE][2];
  1024.   int chroma_qp_offset[2];      //!< offset for qp for chroma [0-Cb, 1-Cr]
  1025.   int auto_crop_right;
  1026.   int auto_crop_bottom;
  1027.   short checkref;
  1028.   int last_valid_reference;
  1029.   int bytes_in_picture;
  1030.   int AverageFrameQP;
  1031.   int SumFrameQP;
  1032.   int GopLevels;
  1033.   int ChromaArrayType;
  1034.   Macroblock    *mb_data_JV[MAX_PLANE];  //!< mb_data to be used during 4:4:4 independent mode encoding
  1035.   int colour_plane_id;    //!< colour_plane_id of the current coded slice (valid only when separate_colour_plane_flag is 1)
  1036.   int lastIDRnumber;
  1037.   int lastIntraNumber;
  1038.   int lastINTRA;
  1039.   int last_ref_idc;
  1040.   int idr_refresh;
  1041.   int masterQP;
  1042. } ImageParameters;
  1043. //! definition of pic motion parameters
  1044. typedef struct pic_motion_params2
  1045. {
  1046.   int64    ref_pic_id;    //!< reference picture identifier [list][subblock_y][subblock_x]
  1047.   int64    ref_id;        //!< reference picture identifier [list][subblock_y][subblock_x]
  1048.   short    mv[2];            //!< motion vector       [list][subblock_x][subblock_y][component]
  1049.   char     ref_idx;       //!< reference picture   [list][subblock_y][subblock_x]
  1050.   byte     mb_field;      //!< field macroblock indicator
  1051.   byte     field_frame;   //!< indicates if co_located is field or frame.
  1052. } PicMotionParams2;
  1053. // Motion Vector structure
  1054. typedef struct
  1055. {
  1056.   short mv_x;
  1057.   short mv_y;
  1058. } MotionVector;
  1059. //! For MB level field/frame coding tools
  1060. //! temporary structure to store MB data for field/frame coding
  1061. typedef struct
  1062. {
  1063.   double min_rdcost;
  1064.   double min_dcost;
  1065.   imgpel rec_mbY[16][16];       // hold the Y component of reconstructed MB
  1066.   imgpel rec_mb_cr[2][16][16];
  1067.   int    ****cofAC;
  1068.   int    ***cofDC;
  1069.   int    mb_type;
  1070.   short  b8mode[4], b8pdir[4];
  1071.   int    cbp;
  1072.   int    mode;
  1073.   int    i16offset;
  1074.   int    c_ipred_mode;
  1075.   int    luma_transform_size_8x8_flag;
  1076.   int    NoMbPartLessThan8x8Flag;
  1077.   int    qp;
  1078.   int    prev_qp;
  1079.   int    prev_dqp;
  1080.   short  delta_qp;
  1081.   int    prev_cbp;
  1082.   
  1083.   int64  cbp_blk;
  1084.   short  ******pred_mv;        //!< predicted motion vectors
  1085.   short  ******all_mv;         //!< all modes motion vectors
  1086.   char   intra_pred_modes[16];
  1087.   char   intra_pred_modes8x8[16];
  1088.   char   **ipredmode;
  1089.   char   refar[2][4][4];       //!< reference frame array [list][y][x]
  1090. } RD_DATA;
  1091. //! Set Explicit GOP Parameters.
  1092. //! Currently only supports Enhancement GOP but could be easily extended
  1093. typedef struct
  1094. {
  1095.   int slice_type;       //! Slice type
  1096.   int display_no;       //! GOP Display order
  1097.   int reference_idc;    //! Is reference?
  1098.   int slice_qp;         //! Assigned QP
  1099.   int hierarchy_layer;    //! Hierarchy layer (used with GOP Hierarchy option 2)
  1100.   int hierarchyPocDelta;  //! Currently unused
  1101. } GOP_DATA;
  1102. typedef struct
  1103. {
  1104.   int mb_p8x8_cost;
  1105.   int smb_p8x8_cost[4];
  1106.   double smb_p8x8_rdcost[4]; 
  1107.   int lrec[16][16]; // transform and quantized coefficients will be stored here for SP frames
  1108.   int cbp8x8;
  1109.   int cbp_blk8x8;
  1110.   int cnt_nonz_8x8;
  1111.   short part8x8mode[4];
  1112.   short part8x8bipred[4];
  1113.   char  part8x8pdir[4];
  1114.   char  part8x8l0ref[4];
  1115.   char  part8x8l1ref[4];
  1116.   imgpel rec_mbY8x8[16][16];
  1117.   imgpel mpr8x8[16][16];
  1118.   imgpel mpr8x8CbCr[2][16][16];
  1119.   imgpel rec_mb8x8_cr[2][16][16];
  1120. } RD_8x8DATA;
  1121. typedef struct
  1122. {
  1123.   double lambda_md;        //!< Mode decision Lambda
  1124.   double lambda_me[3];     //!< Motion Estimation Lambda
  1125.   int    lambda_mf[3];     //!< Integer formatted Motion Estimation Lambda
  1126.   int    best_mcost[2];
  1127.   short  valid[MAXMODE];
  1128.   short  list_offset[2];
  1129.   short  curr_mb_field;
  1130. } RD_PARAMS;
  1131. GOP_DATA *gop_structure;
  1132. RD_DATA *rdopt;
  1133. RD_DATA rddata_top_frame_mb, rddata_bot_frame_mb; //!< For MB level field/frame coding tools
  1134. RD_DATA rddata_top_field_mb, rddata_bot_field_mb; //!< For MB level field/frame coding tools
  1135. RD_DATA rddata_trellis_best, rddata_trellis_curr;
  1136. short *****tmp_mv8, *****tmp_pmv8;
  1137. int   ***motion_cost8;
  1138. extern InputParameters *params;
  1139. extern ImageParameters *img;
  1140. extern DistortionParams *dist;
  1141. // files
  1142. FILE *p_log;                     //!< SNR file
  1143. FILE *p_trace;                   //!< Trace file
  1144. int  p_in;                       //!< original YUV file handle
  1145. int  p_dec;                      //!< decoded image file handle
  1146. int coeff_cost_cr[MAX_PLANE];
  1147. int cmp_cbp[3], i16x16mode, curr_cbp[2];
  1148. int64 cur_cbp_blk[MAX_PLANE];
  1149. int CbCr_predmode_8x8[4]; 
  1150. /***********************************************************************
  1151.  * P r o t o t y p e s   f o r    T M L
  1152.  ***********************************************************************
  1153.  */
  1154. void intrapred_4x4   (Macroblock *currMB, ColorPlane pl, int CurrPixX,int CurrPixY, int *left_available, int *up_available, int *all_available);
  1155. void intrapred_16x16 (Macroblock *currMB, ColorPlane pl);
  1156. // Transform function pointers
  1157. int (*pDCT_4x4)      (Macroblock *currMB, ColorPlane pl, int block_x, int block_y, int *coeff_cost, int intra, int is_cavlc);
  1158. int (*pDCT_16x16)    (Macroblock *currMB, ColorPlane pl, int, int is_cavlc);
  1159. int (*pDCT_8x8)      (Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra);
  1160. int  (*dct_cr_4x4[2])(Macroblock *currMB, int uv,int i11, int is_cavlc);
  1161. int  dct_8x8         (Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra);
  1162. int  dct_8x8_cavlc   (Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra);
  1163. int  dct_8x8_ls      (Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra);
  1164. void copyblock_sp    (Macroblock *currMB, ColorPlane pl, int pos_mb1,int pos_mb2);
  1165. int  dct_chroma_sp   (Macroblock *currMB, int uv,int i11, int is_cavlc);
  1166. int  dct_chroma_sp2  (Macroblock *currMB, int uv,int i11, int is_cavlc);
  1167. int  distortion4x4(int*);
  1168. int  distortion8x8(int*);
  1169. extern int*   refbits;
  1170. extern int**** motion_cost;
  1171. double *mb16x16_cost_frame;
  1172. void  FindSkipModeMotionVector  (Macroblock *currMB);
  1173. void  Get_Direct_Motion_Vectors (Macroblock *currMB);
  1174. void  PartitionMotionSearch     (Macroblock *currMB, int, int, int*);
  1175. int   BIDPartitionCost          (Macroblock *currMB, int, int, char[2], int);
  1176. int   BPredPartitionCost        (Macroblock *currMB, int, int, short, short, int, int);
  1177. int   GetDirectCostMB           (Macroblock *currMB, int bslice);
  1178. int   GetDirectCost8x8          (Macroblock *currMB, int, int*);
  1179. void poc_based_ref_management_frame_pic(int current_pic_num);
  1180. void poc_based_ref_management_field_pic(int current_pic_num);
  1181. int  picture_coding_decision (Picture *picture1, Picture *picture2, int qp);
  1182. unsigned CeilLog2( unsigned uiVal);
  1183. // dynamic mem allocation
  1184. int  init_global_buffers(void);
  1185. void free_global_buffers(void);
  1186. void no_mem_exit  (char *where);
  1187. void free_img    (void);
  1188. int  get_mem_ACcoeff  (int*****);
  1189. int  get_mem_DCcoeff  (int****);
  1190. void free_mem_ACcoeff (int****);
  1191. void free_mem_DCcoeff (int***);
  1192. #if TRACE
  1193. void  trace2out(SyntaxElement *se);
  1194. void  trace2out_cabac(SyntaxElement *se);
  1195. #endif
  1196. void error(char *text, int code);
  1197. byte  field_flag_inference(Macroblock  *currMB);
  1198. void set_mbaff_parameters(Macroblock  *currMB);  // For MB AFF
  1199. //============= restriction of reference frames based on the latest intra-refreshes==========
  1200. void UpdatePixelMap(void);
  1201. int64 compute_SSE(imgpel **imgRef, imgpel **imgSrc, int xRef, int xSrc, int ySize, int xSize);
  1202. // Tian Dong: for IGOPs
  1203. extern Boolean In2ndIGOP;
  1204. extern int start_frame_no_in_this_IGOP;
  1205. extern int start_tr_in_this_IGOP;
  1206. extern int FirstFrameIn2ndIGOP;
  1207. extern int FrameNumberInFile;
  1208. int CalculateFrameNumber(void);
  1209. #define IMG_NUMBER (img->number - start_frame_no_in_this_IGOP)
  1210. void encode_one_macroblock_low (Macroblock *currMB);
  1211. void encode_one_macroblock_high (Macroblock *currMB);
  1212. void encode_one_macroblock_highfast (Macroblock *currMB);
  1213. void encode_one_macroblock_highloss (Macroblock *currMB);
  1214. void (*encode_one_macroblock) (Macroblock *currMB);
  1215. int is_bipred_enabled(int mode); 
  1216. void update_qp    (ImageParameters *img, Macroblock *currMB);
  1217. void select_plane (ColorPlane color_plane);
  1218. void select_dct   (ImageParameters *img, Macroblock *currMB);
  1219. void store_coding_state_cs_cm(Macroblock *currMB);
  1220. void reset_coding_state_cs_cm(Macroblock *currMB);
  1221. void set_slice_type(int slice_type);
  1222. void free_encoder_memory(ImageParameters *img);
  1223. int check_for_SI16(void);
  1224. int **lrec ;
  1225. int ***lrec_uv;
  1226. int si_frame_indicator;
  1227. int sp2_frame_indicator;
  1228. int number_sp2_frames;
  1229. void output_SP_coefficients(void);
  1230. void read_SP_coefficients(void);
  1231. int giRDOpt_B8OnlyFlag;
  1232. #ifdef BEST_NZ_COEFF
  1233. int gaaiMBAFF_NZCoeff[4][12];
  1234. #endif
  1235. // Redundant picture
  1236. imgpel **imgY_tmp;
  1237. imgpel **imgUV_tmp[2];
  1238. int  frameNuminGOP;
  1239. int  redundant_coding;
  1240. int  key_frame;
  1241. int  redundant_ref_idx;
  1242. void Init_redundant_frame(void);
  1243. void Set_redundant_frame(void);
  1244. void encode_one_redundant_frame(void);
  1245. int img_pad_size_uv_x;
  1246. int img_pad_size_uv_y;
  1247. unsigned char chroma_mask_mv_y;
  1248. unsigned char chroma_mask_mv_x;
  1249. int chroma_shift_y, chroma_shift_x;
  1250. int shift_cr_x, shift_cr_x2, shift_cr_y;
  1251. int img_padded_size_x;
  1252. int img_padded_size_x2;
  1253. int img_padded_size_x4;
  1254. int img_padded_size_x_m8;
  1255. int img_padded_size_x_m8x8;
  1256. int img_padded_size_x_m4x4;
  1257. int img_cr_padded_size_x;
  1258. int img_cr_padded_size_x_m8;
  1259. int img_cr_padded_size_x2;
  1260. int img_cr_padded_size_x4;
  1261. // struct with pointers to the sub-images
  1262. typedef struct 
  1263. {
  1264.   imgpel ****luma;    // component 0 (usually Y, X, or R)
  1265.   imgpel ****crcb[2]; // component 2 (usually U/V, Y/Z, or G/B)
  1266. } SubImageContainer;
  1267. int start_me_refinement_hp; // if set then recheck the center position when doing half-pel motion refinement
  1268. int start_me_refinement_qp; // if set then recheck the center position when doing quarter-pel motion refinement
  1269. //For residual DPCM
  1270. int ipmode_DPCM;
  1271. int lossless_res[4][4];
  1272. // For 4:4:4 independent mode
  1273. void change_plane_JV( int nplane );
  1274. void make_frame_picture_JV(void);
  1275. int Motion_Selected;
  1276. int Intra_Selected; 
  1277. #endif