Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 /**
     22 *******************************************************************************
     23 * @file
     24 *  ih264e_structs.h
     25 *
     26 * @brief
     27 *  Structure definitions used in the encoder
     28 *
     29 * @author
     30 *  Harish
     31 *
     32 * @remarks
     33 *  None
     34 *
     35 *******************************************************************************
     36 */
     37 
     38 #ifndef IH264E_STRUCTS_H_
     39 #define IH264E_STRUCTS_H_
     40 
     41 /*****************************************************************************/
     42 /* Structure definitions                                                    */
     43 /*****************************************************************************/
     44 
     45 /* Early declaration of structs */
     46 typedef struct _codec_t codec_t;
     47 typedef struct _proc_t process_ctxt_t;
     48 
     49 
     50 /*****************************************************************************/
     51 /* Extern Function type definitions                                          */
     52 /*****************************************************************************/
     53 
     54 /**
     55 ******************************************************************************
     56  *  @brief      intra prediction filters leaf level
     57 ******************************************************************************
     58  */
     59 typedef void (*pf_intra_pred)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
     60                               WORD32 src_strd, WORD32 dst_strd,
     61                               WORD32 ui_neighboravailability);
     62 
     63 /**
     64 ******************************************************************************
     65  *  @brief      inter prediction filters leaf level
     66 ******************************************************************************
     67  */
     68 
     69 typedef void (*pf_inter_pred_luma_bilinear)(UWORD8 *pu1_src1, UWORD8 *pu1_src2, UWORD8 *pu1_dst,
     70                                             WORD32 src_strd1, WORD32 src_strd2, WORD32 dst_strd,
     71                                             WORD32 height, WORD32 width);
     72 
     73 /**
     74 ******************************************************************************
     75  *  @brief      fwd transform leaf level
     76 ******************************************************************************
     77  */
     78 typedef void (*pf_trans_quant)(UWORD8*pu1_src, UWORD8 *pu1_pred, WORD16 *pi2_out,
     79                                WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_dst_stride,
     80                                const UWORD16 *pu2_scale_mat, const UWORD16 *pu2_thresh_mat,
     81                                UWORD32 u4_qbit, UWORD32 u4_round_fact, UWORD8 *pu1_nnz);
     82 
     83 typedef void (*pf_iquant_itrans)(WORD16 *pi2_src, UWORD8 *pu1_pred, UWORD8 *pu1_out,
     84                                  WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_out_stride,
     85                                  const UWORD16 *pu2_iscale_mat, const UWORD16 *pu2_weigh_mat,
     86                                  UWORD32 qp_div, WORD32 *pi4_tmp);
     87 
     88 /**
     89 ******************************************************************************
     90  *  @brief      Padding leaf level
     91 ******************************************************************************
     92  */
     93 typedef void (*pf_pad)(UWORD8 *pu1_src, WORD32 src_strd, WORD32 wd, WORD32 pad_size);
     94 
     95 /**
     96 ******************************************************************************
     97  *  @brief      memory handling leaf level
     98 ******************************************************************************
     99  */
    100 typedef void (*pf_memcpy)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
    101 
    102 typedef void (*pf_memset)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
    103 
    104 typedef void (*pf_memcpy_mul8)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
    105 
    106 typedef void (*pf_memset_mul8)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
    107 
    108 /**
    109 ******************************************************************************
    110  *  @brief      Sad computation
    111 ******************************************************************************
    112  */
    113 typedef void (*pf_compute_sad)(UWORD8 *pu1_src, UWORD8 *pu1_est,
    114                                UWORD32 src_strd, UWORD32 est_strd,
    115                                WORD32 i4_max_sad, WORD32 *pi4_mb_distortion);
    116 
    117 /**
    118 ******************************************************************************
    119  *  @brief     Intra mode eval:encoder level
    120 ******************************************************************************
    121  */
    122 typedef void (*pf_evaluate_intra_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels_i16, UWORD8 *pu1_dst,
    123                                         UWORD32 src_strd, UWORD32 dst_strd,
    124                                         WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
    125                                         WORD32 *pu4_sadmin,
    126                                         UWORD32 u4_valid_intra_modes);
    127 
    128 typedef void (*pf_evaluate_intra_4x4_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels, UWORD8 *pu1_dst,
    129                                             UWORD32 src_strd, UWORD32 dst_strd,
    130                                             WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
    131                                             WORD32 *pu4_sadmin,
    132                                             UWORD32 u4_valid_intra_modes, UWORD32 u4_lambda,
    133                                             UWORD32 u4_predictd_mode);
    134 
    135 /**
    136 ******************************************************************************
    137  *  @brief     half_pel generation :encoder level
    138 ******************************************************************************
    139  */
    140 typedef void (*pf_sixtapfilter_horz)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
    141                                      WORD32 src_strd, WORD32 dst_strd);
    142 
    143 typedef void (*pf_sixtap_filter_2dvh_vert)(UWORD8 *pu1_src, UWORD8 *pu1_dst1, UWORD8 *pu1_dst2,
    144                                            WORD32 src_strd, WORD32 dst_strd,
    145                                            WORD32 *pi16_pred1,
    146                                            WORD32 pi16_pred1_strd);
    147 /**
    148 ******************************************************************************
    149  *  @brief     color space conversion
    150 ******************************************************************************
    151  */
    152 typedef void (*pf_fmt_conv_420p_to_420sp)(UWORD8 *pu1_y_src, UWORD8 *pu1_u_src, UWORD8 *pu1_v_src,
    153                                           UWORD8 *pu1_y_dst, UWORD8 *pu1_uv_dst,
    154                                           UWORD16 u2_height, UWORD16 u2_width,
    155                                           UWORD16 src_y_strd, UWORD16 src_u_strd, UWORD16 src_v_strd,
    156                                           UWORD16 dst_y_strd, UWORD16 dst_uv_strd,
    157                                           UWORD32 convert_uv_only);
    158 
    159 typedef void (*pf_fmt_conv_422ile_to_420sp)(UWORD8 *pu1_y_buf, UWORD8 *pu1_u_buf, UWORD8 *pu1_v_buf,
    160                                             UWORD8 *pu1_422i_buf,
    161                                             WORD32 u4_y_width, WORD32 u4_y_height, WORD32 u4_y_stride,
    162                                             WORD32 u4_u_stride, WORD32 u4_v_stride,
    163                                             WORD32 u4_422i_stride);
    164 
    165 
    166 
    167 /**
    168 ******************************************************************************
    169  *  @brief     ME evaluation
    170 ******************************************************************************
    171  */
    172 typedef void ih264e_compute_me_ft(process_ctxt_t *);
    173 
    174 /**
    175 ******************************************************************************
    176  *  @brief     SKIP decision
    177 ******************************************************************************
    178  */
    179 typedef WORD32 ih264e_skip_params_ft(process_ctxt_t *, WORD32);
    180 
    181 
    182 /*****************************************************************************/
    183 /* Enums                                                                     */
    184 /*****************************************************************************/
    185 
    186 /**
    187  ******************************************************************************
    188  *  @enum  CODEC_STATE_T
    189  *  @brief codec state
    190  ******************************************************************************
    191  */
    192 typedef enum
    193 {
    194     INIT_DONE,
    195     HEADER_DONE,
    196     FIRST_FRAME_DONE,
    197 } CODEC_STATE_T;
    198 
    199 
    200 /**
    201  ******************************************************************************
    202  *  @enum  JOBQ_CMD_T
    203  *  @brief list of job commands (used during job instantiation)
    204  ******************************************************************************
    205  */
    206 typedef enum
    207 {
    208     CMD_PROCESS,
    209     CMD_ENTROPY,
    210     CMD_FMTCONV,
    211     CMD_ME,
    212 }JOBQ_CMD_T;
    213 
    214 
    215 /*****************************************************************************/
    216 /* Structures                                                                */
    217 /*****************************************************************************/
    218 
    219 /**
    220  * PU information
    221  */
    222 typedef struct
    223 {
    224     /**
    225      *  Motion Vector
    226      */
    227     mv_t s_mv;
    228 
    229     /**
    230      *  Ref index
    231      */
    232     WORD8   i1_ref_idx;
    233 
    234 } enc_pu_mv_t;
    235 
    236 
    237 /*
    238  * Total Pu info for an MB
    239  */
    240 typedef struct
    241 {
    242 
    243     /* Array with ME info for all lists */
    244     enc_pu_mv_t  s_me_info[2];
    245 
    246     /**
    247      *  PU X position in terms of min PU (4x4) units
    248      */
    249     UWORD32     b4_pos_x        : 4;
    250 
    251     /**
    252      *  PU Y position in terms of min PU (4x4) units
    253      */
    254     UWORD32     b4_pos_y        : 4;
    255 
    256     /**
    257      *  PU width in pixels = (b4_wd + 1) << 2
    258      */
    259     UWORD32     b4_wd           : 2;
    260 
    261     /**
    262      *  PU height in pixels = (b4_ht + 1) << 2
    263      */
    264     UWORD32     b4_ht           : 2;
    265 
    266     /**
    267      *  Intra or Inter flag for each partition - 0 or 1
    268      */
    269     UWORD32     b1_intra_flag   : 1;
    270 
    271     /**
    272      *  PRED_L0, PRED_L1, PRED_BI
    273      */
    274     UWORD32     b2_pred_mode    : 2;
    275 
    276 
    277 } enc_pu_t;
    278 
    279 
    280 typedef struct
    281 {
    282     /** Descriptor of raw buffer                                     */
    283     iv_raw_buf_t                            s_raw_buf;
    284 
    285     /** Lower 32bits of time stamp corresponding to the above buffer */
    286     UWORD32                                 u4_timestamp_low;
    287 
    288     /** Upper 32bits of time stamp corresponding to the above buffer */
    289     UWORD32                                 u4_timestamp_high;
    290 
    291     /** Flag to indicate if the current buffer is last buffer */
    292     UWORD32                                 u4_is_last;
    293 
    294     /** Flag to indicate if mb info is sent along with input buffer     */
    295     UWORD32                                 u4_mb_info_type;
    296 
    297     /** Flag to indicate the size of mb info structure                  */
    298     UWORD32                                 u4_mb_info_size;
    299 
    300     /** Buffer containing mb info if mb_info_type is non-zero           */
    301     void                                    *pv_mb_info;
    302 
    303     /** Flag to indicate if pic info is sent along with input buffer     */
    304     UWORD32                                 u4_pic_info_type;
    305 
    306     /** Buffer containing pic info if mb_info_type is non-zero           */
    307     void                                    *pv_pic_info;
    308 
    309 }inp_buf_t;
    310 
    311 typedef struct
    312 {
    313     /** Descriptor of bitstream buffer                                     */
    314     iv_bits_buf_t                           s_bits_buf;
    315 
    316     /** Lower 32bits of time stamp corresponding to the above buffer */
    317     UWORD32                                 u4_timestamp_low;
    318 
    319     /** Upper 32bits of time stamp corresponding to the above buffer */
    320     UWORD32                                 u4_timestamp_high;
    321 
    322     /** Flag to indicate if the current buffer is last buffer */
    323     UWORD32                                 u4_is_last;
    324 
    325 }out_buf_t;
    326 
    327 typedef struct
    328 {
    329     /** Descriptor of picture buffer                                     */
    330     pic_buf_t                               s_pic_buf;
    331 
    332     /** Lower 32bits of time stamp corresponding to the above buffer */
    333     UWORD32                                 u4_timestamp_low;
    334 
    335     /** Upper 32bits of time stamp corresponding to the above buffer */
    336     UWORD32                                 u4_timestamp_high;
    337 
    338     /** Flag to indicate if the current buffer is last buffer */
    339     UWORD32                                 u4_is_last;
    340 
    341     /** Picture count corresponding to current picture */
    342     WORD32                                  i4_pic_cnt;
    343 
    344 }rec_buf_t;
    345 
    346 typedef struct
    347 {
    348     /** maximum width for which codec should request memory requirements    */
    349     UWORD32                                     u4_max_wd;
    350 
    351     /** maximum height for which codec should request memory requirements   */
    352     UWORD32                                     u4_max_ht;
    353 
    354     /** Maximum number of reference frames                                  */
    355     UWORD32                                     u4_max_ref_cnt;
    356 
    357     /** Maximum number of reorder frames                                    */
    358     UWORD32                                     u4_max_reorder_cnt;
    359 
    360     /** Maximum level supported                                             */
    361     UWORD32                                     u4_max_level;
    362 
    363     /** Input color format                                                  */
    364     IV_COLOR_FORMAT_T                           e_inp_color_fmt;
    365 
    366     /** Flag to enable/disable - To be used only for debugging/testing      */
    367     UWORD32                                     u4_enable_recon;
    368 
    369     /** Recon color format                                                  */
    370     IV_COLOR_FORMAT_T                           e_recon_color_fmt;
    371 
    372     /** Encoder Speed preset - Value between 0 (slowest) and 100 (fastest)  */
    373     IVE_SPEED_CONFIG                            u4_enc_speed_preset;
    374 
    375     /** Rate control mode                                                   */
    376     IVE_RC_MODE_T                               e_rc_mode;
    377 
    378     /** Maximum frame rate to be supported                                  */
    379     UWORD32                                     u4_max_framerate;
    380 
    381     /** Maximum bitrate to be supported                                     */
    382     UWORD32                                     u4_max_bitrate;
    383 
    384     /** Maximum number of consecutive  B frames                             */
    385     UWORD32                                     u4_num_bframes;
    386 
    387     /** Content type Interlaced/Progressive                                 */
    388     IV_CONTENT_TYPE_T                           e_content_type;
    389 
    390     /** Maximum search range to be used in X direction                      */
    391     UWORD32                                     u4_max_srch_rng_x;
    392 
    393     /** Maximum search range to be used in Y direction                      */
    394     UWORD32                                     u4_max_srch_rng_y;
    395 
    396     /** Slice Mode                                                          */
    397     IVE_SLICE_MODE_T                            e_slice_mode;
    398 
    399     /** Slice parameter                                                     */
    400     UWORD32                                     u4_slice_param;
    401 
    402     /** Processor architecture                                          */
    403     IV_ARCH_T                                   e_arch;
    404 
    405     /** SOC details                                                     */
    406     IV_SOC_T                                    e_soc;
    407 
    408     /** Input width to be sent in bitstream                                */
    409     UWORD32                                     u4_disp_wd;
    410 
    411     /** Input height to be sent in bitstream                               */
    412     UWORD32                                     u4_disp_ht;
    413 
    414     /** Input width                                                     */
    415     UWORD32                                     u4_wd;
    416 
    417     /** Input height                                                    */
    418     UWORD32                                     u4_ht;
    419 
    420     /** Input stride                                                    */
    421     UWORD32                                     u4_strd;
    422 
    423     /** Source frame rate                                               */
    424     UWORD32                                     u4_src_frame_rate;
    425 
    426     /** Target frame rate                                               */
    427     UWORD32                                     u4_tgt_frame_rate;
    428 
    429     /** Target bitrate in kilobits per second                           */
    430     UWORD32                                     u4_target_bitrate;
    431 
    432     /** Force current frame type                                        */
    433     IV_PICTURE_CODING_TYPE_T                    e_frame_type;
    434 
    435     /** Encoder mode                                                    */
    436     IVE_ENC_MODE_T                              e_enc_mode;
    437 
    438     /** Set initial Qp for I pictures                                   */
    439     UWORD32                                     u4_i_qp;
    440 
    441     /** Set initial Qp for P pictures                                   */
    442     UWORD32                                     u4_p_qp;
    443 
    444     /** Set initial Qp for B pictures                                   */
    445     UWORD32                                     u4_b_qp;
    446 
    447     /** Set minimum Qp for I pictures                                   */
    448     UWORD32                                     u4_i_qp_min;
    449 
    450     /** Set maximum Qp for I pictures                                   */
    451     UWORD32                                     u4_i_qp_max;
    452 
    453     /** Set minimum Qp for P pictures                                   */
    454     UWORD32                                     u4_p_qp_min;
    455 
    456     /** Set maximum Qp for P pictures                                   */
    457     UWORD32                                     u4_p_qp_max;
    458 
    459     /** Set minimum Qp for B pictures                                   */
    460     UWORD32                                     u4_b_qp_min;
    461 
    462     /** Set maximum Qp for B pictures                                   */
    463     UWORD32                                     u4_b_qp_max;
    464 
    465     /** Adaptive intra refresh mode                                     */
    466     IVE_AIR_MODE_T                              e_air_mode;
    467 
    468     /** Adaptive intra refresh period in frames                         */
    469     UWORD32                                     u4_air_refresh_period;
    470 
    471     /** VBV buffer delay                                                */
    472     UWORD32                                     u4_vbv_buffer_delay;
    473 
    474     /** VBV buffer size                                                 */
    475     UWORD32                                     u4_vbv_buf_size;
    476 
    477     /** Number of cores to be used                                      */
    478     UWORD32                                     u4_num_cores;
    479 
    480     /** ME speed preset - Value between 0 (slowest) and 100 (fastest)      */
    481     UWORD32                                     u4_me_speed_preset;
    482 
    483     /** Flag to enable/disable half pel motion estimation               */
    484     UWORD32                                     u4_enable_hpel;
    485 
    486     /** Flag to enable/disable quarter pel motion estimation            */
    487     UWORD32                                     u4_enable_qpel;
    488 
    489     /** Flag to enable/disable intra 4x4 analysis                       */
    490     UWORD32                                     u4_enable_intra_4x4;
    491 
    492     /** Flag to enable/disable intra 8x8 analysis                       */
    493     UWORD32                                     u4_enable_intra_8x8;
    494 
    495     /** Flag to enable/disable intra 16x16 analysis                     */
    496     UWORD32                                     u4_enable_intra_16x16;
    497 
    498     /** Flag to enable/disable fast SAD approximation                   */
    499     UWORD32                                     u4_enable_fast_sad;
    500 
    501     /*flag to enable/disable alternate reference frames                 */
    502     UWORD32                                     u4_enable_alt_ref;
    503 
    504     /*Flag to enable/disable computation of SATDQ in ME*/
    505     UWORD32                                     u4_enable_satqd;
    506 
    507     /*Minimum SAD to search for*/
    508     WORD32                                     i4_min_sad;
    509 
    510     /** Maximum search range in X direction for farthest reference      */
    511     UWORD32                                     u4_srch_rng_x;
    512 
    513     /** Maximum search range in Y direction for farthest reference      */
    514     UWORD32                                     u4_srch_rng_y;
    515 
    516     /** I frame interval                                                */
    517     UWORD32                                     u4_i_frm_interval;
    518 
    519     /** IDR frame interval                                              */
    520     UWORD32                                     u4_idr_frm_interval;
    521 
    522     /** Disable deblock level (0: Enable completely, 3: Disable completely */
    523     UWORD32                                     u4_disable_deblock_level;
    524 
    525     /** Profile                                                         */
    526     IV_PROFILE_T                                e_profile;
    527 
    528     /** Lower 32bits of time stamp corresponding to input buffer,
    529      * from which this command takes effect                             */
    530     UWORD32                                     u4_timestamp_low;
    531 
    532     /** Upper 32bits of time stamp corresponding to input buffer,
    533      * from which this command takes effect                             */
    534     UWORD32                                     u4_timestamp_high;
    535 
    536     /** Flag to say if the current config parameter set is valid
    537      * Will be zero to start with and will be set to 1, when configured
    538      * Once encoder uses the parameter set, this will be set to zero */
    539     UWORD32                                     u4_is_valid;
    540 
    541     /** Command associated with this config param set */
    542     IVE_CONTROL_API_COMMAND_TYPE_T              e_cmd;
    543 
    544     /** Input width in mbs                                                    */
    545     UWORD32                                     i4_wd_mbs;
    546 
    547     /** Input height in mbs                                                   */
    548     UWORD32                                     i4_ht_mbs;
    549 
    550     /** entropy coding mode flag                                              */
    551     UWORD32                                     u4_entropy_coding_mode;
    552 
    553     /** enable weighted prediction                                            */
    554     UWORD32                                     u4_weighted_prediction;
    555 
    556     /** enable constrained intra prediction                                   */
    557     UWORD32                                     u4_constrained_intra_pred;
    558 
    559     /** Pic info type */
    560     UWORD32                                     u4_pic_info_type;
    561     /**
    562      * MB info type
    563      */
    564     UWORD32                                     u4_mb_info_type;
    565 
    566     /** VUI structure                                                         */
    567     vui_t                                       s_vui;
    568 
    569 }cfg_params_t;
    570 
    571 
    572 
    573 /** Structure to hold format conversion context */
    574 typedef struct
    575 {
    576     /** Current row for which format conversion should be done */
    577     WORD32 i4_cur_row;
    578 
    579     /** Number of rows for which format conversion should be done */
    580     WORD32 i4_num_rows;
    581 
    582 }fmt_conv_t;
    583 
    584 
    585 /**
    586  * Structure to represent a processing job entry
    587  */
    588 typedef struct
    589 {
    590     /**
    591      * Command
    592      */
    593     WORD32 i4_cmd;
    594 
    595     /**
    596      * MB x of the starting MB
    597      */
    598     WORD16 i2_mb_x;
    599 
    600     /**
    601      * MB y of the starting MB
    602      */
    603 
    604     WORD16 i2_mb_y;
    605 
    606     /**
    607      * Number of MBs that need to be processed in this job
    608      */
    609     WORD16 i2_mb_cnt;
    610 
    611     /**
    612      * Process contexts base index
    613      * Will toggle between 0 and MAX_PROCESS_THREADS
    614      */
    615     WORD16 i2_proc_base_idx;
    616 
    617 } job_t;
    618 
    619 
    620 /**
    621  * Structure to represent a MV Bank buffer
    622  */
    623 typedef struct
    624 {
    625     /**
    626      *  Pointer to hold num PUs each MB in a picture
    627      */
    628     UWORD32 *pu4_mb_pu_cnt;
    629 
    630     /**
    631      * Pointer to hold enc_pu_t for each PU in a picture
    632      */
    633     enc_pu_t *ps_pic_pu;
    634 
    635     /**
    636      * Pointer to hold PU map for each MB in a picture
    637      */
    638     UWORD8 *pu1_pic_pu_map;
    639 
    640     /**
    641      * Pointer to hold the Slice map
    642      */
    643     UWORD16 *pu1_pic_slice_map;
    644 
    645     /**
    646      * Absolute POC for the current MV Bank
    647      */
    648     WORD32 i4_abs_poc;
    649 
    650     /**
    651      * Buffer Id
    652      */
    653     WORD32     i4_buf_id;
    654 
    655 } mv_buf_t;
    656 
    657 
    658 /**
    659  * Reference set containing pointers to MV buf and pic buf
    660  */
    661 typedef struct
    662 {
    663     /** Picture count */
    664     WORD32    i4_pic_cnt;
    665 
    666     /** POC */
    667     WORD32    i4_poc;
    668 
    669     /** picture buffer */
    670     pic_buf_t *ps_pic_buf;
    671 
    672     /** mv buffer */
    673     mv_buf_t  *ps_mv_buf;
    674 
    675 }ref_set_t;
    676 
    677 typedef struct
    678 {
    679 
    680     /**
    681      * Pointer to current PPS
    682      */
    683     pps_t *ps_pps;
    684 
    685     /**
    686      * Pointer to current SPS
    687      */
    688     sps_t *ps_sps;
    689 
    690     /**
    691      * Pointer to current slice header structure
    692      */
    693     slice_header_t *ps_slice_hdr;
    694 
    695     /**
    696      * MB's x position within a picture in raster scan in MB units
    697      */
    698     WORD32 i4_mb_x;
    699 
    700     /**
    701      * MB's y position within a picture in raster scan in MB units
    702      */
    703 
    704     WORD32 i4_mb_y;
    705 
    706     /**
    707      * Current PU structure - set to MB enc_pu_t pointer at the start of MB processing and incremented
    708      * for every TU
    709      */
    710     enc_pu_t *ps_pu;
    711 
    712     /**
    713      * Pointer to frame level enc_pu_t for the current frame being parsed
    714      * where MVs and Intra pred modes will be updated
    715      */
    716     enc_pu_t *ps_pic_pu;
    717 
    718     /**
    719      *  Pointer to hold num PUs each MB in a picture
    720      */
    721     UWORD32 *pu4_mb_pu_cnt;
    722 
    723     /** PU Index map per MB. The indices in this map are w.r.t picture pu array and not
    724      * w.r.t MB pu array.
    725      * This will be used during mv prediction and since neighbors will have different MB pu map
    726      * it will be easier if they all have indices w.r.t picture level PU array rather than MB level
    727      * PU array.
    728      * pu1_pic_pu_map is map w.r.t MB's enc_pu_t array
    729      */
    730     UWORD32 *pu4_pic_pu_idx_map;
    731 
    732     /**
    733       * Pointer to pu_map for the current frame being parsed
    734       * where MVs and Intra pred modes will be updated
    735       */
    736      UWORD8 *pu1_pic_pu_map;
    737 
    738      /**
    739       *  PU count in current MB
    740       */
    741      WORD32 i4_mb_pu_cnt;
    742 
    743      /**
    744       *  PU count in current MB
    745       */
    746      WORD32 i4_mb_start_pu_idx;
    747 
    748      /**
    749       *  Top availability for current MB level
    750       */
    751      UWORD8 u1_top_mb_avail;
    752 
    753      /**
    754       *  Top right availability for current MB level
    755       */
    756      UWORD8 u1_top_rt_mb_avail;
    757      /**
    758       *  Top left availability for current MB level
    759       */
    760      UWORD8 u1_top_lt_mb_avail;
    761      /**
    762       *  left availability for current MB level
    763       */
    764      UWORD8 u1_left_mb_avail;
    765 
    766 }mv_ctxt_t;
    767 
    768 typedef struct
    769 {
    770     /**
    771      * MB's x position within a picture in raster scan in MB units
    772      */
    773     WORD32 i4_mb_x;
    774 
    775     /**
    776      * MB's y position within a picture in raster scan in MB units
    777      */
    778     WORD32 i4_mb_y;
    779 
    780     /**
    781      * MB's x position within a Slice in raster scan in MB units
    782      */
    783     WORD32 i4_mb_slice_x;
    784 
    785     /**
    786      * MB's y position within a Slice in raster scan in MB units
    787      */
    788     WORD32 i4_mb_slice_y;
    789 
    790     /**
    791      * Vertical strength, Two bits per edge.
    792      * Stored in format. BS[15] | BS[14] | .. |BS[0]
    793      */
    794     UWORD32 *pu4_pic_vert_bs;
    795 
    796     /**
    797      * Boundary strength, Two bits per edge.
    798      * Stored in format. BS[15] | BS[14] | .. |BS[0]
    799      */
    800     UWORD32 *pu4_pic_horz_bs;
    801 
    802     /**
    803      *  Qp array stored for each mb
    804      */
    805     UWORD8  *pu1_pic_qp;
    806 
    807 }bs_ctxt_t;
    808 
    809 typedef struct
    810 {
    811     /**
    812      * MB's x position within a picture in raster scan in MB units
    813      */
    814     WORD32 i4_mb_x;
    815 
    816     /**
    817      * MB's y position within a picture in raster scan in MB units
    818      */
    819     WORD32 i4_mb_y;
    820 
    821     /**
    822      * structure that contains BS and QP frame level arrays
    823      */
    824     bs_ctxt_t s_bs_ctxt;
    825 
    826     /**
    827      * Pointer to 0th luma pixel in current pic
    828      */
    829     UWORD8 *pu1_cur_pic_luma;
    830 
    831     /**
    832      * Pointer to 0th chroma pixel in current pic
    833      */
    834     UWORD8 *pu1_cur_pic_chroma;
    835 
    836     /**
    837      *  Points to the array of slice indices which is used to identify the slice
    838      *  to which each MB in a frame belongs.
    839      */
    840     UWORD8 *pu1_slice_idx;
    841 
    842 }deblk_ctxt_t;
    843 
    844 
    845 /**
    846  ******************************************************************************
    847  *  @brief      Structure to hold data and flags for 'n' mb processing for
    848  *                deblocking , padding and half pel generation.
    849  ******************************************************************************
    850  */
    851 typedef struct
    852 {
    853     /**
    854      * MB's x position last processed + 1
    855      */
    856     WORD32 i4_mb_x;
    857 
    858     /**
    859      * MB's y position ,current processing.
    860      */
    861     WORD32 i4_mb_y;
    862 
    863     /**
    864      * Number of MBs processed in a stretch
    865      */
    866     WORD32 i4_n_mbs;
    867 
    868 }n_mb_process_ctxt_t;
    869 
    870 
    871 /**
    872 ******************************************************************************
    873  *  @brief      Structure to hold coefficient info for a 4x4 subblock.
    874  *  The following can be used to type-cast coefficient data that is stored
    875  *  per subblock. Note that though i2_level is shown as an array that
    876  *  holds 16 coefficients, only the first few entries will be valid. Next
    877  *  subblocks data starts after the valid number of coefficients. Number
    878  *  of non-zero coefficients will be derived using number of non-zero bits
    879  *  in sig coeff map
    880 ******************************************************************************
    881  */
    882 typedef struct
    883 {
    884     /**
    885      * significant coefficient map and nnz are packed in
    886      * to msb (2 bytes) and lsb (2 bytes) respectively
    887      */
    888     WORD32  i4_sig_map_nnz;
    889 
    890     /**
    891      * array of non zero residue coefficients
    892      */
    893     WORD16  ai2_residue[16];
    894 
    895 }tu_sblk_coeff_data_t;
    896 
    897 /**
    898 ******************************************************************************
    899  *  @brief      Structure contains few common state variables such as MB indices,
    900  *  current SPS, PPS etc which are to be used in the entropy thread. By keeping
    901  *  it a different structure it is being explicitly signaled that these
    902  * variables are specific to entropy threads context and other threads should
    903  * not update these elements
    904 ******************************************************************************
    905  */
    906 typedef struct
    907 {
    908     /**
    909      * Pointer to the cabac context
    910      */
    911     cabac_ctxt_t *ps_cabac;
    912 
    913     /**
    914      * start of frame / start of slice flag
    915      */
    916     WORD32 i4_sof;
    917 
    918     /**
    919      * end of frame / end of slice flag
    920      */
    921     WORD32 i4_eof;
    922 
    923     /**
    924      * generate header upon request
    925      */
    926     WORD32 i4_gen_header;
    927 
    928     /**
    929      *  seq_parameter_set_id
    930      */
    931     UWORD32 u4_sps_id;
    932 
    933     /**
    934      * Pointer to base of sequence parameter set structure array
    935      */
    936     sps_t *ps_sps_base;
    937 
    938     /**
    939      *  pic_parameter_set_id
    940      */
    941     UWORD32 u4_pps_id;
    942 
    943     /**
    944      * Pointer to base of Picture parameter set structure array
    945      */
    946     pps_t *ps_pps_base;
    947 
    948     /**
    949      * Current slice idx
    950      */
    951     WORD32 i4_cur_slice_idx;
    952 
    953     /**
    954      * Points to the array of slice indices which is used to identify the independent slice
    955      * to which each MB in a frame belongs.
    956      */
    957     UWORD8 *pu1_slice_idx;
    958 
    959     /**
    960      * Pointer to base of slice header structure array
    961      */
    962     slice_header_t *ps_slice_hdr_base;
    963 
    964     /**
    965      * entropy status
    966      */
    967     UWORD8  *pu1_entropy_map;
    968 
    969     /**
    970      * MB's x position within a picture in raster scan in MB units
    971      */
    972     WORD32 i4_mb_x;
    973 
    974     /**
    975      * MB's y position within a picture in raster scan in MB units
    976      */
    977     WORD32 i4_mb_y;
    978 
    979     /**
    980      * MB start address
    981      */
    982     WORD32 i4_mb_cnt;
    983 
    984     /**
    985      * MB start address
    986      */
    987     WORD32 i4_mb_start_add;
    988 
    989     /**
    990      * MB end address
    991      */
    992     WORD32 i4_mb_end_add;
    993 
    994     /**
    995      * Input width in mbs
    996      */
    997     WORD32 i4_wd_mbs;
    998 
    999     /**
   1000      * Input height in mbs
   1001      */
   1002     WORD32 i4_ht_mbs;
   1003 
   1004     /**
   1005      * Bitstream structure
   1006      */
   1007     bitstrm_t *ps_bitstrm;
   1008 
   1009     /**
   1010      *  transform_8x8_mode_flag
   1011      */
   1012     WORD8 i1_transform_8x8_mode_flag;
   1013 
   1014     /**
   1015      *  entropy_coding_mode_flag
   1016      */
   1017     WORD8 u1_entropy_coding_mode_flag;
   1018 
   1019     /**
   1020      * Pointer to the top row nnz for luma
   1021      */
   1022     UWORD8 (*pu1_top_nnz_luma)[4];
   1023 
   1024     /**
   1025      * left nnz for luma
   1026      */
   1027     UWORD32 u4_left_nnz_luma;
   1028 
   1029     /**
   1030      * Pointer to zero runs before for the mb
   1031      */
   1032     UWORD8  au1_zero_run[16];
   1033 
   1034     /**
   1035      * Pointer to the top row nnz for chroma
   1036      */
   1037     UWORD8 (*pu1_top_nnz_cbcr)[4];
   1038 
   1039     /**
   1040      * left nnz for chroma
   1041      */
   1042     UWORD8 u4_left_nnz_cbcr;
   1043 
   1044     /**
   1045      * Pointer frame level mb subblock coeff data
   1046      */
   1047     void *pv_pic_mb_coeff_data;
   1048 
   1049     /**
   1050      * Pointer to mb subblock coeff data and number of subblocks and scan idx
   1051      * Incremented each time a coded subblock is processed
   1052      */
   1053     void *pv_mb_coeff_data;
   1054 
   1055     /**
   1056      * Pointer frame level mb header data
   1057      */
   1058     void *pv_pic_mb_header_data;
   1059 
   1060     /**
   1061      * Pointer to mb header data and
   1062      * incremented each time a coded mb is encoded
   1063      */
   1064     void *pv_mb_header_data;
   1065 
   1066     /**
   1067      * Error code during parse stage
   1068      */
   1069     IH264E_ERROR_T i4_error_code;
   1070 
   1071     /**
   1072      * Void pointer to job context
   1073      */
   1074     void *pv_proc_jobq, *pv_entropy_jobq;
   1075 
   1076     /**
   1077      * Flag to signal end of frame
   1078      */
   1079     WORD32 i4_end_of_frame;
   1080 
   1081     /**
   1082      * Abs POC count of the frame
   1083      */
   1084      WORD32 i4_abs_pic_order_cnt;
   1085 
   1086      /**
   1087       * mb skip run
   1088       */
   1089      WORD32 *pi4_mb_skip_run;
   1090 
   1091      /**
   1092       * Flag to signal end of sequence
   1093       */
   1094      UWORD32 u4_is_last;
   1095 
   1096      /**
   1097       * Lower 32bits of time-stamp corresponding to the buffer being encoded
   1098       */
   1099      UWORD32 u4_timestamp_low;
   1100 
   1101      /**
   1102       * Upper 32bits of time-stamp corresponding to the buffer being encoded
   1103       */
   1104      UWORD32 u4_timestamp_high;
   1105 
   1106      /**
   1107       * Current Picture count - used for synchronization
   1108       */
   1109      WORD32  i4_pic_cnt;
   1110 
   1111      /**
   1112       * Number of bits consumed by header for I and P mb types
   1113       */
   1114      UWORD32 u4_header_bits[MAX_MB_TYPE];
   1115 
   1116      /**
   1117       * Number of bits consumed by residue for I and P mb types
   1118       */
   1119      UWORD32 u4_residue_bits[MAX_MB_TYPE];
   1120 
   1121 } entropy_ctxt_t;
   1122 
   1123 /**
   1124 ******************************************************************************
   1125 *  @brief      macro block info.
   1126 ******************************************************************************
   1127 */
   1128 typedef struct
   1129 {
   1130     /**
   1131      * mb type
   1132      */
   1133     UWORD16 u2_is_intra;
   1134 
   1135     /**
   1136      * mb type
   1137      */
   1138     UWORD16 u2_mb_type;
   1139 
   1140     /**
   1141      * csbp
   1142      */
   1143     UWORD32 u4_csbp;
   1144 
   1145     /**
   1146      * mb distortion
   1147      */
   1148     WORD32 i4_mb_distortion;
   1149 
   1150 }mb_info_t;
   1151 
   1152 /**
   1153 ******************************************************************************
   1154 *  @brief      structure presenting the neighbor availability of a mb
   1155 *  or subblk or any other partition
   1156 ******************************************************************************
   1157 */
   1158 typedef struct
   1159 {
   1160     /**
   1161      * left blk/subblk/partition
   1162      */
   1163     UWORD8 u1_mb_a;
   1164 
   1165     /**
   1166      * top blk/subblk/partition
   1167      */
   1168     UWORD8 u1_mb_b;
   1169 
   1170     /**
   1171      * topright blk/subblk/partition
   1172      */
   1173     UWORD8 u1_mb_c;
   1174 
   1175     /**
   1176      * topleft blk/subblk/partition
   1177      */
   1178     UWORD8 u1_mb_d;
   1179 
   1180 }block_neighbors_t;
   1181 
   1182 /**
   1183  ******************************************************************************
   1184  *  @brief      MB info  related variables used during NMB processing
   1185  ******************************************************************************
   1186  */
   1187 typedef struct
   1188 {
   1189     UWORD32 u4_mb_type;
   1190     UWORD32 u4_min_sad;
   1191     UWORD32 u4_min_sad_reached;
   1192     WORD32  i4_mb_cost;
   1193     WORD32  i4_mb_distortion;
   1194 
   1195     enc_pu_mv_t as_skip_mv[4];
   1196 
   1197     enc_pu_mv_t as_pred_mv[2];
   1198 
   1199     block_neighbors_t s_ngbr_avbl;
   1200 
   1201     /*
   1202      * Buffer to hold best subpel buffer in each MB of NMB
   1203      */
   1204     UWORD8 *pu1_best_sub_pel_buf;
   1205 
   1206     /*
   1207      * Stride for subpel buffer
   1208      */
   1209     UWORD32 u4_bst_spel_buf_strd;
   1210 
   1211 }mb_info_nmb_t;
   1212 
   1213 /**
   1214  ******************************************************************************
   1215  *  @brief      Pixel processing thread context
   1216  ******************************************************************************
   1217  */
   1218 struct _proc_t
   1219 {
   1220     /**
   1221      * entropy context
   1222      */
   1223     entropy_ctxt_t s_entropy;
   1224 
   1225     /**
   1226      * me context
   1227      */
   1228     me_ctxt_t s_me_ctxt;
   1229 
   1230     /**
   1231      * Pointer to codec context
   1232      */
   1233     codec_t *ps_codec;
   1234 
   1235     /**
   1236      * N mb process contest
   1237      */
   1238     n_mb_process_ctxt_t s_n_mb_ctxt;
   1239 
   1240     /**
   1241      * Source pointer to current MB luma
   1242      */
   1243     UWORD8 *pu1_src_buf_luma;
   1244 
   1245     /**
   1246      * Source pointer to current MB chroma
   1247      */
   1248     UWORD8 *pu1_src_buf_chroma;
   1249 
   1250     /**
   1251      * Recon pointer to current MB luma
   1252      */
   1253     UWORD8 *pu1_rec_buf_luma;
   1254 
   1255     /**
   1256      * Recon pointer to current MB chroma
   1257      */
   1258     UWORD8 *pu1_rec_buf_chroma;
   1259 
   1260     /**
   1261      * Ref pointer to current MB luma
   1262      */
   1263     UWORD8 *apu1_ref_buf_luma[MAX_REF_PIC_CNT];
   1264 
   1265     /**
   1266      * Ref pointer to current MB chroma
   1267      */
   1268     UWORD8 *apu1_ref_buf_chroma[MAX_REF_PIC_CNT];
   1269 
   1270     /**
   1271      * pointer to luma plane of input buffer (base :: mb (0,0))
   1272      */
   1273     UWORD8 *pu1_src_buf_luma_base;
   1274 
   1275     /**
   1276      * pointer to luma plane of reconstructed buffer (base :: mb (0,0))
   1277      */
   1278     UWORD8 *pu1_rec_buf_luma_base;
   1279 
   1280     /**
   1281      * pointer to luma plane of ref buffer (base :: mb (0,0))
   1282      */
   1283     UWORD8 *apu1_ref_buf_luma_base[MAX_REF_PIC_CNT];
   1284 
   1285     /**
   1286      * pointer to  chroma plane of input buffer (base :: mb (0,0))
   1287      */
   1288     UWORD8 *pu1_src_buf_chroma_base;
   1289 
   1290     /*
   1291      * Buffer for color space conversion of luma
   1292      */
   1293     UWORD8 *pu1_y_csc_buf;
   1294 
   1295     /*
   1296      * Buffer for color space conversion of luma
   1297      */
   1298 
   1299     UWORD8 *pu1_uv_csc_buf;
   1300 
   1301     /**
   1302      * pointer to  chroma plane of reconstructed buffer (base :: mb (0,0))
   1303      */
   1304     UWORD8 *pu1_rec_buf_chroma_base;
   1305 
   1306     /**
   1307      * pointer to  chroma plane of reconstructed buffer (base :: mb (0,0))
   1308      */
   1309     UWORD8 *apu1_ref_buf_chroma_base[MAX_REF_PIC_CNT];
   1310 
   1311     /**
   1312      * Pointer to ME NMB info
   1313      */
   1314     mb_info_nmb_t *ps_nmb_info;
   1315 
   1316     mb_info_nmb_t *ps_cur_mb;
   1317 
   1318     /**
   1319      * source luma stride
   1320      */
   1321     WORD32 i4_src_strd;
   1322 
   1323     /**
   1324      * source chroma stride
   1325      */
   1326     WORD32 i4_src_chroma_strd;
   1327 
   1328     /**
   1329      * recon stride & ref stride
   1330      * (strides for luma and chroma are the same)
   1331      */
   1332     WORD32 i4_rec_strd;
   1333 
   1334     /**
   1335      * Offset for half pel x plane from the pic buf
   1336      */
   1337     UWORD32 u4_half_x_offset;
   1338 
   1339     /**
   1340      * Offset for half pel y plane from half x plane
   1341      */
   1342     UWORD32 u4_half_y_offset;
   1343 
   1344     /**
   1345      * Offset for half pel xy plane from half y plane
   1346      */
   1347     UWORD32 u4_half_xy_offset;
   1348 
   1349     /**
   1350      * pred buffer pointer (temp buffer 1)
   1351      */
   1352     UWORD8 *pu1_pred_mb;
   1353 
   1354     /**
   1355      * pred buffer pointer (prediction buffer for intra 16x16
   1356      */
   1357     UWORD8 *pu1_pred_mb_intra_16x16;
   1358 
   1359     /**
   1360      * pred buffer pointer (prediction buffer for intra 16x16_plane
   1361      */
   1362     UWORD8 *pu1_pred_mb_intra_16x16_plane;
   1363 
   1364     /**
   1365      * pred buffer pointer (prediction buffer for intra chroma
   1366      */
   1367     UWORD8 *pu1_pred_mb_intra_chroma;
   1368 
   1369     /**
   1370      * pred buffer pointer (prediction buffer for intra chroma plane
   1371      */
   1372     UWORD8 *pu1_pred_mb_intra_chroma_plane;
   1373 
   1374     /**
   1375      * temp. reference buffer ptr for intra 4x4 when rdopt is on
   1376      */
   1377     UWORD8 *pu1_ref_mb_intra_4x4;
   1378 
   1379     /**
   1380      * prediction buffer stride
   1381      */
   1382     WORD32 i4_pred_strd;
   1383 
   1384     /**
   1385      * transform buffer pointer (temp buffer 2)
   1386      */
   1387     WORD16 *pi2_res_buf;
   1388 
   1389     /**
   1390      * temp. transform buffer ptr for intra 4x4 when rdopt is on
   1391      */
   1392     WORD16 *pi2_res_buf_intra_4x4;
   1393 
   1394     /**
   1395      * transform buffer stride
   1396      */
   1397     WORD32 i4_res_strd;
   1398 
   1399     /**
   1400      * scratch buffer for inverse transform (temp buffer 3)
   1401      */
   1402     void *pv_scratch_buff;
   1403 
   1404     /**
   1405      * frame num
   1406      */
   1407     WORD32 i4_frame_num;
   1408 
   1409     /**
   1410      * start address of frame / sub-frame
   1411      */
   1412     WORD32 i4_frame_strt_add;
   1413 
   1414     /**
   1415      *  IDR pic
   1416      */
   1417     UWORD32 u4_is_idr;
   1418 
   1419     /**
   1420      *  idr_pic_id
   1421      */
   1422     UWORD32 u4_idr_pic_id;
   1423 
   1424     /**
   1425      * Input width in mbs
   1426      */
   1427     WORD32 i4_wd_mbs;
   1428 
   1429     /**
   1430      * Input height in mbs
   1431      */
   1432     WORD32 i4_ht_mbs;
   1433 
   1434     /**
   1435      *  slice_type
   1436      */
   1437     WORD32  i4_slice_type;
   1438 
   1439     /**
   1440      * Current slice idx
   1441      */
   1442     WORD32 i4_cur_slice_idx;
   1443 
   1444     /**
   1445      * MB's x position within a picture in raster scan in MB units
   1446      */
   1447     WORD32 i4_mb_x;
   1448 
   1449     /**
   1450      * MB's y position within a picture in raster scan in MB units
   1451      */
   1452     WORD32 i4_mb_y;
   1453 
   1454     /**
   1455      * MB's x position within a Slice in raster scan in MB units
   1456      */
   1457     WORD32 i4_mb_slice_x;
   1458 
   1459     /**
   1460      * MB's y position within a Slice in raster scan in MB units
   1461      */
   1462     WORD32 i4_mb_slice_y;
   1463 
   1464     /**
   1465      *  mb type
   1466      */
   1467     UWORD32 u4_mb_type;
   1468 
   1469     /**
   1470      *  is intra
   1471      */
   1472     UWORD32 u4_is_intra;
   1473 
   1474     /**
   1475      * mb neighbor availability pointer
   1476      */
   1477     block_neighbors_t *ps_ngbr_avbl;
   1478 
   1479     /**
   1480      * lambda (lagrange multiplier for cost computation)
   1481      */
   1482     UWORD32 u4_lambda;
   1483 
   1484     /**
   1485      * mb distortion
   1486      */
   1487     WORD32 i4_mb_distortion;
   1488 
   1489     /**
   1490      * mb cost
   1491      */
   1492     WORD32 i4_mb_cost;
   1493 
   1494     /********************************************************************/
   1495     /* i4_ngbr_avbl_mb_16 - ngbr avbl of curr mb                        */
   1496     /* i4_ngbr_avbl_sb_8 - ngbr avbl of all 8x8 sub blocks of curr mb   */
   1497     /* i4_ngbr_avbl_sb_4 - ngbr avbl of all 4x4 sub blocks of curr mb   */
   1498     /* i4_ngbr_avbl_mb_c - chroma ngbr avbl of curr mb                  */
   1499     /********************************************************************/
   1500     WORD32  i4_ngbr_avbl_16x16_mb;
   1501     WORD32  ai4_neighbor_avail_8x8_subblks[4];
   1502     UWORD8  au1_ngbr_avbl_4x4_subblks[16];
   1503     WORD32  i4_chroma_neighbor_avail_8x8_mb;
   1504 
   1505     /**
   1506      * array to store the mode of mb sub blocks
   1507      */
   1508     UWORD8  au1_intra_luma_mb_4x4_modes[16];
   1509 
   1510     /**
   1511      * array to store the predicted mode of mb sub blks
   1512      */
   1513     UWORD8  au1_predicted_intra_luma_mb_4x4_modes[16];
   1514 
   1515     /**
   1516      * macro block intra 16x16 mode
   1517      */
   1518     UWORD8  u1_l_i16_mode;
   1519 
   1520     /**
   1521      * array to store the mode of the macro block intra 8x8 4 modes
   1522      */
   1523     UWORD8  au1_intra_luma_mb_8x8_modes[4];
   1524 
   1525     /**
   1526      * intra chroma mb mode
   1527      */
   1528     UWORD8  u1_c_i8_mode;
   1529 
   1530     /********************************************************************/
   1531     /* array to store pixels from the neighborhood for intra prediction */
   1532     /* i16 - 16 left pels + 1 top left pel + 16 top pels = 33 pels      */
   1533     /* i8 - 8 lpels + 1 tlpels + 8 tpels + 8 tr pels = 25 pels          */
   1534     /* i4 - 4 lpels + 1 tlpels + 4 tpels + 4 tr pels = 13 pels          */
   1535     /* ic - 8 left pels + 1 top left pel + 8 top pels )*2               */
   1536     /********************************************************************/
   1537     UWORD8 au1_ngbr_pels[34];
   1538 
   1539     /**
   1540      * array for 8x8 intra pels filtering (temp buff 4)
   1541      */
   1542     UWORD8 au1_neighbor_pels_i8x8_unfiltered[25];
   1543 
   1544     /**
   1545      * Number of sub partitons in the inter pred MB
   1546      */
   1547     UWORD32 u4_num_sub_partitions;
   1548 
   1549     /**
   1550      *  Pointer to hold num PUs each MB in a picture
   1551      */
   1552     UWORD32 *pu4_mb_pu_cnt;
   1553 
   1554     /**
   1555      * Pointer to the array of structures having motion vectors, size
   1556      *  and position of sub partitions
   1557      */
   1558     enc_pu_t *ps_pu;
   1559 
   1560     /**
   1561      * Pointer to the pu of current co-located MB in list 1
   1562      */
   1563     enc_pu_t *ps_colpu;
   1564 
   1565     /**
   1566      * predicted motion vector
   1567      */
   1568     enc_pu_mv_t *ps_skip_mv;
   1569 
   1570     /**
   1571      * predicted motion vector
   1572      */
   1573     enc_pu_mv_t *ps_pred_mv;
   1574 
   1575     /**
   1576      * top row mb syntax information base
   1577      * In normal working scenarios, for a given context set,
   1578      * the mb syntax info pointer is identical across all process threads.
   1579      * But when the hard bound on slices are enabled, in multi core, frame
   1580      * is partitioned in to sections equal to set number of cores and each
   1581      * partition is run independently. In this scenario, a ctxt set will alone
   1582      * appear to run multiple frames at a time. For this to occur, the common
   1583      * pointers across the proc ctxt should disappear.
   1584      *
   1585      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
   1586      * across individual ctxts when byte bnd per slice is enabled.
   1587      */
   1588     mb_info_t *ps_top_row_mb_syntax_ele_base;
   1589 
   1590     /**
   1591      * top row mb syntax information
   1592      */
   1593     mb_info_t *ps_top_row_mb_syntax_ele;
   1594 
   1595     /**
   1596      * left mb syntax information
   1597      */
   1598     mb_info_t s_left_mb_syntax_ele;
   1599 
   1600     /**
   1601      * top left mb syntax information
   1602      */
   1603     mb_info_t s_top_left_mb_syntax_ele;
   1604 
   1605     /**
   1606      * top left mb syntax information
   1607      */
   1608 
   1609     mb_info_t s_top_left_mb_syntax_ME;
   1610 
   1611     /**
   1612      * left mb motion vector
   1613      */
   1614     enc_pu_t s_left_mb_pu_ME;
   1615 
   1616     /**
   1617      * top left mb motion vector
   1618      */
   1619     enc_pu_t s_top_left_mb_pu_ME;
   1620 
   1621     /**
   1622      * mb neighbor availability pointer
   1623      */
   1624     block_neighbors_t s_ngbr_avbl;
   1625 
   1626     /**
   1627      * In case the macroblock type is intra, the intra modes of all
   1628      * partitions for the left mb are stored in the array below
   1629      */
   1630     UWORD8 au1_left_mb_intra_modes[16];
   1631 
   1632     /**
   1633      * In case the macroblock type is intra, the intra modes of all
   1634      * partitions for the top mb are stored in the array below
   1635      *
   1636      * In normal working scenarios, for a given context set,
   1637      * the mb syntax info pointer is identical across all process threads.
   1638      * But when the hard bound on slices are enabled, in multi core, frame
   1639      * is partitioned in to sections equal to set number of cores and each
   1640      * partition is run independently. In this scenario, a ctxt set will alone
   1641      * appear to run multiple frames at a time. For this to occur, the common
   1642      * pointers across the proc ctxt should disappear.
   1643      *
   1644      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
   1645      * across individual ctxts when byte bnd per slice is enabled.
   1646      */
   1647     UWORD8 *pu1_top_mb_intra_modes_base;
   1648 
   1649     /**
   1650      * In case the macroblock type is intra, the intra modes of all
   1651      * partitions for the top mb are stored in the array below
   1652      */
   1653     UWORD8 *pu1_top_mb_intra_modes;
   1654 
   1655     /**
   1656      * left mb motion vector
   1657      */
   1658     enc_pu_t s_left_mb_pu;
   1659 
   1660     /**
   1661      * top left mb motion vector
   1662      */
   1663     enc_pu_t s_top_left_mb_pu;
   1664 
   1665     /**
   1666      * top row motion vector info
   1667      *
   1668      * In normal working scenarios, for a given context set,
   1669      * the top row pu pointer is identical across all process threads.
   1670      * But when the hard bound on slices are enabled, in multi core, frame
   1671      * is partitioned in to sections equal to set number of cores and each
   1672      * partition is run independently. In this scenario, a ctxt set will alone
   1673      * appear to run multiple frames at a time. For this to occur, the common
   1674      * pointers across the proc ctxt should disappear.
   1675      *
   1676      * This is done by allocating MAX_PROCESS_THREADS memory and distributing
   1677      * across individual ctxts when byte bnd per slice is enabled.
   1678      */
   1679     enc_pu_t *ps_top_row_pu_base;
   1680 
   1681     /**
   1682      * top row motion vector info
   1683      */
   1684     enc_pu_t *ps_top_row_pu;
   1685 
   1686     enc_pu_t *ps_top_row_pu_ME;
   1687 
   1688     /**
   1689      * coded block pattern
   1690      */
   1691     UWORD32 u4_cbp;
   1692 
   1693     /**
   1694      * csbp
   1695      */
   1696     UWORD32 u4_csbp;
   1697 
   1698     /**
   1699      *  number of non zero coeffs
   1700      */
   1701     UWORD32 au4_nnz[5];
   1702 
   1703     /**
   1704      *  number of non zero coeffs for intra 4x4 when rdopt is on
   1705      */
   1706     UWORD32 au4_nnz_intra_4x4[4];
   1707 
   1708     /**
   1709      * frame qp & mb qp
   1710      */
   1711     UWORD32 u4_frame_qp, u4_mb_qp;
   1712 
   1713     /**
   1714      * mb qp previous
   1715      */
   1716     UWORD32 u4_mb_qp_prev;
   1717 
   1718     /**
   1719      * quantization parameters for luma & chroma planes
   1720      */
   1721     quant_params_t *ps_qp_params[3];
   1722 
   1723     /**
   1724      * Pointer frame level mb subblock coeff data
   1725      */
   1726     void *pv_pic_mb_coeff_data;
   1727 
   1728     /**
   1729      * Pointer to mb subblock coeff data and number of subblocks and scan idx
   1730      * Incremented each time a coded subblock is processed
   1731      */
   1732     void *pv_mb_coeff_data;
   1733 
   1734     /**
   1735      * Pointer frame level mb header data
   1736      */
   1737     void *pv_pic_mb_header_data;
   1738 
   1739     /**
   1740      * Pointer to mb header data and
   1741      * incremented each time a coded mb is encoded
   1742      */
   1743     void *pv_mb_header_data;
   1744 
   1745     /**
   1746      * Signal that pic_init is called first time
   1747      */
   1748     WORD32 i4_first_pic_init;
   1749 
   1750     /**
   1751      * Current MV Bank's buffer ID
   1752      */
   1753     WORD32 i4_cur_mv_bank_buf_id;
   1754 
   1755     /**
   1756      * Void pointer to job context
   1757      */
   1758     void *pv_proc_jobq, *pv_entropy_jobq;
   1759 
   1760     /**
   1761      * Number of MBs to be processed in the current Job
   1762      */
   1763     WORD32 i4_mb_cnt;
   1764 
   1765     /**
   1766      * ID for the current context - Used for debugging
   1767      */
   1768     WORD32 i4_id;
   1769 
   1770     /**
   1771      * Pointer to current picture buffer structure
   1772      */
   1773     pic_buf_t *ps_cur_pic;
   1774 
   1775     /**
   1776      * Pointer to current picture's mv buffer structure
   1777      */
   1778     mv_buf_t *ps_cur_mv_buf;
   1779 
   1780     /**
   1781      * Flag to indicate if ps_proc was initialized at least once in a frame.
   1782      * This is needed to handle cases where a core starts to handle format
   1783      * conversion jobs directly
   1784      */
   1785     WORD32 i4_init_done;
   1786 
   1787     /**
   1788      * Process status: one byte per MB
   1789      */
   1790     UWORD8 *pu1_proc_map;
   1791 
   1792     /**
   1793      * Deblk status: one byte per MB
   1794      */
   1795     UWORD8 *pu1_deblk_map;
   1796 
   1797     /**
   1798      * Process status: one byte per MB
   1799      */
   1800     UWORD8 *pu1_me_map;
   1801 
   1802     /*
   1803      * Intra refresh mask.
   1804      * Indicates if an Mb is coded in intra mode within the current AIR interval
   1805      * NOTE Refreshes after each AIR period
   1806      * NOTE The map is shared between process
   1807      */
   1808     UWORD8 *pu1_is_intra_coded;
   1809 
   1810     /**
   1811      * Disable deblock level (0: Enable completely, 3: Disable completely
   1812      */
   1813     UWORD32 u4_disable_deblock_level;
   1814 
   1815     /**
   1816      * Pointer to the structure that contains deblock context
   1817      */
   1818     deblk_ctxt_t s_deblk_ctxt;
   1819 
   1820     /**
   1821      * Points to the array of slice indices which is used to identify the independent
   1822      * slice to which each MB in a frame belongs.
   1823      */
   1824     UWORD8 *pu1_slice_idx;
   1825 
   1826     /**
   1827      * Pointer to base of slice header structure array
   1828      */
   1829     slice_header_t *ps_slice_hdr_base;
   1830 
   1831     /**
   1832      * Number of mb's to process in one loop
   1833      */
   1834     WORD32 i4_nmb_ntrpy;
   1835 
   1836     /**
   1837      * Number of mb's to process in one loop
   1838      */
   1839     UWORD32 u4_nmb_me;
   1840 
   1841     /**
   1842      * Structure for current input buffer
   1843      */
   1844     inp_buf_t s_inp_buf;
   1845 
   1846     /**
   1847      * api call cnt
   1848      */
   1849     WORD32 i4_encode_api_call_cnt;
   1850 
   1851     /**
   1852      * Current Picture count - used for synchronization
   1853      */
   1854     WORD32 i4_pic_cnt;
   1855 
   1856     /**
   1857       * Intermediate buffer for interpred leaf level functions
   1858       */
   1859     WORD32 ai16_pred1[HP_BUFF_WD * HP_BUFF_HT];
   1860 
   1861     /**
   1862      * Reference picture for the current picture
   1863      * TODO: Only 2 reference assumed currently
   1864      */
   1865     pic_buf_t *aps_ref_pic[MAX_REF_PIC_CNT];
   1866 
   1867     /**
   1868      * Reference MV buff for the current picture
   1869      */
   1870     mv_buf_t *aps_mv_buf[MAX_REF_PIC_CNT];
   1871 
   1872     /**
   1873      * frame info used by RC
   1874      */
   1875     frame_info_t s_frame_info;
   1876 
   1877     /*
   1878      * NOTE NOT PERSISTANT INSIDE FUNCTIONS
   1879      * Min sad for current MB
   1880      * will be populated initially
   1881      * Once a sad less than eq to u4_min_sad is reached, the value will be copied to the cariable
   1882      */
   1883     UWORD32  u4_min_sad;
   1884 
   1885     /*
   1886      * indicates weather we have rached minimum sa or not
   1887      */
   1888     UWORD32 u4_min_sad_reached;
   1889 
   1890     /**
   1891      * Current error code
   1892      */
   1893     WORD32 i4_error_code;
   1894 
   1895     /*
   1896      * Enables or disables computation of recon
   1897      */
   1898     UWORD32 u4_compute_recon;
   1899 
   1900     /*
   1901      * Temporary buffers to be used for subpel computation
   1902      */
   1903     UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT];
   1904 
   1905     /*
   1906      * Buffer holding best sub pel values
   1907      */
   1908     UWORD8 *pu1_best_subpel_buf;
   1909 
   1910     /*
   1911      * Stride for buffer holding best sub pel
   1912      */
   1913     UWORD32 u4_bst_spel_buf_strd;
   1914 
   1915 };
   1916 
   1917 /**
   1918  ******************************************************************************
   1919  *  @brief      Rate control related variables
   1920  ******************************************************************************
   1921  */
   1922 typedef struct
   1923 {
   1924     void *pps_rate_control_api;
   1925 
   1926     void *pps_frame_time;
   1927 
   1928     void *pps_time_stamp;
   1929 
   1930     void *pps_pd_frm_rate;
   1931 
   1932     /**
   1933      * frame rate pull down
   1934      */
   1935     WORD32 pre_encode_skip[MAX_CTXT_SETS];
   1936 
   1937     /**
   1938      * skip frame (cbr)
   1939      */
   1940     WORD32 post_encode_skip[MAX_CTXT_SETS];
   1941 
   1942     /**
   1943      * rate control type
   1944      */
   1945     rc_type_e e_rc_type;
   1946 
   1947     /**
   1948      * pic type
   1949      */
   1950     picture_type_e e_pic_type;
   1951 
   1952     /**
   1953      * intra cnt in previous frame
   1954      */
   1955     WORD32 num_intra_in_prev_frame;
   1956 
   1957     /**
   1958      * avg activity of prev frame
   1959      */
   1960     WORD32 i4_avg_activity;
   1961 
   1962 }rate_control_ctxt_t;
   1963 
   1964 /**
   1965  * Codec context
   1966  */
   1967 struct _codec_t
   1968 {
   1969     /**
   1970      * Id of current pic (input order)
   1971      */
   1972     WORD32 i4_poc;
   1973 
   1974     /**
   1975      * Number of encode frame API calls made
   1976      * This variable must only be used for context selection [Read only]
   1977      */
   1978     WORD32 i4_encode_api_call_cnt;
   1979 
   1980     /**
   1981      * Number of pictures encoded
   1982      */
   1983     WORD32 i4_pic_cnt;
   1984 
   1985     /**
   1986      * Number of threads created
   1987      */
   1988     WORD32 i4_proc_thread_cnt;
   1989 
   1990     /**
   1991      * Mutex used to keep the control calls thread-safe
   1992      */
   1993     void *pv_ctl_mutex;
   1994 
   1995     /**
   1996      * Current active config parameters
   1997      */
   1998     cfg_params_t s_cfg;
   1999 
   2000     /**
   2001      * Array containing the config parameter sets
   2002      */
   2003     cfg_params_t as_cfg[MAX_ACTIVE_CONFIG_PARAMS];
   2004 
   2005     /**
   2006      * Color format used by encoder internally
   2007      */
   2008     IV_COLOR_FORMAT_T e_codec_color_format;
   2009 
   2010     /**
   2011      * recon stride
   2012      * (strides for luma and chroma are the same)
   2013      */
   2014     WORD32 i4_rec_strd;
   2015 
   2016     /**
   2017      * Flag to enable/disable deblocking of a frame
   2018      */
   2019     WORD32 i4_disable_deblk_pic;
   2020 
   2021     /**
   2022      * Number of continuous frames where deblocking was disabled
   2023      */
   2024     WORD32 i4_disable_deblk_pic_cnt;
   2025 
   2026     /**
   2027      * frame type
   2028      */
   2029     PIC_TYPE_T pic_type;
   2030 
   2031     /**
   2032      * frame qp
   2033      */
   2034     UWORD32 u4_frame_qp;
   2035 
   2036     /**
   2037      * frame num
   2038      */
   2039     WORD32 i4_frame_num;
   2040 
   2041     /**
   2042      *  slice_type
   2043      */
   2044     WORD32  i4_slice_type;
   2045 
   2046     /*
   2047      * Force current frame to specific type
   2048      */
   2049     IV_PICTURE_CODING_TYPE_T force_curr_frame_type;
   2050 
   2051     /**
   2052      *  IDR pic
   2053      */
   2054     UWORD32 u4_is_idr;
   2055 
   2056     /**
   2057      *  idr_pic_id
   2058      */
   2059     WORD32 i4_idr_pic_id;
   2060 
   2061     /**
   2062      * Flush mode
   2063      */
   2064     WORD32 i4_flush_mode;
   2065 
   2066     /**
   2067      * Encode header mode
   2068      */
   2069     WORD32 i4_header_mode;
   2070 
   2071     /**
   2072      * Flag to indicate if header has already
   2073      * been generated when i4_api_call_cnt 0
   2074      */
   2075     UWORD32 u4_header_generated;
   2076 
   2077     /**
   2078      * Encode generate header
   2079      */
   2080     WORD32 i4_gen_header;
   2081 
   2082     /**
   2083      * To signal successful completion of init
   2084      */
   2085     WORD32 i4_init_done;
   2086 
   2087     /**
   2088      * To signal that at least one picture was decoded
   2089      */
   2090     WORD32 i4_first_pic_done;
   2091 
   2092     /**
   2093      * Reset flag - Codec is reset if this flag is set
   2094      */
   2095     WORD32 i4_reset_flag;
   2096 
   2097     /**
   2098      * Current error code
   2099      */
   2100     WORD32 i4_error_code;
   2101 
   2102     /**
   2103      * threshold residue
   2104      */
   2105     WORD32 u4_thres_resi;
   2106 
   2107     /**
   2108      * disable intra inter gating
   2109      */
   2110     UWORD32 u4_inter_gate;
   2111 
   2112     /**
   2113      * Holds mem records passed during init.
   2114      * This will be used to return the mem records during retrieve call
   2115      */
   2116     iv_mem_rec_t *ps_mem_rec_backup;
   2117 
   2118     /**
   2119      * Flag to determine if the entropy thread is active
   2120      */
   2121     volatile UWORD32 au4_entropy_thread_active[MAX_CTXT_SETS];
   2122 
   2123     /**
   2124      * Mutex used to keep the entropy calls thread-safe
   2125      */
   2126     void *pv_entropy_mutex;
   2127 
   2128     /**
   2129      * Job queue buffer base
   2130      */
   2131     void *pv_proc_jobq_buf, *pv_entropy_jobq_buf;
   2132 
   2133     /**
   2134      * Job Queue mem tab size
   2135      */
   2136     WORD32 i4_proc_jobq_buf_size, i4_entropy_jobq_buf_size;
   2137 
   2138     /**
   2139      * Memory for MV Bank buffer manager
   2140      */
   2141     void *pv_mv_buf_mgr_base;
   2142 
   2143     /**
   2144      * MV Bank buffer manager
   2145      */
   2146     void *pv_mv_buf_mgr;
   2147 
   2148     /**
   2149      * Pointer to MV Buf structure array
   2150      */
   2151     void *ps_mv_buf;
   2152 
   2153     /**
   2154      * Base address for Motion Vector bank buffer
   2155      */
   2156     void *pv_mv_bank_buf_base;
   2157 
   2158     /**
   2159      * MV Bank size allocated
   2160      */
   2161     WORD32 i4_total_mv_bank_size;
   2162 
   2163     /**
   2164      * Memory for Picture buffer manager for reference pictures
   2165      */
   2166     void *pv_ref_buf_mgr_base;
   2167 
   2168     /**
   2169      * Picture buffer manager for reference pictures
   2170      */
   2171     void *pv_ref_buf_mgr;
   2172 
   2173     /**
   2174      * Number of reference buffers added to the buffer manager
   2175      */
   2176     WORD32 i4_ref_buf_cnt;
   2177 
   2178     /**
   2179      * Pointer to Pic Buf structure array
   2180      */
   2181     void *ps_pic_buf;
   2182 
   2183     /**
   2184      * Base address for Picture buffer
   2185      */
   2186     void *pv_pic_buf_base;
   2187 
   2188     /**
   2189      * Total pic buffer size allocated
   2190      */
   2191     WORD32 i4_total_pic_buf_size;
   2192 
   2193     /**
   2194      * Memory for Buffer manager for output buffers
   2195      */
   2196      void *pv_out_buf_mgr_base;
   2197 
   2198     /**
   2199      * Buffer manager for output buffers
   2200      */
   2201      void *pv_out_buf_mgr;
   2202 
   2203     /**
   2204      * Current output buffer's buffer ID
   2205      */
   2206     WORD32 i4_out_buf_id;
   2207 
   2208     /**
   2209      * Number of output buffers added to the buffer manager
   2210      */
   2211     WORD32 i4_out_buf_cnt;
   2212 
   2213     /**
   2214      * Memory for Picture buffer manager for input buffers
   2215      */
   2216      void *pv_inp_buf_mgr_base;
   2217 
   2218     /**
   2219      * Picture buffer manager for input buffers
   2220      */
   2221      void *pv_inp_buf_mgr;
   2222 
   2223     /**
   2224      * Current input buffer's buffer ID
   2225      */
   2226     WORD32 i4_inp_buf_id;
   2227 
   2228     /**
   2229      * Number of input buffers added to the buffer manager
   2230      */
   2231     WORD32 i4_inp_buf_cnt;
   2232 
   2233     /**
   2234      * Current input buffer
   2235      */
   2236     pic_buf_t *ps_inp_buf;
   2237 
   2238     /**
   2239      * Pointer to dpb manager structure
   2240      */
   2241     void *pv_dpb_mgr;
   2242 
   2243     /**
   2244      * Pointer to base of Sequence parameter set structure array
   2245      */
   2246     sps_t *ps_sps_base;
   2247 
   2248     /**
   2249      * Pointer to base of Picture parameter set structure array
   2250      */
   2251     pps_t *ps_pps_base;
   2252 
   2253     /**
   2254      *  seq_parameter_set_id
   2255      */
   2256     WORD32 i4_sps_id;
   2257 
   2258     /**
   2259      *  pic_parameter_set_id
   2260      */
   2261     WORD32 i4_pps_id;
   2262 
   2263     /**
   2264      * Pointer to base of slice header structure array
   2265      */
   2266     slice_header_t *ps_slice_hdr_base;
   2267 
   2268     /**
   2269      * packed residue coeff data size for 1 row of mbs
   2270      */
   2271     UWORD32 u4_size_coeff_data;
   2272 
   2273     /**
   2274      * packed header data size for 1 row of mbs
   2275      */
   2276     UWORD32 u4_size_header_data;
   2277 
   2278     /**
   2279      * Processing context - One for each processing thread
   2280      * Create two sets, each set used for alternate frames
   2281      */
   2282     process_ctxt_t as_process[MAX_PROCESS_CTXT];
   2283 
   2284     /**
   2285      * Thread handle for each of the processing threads
   2286      */
   2287     void *apv_proc_thread_handle[MAX_PROCESS_THREADS];
   2288 
   2289     /**
   2290      * Thread created flag for each of the processing threads
   2291      */
   2292     WORD32 ai4_process_thread_created[MAX_PROCESS_THREADS];
   2293 
   2294     /**
   2295      * Void pointer to process job context
   2296      */
   2297     void *pv_proc_jobq, *pv_entropy_jobq;
   2298 
   2299     /**
   2300      * Number of MBs processed together for better instruction cache handling
   2301      */
   2302     WORD32 i4_proc_nmb;
   2303 
   2304     /**
   2305      * Previous POC lsb
   2306      */
   2307     WORD32 i4_prev_poc_lsb;
   2308 
   2309     /**
   2310      * Previous POC msb
   2311      */
   2312     WORD32 i4_prev_poc_msb;
   2313 
   2314     /**
   2315      * Max POC lsb that has arrived till now
   2316      */
   2317     WORD32 i4_max_prev_poc_lsb;
   2318 
   2319     /**
   2320      * Context for format conversion
   2321      */
   2322     fmt_conv_t s_fmt_conv;
   2323 
   2324     /**
   2325      * Absolute pic order count
   2326      */
   2327     WORD32 i4_abs_pic_order_cnt;
   2328 
   2329     /**
   2330      *  Pic order count of lsb
   2331      */
   2332     WORD32 i4_pic_order_cnt_lsb;
   2333 
   2334     /**
   2335      * Array giving current picture being processed in each context set
   2336      */
   2337     WORD32 ai4_pic_cnt[MAX_CTXT_SETS];
   2338 
   2339     /*
   2340      * Min sad to search for
   2341      */
   2342     UWORD32 u4_min_sad;
   2343 
   2344     /**
   2345      * Reference picture set
   2346      */
   2347     ref_set_t as_ref_set[MAX_DPB_SIZE + MAX_CTXT_SETS];
   2348 
   2349 
   2350     /*
   2351      * Air pic cnt
   2352      * Contains the number of pictures that have been encoded with air
   2353      * This value is moudulo air refresh period
   2354      */
   2355     WORD32 i4_air_pic_cnt;
   2356 
   2357     /*
   2358      * Intra refresh map
   2359      * Stores the frames at which intra refresh should occur for a MB
   2360      */
   2361     UWORD16 *pu2_intr_rfrsh_map;
   2362 
   2363     /*
   2364      * Indicates if the current frame is used as a reference frame
   2365      */
   2366     UWORD32 u4_is_curr_frm_ref;
   2367 
   2368     /*
   2369      * Indicates if there can be non reference frames in the stream
   2370      */
   2371     WORD32 i4_non_ref_frames_in_stream;
   2372 
   2373     /*
   2374      * Memory for color space conversion for luma plane
   2375      */
   2376     UWORD8 *pu1_y_csc_buf_base;
   2377 
   2378     /*
   2379      * Memory for color space conversion foe chroma plane
   2380      */
   2381     UWORD8 *pu1_uv_csc_buf_base;
   2382 
   2383     /**
   2384      * Function pointers for intra pred leaf level functions luma
   2385      */
   2386     pf_intra_pred apf_intra_pred_16_l[MAX_I16x16];
   2387     pf_intra_pred apf_intra_pred_8_l[MAX_I8x8];
   2388     pf_intra_pred apf_intra_pred_4_l[MAX_I4x4];
   2389 
   2390     /**
   2391      * Function pointers for intra pred leaf level functions chroma
   2392      */
   2393     pf_intra_pred apf_intra_pred_c[MAX_CH_I8x8];
   2394 
   2395     /**
   2396      * luma core coding function pointer
   2397      */
   2398     UWORD8 (*luma_energy_compaction[4])(process_ctxt_t *ps_proc);
   2399 
   2400     /**
   2401      * chroma core coding function pointer
   2402      */
   2403     UWORD8 (*chroma_energy_compaction[2])(process_ctxt_t *ps_proc);
   2404 
   2405     /**
   2406      * forward transform for intra blk of mb type 16x16
   2407      */
   2408     ih264_luma_16x16_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_16x16;
   2409 
   2410     /**
   2411      * inverse transform for intra blk of mb type 16x16
   2412      */
   2413     ih264_luma_16x16_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_16x16;
   2414 
   2415     /**
   2416      * forward transform for 4x4 blk luma
   2417      */
   2418     ih264_resi_trans_quant_ft *pf_resi_trans_quant_4x4;
   2419 
   2420     /**
   2421      * forward transform for 4x4 blk luma
   2422      */
   2423     ih264_resi_trans_quant_ft *pf_resi_trans_quant_chroma_4x4;
   2424 
   2425     /*
   2426      * hadamard transform and quant for a 4x4 block
   2427      */
   2428     ih264_hadamard_quant_ft *pf_hadamard_quant_4x4;
   2429 
   2430     /*
   2431      *  hadamard transform and quant for a 4x4 block
   2432      */
   2433     ih264_hadamard_quant_ft *pf_hadamard_quant_2x2_uv;
   2434 
   2435     /**
   2436      * inverse transform for 4x4 blk
   2437      */
   2438     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4;
   2439 
   2440     /**
   2441      * inverse transform for chroma 4x4 blk
   2442      */
   2443     ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4;
   2444 
   2445     /**
   2446      * inverse transform for 4x4 blk with only single dc coeff
   2447      */
   2448     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4_dc;
   2449 
   2450     /**
   2451      * inverse transform for chroma 4x4 blk with only single dc coeff
   2452      */
   2453     ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4_dc;
   2454 
   2455     /*
   2456      * Inverse hadamard transform and iquant for a 4x4 block
   2457      */
   2458     ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_4x4;
   2459 
   2460     /*
   2461      * Inverse hadamard transform and iquant for a 4x4 block
   2462      */
   2463     ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_2x2_uv;
   2464 
   2465     /*
   2466      * Function for interleave copy*
   2467      */
   2468     ih264_interleave_copy_ft *pf_interleave_copy;
   2469 
   2470     /**
   2471      * forward transform for 8x8 blk
   2472      */
   2473     ih264_resi_trans_quant_ft *pf_resi_trans_quant_8x8;
   2474 
   2475     /**
   2476      * inverse transform for 8x8 blk
   2477      */
   2478     /**
   2479      * inverse transform for 4x4 blk
   2480      */
   2481     ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_8x8;
   2482 
   2483     /**
   2484      * forward transform for chroma MB
   2485      */
   2486     ih264_chroma_8x8_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_8x8_chroma;
   2487 
   2488     /**
   2489      * inverse transform for chroma MB
   2490      */
   2491     ih264_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_8x8_chroma;
   2492 
   2493     /**
   2494      * deblock vertical luma edge with blocking strength 4
   2495      */
   2496     ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4;
   2497 
   2498     /**
   2499      * deblock vertical chroma edge with blocking strength 4
   2500      */
   2501     ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4;
   2502 
   2503     /**
   2504      * deblock vertical luma edge with blocking strength less than 4
   2505      */
   2506     ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4;
   2507 
   2508     /**
   2509      * deblock vertical chroma edge with blocking strength less than 4
   2510      */
   2511     ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4;
   2512 
   2513     /**
   2514      * deblock horizontal luma edge with blocking strength 4
   2515      */
   2516     ih264_deblk_edge_bs4_ft *pf_deblk_luma_horz_bs4;
   2517 
   2518     /**
   2519      * deblock horizontal chroma edge with blocking strength 4
   2520      */
   2521     ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_horz_bs4;
   2522 
   2523     /**
   2524      * deblock horizontal luma edge with blocking strength less than 4
   2525      */
   2526     ih264_deblk_edge_bslt4_ft *pf_deblk_luma_horz_bslt4;
   2527 
   2528     /**
   2529      * deblock horizontal chroma edge with blocking strength less than 4
   2530      */
   2531     ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_horz_bslt4;
   2532 
   2533 
   2534     /**
   2535      * functions for padding
   2536      */
   2537     pf_pad pf_pad_top;
   2538     pf_pad pf_pad_bottom;
   2539     pf_pad pf_pad_left_luma;
   2540     pf_pad pf_pad_left_chroma;
   2541     pf_pad pf_pad_right_luma;
   2542     pf_pad pf_pad_right_chroma;
   2543 
   2544     /**
   2545      * Inter pred leaf level functions
   2546      */
   2547     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_copy;
   2548     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_horz;
   2549     ih264_inter_pred_luma_ft    *pf_inter_pred_luma_vert;
   2550     pf_inter_pred_luma_bilinear  pf_inter_pred_luma_bilinear;
   2551     ih264_inter_pred_chroma_ft  *pf_inter_pred_chroma;
   2552 
   2553     /**
   2554      * fn ptrs for compute sad routines
   2555      */
   2556     ime_compute_sad_ft *apf_compute_sad_16x16[2];
   2557     ime_compute_sad_ft *pf_compute_sad_16x8;
   2558 
   2559 
   2560     /**
   2561      * Function pointer for computing ME
   2562      * 1 for PSLICE and 1 for BSLICE
   2563      */
   2564     ih264e_compute_me_ft *apf_compute_me[2];
   2565 
   2566     /**
   2567      * Function pointers for computing SKIP parameters
   2568      */
   2569     ih264e_skip_params_ft *apf_find_skip_params_me[2];
   2570 
   2571     /**
   2572      * fn ptrs for memory handling operations
   2573      */
   2574     pf_memcpy pf_mem_cpy;
   2575     pf_memset pf_mem_set;
   2576     pf_memcpy_mul8 pf_mem_cpy_mul8;
   2577     pf_memset_mul8 pf_mem_set_mul8;
   2578 
   2579     /**
   2580      * intra mode eval -encoder level function
   2581      */
   2582     pf_evaluate_intra_modes pf_ih264e_evaluate_intra16x16_modes;
   2583     pf_evaluate_intra_modes pf_ih264e_evaluate_intra_chroma_modes;
   2584     pf_evaluate_intra_4x4_modes pf_ih264e_evaluate_intra_4x4_modes;
   2585 
   2586     /* Half pel generation function - encoder level
   2587      *
   2588      */
   2589     pf_sixtapfilter_horz pf_ih264e_sixtapfilter_horz;
   2590     pf_sixtap_filter_2dvh_vert pf_ih264e_sixtap_filter_2dvh_vert;
   2591 
   2592     /**
   2593      * color space conversion form YUV 420P to YUV 420Sp
   2594      */
   2595     pf_fmt_conv_420p_to_420sp pf_ih264e_conv_420p_to_420sp;
   2596 
   2597 
   2598     /**
   2599      * color space conversion form YUV 420P to YUV 420Sp
   2600      */
   2601     pf_fmt_conv_422ile_to_420sp pf_ih264e_fmt_conv_422i_to_420sp;
   2602 
   2603     /**
   2604      * write mb layer for a given slice I, P, B
   2605      */
   2606     IH264E_ERROR_T (*pf_write_mb_syntax_layer[2][3]) ( entropy_ctxt_t *ps_ent_ctxt );
   2607 
   2608     /**
   2609      * Output buffer
   2610      */
   2611     out_buf_t as_out_buf[MAX_CTXT_SETS];
   2612 
   2613     /**
   2614      * recon buffer
   2615      */
   2616     rec_buf_t as_rec_buf[MAX_CTXT_SETS];
   2617 
   2618     /**
   2619      * rate control context
   2620      */
   2621     rate_control_ctxt_t s_rate_control;
   2622 
   2623     /**
   2624      * input buffer queue
   2625      */
   2626     inp_buf_t as_inp_list[MAX_NUM_BFRAMES];
   2627 
   2628     /**
   2629      * Flag to indicate if any IDR requests are pending
   2630      */
   2631     WORD32 i4_pending_idr_flag;
   2632 
   2633     /*
   2634     *Flag to indicate if we have recived the last input frame
   2635     */
   2636     WORD32 i4_last_inp_buff_received;
   2637 
   2638 };
   2639 
   2640 #endif /* IH264E_STRUCTS_H_ */
   2641