global.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:31k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. ***********************************************************************
  3. * COPYRIGHT AND WARRANTY INFORMATION
  4. *
  5. * Copyright 2001, International Telecommunications Union, Geneva
  6. *
  7. * DISCLAIMER OF WARRANTY
  8. *
  9. * These software programs are available to the user without any
  10. * license fee or royalty on an "as is" basis. The ITU disclaims
  11. * any and all warranties, whether express, implied, or
  12. * statutory, including any implied warranties of merchantability
  13. * or of fitness for a particular purpose.  In no event shall the
  14. * contributor or the ITU be liable for any incidental, punitive, or
  15. * consequential damages of any kind whatsoever arising from the
  16. * use of these programs.
  17. *
  18. * This disclaimer of warranty extends to the user of these programs
  19. * and user's customers, employees, agents, transferees, successors,
  20. * and assigns.
  21. *
  22. * The ITU does not represent or warrant that the programs furnished
  23. * hereunder are free of infringement of any third-party patents.
  24. * Commercial implementations of ITU-T Recommendations, including
  25. * shareware, may be subject to royalty fees to patent holders.
  26. * Information regarding the ITU-T patent policy is available from
  27. * the ITU Web site at http://www.itu.int.
  28. *
  29. * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
  30. ************************************************************************
  31. */
  32. /*!
  33.  ************************************************************************
  34.  *  file
  35.  *     global.h
  36.  *  brief
  37.  *     global definitions for for H.26L encoder.
  38.  *  author
  39.  *     Copyright (C) 1999  Telenor Satellite Services,Norway
  40.  *                         Ericsson Radio Systems, Sweden
  41.  *
  42.  *     Inge Lille-Lang鴜               <inge.lille-langoy@telenor.com>
  43.  *
  44.  *     Telenor Satellite Services
  45.  *     Keysers gt.13                       tel.:   +47 23 13 86 98
  46.  *     N-0130 Oslo,Norway                  fax.:   +47 22 77 79 80
  47.  *
  48.  *     Rickard Sjoberg                 <rickard.sjoberg@era.ericsson.se>
  49.  *
  50.  *     Ericsson Radio Systems
  51.  *     KI/ERA/T/VV
  52.  *     164 80 Stockholm, Sweden
  53.  *
  54.  ************************************************************************
  55.  */
  56. #ifndef _GLOBAL_H_
  57. #define _GLOBAL_H_
  58. #include <stdio.h>
  59. #include "defines.h"
  60. #ifndef WIN32
  61.   #include "minmax.h"
  62. #else
  63.   #define  snprintf _snprintf
  64. #endif
  65. /***********************************************************************
  66.  * T y p e    d e f i n i t i o n s    f o r    T M L
  67.  ***********************************************************************
  68.  */
  69. typedef unsigned char byte;    //!< byte type definition
  70. #define pel_t byte
  71. //! Data Partitioning Modes
  72. typedef enum
  73. {
  74.   PAR_DP_1,   //!< no data partitioning is supported
  75.   PAR_DP_3,   //!< data partitioning with 3 partitions
  76. } PAR_DP_TYPE;
  77. //! Output File Types
  78. typedef enum
  79. {
  80.   PAR_OF_26L,    //!< Current TML description
  81.   PAR_OF_RTP     //!< RTP packets in outfile
  82. } PAR_OF_TYPE;
  83. //! Boolean Type
  84. typedef enum {
  85.   FALSE,
  86.   TRUE
  87. } Boolean;
  88. //! definition of H.26L syntax elements
  89. typedef enum {
  90.   SE_HEADER,
  91.   SE_PTYPE,
  92.   SE_MBTYPE,
  93.   SE_REFFRAME,
  94.   SE_INTRAPREDMODE,
  95.   SE_MVD,
  96.   SE_CBP_INTRA,
  97.   SE_LUM_DC_INTRA,
  98.   SE_CHR_DC_INTRA,
  99.   SE_LUM_AC_INTRA,
  100.   SE_CHR_AC_INTRA,
  101.   SE_CBP_INTER,
  102.   SE_LUM_DC_INTER,
  103.   SE_CHR_DC_INTER,
  104.   SE_LUM_AC_INTER,
  105.   SE_CHR_AC_INTER,
  106.   SE_DELTA_QUANT,
  107.   SE_BFRAME,
  108.   SE_EOS,
  109.   SE_MAX_ELEMENTS  //!< number of maximum syntax elements
  110. } SE_type;         // substituting the definitions in elements.h
  111. typedef enum {
  112.   INTER_MB,
  113.   INTRA_MB_4x4,
  114.   INTRA_MB_16x16
  115. } IntraInterDecision;
  116. typedef enum {
  117.   BITS_HEADER,
  118.   BITS_TOTAL_MB,
  119.   BITS_MB_MODE,
  120.   BITS_INTER_MB,
  121.   BITS_CBP_MB,
  122.   BITS_COEFF_Y_MB,
  123.   BITS_COEFF_UV_MB,
  124.   BITS_DELTA_QUANT_MB,
  125.   MAX_BITCOUNTER_MB
  126. } BitCountType;
  127. typedef enum {
  128.   SINGLE_SCAN,
  129.   DOUBLE_SCAN
  130. } ScanMode;
  131. typedef enum {
  132.   NO_SLICES,
  133.   FIXED_MB,
  134.   FIXED_RATE,
  135.   CALLBACK
  136. } SliceMode;
  137. typedef enum {
  138.   UVLC,
  139.   CABAC
  140. } SymbolMode;
  141. /***********************************************************************
  142.  * D a t a    t y p e s   f o r  C A B A C
  143.  ***********************************************************************
  144.  */
  145. //! struct to characterize the state of the arithmetic coding engine
  146. typedef struct
  147. {
  148.   unsigned int  Elow, Ehigh;
  149.   unsigned int  Ebuffer;
  150.   unsigned int  Ebits_to_go;
  151.   unsigned int  Ebits_to_follow;
  152.   byte          *Ecodestrm;
  153.   int           *Ecodestrm_len;
  154.   // storage in case of recode MB
  155.   unsigned int  ElowS, EhighS;
  156.   unsigned int  EbufferS;
  157.   unsigned int  Ebits_to_goS;
  158.   unsigned int  Ebits_to_followS;
  159.   byte          *EcodestrmS;
  160.   int           *Ecodestrm_lenS;
  161. } EncodingEnvironment;
  162. typedef EncodingEnvironment *EncodingEnvironmentPtr;
  163. //! struct for context management
  164. typedef struct
  165. {
  166.   unsigned int  cum_freq[2];    //!< cumulated frequency counts
  167.   Boolean       in_use;         //!< flag for context in use
  168.   unsigned int  max_cum_freq;   //!< maximum frequency count
  169. } BiContextType;
  170. typedef BiContextType *BiContextTypePtr;
  171. /**********************************************************************
  172.  * 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
  173.  **********************************************************************
  174.  */
  175. #define NUM_MB_TYPE_CTX  10
  176. #define NUM_MV_RES_CTX   10
  177. #define NUM_REF_NO_CTX   6
  178. #define NUM_DELTA_QP_CTX 4
  179. typedef struct
  180. {
  181.   BiContextTypePtr mb_type_contexts[2];
  182.   BiContextTypePtr mv_res_contexts[2];
  183.   BiContextTypePtr ref_no_contexts;
  184.   BiContextTypePtr delta_qp_contexts;
  185. } MotionInfoContexts;
  186. #define NUM_IPR_CTX    2
  187. #define NUM_CBP_CTX    4
  188. #define NUM_TRANS_TYPE 9
  189. #define NUM_LEVEL_CTX  4
  190. #define NUM_RUN_CTX    2
  191. typedef struct
  192. {
  193.   BiContextTypePtr ipr_contexts[6];
  194.   BiContextTypePtr cbp_contexts[2][3];
  195.   BiContextTypePtr level_context[NUM_TRANS_TYPE];
  196.   BiContextTypePtr run_context[NUM_TRANS_TYPE];
  197. } TextureInfoContexts;
  198. //*********************** end of data type definition for CABAC *******************
  199. /***********************************************************************
  200.  * N e w   D a t a    t y p e s   f o r    T M L
  201.  ***********************************************************************
  202.  */
  203. //! Syntaxelement
  204. typedef struct syntaxelement
  205. {
  206.   int                 type;           //!< type of syntax element for data part.
  207.   int                 value1;         //!< numerical value of syntax element
  208.   int                 value2;         //!< for blocked symbols, e.g. run/level
  209.   int                 len;            //!< length of code
  210.   int                 inf;            //!< info part of UVLC code
  211.   unsigned int        bitpattern;     //!< UVLC bitpattern
  212.   int                 context;        //!< CABAC context
  213. #if TRACE
  214.   #define             TRACESTRING_SIZE 100            //!< size of trace string
  215.   char                tracestring[TRACESTRING_SIZE];  //!< trace string
  216. #endif
  217.   //!< for mapping of syntaxElement to UVLC
  218.   void    (*mapping)(int value1, int value2, int* len_ptr, int* info_ptr);
  219.   //!< used for CABAC: refers to actual coding method of each individual syntax element type
  220.   void    (*writing)(struct syntaxelement *, EncodingEnvironmentPtr);
  221. } SyntaxElement;
  222. //! Macroblock
  223. typedef struct macroblock
  224. {
  225.   int                 currSEnr;                   //!< number of current syntax element
  226.   int                 slice_nr;                   //!< slice number to which the MB belongs
  227.   int                 delta_qp;
  228.   int                 qp ;
  229.   int                 intraOrInter;
  230.   int                 bitcounter[MAX_BITCOUNTER_MB];
  231.   struct macroblock   *mb_available[3][3];        /*!< pointer to neighboring MBs in a 3x3 window of current MB, which is located at [1][1] n
  232.                                                        NULL pointer identifies neighboring MBs which are unavailable */
  233.   // some storage of macroblock syntax elements for global access
  234.   int                 mb_type;
  235.   int                 mb_imode;
  236.   int                 ref_frame;
  237.   int                 mvd[2][BLOCK_MULTIPLE][BLOCK_MULTIPLE][2];          //!< indices correspond to [forw,backw][block_y][block_x][x,y]
  238.   int                 intra_pred_modes[BLOCK_MULTIPLE*BLOCK_MULTIPLE];
  239.   int                 cbp ;
  240.   int                 cbp_blk ;    //!< 1 bit set for every 4x4 block with coefs (not implemented for INTRA)
  241. } Macroblock;
  242. //! Bitstream
  243. typedef struct
  244. {
  245.   int             byte_pos;           //!< current position in bitstream;
  246.   int             bits_to_go;         //!< current bitcounter
  247.   byte            byte_buf;           //!< current buffer for last written byte
  248.   int             stored_byte_pos;    //!< storage for position in bitstream;
  249.   int             stored_bits_to_go;  //!< storage for bitcounter
  250.   int             header_len;
  251.   byte            header_byte_buffer;
  252.   byte            stored_byte_buf;    //!< storage for buffer of last written byte
  253.   byte            byte_buf_skip;      //!< current buffer for last written byte
  254.   int             byte_pos_skip;      //!< storage for position in bitstream;
  255.   int             bits_to_go_skip;    //!< storage for bitcounter
  256.   byte            *streamBuffer;      //!< actual buffer for written bytes
  257. } Bitstream;
  258. //! DataPartition
  259. typedef struct datapartition
  260. {
  261.   Bitstream           *bitstream;
  262.   EncodingEnvironment ee_cabac;
  263.   int                 (*writeSyntaxElement)(SyntaxElement *, struct datapartition *);
  264.                       /*!< virtual function;
  265.                            actual method depends on chosen data partition and
  266.                            entropy coding method  */
  267. } DataPartition;
  268. //! Slice
  269. typedef struct
  270. {
  271.   int                 picture_id;
  272.   int                 slice_nr;     //!< not necessary but o.k.
  273.   int                 qp;
  274.   int                 picture_type; //!< picture type
  275.   int                 start_mb_nr;
  276.   int                 dp_mode;      //!< data partioning mode
  277.   int                 max_part_nr;  //!< number of different partitions
  278.   DataPartition       *partArr;     //!< array of partitions
  279.   MotionInfoContexts  *mot_ctx;     //!< pointer to struct of context models for use in CABAC
  280.   TextureInfoContexts *tex_ctx;     //!< pointer to struct of context models for use in CABAC
  281.   Boolean             (*slice_too_big)(int bits_slice); //!< for use of callback functions
  282. } Slice;
  283. // GH: global picture format dependend buffers, mem allocation in image.c
  284. byte   **imgY;               //!< Encoded luma images
  285. byte  ***imgUV;              //!< Encoded croma images
  286. byte   **imgY_org;           //!< Reference luma image
  287. byte  ***imgUV_org;          //!< Reference croma image
  288. byte   **imgY_pf;            //!< Post filter luma image
  289. byte  ***imgUV_pf;           //!< Post filter croma image
  290. byte  ***mref;               //!< 1/4 pix luma
  291. byte ****mcef;               //!< pix chroma
  292. int    **img4Y_tmp;          //!< for quarter pel interpolation
  293. byte   **imgY_tmp;           //!< for loop filter
  294. byte  ***imgUV_tmp;
  295. int   ***tmp_mv;             //!< motion vector buffer
  296. int    **refFrArr;           //!< Array for reference frames of each block
  297. // B pictures
  298. // motion vector : forward, backward, direct
  299. int  ***tmp_fwMV;
  300. int  ***tmp_bwMV;
  301. int  ***dfMV;
  302. int  ***dbMV;
  303. int   **fw_refFrArr;
  304. int   **bw_refFrArr;
  305. byte  **mref_P;              //!< for B-frames: 1/4 pix luma for next P picture
  306. byte ***mcef_P;              //!< for B-frames: pix chroma for next P picture
  307. byte  **nextP_imgY;
  308. byte ***nextP_imgUV;
  309. pel_t **Refbuf11;            //!< 1/1th pel (full pel) reference frame buffer
  310. pel_t  *Refbuf11_P;          //!< 1/1th pel P picture buffer
  311. // Buffers for rd optimization with packet losses, Dim. Kontopodis
  312. int  **resY;             //!< Residue of Luminance
  313. byte ***decY;            //!< Decoded values at the simulated decoders
  314. byte ****decref;         //!< Reference frames of the simulated decoders
  315. byte ***decY_best;       //!< Decoded frames for the best mode for all decoders
  316. byte **RefBlock;
  317. byte **status_map;
  318. int intras;       //!< Counts the intra updates in each frame.
  319. int  Bframe_ctr, frame_no, nextP_tr;
  320. int  tot_time;
  321. #define ET_SIZE 300      //!< size of error text buffer
  322. char errortext[ET_SIZE]; //!< buffer for error message for exit with error()
  323. //! SNRParameters
  324. typedef struct
  325. {
  326.   float snr_y;               //!< current Y SNR
  327.   float snr_u;               //!< current U SNR
  328.   float snr_v;               //!< current V SNR
  329.   float snr_y1;              //!< SNR Y(dB) first frame
  330.   float snr_u1;              //!< SNR U(dB) first frame
  331.   float snr_v1;              //!< SNR V(dB) first frame
  332.   float snr_ya;              //!< Average SNR Y(dB) remaining frames
  333.   float snr_ua;              //!< Average SNR U(dB) remaining frames
  334.   float snr_va;              //!< Average SNR V(dB) remaining frames
  335. } SNRParameters;
  336.                              //! all input parameters
  337. typedef struct
  338. {
  339.   int no_frames;                //!< number of frames to be encoded
  340.   int qp0;                      //!< QP of first frame
  341.   int qpN;                      //!< QP of remaining frames
  342.   int jumpd;                    //!< number of frames to skip in input sequence (e.g 2 takes frame 0,3,6,9...)
  343.   int mv_res;                   //!< motion vector resolution: 0: 1/4-pel, 1: 1/8-pel
  344.   int hadamard;                 /*!< 0: 'normal' SAD in 1/3 pixel search.  1: use 4x4 Haphazard transform and '
  345.                                      Sum of absolute transform difference' in 1/3 pixel search                   */
  346.   int search_range;             /*!< search range - integer pel search and 16x16 blocks.  The search window is
  347.                                      generally around the predicted vector. Max vector is 2xmcrange.  For 8x8
  348.                                      and 4x4 block sizes the search range is 1/2 of that for 16x16 blocks.       */
  349.   int no_multpred;              /*!< 1: prediction from the last frame only. 2: prediction from the last or
  350.                                      second last frame etc.  Maximum 5 frames                                    */
  351.   int img_width;                //!< GH: if CUSTOM image format is chosen, use this size
  352.   int img_height;               //!< GH: width and height must be a multiple of 16 pels
  353.   int yuv_format;               //!< GH: YUV format (0=4:0:0, 1=4:2:0, 2=4:2:2, 3=4:4:4,currently only 4:2:0 is supported)
  354.   int color_depth;              //!< GH: YUV color depth per component in bit/pel (currently only 8 bit/pel is supported)
  355.   int intra_upd;                /*!< For error robustness. 0: no special action. 1: One GOB/frame is intra coded
  356.                                      as regular 'update'. 2: One GOB every 2 frames is intra coded etc.
  357.                                      In connection with this intra update, restrictions is put on motion vectors
  358.                                      to prevent errors to propagate from the past                                */
  359.   int blc_size[8][2];           //!< array for different block sizes
  360.   int slice_mode;               //!< Indicate what algorithm to use for setting slices
  361.   int slice_argument;           //!< Argument to the specified slice algorithm
  362.   int UseConstrainedIntraPred;  //!< 0: Inter MB pixels are allowed for intra prediction 1: Not allowed
  363.   int  infile_header;           //!< If input file has a header set this to the length of the header
  364.   char infile[100];             //!< YUV 4:2:0 input format
  365.   char outfile[100];            //!< H.26L compressed output bitstream
  366.   char ReconFile[100];          //!< Reconstructed Pictures
  367.   char TraceFile[100];          //!< Trace Outputs
  368.   int intra_period;             //!< Random Access period though intra
  369.   // B pictures
  370.   int successive_Bframe;        //!< number of B frames that will be used
  371.   int qpB;                      //!< QP of B frames
  372.   // SP Pictures
  373.   int sp_periodicity;           //!< The periodicity of SP-pictures
  374.   int qpsp;                     //!< SP Picture QP for prediction error
  375.   int qpsp_pred;                //!< SP Picture QP for predicted block
  376.   // Introduced by TOM
  377.   int symbol_mode;              //!< Specifies the mode the symbols are mapped on bits
  378.   int of_mode;                  //!< Specifies the mode of the output file
  379.   int partition_mode;           //!< Specifies the mode of data partitioning
  380.   int SequenceHeaderType;
  381.   int TRModulus;
  382.   int PicIdModulus;
  383.   int InterSearch16x16;
  384.   int InterSearch16x8;
  385.   int InterSearch8x16;
  386.   int InterSearch8x8;
  387.   int InterSearch8x4;
  388.   int InterSearch4x8;
  389.   int InterSearch4x4;
  390.   char PictureTypeSequence[MAXPICTURETYPESEQUENCELEN];
  391. #ifdef _FULL_SEARCH_RANGE_
  392.   int full_search;
  393. #endif
  394. #ifdef _ADAPT_LAST_GROUP_
  395.   int last_frame;
  396. #endif
  397. #ifdef _CHANGE_QP_
  398.   int qpN2, qpB2, qp2start;
  399. #endif
  400.   int rdopt;
  401. #ifdef _ADDITIONAL_REFERENCE_FRAME_
  402.   int add_ref_frame;
  403. #endif
  404. #ifdef _LEAKYBUCKET_
  405.   int NumberLeakyBuckets;
  406.   char LeakyBucketRateFile[100];
  407.   char LeakyBucketParamFile[100];
  408. #endif
  409.   int LossRate;
  410.   int NoOfDecoders;
  411. } InputParameters;
  412. //! ImageParameters
  413. typedef struct
  414. {
  415.   int number;                  //!< current image number to be encoded
  416.   int nb_references;
  417.   int current_mb_nr;
  418.   int total_number_mb;
  419.   int current_slice_nr;
  420.   int type;
  421.   int types;                   /*!< This is for SP-Pictures, since all the syntax elements for SP-Pictures
  422.                                     are the same as P-pictures, we keep the img->type as P_IMG but indicate
  423.                                     SP-Pictures by img->types */
  424.   int no_multpred;             /*!< 1: prediction from the last frame only.
  425.                                     2: prediction from the last or second last frame etc. */
  426.   int multframe_no;
  427.   int qp;                      //!< quant for the current frame
  428.   int qpsp;                    //!< quant for the prediction frame of SP-frame
  429.   int frame_cycle;
  430.   int framerate;
  431.   int width;                   //!< Number of pels
  432.   int width_cr;                //!< Number of pels chroma
  433.   int height;                  //!< Number of lines
  434.   int height_cr;               //!< Number of lines  chroma
  435.   int height_err;              //!< For y vector limitation for error robustness
  436.   int mb_y;                    //!< current MB vertical
  437.   int mb_x;                    //!< current MB horizontal
  438.   int mb_x_save;               //!< horizontal position of the last written MB
  439.   int mb_y_save;               //!< vertical position of the last written MB
  440.   int block_y;                 //!< current block vertical
  441.   int block_x;                 //!< current block horizontal
  442.   int subblock_y;              //!< current subblock vertical
  443.   int subblock_x;              //!< current subblock horizontal
  444.   int pix_y;                   //!< current pixel vertical
  445.   int pix_x;                   //!< current pixel horizontal
  446.   int mb_y_upd;
  447.   int mb_y_intra;              //!< which GOB to intra code
  448.   int mb_mode;                 //!< MB mode relevant for inter images, for intra images are all MB intra
  449.   int imod;                    //!< new/old intra modes + inter
  450.   int pix_c_y;                 //!< current pixel chroma vertical
  451.   int block_c_x;               //!< current block chroma vertical
  452.   int pix_c_x;                 //!< current pixel chroma horizontal
  453.   int blc_size_h;              //!< block size for motion search, horizontal
  454.   int blc_size_v;              //!< block size for motion search, vertical
  455.   int kac;                     //!< any AC coeffs
  456.   int **ipredmode;             //!< GH ipredmode[90][74];prediction mode for inter frames */ /* fix from ver 4.1
  457.   int cod_counter;             //!< Current count of number of skipped macroblocks in a row
  458.   // some temporal buffers
  459.   int mprr[6][4][4];           //!< all 5 prediction modes
  460.   int mprr_2[5][16][16];       //!< all 4 new intra prediction modes
  461.   int***** mv;                 //!< motion vectors for all block types and all reference frames
  462.   int mpr[16][16];             //!< current best prediction mode
  463.   int m7[16][16];              //!< the diff pixel values between orginal image and prediction
  464.   int cof[4][6][18][2][2];     //!< coefficients
  465.   int cofu[5][2][2];           //!< coefficients chroma
  466.   byte tmp_loop_Y[BLOCK_MULTIPLE+2][BLOCK_MULTIPLE+2];      //!< temporal storage for LUMA loop-filter strength
  467.   byte tmp_loop_UV[BLOCK_MULTIPLE/2+2][BLOCK_MULTIPLE/2+2]; //!< temporal storage for CHROMA loop-filter strength
  468.   Slice       *currentSlice;                                //!< pointer to current Slice data struct
  469.   Macroblock    *mb_data;                                   //!< array containing all MBs of a whole frame
  470.   SyntaxElement   MB_SyntaxElements[MAX_SYMBOLS_PER_MB];    //!< temporal storage for all chosen syntax elements of one MB
  471.   int quad[256];               //!< Array containing square values,used for snr computation  */                                         /* Values are limited to 5000 for pixel differences over 70 (sqr(5000)).
  472.   int mv_bituse[512];
  473.   int *slice_numbers;
  474.   int *intra_mb;
  475.   // UMV support
  476.   int mhor;
  477.   int mvert;
  478.   int tr;
  479.   int refPicID;                         //<! temporal reference for reference frames (non-B frames), added by WYK
  480.   // B pictures
  481.   int b_interval;
  482.   int p_interval;
  483.   int b_frame_to_code;
  484.   int fw_mb_mode;
  485.   int fw_multframe_no;
  486.   int fw_blc_size_h;
  487.   int fw_blc_size_v;
  488.   int bw_mb_mode;
  489.   int bw_multframe_no;
  490.   int bw_blc_size_h;
  491.   int bw_blc_size_v;
  492.   int***** p_fwMV;       //!< for MVDFW
  493.   int***** p_bwMV;       //!< for MVDBW
  494.   int blk_bituse[10];    //!< it is included when getting bid_sad
  495.   int***** all_mv;       //!< replaces local all_mv
  496.   int***** all_bmv;      //!< replaces local all_mv
  497.   int buf_cycle;
  498. } ImageParameters;
  499.                                 //!< statistics
  500. typedef struct
  501. {
  502.   int   quant0;                 //!< quant for the first frame
  503.   int   quant1;                 //!< average quant for the remaining frames
  504.   float bitr;                   //!< bit rate for current frame, used only for output til terminal
  505.   float bitr0;                  //!< stored bit rate for the first frame
  506.   float bitrate;                //!< average bit rate for the sequence except first frame
  507.   int   bit_ctr;                //!< counter for bit usage
  508.   int   bit_ctr_0;              //!< stored bit use for the first frame
  509.   int   bit_ctr_n;              //!< bit usage for the current frame
  510.   int   bit_slice;              //!< number of bits in current slice
  511.   int   bit_use_mode_inter[33]; //!< statistics of bit usage
  512.   int   mode_use_intra[25];     //!< Macroblock mode usage for Intra frames
  513.   int   mode_use_inter[33];
  514.   // B pictures
  515.   int   *mode_use_Bframe;
  516.   int   *bit_use_mode_Bframe;
  517.   int   bit_ctr_P;
  518.   int   bit_ctr_B;
  519.   float bitrate_P;
  520.   float bitrate_B;
  521.   int bit_use_mb_type[3];
  522.   int   bit_use_header[3];
  523.   int   tmp_bit_use_cbp[3];
  524.   int   bit_use_coeffY[3];
  525.   int   bit_use_coeffC[3];
  526.   int   bit_use_delta_quant[3];
  527. } StatParameters;
  528. extern InputParameters *input;
  529. extern ImageParameters *img;
  530. extern StatParameters *stat;
  531. extern SNRParameters *snr;
  532. #ifdef H26L_LIB
  533. extern byte* memout;
  534. extern int memoutlength;
  535. #endif
  536. // files
  537. FILE *p_dec,*p_dec_u,*p_dec_v;   //!< internal decoded image for debugging
  538. FILE *p_stat;                    //!< status file for the last encoding session
  539. FILE *p_log;                     //!< SNR file
  540. FILE *p_in;                      //!< YUV
  541. FILE *p_datpart;                 //!< file to write bitlength and id of all partitions
  542. FILE *p_trace;                   //!< Trace file
  543. /***********************************************************************
  544.  * P r o t o t y p e s   f o r    T M L
  545.  ***********************************************************************
  546.  */
  547. void intrapred_luma(int CurrPixX,int CurrPixY);
  548. void init();
  549. void find_snr();
  550. void oneforthpix();
  551. void oneforthpix_2();
  552. int  encode_oneIorP_Frame();
  553. int  encode_oneB_Frame();
  554. int  find_sad(int hadamard, int m7[16][16]);
  555. int  dct_luma(int pos_mb1,int pos_mb2,int *cnt_nonz);
  556. int  dct_luma_sp(int pos_mb1,int pos_mb2,int *cnt_nonz);
  557. int  copyblock_sp(int pos_mb1,int pos_mb2);
  558. int  dct_chroma(int uv,int i11);
  559. int  dct_chroma_sp(int uv,int i11);
  560. int  motion_search(int isi);
  561. void levrun_linfo_c2x2(int level,int run,int *len,int *info);
  562. void levrun_linfo_intra(int level,int run,int *len,int *info);
  563. void levrun_linfo_inter(int level,int run,int *len,int *info);
  564. int  sign(int a,int b);
  565. void intrapred_chroma(int,int,int uv);
  566. #ifndef NO_RDQUANT
  567. void rd_quant(int no_coeff,int *coeff);
  568. #endif
  569. void intrapred_luma_2();
  570. int  find_sad2(int *intra_mode);
  571. void dct_luma2(int);
  572. void init_img();
  573. void init_stat();
  574. void report();
  575. void information_init();
  576. void init_frame();
  577. void select_picture_type(SyntaxElement *symbol);
  578. void read_one_new_frame();
  579. void write_reconstructed_image();
  580. void DeblockMb(ImageParameters *img, byte **, byte ***) ;
  581. // dynamic mem allocation
  582. int  get_mem4global_buffers();
  583. void free_mem4global_buffers();
  584. int  get_mem2D    (byte ***array2D, int rows, int columns);
  585. int  get_mem2Dint (int ***array2D, int rows, int columns);
  586. int  get_mem3D    (byte ****array2D, int frames, int rows, int columns);
  587. int  get_mem3Dint (int ****array3D, int frames, int rows, int columns);
  588. void no_mem_exit  (char *where);
  589. int  get_mem_mv  (int******);
  590. void free_mem_mv (int*****);
  591. void free_img    ();
  592. // Added for (re-) structuring the TML soft
  593. int   encode_one_frame();
  594. void  encode_one_slice(SyntaxElement *sym);
  595. void  malloc_slice();
  596. void  free_slice();
  597. void  init_slice();
  598. void  encode_one_macroblock();
  599. void  start_macroblock();
  600. void  terminate_macroblock(Boolean *end_of_slice, Boolean *recode_macroblock);
  601. int   slice_too_big(int rlc_bits);
  602. void  write_one_macroblock();
  603. void  proceed2nextMacroblock();
  604. void  LumaResidualCoding_P();
  605. void  ChromaCoding_P(int *cr_cbp);
  606. void  SetRefFrameInfo_P();
  607. int   MakeIntraPrediction(int *intra_pred_mode_2);
  608. void  CheckAvailabilityOfNeighbors();
  609. int   writeMotionInfo2NAL_Pframe();
  610. void  writeCBPandCoeffs2NAL();
  611. int   writeSyntaxElement_UVLC(SyntaxElement *se, DataPartition *this_dataPart);
  612. void  writeUVLC2buffer(SyntaxElement *se, Bitstream *currStream);
  613. int   symbol2uvlc(SyntaxElement *se);
  614. void  n_linfo(int n, int *len,int *info);
  615. void  n_linfo2(int n, int dummy, int *len,int *info);
  616. void  intrapred_linfo(int ipred1, int ipred2, int *len,int *info);
  617. void  mvd_linfo2(int mvd, int dummy, int *len,int *info);
  618. void  dquant_linfo(int mvd, int dummy, int *len,int *info);
  619. void  cbp_linfo_intra(int cbp, int dummy, int *len,int *info);
  620. void  cbp_linfo_inter(int cbp, int dummy, int *len,int *info);
  621. #if TRACE
  622. void  trace2out(SyntaxElement *se);
  623. #endif
  624. Boolean dummy_slice_too_big(int bits_slice);
  625. // CABAC
  626. void arienco_start_encoding(EncodingEnvironmentPtr eep, unsigned char *code_buffer, int *code_len );
  627. int  arienco_bits_written(EncodingEnvironmentPtr eep);
  628. void arienco_done_encoding(EncodingEnvironmentPtr eep);
  629. void biari_init_context( BiContextTypePtr ctx, int ini_count_0, int ini_count_1, int max_cum_freq );
  630. void biari_copy_context( BiContextTypePtr ctx_orig, BiContextTypePtr ctx_dest );
  631. void biari_print_context( BiContextTypePtr ctx );
  632. void rescale_cum_freq(BiContextTypePtr bi_ct);
  633. void biari_encode_symbol(EncodingEnvironmentPtr eep, signed short symbol, BiContextTypePtr bi_ct );
  634. MotionInfoContexts* create_contexts_MotionInfo(void);
  635. TextureInfoContexts* create_contexts_TextureInfo(void);
  636. void init_contexts_MotionInfo(MotionInfoContexts *enco_ctx, int ini_flag);
  637. void init_contexts_TextureInfo(TextureInfoContexts *enco_ctx, int ini_flag);
  638. void delete_contexts_MotionInfo(MotionInfoContexts *enco_ctx);
  639. void delete_contexts_TextureInfo(TextureInfoContexts *enco_ctx);
  640. void writeHeaderToBuffer();
  641. void writeEOSToBuffer();
  642. int  writeSyntaxElement_CABAC(SyntaxElement *se, DataPartition *this_dataPart);
  643. void writeMB_typeInfo2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  644. void writeIntraPredMode2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  645. void writeRefFrame2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  646. void writeMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  647. void writeCBP2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  648. void writeDquant_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  649. void writeRunLevel2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  650. void writeBiDirBlkSize2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  651. void writeBiMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp);
  652. void error(char *text, int code);
  653. int  start_sequence();
  654. int  terminate_sequence();
  655. int  start_slice(SyntaxElement *sym);
  656. int  terminate_slice();
  657. void DP_SliceHeader(FILE *out, int bytes_written, int part_nr);
  658. void DP_PartHeader(FILE *out, int bytes_written, int part_nr);
  659. // B pictures
  660. void copy2mref();
  661. int  motion_search_Bframe(int tot_intra_sad);
  662. int  get_fwMV(int *min_fw_sad, int tot_intra_sad);
  663. void get_bwMV(int *min_bw_sad);
  664. void get_bid(int *bid_sad, int fw_predframe_no);
  665. void get_dir(int *dir_sad);
  666. void compare_sad(int tot_intra_sad, int fw_sad, int bw_sad, int bid_sad, int dir_sad);
  667. void LumaResidualCoding_B();
  668. void ChromaCoding_B(int *cr_cbp);
  669. void SetRefFrameInfo_B();
  670. int  writeMotionInfo2NAL_Bframe();
  671. int  BlkSize2CodeNumber(int blc_size_h, int blc_size_v);
  672. // Introduced for 1/8-pel
  673. void interpolate_frame();
  674. void interpolate_frame_2();
  675. void oneeighthpix(int prior_B_frame);
  676. void InitRefbuf ();
  677. void InitMotionVectorSearchModule();
  678. #endif
  679. int   writeMB_bits_for_4x4_luma   (int, int, int);
  680. int   writeMB_bits_for_16x16_luma ();
  681. int   writeMB_bits_for_luma       (int);
  682. int   writeMB_bits_for_DC_chroma  (int);
  683. int   writeMB_bits_for_AC_chroma  (int);
  684. int   writeMB_bits_for_CBP        ();
  685. int   writeMB_bits_for_Dquant     ();
  686. int   SingleUnifiedMotionSearch   (int, int, int**, int***, int*****, int, int*****, double);
  687. //============= rate-distortion optimization ===================
  688. void  clear_rdopt      ();
  689. void  init_rdopt       ();
  690. void  RD_Mode_Decision ();
  691. //============= rate-distortion opt with packet losses ===========
  692. void decode_one_macroblock();
  693. void Get_Reference_Block(byte **imY, int block_y, int block_x, int mvhor, int mvver, byte **out);
  694. byte Get_Reference_Pixel(byte **imY, int y, int x);
  695. int Half_Upsample(byte **imY, int j, int i);
  696. void DecOneForthPix(byte **dY, byte ***dref);
  697. void compute_residue(int mode);
  698. void UpdateDecoders();
  699. void Build_Status_Map(byte **s_map);
  700. void Error_Concealment(byte **inY, byte **s_map, byte ***refY);
  701. void Conceal_Error(byte **inY, int mb_y, int mb_x, byte ***refY);
  702. //============= fast full integer search =======================
  703. #ifdef _FAST_FULL_ME_
  704. void  InitializeFastFullIntegerSearch (int);
  705. void  ClearFastFullIntegerSearch    ();
  706. void  ResetFastFullIntegerSearch    ();
  707. #endif