/******************************************************************************
 *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/*!
******************************************************************************
* \file ihevce_enc_loop_structs.h
*
* \brief
*    This file contains strcutures of enc_loop pass
*
* \date
*    18/09/2012
*
* \author
*    Ittiam
*
******************************************************************************
*/

#ifndef _IHEVCE_ENC_LOOP_STRUCTS_H_
#define _IHEVCE_ENC_LOOP_STRUCTS_H_

#include "ihevc_macros.h"

extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2];

/*****************************************************************************/
/* Constant Macros                                                           */
/*****************************************************************************/
/** /breif 4x4 DST, 4x4, 8x8, 16x16, 32x32 */
#define NUM_TRANS_TYPES 5
#define INTRA_PLANAR 0
#define INTRA_DC 1
#define NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD 2
#define MAX_TU_IN_TU_EQ_DIV_2 4
#define MAX_MVP_LIST_CAND 2
#define MAX_COST 0x7ffffff
#define MAX_COST_64 0x7ffffffffffffff
#define NUM_32CU_AND_64CU_IN_CTB 5 /* 4 - 32x32 + 1 64x64*/
#define PING_PONG 2
#define MAX_SAO_RD_CAND 10
#define SCRATCH_BUF_STRIDE 80

/*****************************************************************************/
/* Function Macros                                                           */
/*****************************************************************************/
#define INTRA_ANGULAR(x) (x)

/** @breif max 30bit value */
#define MAX30 ((1 << 30) - 1)

/* @brief macro to clip a data to max of 30bits (assuming unsgined) */
#define CLIP30(x) ((x) > MAX30 ? MAX30 : (x))

/* @brief compute the (lambda * rate) with a qshift and clip result to 30bits */
#define COMPUTE_RATE_COST_CLIP30(r, l, qshift) ((WORD32)CLIP30((ULWORD64)((r) * (l)) >> (qshift)))

#define IHEVCE_INV_WT_PRED(inp, wt, off, shift)                                                    \
    (((((inp) - (off)) << (shift)) * wt + (1 << 14)) >> 15)

#define POPULATE_PU_STRUCT(ps_pu, mvx, mvy, offset_x, offset_y, wd, ht, ref_idx, pred_lx)          \
    {                                                                                              \
        (ps_pu)->b4_pos_x = (offset_x) >> 2;                                                       \
        (ps_pu)->b4_pos_y = (offset_y) >> 2;                                                       \
        (ps_pu)->b4_wd = ((wd) >> 2) - 1;                                                          \
        (ps_pu)->b4_ht = ((ht) >> 2) - 1;                                                          \
        (ps_pu)->b1_intra_flag = 0;                                                                \
        (ps_pu)->b2_pred_mode = pred_lx;                                                           \
        if(pred_lx)                                                                                \
        {                                                                                          \
            (ps_pu)->mv.i1_l0_ref_idx = -1;                                                        \
            (ps_pu)->mv.i1_l1_ref_idx = ref_idx;                                                   \
            (ps_pu)->mv.s_l1_mv.i2_mvx = mvx;                                                      \
            (ps_pu)->mv.s_l1_mv.i2_mvy = mvy;                                                      \
        }                                                                                          \
        else                                                                                       \
        {                                                                                          \
            (ps_pu)->mv.i1_l0_ref_idx = ref_idx;                                                   \
            (ps_pu)->mv.i1_l1_ref_idx = -1;                                                        \
            (ps_pu)->mv.s_l0_mv.i2_mvx = mvx;                                                      \
            (ps_pu)->mv.s_l0_mv.i2_mvy = mvy;                                                      \
        }                                                                                          \
    }

#define GET_FRAME_QSTEP_FROM_QP(frame_qp, frame_qstep)                                             \
    {                                                                                              \
        double q_steps[6] = { 0.625, 0.703, 0.79, 0.889, 1.0, 1.125 };                             \
                                                                                                   \
        frame_qstep = (WORD32)((1 << ((frame_qp) / 6)) * q_steps[(frame_qp) % 6]);                 \
    }

#define INITIALISE_MERGE_RESULT_STRUCT(ps_merge_data, pas_pu_results)                              \
    {                                                                                              \
        WORD32 i, j, k;                                                                            \
                                                                                                   \
        for(i = 0; i < TOT_NUM_PARTS; i++)                                                         \
        {                                                                                          \
            (ps_merge_data)->s_pu_results.u1_num_results_per_part_l0[i] = 0;                       \
            (ps_merge_data)->s_pu_results.u1_num_results_per_part_l1[i] = 0;                       \
        }                                                                                          \
        for(i = 0; i < 2; i++)                                                                     \
        {                                                                                          \
            for(j = 0; j < TOT_NUM_PARTS; j++)                                                     \
            {                                                                                      \
                (ps_merge_data)->s_pu_results.aps_pu_results[i][j] = pas_pu_results[i][j];         \
                for(k = 0; k < MAX_NUM_RESULTS_PER_PART_LIST; k++)                                 \
                {                                                                                  \
                    pas_pu_results[i][j][k].i4_tot_cost = MAX_COST;                                \
                    pas_pu_results[i][j][k].pu.mv.i1_l0_ref_idx = -1;                              \
                    pas_pu_results[i][j][k].pu.mv.i1_l1_ref_idx = -1;                              \
                }                                                                                  \
            }                                                                                      \
        }                                                                                          \
    }

#define POPULATE_CTB_PARAMS                                                                        \
    (ps_common_frm_prms,                                                                           \
     apu1_wt_inp,                                                                                  \
     i4_ctb_x_off,                                                                                 \
     i4_ctb_y_off,                                                                                 \
     ppu1_pred,                                                                                    \
     cu_size,                                                                                      \
     ref_stride,                                                                                   \
     bidir_enabled,                                                                                \
     num_refs,                                                                                     \
     pps_rec_list_l0,                                                                              \
     pps_rec_list_l1,                                                                              \
     pu1_non_wt_inp,                                                                               \
     lambda,                                                                                       \
     lambda_q_shift,                                                                               \
     wpred_log_wdc)                                                                                \
    {                                                                                              \
        WORD32 i, j;                                                                               \
        (ps_common_frm_prms)->i4_bidir_enabled = bidir_enabled;                                    \
        (ps_common_frm_prms)->i4_ctb_x_off = i4_ctb_x_off;                                         \
        (ps_common_frm_prms)->i4_ctb_y_off = i4_ctb_y_off;                                         \
        (ps_common_frm_prms)->i4_inp_stride = cu_size;                                             \
        (ps_common_frm_prms)->i4_lamda = lambda;                                                   \
        (ps_common_frm_prms)->i4_pred_stride = cu_size;                                            \
        (ps_common_frm_prms)->i4_rec_stride = ref_stride;                                          \
        (ps_common_frm_prms)->pps_rec_list_l0 = pps_rec_list_l0;                                   \
        (ps_common_frm_prms)->pps_rec_list_l1 = pps_rec_list_l1;                                   \
        (ps_common_frm_prms)->ppu1_pred = ppu1_pred;                                               \
        (ps_common_frm_prms)->pu1_non_wt_inp = pu1_non_wt_inp;                                     \
        (ps_common_frm_prms)->pu1_wkg_mem = NULL;                                                  \
        (ps_common_frm_prms)->u1_lamda_qshift = lambda_q_shift;                                    \
        (ps_common_frm_prms)->u1_num_ref = num_refs;                                               \
        (ps_common_frm_prms)->wpred_log_wdc = wpred_log_wdc;                                       \
        for(i = 0; i < 2; i++)                                                                     \
        {                                                                                          \
            for(j = 0; j < MAX_NUM_REF; j++)                                                       \
            {                                                                                      \
                (ps_common_frm_prms)->apu1_wt_inp = (apu1_wt_inp)[i][j];                           \
            }                                                                                      \
        }                                                                                          \
    }

#define COMPUTE_MERGE_IDX_COST(merge_idx_0_model, merge_idx, max_merge_cand, lambda, cost)         \
    {                                                                                              \
        WORD32 cab_bits_q12 = 0;                                                                   \
                                                                                                   \
        /* sanity checks */                                                                        \
        ASSERT((merge_idx >= 0) && (merge_idx < max_merge_cand));                                  \
                                                                                                   \
        /* encode the merge idx only if required */                                                \
        if(max_merge_cand > 1)                                                                     \
        {                                                                                          \
            WORD32 bin = (merge_idx > 0);                                                          \
                                                                                                   \
            /* bits for the context modelled first bin */                                          \
            cab_bits_q12 += gau2_ihevce_cabac_bin_to_bits[merge_idx_0_model ^ bin];                \
                                                                                                   \
            /* bits for larged merge idx coded as bypass tunary */                                 \
            if((max_merge_cand > 2) && (merge_idx > 0))                                            \
            {                                                                                      \
                cab_bits_q12 += (MIN(merge_idx, (max_merge_cand - 2))) << CABAC_FRAC_BITS_Q;       \
            }                                                                                      \
                                                                                                   \
            cost = COMPUTE_RATE_COST_CLIP30(                                                       \
                cab_bits_q12, lambda, (LAMBDA_Q_SHIFT + CABAC_FRAC_BITS_Q));                       \
        }                                                                                          \
        else                                                                                       \
        {                                                                                          \
            cost = 0;                                                                              \
        }                                                                                          \
    }

/*****************************************************************************/
/* Typedefs                                                                  */
/*****************************************************************************/

typedef FT_CALC_HAD_SATD_8BIT *pf_res_trans_luma_had_chroma;

/** \breif function pointer prototype for residue and transform enc_loop */
typedef UWORD32 (*pf_res_trans_chroma)(
    UWORD8 *pu1_src,
    UWORD8 *pu1_pred,
    WORD32 *pi4_tmp,
    WORD16 *pi2_dst,
    WORD32 src_strd,
    WORD32 pred_strd,
    WORD32 dst_strd_chr_flag);

/** \breif function pointer prototype for quantization and inv Quant for ssd
calc. for all transform sizes */
typedef WORD32 (*pf_quant_iquant_ssd)(
    WORD16 *pi2_coeffs,
    WORD16 *pi2_quant_coeff,
    WORD16 *pi2_q_dst,
    WORD16 *pi2_iq_dst,
    WORD32 trans_size,
    WORD32 qp_div, /* qpscaled / 6 */
    WORD32 qp_rem, /* qpscaled % 6 */
    WORD32 q_add,
    WORD32 *pi4_quant_round_factor_0_1,
    WORD32 *pi4_quant_round_factor_1_2,
    WORD32 src_strd,
    WORD32 dst_q_strd,
    WORD32 dst_iq_strd,
    UWORD8 *csbf,
    WORD32 csbf_strd,
    WORD32 *zero_col,
    WORD32 *zero_row,
    WORD16 *pi2_dequant_coeff,
    LWORD64 *pi8_cost);

/** \breif function pointer prototype for quantization and inv Quant for ssd
calc. for all transform sizes (in case of RDOQ + SBH) */
typedef WORD32 (*pf_quant_iquant_ssd_sbh)(
    WORD16 *pi2_coeffs,
    WORD16 *pi2_quant_coeff,
    WORD16 *pi2_q_dst,
    WORD16 *pi2_iq_dst,
    WORD32 trans_size,
    WORD32 qp_div, /* qpscaled / 6 */
    WORD32 qp_rem, /* qpscaled % 6 */
    WORD32 q_add,
    WORD32 src_strd,
    WORD32 dst_q_strd,
    WORD32 dst_iq_strd,
    UWORD8 *csbf,
    WORD32 csbf_strd,
    WORD32 *zero_col,
    WORD32 *zero_row,
    WORD16 *pi2_dequant_coeff,
    WORD32 *pi4_cost,
    WORD32 i4_scan_idx,
    WORD32 i4_perform_rdoq);

/** \breif function pointer prototype for inverse transform and recon
for all transform sizes : Luma */
typedef void (*pf_it_recon)(
    WORD16 *pi2_src,
    WORD16 *pi2_tmp,
    UWORD8 *pu1_pred,
    UWORD8 *pu1_dst,
    WORD32 src_strd,
    WORD32 pred_strd,
    WORD32 dst_strd,
    WORD32 zero_cols,
    WORD32 zero_rows);

/** \breif function pointer prototype for inverse transform and recon
for all transform sizes : Chroma */
typedef void (*pf_it_recon_chroma)(
    WORD16 *pi2_src,
    WORD16 *pi2_tmp,
    UWORD8 *pu1_pred,
    UWORD8 *pu1_dst,
    WORD32 src_strd,
    WORD32 pred_strd,
    WORD32 dst_strd,
    WORD32 zero_cols,
    WORD32 zero_rows);

/** \breif function pointer prototype for luma sao. */
typedef void (*pf_sao_luma)(
    UWORD8 *pu1_src,
    WORD32 src_strd,
    UWORD8 *pu1_src_left,
    UWORD8 *pu1_src_top,
    UWORD8 *pu1_src_top_left,
    UWORD8 *pu1_src_top_right,
    UWORD8 *pu1_src_bot_left,
    UWORD8 *pu1_avail,
    WORD8 *pi1_sao_offset,
    WORD32 wd,
    WORD32 ht);

/** \breif function pointer prototype for chroma sao. */
typedef void (*pf_sao_chroma)(
    UWORD8 *pu1_src,
    WORD32 src_strd,
    UWORD8 *pu1_src_left,
    UWORD8 *pu1_src_top,
    UWORD8 *pu1_src_top_left,
    UWORD8 *pu1_src_top_right,
    UWORD8 *pu1_src_bot_left,
    UWORD8 *pu1_avail,
    WORD8 *pi1_sao_offset_u,
    WORD8 *pi1_sao_offset_v,
    WORD32 wd,
    WORD32 ht);

/*****************************************************************************/
/* Enums                                                                     */
/*****************************************************************************/

typedef enum
{
    IP_FUNC_MODE_0 = 0,
    IP_FUNC_MODE_1,
    IP_FUNC_MODE_2,
    IP_FUNC_MODE_3TO9,
    IP_FUNC_MODE_10,
    IP_FUNC_MODE_11TO17,
    IP_FUNC_MODE_18_34,
    IP_FUNC_MODE_19TO25,
    IP_FUNC_MODE_26,
    IP_FUNC_MODE_27TO33,

    NUM_IP_FUNCS

} IP_FUNCS_T;

typedef enum
{
    /* currently only cu and cu/2 modes are supported */
    TU_EQ_CU = 0,
    TU_EQ_CU_DIV2,
    TU_EQ_SUBCU, /* only applicable for NXN mode at mincusize */

    /* support for below modes needs to be added */
    TU_EQ_CU_DIV4,
    TU_EQ_CU_DIV8,
    TU_EQ_CU_DIV16,

    NUM_TU_WRT_CU,

} TU_SIZE_WRT_CU_T;

typedef enum
{
    RDOPT_MODE = 0,
    RDOPT_SKIP_MODE = 1,

    NUM_CORE_CALL_MODES,

} CORE_FUNC_CALL_MODE_T;

typedef enum
{
    ENC_LOOP_CTXT = 0,
    ENC_LOOP_THRDS_CTXT,
    ENC_LOOP_SCALE_MAT,
    ENC_LOOP_RESCALE_MAT,
    ENC_LOOP_TOP_LUMA,
    ENC_LOOP_TOP_CHROMA,
    ENC_LOOP_TOP_NBR4X4,
    ENC_LOOP_RC_PARAMS, /* memory to dump rate control parameters by each thread for each bit-rate instance */
    ENC_LOOP_QP_TOP_4X4,
    ENC_LOOP_DEBLOCKING,
    ENC_LOOP_422_CHROMA_INTRA_PRED,
    ENC_LOOP_INTER_PRED,
    ENC_LOOP_CHROMA_PRED_INTRA,
    ENC_LOOP_REF_SUB_OUT,
    ENC_LOOP_REF_FILT_OUT,
    ENC_LOOP_CU_RECUR_LUMA_RECON,
    ENC_LOOP_CU_RECUR_CHROMA_RECON,
    ENC_LOOP_CU_RECUR_LUMA_PRED,
    ENC_LOOP_CU_RECUR_CHROMA_PRED,
    ENC_LOOP_LEFT_LUMA_DATA,
    ENC_LOOP_LEFT_CHROMA_DATA,
    ENC_LOOP_SAO,
    ENC_LOOP_CU_COEFF_DATA,
    ENC_LOOP_CU_RECUR_COEFF_DATA,
    ENC_LOOP_CU_DEQUANT_DATA,
    ENC_LOOP_RECON_DATA_STORE,
    /* should always be the last entry */
    NUM_ENC_LOOP_MEM_RECS

} ENC_LOOP_MEM_TABS_T;

/** This is for assigning the pred buiffers for luma (2 ping-pong) and
chroma(1)   */
typedef enum
{
    CU_ME_INTRA_PRED_LUMA_IDX0 = 0,
    CU_ME_INTRA_PRED_LUMA_IDX1,
    CU_ME_INTRA_PRED_CHROMA_IDX,

    /* should be always the last entry */
    NUM_CU_ME_INTRA_PRED_IDX

} CU_ME_INTRA_PRED_IDX_T;

/*****************************************************************************/
/* Structure                                                                 */
/*****************************************************************************/

/**
******************************************************************************
*  @brief     Structure to store TU prms req. for enc_loop only
******************************************************************************
*/
typedef struct
{
    /** Zero_col info. for the current TU Luma */
    UWORD32 u4_luma_zero_col;
    /** Zero_row info. for the current TU Luma */
    UWORD32 u4_luma_zero_row;

    /** Zero_col info. for the current TU Chroma Cb */
    UWORD32 au4_cb_zero_col[2];
    /** Zero_row info. for the current TU Chroma Cb */
    UWORD32 au4_cb_zero_row[2];
    /** Zero_col info. for the current TU Chroma Cr */
    UWORD32 au4_cr_zero_col[2];
    /** Zero_row info. for the current TU Chroma Cr */
    UWORD32 au4_cr_zero_row[2];

    /** bytes consumed by the luma ecd data */
    WORD16 i2_luma_bytes_consumed;
    /** bytes consumed by the Cb ecd data */
    WORD16 ai2_cb_bytes_consumed[2];
    /** bytes consumed by the Cr ecd data */
    WORD16 ai2_cr_bytes_consumed[2];

    /** flag to re-evaluate IQ and Coeff data of luma in the final_recon
    function. If zero, uses the data from RDOPT cand.                   */
    UWORD16 b1_eval_luma_iq_and_coeff_data : 1;
    /** flag to re-evaluate IQ and Coeff data of chroma in the final_recon
    function. If zero, uses the data from RDOPT cand.                   */
    UWORD16 b1_eval_chroma_iq_and_coeff_data : 1;

    /* TO DO : No support now, need to add. Always comapre ZERO_CBF cost */
    /** Luma ZERO_CBF cost is compared with residue coding cost only if this
    flag is enabled */
    UWORD16 b1_eval_luma_zero_cbf_cost : 1;
    /** Chroma ZERO_CBF cost is compared with residue coding cost only if this
    flag is enabled */
    UWORD16 b1_eval_chroma_zero_cbf_cost : 1;

    /** Reserved to make WORD32 alignment */
    UWORD16 b12_reserved : 12;

} tu_enc_loop_temp_prms_t;

typedef struct recon_datastore_t
{
    /* 2 to store current and best */
    void *apv_luma_recon_bufs[2];

    /* 0 to store cur chroma mode recon */
    /* 1 to store winning independent chroma mode with a single TU's recon */
    /* 2 to store winning independent chroma mode with 4 TUs' recon */
    void *apv_chroma_recon_bufs[3];

    /* The following two arrays are used to store the ID's of the buffers */
    /* where the winning recon is being stored */
    /* For Luma buffers, the permissible values are 0, 1 and UCHAR_MAX */
    /* For Chroma buffers, the permissible values are 0, 1, 2 and UCHAR_MAX */
    /* The value 'UCHAR_MAX' indicates the absence of Recon for that particular TU */
    UWORD8 au1_bufId_with_winning_LumaRecon[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];

    /* 2 - 2 Chroma planes */
    /* 2 - 2 possible subTU's */
    UWORD8 au1_bufId_with_winning_ChromaRecon[2][MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW][2];

    WORD32 i4_lumaRecon_stride;

    WORD32 i4_chromaRecon_stride;

    UWORD8 au1_is_chromaRecon_available[3];

    UWORD8 u1_is_lumaRecon_available;

} recon_datastore_t;

typedef struct enc_loop_cu_final_prms_t
{
    recon_datastore_t s_recon_datastore;

    /**
    * Cu size of the current cu being processed
    */
    UWORD8 u1_cu_size;
    /**
    * flags to indicate the final cu prediction mode
    */
    UWORD8 u1_intra_flag;

    /**
    * flags to indicate Skip mode for CU
    */
    UWORD8 u1_skip_flag;

    /**
    * number of tu in current cu for a given mode
    * if skip then this value should be 1
    */
    UWORD16 u2_num_tus_in_cu;

    /**
    * number of pu in current cu for a given mode
    * if skip then this value should be 1
    */
    UWORD16 u2_num_pus_in_cu;

    /**
    * total bytes produced in ECD data buffer
    * if skip then this value should be 0
    */
    WORD32 i4_num_bytes_ecd_data;

    /**
    * Partition mode of the best candidate
    * if skip then this value should be SIZE_2Nx2N
    * @sa PART_SIZE_E
    */
    UWORD8 u1_part_mode;

    /**
    * indicates if inter cu has coded coeffs 1: coded, 0: not coded
    * if skip then this value shoudl be ignored
    */
    UWORD8 u1_is_cu_coded;

    /**
    * Chroma pred mode as signalled in bitstream
    */
    UWORD8 u1_chroma_intra_pred_mode;

    /**
    * To store the best chroma mode for TU. Will be same for NxN case.
    * Actual Chroma pred
    */
    UWORD8 u1_chroma_intra_pred_actual_mode;

    /**
    * sad accumulated over all Tus of given CU
    */
    UWORD32 u4_cu_sad;

    /**
    * sad accumulated over all Tus of given CU
    */
    LWORD64 i8_cu_ssd;

    /**
    * open loop intra sad
    */
    UWORD32 u4_cu_open_intra_sad;

    /**
    * header bits of cu estimated during RDO evaluation.
    * Includes tu splits flags excludes cbf flags
    */
    UWORD32 u4_cu_hdr_bits;
    /**
    * luma residual bits of a cu estimated during RDO evaluation.
    */
    UWORD32 u4_cu_luma_res_bits;

    /**
    * chroma residual bits of a cu estimated during RDO evaluation.
    */
    UWORD32 u4_cu_chroma_res_bits;

    /**
    * cbf bits of a cu estimated during RDO evaluation (considered as part of texture bits later)
    */
    UWORD32 u4_cu_cbf_bits;

    /**
    * array of PU for current CU
    * For Inter PUs this will contain the follwoing
    *   - merge flag
    *   - (MVD and reference indicies) or (Merge Index)
    *   - (if Cu is skipped then Merge index for skip
    *      will be in 1st PU entry in array)
    * for intra PU only intra flag will be set to 1
    *
    */
    pu_t as_pu_enc_loop[NUM_PU_PARTS];

    /**
    * array of PU for chroma usage
    * in case of Merge MVs and reference idx of the final candidate
    * used by luma need sto be stored
    * for intra PU this will not be used
    */
    pu_t as_pu_chrm_proc[NUM_PU_PARTS];

    /**
    * array of colocated PU for current CU
    * MV and Ref pic id should be stored in this
    * for intra PU only intra flag will be set to 1
    */
    pu_col_mv_t as_col_pu_enc_loop[NUM_INTER_PU_PARTS];

    /** array to store the intra mode pred related params
    * if nxn mode the all 4 lcoations will be used
    */
    intra_prev_rem_flags_t as_intra_prev_rem[NUM_PU_PARTS];

    /**
    * array to store TU propeties of the each tu in a CU
    */
    tu_enc_loop_out_t as_tu_enc_loop[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];

    /**
    * array to store TU propeties (req. for enc_loop only and not for
    * entropy) of the each tu in a CU
    */
    tu_enc_loop_temp_prms_t as_tu_enc_loop_temp_prms[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];

    /**
    * Neighbour flags stored for chroma reuse
    */
    UWORD32 au4_nbr_flags[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];

    /**
    * intra pred modes stored for chroma reuse
    */
    UWORD8 au1_intra_pred_mode[4];

    /**
    * array for storing coeffs during RD opt stage at CU level.
    * Luma and chroma together
    */
    UWORD8 *pu1_cu_coeffs;

    /**
    * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer.
    */
    WORD32 i4_chrm_cu_coeff_strt_idx;

    /**
    * array for storing dequantized vals. during RD opt stage at CU level
    * Luma and chroma together.
    * Stride is assumed to be cu_size
    * u-v interleaved storing is at TU level
    */
    WORD16 *pi2_cu_deq_coeffs;

    /**
    * Chroma deq_coeffs start point in the ai2_cu_deq_coeffs buffer.
    */
    WORD32 i4_chrm_deq_coeff_strt_idx;

    /**
    * The total RDOPT cost of the CU for the best mode
    */
    LWORD64 i8_best_rdopt_cost;

    /**
    * The current running RDOPT cost for the current mode
    */
    LWORD64 i8_curr_rdopt_cost;

    LWORD64 i8_best_distortion;

} enc_loop_cu_final_prms_t;

typedef struct
{
    /** Current Cu chroma recon pointer in pic buffer */
    UWORD8 *pu1_final_recon;

    UWORD16 *pu2_final_recon;

    /** Current Cu chroma source pointer in pic buffer */
    UWORD8 *pu1_curr_src;

    UWORD16 *pu2_curr_src;

    /** Current CU chroma reocn buffer stride */
    WORD32 i4_chrm_recon_stride;

    /** Current CU chroma source buffer stride */
    WORD32 i4_chrm_src_stride;

    /** Current Cu chroma Left pointer for intra pred */
    UWORD8 *pu1_cu_left;

    UWORD16 *pu2_cu_left;

    /** Left buffer stride */
    WORD32 i4_cu_left_stride;

    /** Current Cu chroma top pointer for intra pred */
    UWORD8 *pu1_cu_top;

    UWORD16 *pu2_cu_top;

    /** Current Cu chroma top left pointer for intra pred */
    UWORD8 *pu1_cu_top_left;

    UWORD16 *pu2_cu_top_left;

} enc_loop_chrm_cu_buf_prms_t;

typedef struct
{
    /** cost of the current satd cand */
    WORD32 i4_cost;

    /** tu size w.r.t to cu of the current satd cand
    * @sa TU_SIZE_WRT_CU_T
    */
    WORD8 i4_tu_depth;

    /**
    *  access valid number of entries in this array based on u1_part_size
    */
    UWORD8 au1_intra_luma_modes[NUM_PU_PARTS];

    /** @remarks u1_part_size 2Nx2N or  NxN  */
    UWORD8 u1_part_mode; /* @sa: PART_SIZE_E */

    /** Flag to indicate whether current candidate needs to be evaluated */
    UWORD8 u1_eval_flag;

} cu_intra_satd_out_t;

/** \brief cu level parameters for SATD / RDOPT function */

typedef struct
{
    /** pointer to source luma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_luma_src;

    UWORD16 *pu2_luma_src;

    /** pointer to source chroma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_chrm_src;

    UWORD16 *pu2_chrm_src;

    /** pointer to recon luma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_luma_recon;

    UWORD16 *pu2_luma_recon;

    /** pointer to recon chroma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_chrm_recon;

    UWORD16 *pu2_chrm_recon;

    /*1st pass parallel dpb buffer pointers aimilar to the above*/
    UWORD8 *pu1_luma_recon_src;

    UWORD16 *pu2_luma_recon_src;

    UWORD8 *pu1_chrm_recon_src;

    UWORD16 *pu2_chrm_recon_src;

    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_hxfy;

    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_fxhy;

    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_hxhy;

    /** Luma source stride */
    WORD32 i4_luma_src_stride;

    /** chroma soruce stride */
    WORD32 i4_chrm_src_stride;

    /** Luma recon stride */
    WORD32 i4_luma_recon_stride;

    /** chroma recon stride */
    WORD32 i4_chrm_recon_stride;

    /** ctb size */
    WORD32 i4_ctb_size;

    /** current ctb postion horz */
    WORD32 i4_ctb_pos;

    /** number of PU finalized for curr CU  */
    WORD32 i4_num_pus_in_cu;

    /** number of bytes consumed for current in ecd data buf */
    WORD32 i4_num_bytes_cons;

    UWORD8 u1_is_cu_noisy;

    UWORD8 *pu1_is_8x8Blk_noisy;

} enc_loop_cu_prms_t;

/**
******************************************************************************
*  @brief Pad inter pred recon context
******************************************************************************
*/
typedef struct
{
    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_hxfy;

    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_fxhy;

    /** Pointer to Subpel Plane Buffer */
    UWORD8 *pu1_sbpel_hxhy;

    /** pointer to recon luma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_luma_recon;

    /** pointer to recon chroma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_chrm_recon;

    /*FOr recon source 1st pass starts*/

    UWORD8 *pu1_luma_recon_src;

    /** pointer to recon chroma pointer
    *  pointer will be pointing to CTB start location
    *  At CU level based on the CU position this pointer
    *  has to appropriately incremented
    */
    UWORD8 *pu1_chrm_recon_src;
    /*FOr recon source 1st pass ends */
    /** Luma recon stride */
    WORD32 i4_luma_recon_stride;

    /** chroma recon stride */
    WORD32 i4_chrm_recon_stride;

    /** ctb size */
    WORD32 i4_ctb_size;

    /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
    UWORD8 u1_chroma_array_type;

} pad_interp_recon_frm_t;

/**
******************************************************************************
*  @brief inter prediction (MC) context for enc loop
******************************************************************************
*/
/*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/
typedef struct
{
    /** pointer to reference lists */
    recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2];

    /** scratch buffer for horizontal interpolation destination */
    WORD16 MEM_ALIGN16 ai2_horz_scratch[MAX_CTB_SIZE * (MAX_CTB_SIZE + 8)];

    /** scratch 16 bit buffer for interpolation in l0 direction */
    WORD16 MEM_ALIGN16 ai2_scratch_buf_l0[MAX_CTB_SIZE * MAX_CTB_SIZE];

    /** scratch 16 bit buffer for interpolation in l1 direction */
    WORD16 MEM_ALIGN16 ai2_scratch_buf_l1[MAX_CTB_SIZE * MAX_CTB_SIZE];

    /** Pointer to struct containing function pointers to
    functions in the 'common' library' */
    func_selector_t *ps_func_selector;

    /** common denominator used for luma weights */
    WORD32 i4_log2_luma_wght_denom;

    /** common denominator used for chroma weights */
    WORD32 i4_log2_chroma_wght_denom;

    /**  offset w.r.t frame start in horz direction (pels) */
    WORD32 i4_ctb_frm_pos_x;

    /**  offset w.r.t frame start in vert direction (pels) */
    WORD32 i4_ctb_frm_pos_y;

    /* Bit Depth of Input */
    WORD32 i4_bit_depth;

    /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
    UWORD8 u1_chroma_array_type;

    /** weighted_pred_flag      */
    WORD8 i1_weighted_pred_flag;

    /** weighted_bipred_flag    */
    WORD8 i1_weighted_bipred_flag;

    /** Structure to describe extra CTBs around frame due to search
    range associated with distributed-mode. Entries are top, left,
    right and bottom */
    WORD32 ai4_tile_xtra_pel[4];

} inter_pred_ctxt_t;
/*IMPORTANT please keep inter_pred_ctxt_t and inter_pred_me_ctxt_t as identical*/

typedef IV_API_CALL_STATUS_T (*PF_LUMA_INTER_PRED_PU)(
    void *pv_inter_pred_ctxt,
    pu_t *ps_pu,
    void *pv_dst_buf,
    WORD32 dst_stride,
    WORD32 i4_flag_inter_pred_source);

/**
******************************************************************************
*  @brief  Motion predictor context structure
******************************************************************************
*/
typedef struct
{
    /** pointer to reference lists */
    recon_pic_buf_t *(*ps_ref_list)[HEVCE_MAX_REF_PICS * 2];

    /** pointer to the slice header */
    slice_header_t *ps_slice_hdr;

    /** pointer to SPS */
    sps_t *ps_sps;

    /** CTB x. In CTB unit*/
    WORD32 i4_ctb_x;

    /** CTB y. In CTB unit */
    WORD32 i4_ctb_y;

    /** Log2 Parallel Merge Level - 2  */
    WORD32 i4_log2_parallel_merge_level_minus2;

    /* Number of extra CTBs external to tile due to fetched search-range around Tile */
    /* TOP, left, right and bottom */
    WORD32 ai4_tile_xtra_ctb[4];

} mv_pred_ctxt_t;

/**
******************************************************************************
*  @brief  Deblocking and Boundary strength CTB level structure
******************************************************************************
*/
typedef struct
{
    /** Array to store the packed BS values in horizontal direction  */
    UWORD32 au4_horz_bs[(MAX_CTB_SIZE >> 3) + 1];

    /** Array to store the packed BS values in vertical direction  */
    UWORD32 au4_vert_bs[(MAX_CTB_SIZE >> 3) + 1];

    /** CTB neighbour availability flags for deblocking */
    UWORD8 u1_not_first_ctb_col_of_frame;
    UWORD8 u1_not_first_ctb_row_of_frame;

} deblk_bs_ctb_ctxt_t;

/**
******************************************************************************
*  @brief  Deblocking and CTB level structure
******************************************************************************
*/
typedef struct
{
    /**
    * BS of the last vertical 4x4 column of previous CTB
    */
    UWORD8 au1_prev_bs[MAX_CTB_SIZE >> 3];

    /**
    * BS of the last vertical 4x4 column of previous CTB
    */
    UWORD8 au1_prev_bs_uv[MAX_CTB_SIZE >> 3];

    /** pointer to top 4x4 ctb nbr structure; for accessing qp  */
    nbr_4x4_t *ps_top_ctb_nbr_4x4;

    /** pointer to left 4x4 ctb nbr structure; for accessing qp */
    nbr_4x4_t *ps_left_ctb_nbr_4x4;

    /** pointer to current 4x4 ctb nbr structure; for accessing qp */
    nbr_4x4_t *ps_cur_ctb_4x4;

    /** max of 8 such contiguous bs to be computed for 64x64 ctb */
    UWORD32 *pu4_bs_horz;

    /** max of 8 such contiguous bs to be computed for 64x64 ctb */
    UWORD32 *pu4_bs_vert;

    /** ptr to current ctb luma pel in frame */
    UWORD8 *pu1_ctb_y;

    UWORD16 *pu2_ctb_y;

    /** ptr to current ctb sp interleaved chroma pel in frame */
    UWORD8 *pu1_ctb_uv;

    UWORD16 *pu2_ctb_uv;

    func_selector_t *ps_func_selector;

    /** left nbr buffer stride in terms of 4x4 units */
    WORD32 i4_left_nbr_4x4_strd;

    /** current  buffer stride in terms of 4x4 units */
    WORD32 i4_cur_4x4_strd;

    /** size in pels 16 / 32 /64 */
    WORD32 i4_ctb_size;

    /** stride for luma       */
    WORD32 i4_luma_pic_stride;

    /** stride for  chroma */
    WORD32 i4_chroma_pic_stride;

    /** boolean indicating if left ctb edge is to be deblocked or not */
    WORD32 i4_deblock_left_ctb_edge;

    /** boolean indicating if top ctb edge is to be deblocked or not */
    WORD32 i4_deblock_top_ctb_edge;

    /** beta offset index */
    WORD32 i4_beta_offset_div2;

    /** tc offset index */
    WORD32 i4_tc_offset_div2;

    /** chroma cb qp offset index */
    WORD32 i4_cb_qp_indx_offset;

    /** chroma cr qp offset index */
    WORD32 i4_cr_qp_indx_offset;

    WORD32 i4_bit_depth;

    /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
    UWORD8 u1_chroma_array_type;

} deblk_ctb_params_t;

/**
******************************************************************************
*  @brief  Stores the BS and Qp of a CTB row. For CTB-row level deblocking
******************************************************************************
*/
typedef struct deblk_ctbrow_prms
{
    /**
    * Refer to ihevce_enc_loop_get_mem_recs() and
    * ihevce_enc_loop_init()for more info
    * regarding memory allocation to each one below.
    */

    /**
    * Stores the vertical boundary strength of a CTB row.
    */
    UWORD32 *pu4_ctb_row_bs_vert;

    /**
    * Storage is same as above. Contains horizontal BS.
    */
    UWORD32 *pu4_ctb_row_bs_horz;

    /**
    * Pointer to the CTB row's Qp storage
    */
    WORD8 *pi1_ctb_row_qp;

    /**
    * Stride of the pu1_ctb_row_qp_p buffer in WORD32 unit
    */
    WORD32 u4_qp_buffer_stride;

    /*
    *   Pointer to the  memory which contains the Qp of
    *   top4x4 neighbour blocks for each CTB row.
    *   This memory is at frame level.
    */
    WORD8 *api1_qp_top_4x4_ctb_row[MAX_NUM_ENC_LOOP_PARALLEL];

    /*
    *   Stride of the above memory location.
    *   Values in one-stride correspondes to one CTB row.
    */
    WORD32 u4_qp_top_4x4_buf_strd;

    /*size of frm level qp buffer*/
    WORD32 u4_qp_top_4x4_buf_size;

} deblk_ctbrow_prms_t;

/**
******************************************************************************
*  @brief  Entropy rd opt context for cabac bit estimation and RDO
******************************************************************************
*/
typedef struct rdopt_entropy_ctxt
{
    /**
    * array for entropy contexts during RD opt stage at CU level
    * one best and one current is required
    */
    entropy_context_t as_cu_entropy_ctxt[2];

    /**
    * init state of entropy context models during CU RD opt stage,
    * required for saving and restoring the cabac states
    */
    UWORD8 au1_init_cabac_ctxt_states[IHEVC_CAB_CTXT_END];

    /*
    * ptr to top row cu skip flags (1 bit per 8x8CU)
    */
    UWORD8 *pu1_cu_skip_top_row;

    /**
    * Current entropy ctxt idx
    */
    WORD32 i4_curr_buf_idx;

} rdopt_entropy_ctxt_t;

/**
******************************************************************************
*  @brief  structure to save predicted data from Inter SATD stage to Inter RD opt stage
******************************************************************************
*/
typedef struct
{
    /*Buffer to store the predicted data after motion compensation for merge and
    * skip candidates.
    * [2] Because for a given candidate we do motion compensation for 5 merge candidates.
    *     store the pred data after mc for the first 2 candidates and from 3rd candidate
    *     onwards, overwrite the data which has higher SATD cost.
    */
    void *apv_pred_data[2];

    /** Stride to store the predicted data
    */
    WORD32 i4_pred_data_stride;

} merge_skip_pred_data_t;
/**
******************************************************************************
*  @brief  Structure to hold Rate control related parameters
*          for each bit-rate instance and each thread
******************************************************************************
*/
typedef struct
{
    /**
    *frame level open loop intra sad
    *
    */
    LWORD64 i8_frame_open_loop_ssd;

    /**
    *frame level open loop intra sad
    *
    */
    UWORD32 u4_frame_open_loop_intra_sad;
    /**
    * frame level intra sad accumulator
    */
    UWORD32 u4_frame_intra_sad;

    /**
    *  frame level sad accumulator
    */
    UWORD32 u4_frame_sad_acc;

    /**
    *  frame level intra sad accumulator
    */
    UWORD32 u4_frame_inter_sad_acc;

    /**
    *  frame level inter sad accumulator
    */
    UWORD32 u4_frame_intra_sad_acc;

    /**
    *  frame level cost accumulator
    */
    LWORD64 i8_frame_cost_acc;

    /**
    *  frame level intra cost accumulator
    */
    LWORD64 i8_frame_inter_cost_acc;

    /**
    *  frame level inter cost accumulator
    */
    LWORD64 i8_frame_intra_cost_acc;

    /**
    * frame level rdopt bits accumulator
    */
    UWORD32 u4_frame_rdopt_bits;

    /**
    * frame level rdopt header bits accumulator
    */
    UWORD32 u4_frame_rdopt_header_bits;

    /* Sum the Qps of each 8*8 block in CU
    * 8*8 block is considered as Min CU size possible as per standard is 8
    * 0 corresponds to INTER and 1 corresponds to INTRA
    */
    WORD32 i4_qp_normalized_8x8_cu_sum[2];

    /* Count the number of 8x8 blocks in each CU type (INTER/INTRA)
    * 0 corresponds to INTER and 1 corresponds to INTRA
    */
    WORD32 i4_8x8_cu_sum[2];

    /* SAD/Qscale accumulated over all CUs. CU size is inherently
    * taken care in SAD
    */
    LWORD64 i8_sad_by_qscale[2];

} enc_loop_rc_params_t;
/**
******************************************************************************
*  @brief  CU information structure. This is to store the
*  CU final out after Recursion
******************************************************************************
*/
typedef struct ihevce_enc_cu_node_ctxt_t
{
    /* CU params */
    /** CU X position in terms of min CU (8x8) units */
    UWORD8 b3_cu_pos_x : 3;

    /** CU Y position in terms of min CU (8x8) units */
    UWORD8 b3_cu_pos_y : 3;

    /** reserved bytes */
    UWORD8 b2_reserved : 2;

    /** CU size 2N (width or height) in pixels */
    UWORD8 u1_cu_size;

    /**
    * array for storing cu level final params for a given mode
    * one best and one current is required
    */
    enc_loop_cu_final_prms_t s_cu_prms;

    /**
    * array for storing cu level final params for a given mode
    * one best and one current is required
    */
    enc_loop_cu_final_prms_t *ps_cu_prms;

    /* flag to indicate if current CU is the first
    CU of the Quantisation group*/
    UWORD32 b1_first_cu_in_qg : 1;

    /** qp used during for CU
    * @remarks :
    */
    WORD8 i1_cu_qp;

} ihevce_enc_cu_node_ctxt_t;

typedef struct
{
    WORD32 i4_sad;

    WORD32 i4_mv_cost;

    WORD32 i4_tot_cost;

    WORD8 i1_ref_idx;

    mv_t s_mv;

} block_merge_nodes_t;

/**
******************************************************************************
*  @brief  This struct is used for storing output of block merge
******************************************************************************
*/
typedef struct
{
    block_merge_nodes_t *aps_best_results[MAX_NUM_PARTS];

    /* Contains the best uni dir for each partition type */
    WORD32 ai4_best_uni_dir[MAX_NUM_PARTS];

    /* Contains the best pred dir for each partition type */
    WORD32 ai4_best_pred_dir[MAX_NUM_PARTS];

    WORD32 i4_tot_cost;

    PART_TYPE_T e_part_type;
} block_merge_results_t;

/**
******************************************************************************
*  @brief  This struct is used for storing output of block merge and also
*          all of the intermediate results required
******************************************************************************
*/
typedef struct
{
    block_merge_results_t as_best_results[3 + 1][NUM_BEST_ME_OUTPUTS];

    block_merge_nodes_t as_nodes[3][TOT_NUM_PARTS][NUM_BEST_ME_OUTPUTS];

    WORD32 part_mask;

    WORD32 num_results_per_part;

    WORD32 num_best_results;

    /**
    * Overall best CU cost, while other entries store CU costs
    * in single direction, this is best CU cost, where each
    * partition cost is evaluated as best of uni/bi
    */
    WORD32 best_cu_cost;

} block_merge_data_t;
/**
******************************************************************************
*  @brief  CU nbr information structure. This is to store the
*  neighbour information for final reconstruction function
******************************************************************************
*/
typedef struct
{
    /* Pointer to top-left nbr */
    nbr_4x4_t *ps_topleft_nbr_4x4;
    /* Pointer to left nbr */
    nbr_4x4_t *ps_left_nbr_4x4;
    /* Pointer to top nbr */
    nbr_4x4_t *ps_top_nbr_4x4;
    /* stride of left_nbr_4x4 */
    WORD32 nbr_4x4_left_strd;

    /* Pointer to CU top */
    UWORD8 *pu1_cu_top;

    UWORD16 *pu2_cu_top;

    /* Pointer to CU top-left */
    UWORD8 *pu1_cu_top_left;

    UWORD16 *pu2_cu_top_left;

    /* Pointer to CU left */
    UWORD8 *pu1_cu_left;

    UWORD16 *pu2_cu_left;

    /* stride of left pointer */
    WORD32 cu_left_stride;
} cu_nbr_prms_t;

/** Structure to save the flags required for Final mode Reconstruction
function. These flags are set based on quality presets and
the bit-rate we are working on */
typedef struct
{
    /** Flag to indicate whether Luma pred data need to recomputed in the
    final_recon function. Now disabled for all modes */
    UWORD8 u1_eval_luma_pred_data;

    /** Flag to indicate whether Chroma pred data need to recomputed in the
    final_recon function. Now disabled for MedSpeed only */
    UWORD8 u1_eval_chroma_pred_data;

    /** Flag to indicate whether header data need to recomputed in the
    final_recon function. Now disabled for all modes */
    UWORD8 u1_eval_header_data;

    UWORD8 u1_eval_recon_data;
} cu_final_recon_flags_t;

/**
******************************************************************************
*  @brief  structure to save pred data of ME cand. 1 ping-pong to store the
*  the best and current luma cand. 1 buffer to store the best chroma pred
******************************************************************************
*/
typedef struct
{
    /** Pointers to store luma pred data of me/intra cand.(2) and chroma(1) */
    UWORD8 *pu1_pred_data[NUM_CU_ME_INTRA_PRED_IDX];

    UWORD16 *pu2_pred_data[NUM_CU_ME_INTRA_PRED_IDX];

    /** Stride to store the predicted data of me/intra cand.(2) and chroma(1) */
    WORD32 ai4_pred_data_stride[NUM_CU_ME_INTRA_PRED_IDX];
    /** Counter saying how many pointers are assigned */
    WORD32 i4_pointer_count;

} cu_me_intra_pred_prms_t;

/**
******************************************************************************
*  @brief  Chroma RDOPT context structure
******************************************************************************
*/
typedef struct
{
    /** Storing the inverse quantized data (cb) for the special modes*/
    WORD16 ai2_iq_data_cb[(MAX_TU_SIZE * MAX_TU_SIZE) << 1];

    /** Storing the inverse quantized data (cr) for the special modes*/
    WORD16 ai2_iq_data_cr[(MAX_TU_SIZE * MAX_TU_SIZE) << 1];

    /** Storing the scan coeffs (cb) for the special modes*/
    UWORD8 au1_scan_coeff_cb[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4];

    /** Storing the scan coeffs (cb) for the special modes*/
    UWORD8 au1_scan_coeff_cr[2][(MAX_TU_IN_CTB >> 1) * MAX_SCAN_COEFFS_BYTES_4x4];

    /** Max number of bytes filled in scan coeff data (cb) per TU*/
    WORD32 ai4_num_bytes_scan_coeff_cb_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Max number of bytes filled in scan coeff data (cr) per TU*/
    WORD32 ai4_num_bytes_scan_coeff_cr_per_tu[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Stride of the iq buffer*/
    WORD32 i4_iq_buff_stride;

    /** Storing the pred data
    The predicted data is always interleaved. Therefore the size of this array will be
    ((MAX_TU_SIZE * MAX_TU_SIZE) >> 2) * 2)*/
    void *pv_pred_data;

    /** Predicted data stride*/
    WORD32 i4_pred_stride;

    /** Storing the cbfs for each tu
    For 1 tu case, only the 0th element will be valid*/
    UWORD8 au1_cbf_cb[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Storing the cbfs for each tu
    For 1 tu case, only the 0th element will be valid*/
    UWORD8 au1_cbf_cr[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** To store the cabac ctxt model updated by the RDOPT of best chroma mode
    [0] : for 1 TU case, [1] : for 4 TU case */
    UWORD8 au1_chrm_satd_updated_ctxt_models[IHEVC_CAB_CTXT_END];

    /** Best SATD chroma mode, [0] : for 1 TU case (TU_EQ_CU) , [1] : for 4 TU case
    Values : 0(PLANAR), 1(VERT), 2(HOR), 3(DC) chroma mode per each TU */
    UWORD8 u1_best_cr_mode;

    /** Best SATD chroma mode's RDOPT cost, [0] : for 1 TU case, [1] : for 4 TU case */
    LWORD64 i8_chroma_best_rdopt;

    /* Account for coding b3_chroma_intra_pred_mode prefix and suffix bins */
    /* This is done by adding the bits for signalling chroma mode (0-3)    */
    /* and subtracting the bits for chroma mode same as luma mode (4)      */
    LWORD64 i8_cost_to_encode_chroma_mode;

    /** Best SATD chroma mode's tu bits, [0] : for 1 TU case, [1] : for 4 TU case */
    WORD32 i4_chrm_tu_bits;

    /** Storing the zero col values for each TU for cb*/
    WORD32 ai4_zero_col_cb[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Storing the zero col values for each TU for cr*/
    WORD32 ai4_zero_col_cr[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Storing the zero row values for each TU for cb*/
    WORD32 ai4_zero_row_cb[2][MAX_TU_IN_TU_EQ_DIV_2];

    /** Storing the zero row values for each TU for cr*/
    WORD32 ai4_zero_row_cr[2][MAX_TU_IN_TU_EQ_DIV_2];
} chroma_intra_satd_ctxt_t;

/**
******************************************************************************
*  @brief  Chroma RDOPT context structure
******************************************************************************
*/
typedef struct
{
    /** Chroma SATD context structure. It is an array of two to account for the TU_EQ_CU candidate
    and the TU_EQ_CU_DIV2 candidate*/
    chroma_intra_satd_ctxt_t as_chr_intra_satd_ctxt[NUM_POSSIBLE_TU_SIZES_CHR_INTRA_SATD];

    /** Chroma SATD has has to be evaluated only for the HIGH QUALITY */
    UWORD8 u1_eval_chrm_satd;

    /** Chroma RDOPT has to be evaluated only for the HIGH QUALITY / MEDIUM SPEED preset */
    UWORD8 u1_eval_chrm_rdopt;

} ihevce_chroma_rdopt_ctxt_t;

typedef struct
{
    inter_cu_results_t s_cu_results;

    inter_pu_results_t s_pu_results;
} block_merge_output_t;

/**
******************************************************************************
*  @brief  Structure to store the Merge/Skip Cand. for EncLoop
******************************************************************************
*/
typedef struct
{
    /** List of all  merge/skip candidates to be evalauted (SATD/RDOPT) for
    * this CU
    */
    cu_inter_cand_t as_cu_inter_merge_skip_cand[MAX_NUM_CU_MERGE_SKIP_CAND];

    /** number of merge/skip candidates
    */
    UWORD8 u1_num_merge_cands;

    UWORD8 u1_num_skip_cands;

    UWORD8 u1_num_merge_skip_cands;

} cu_inter_merge_skip_t;

/** Structure to store the Mixed mode Cand. for EncLoop */
typedef struct
{
    cu_inter_cand_t as_cu_data[MAX_NUM_MIXED_MODE_INTER_RDO_CANDS];

    UWORD8 u1_num_mixed_mode_type0_cands;

    UWORD8 u1_num_mixed_mode_type1_cands;

} cu_mixed_mode_inter_t;

typedef struct
{
    /* +2 because an additional buffer is required for */
    /* storing both cur and best during merge eval */
    void *apv_inter_pred_data[MAX_NUM_INTER_RDO_CANDS + 4];

    /* Bit field used to determine the indices of free bufs in 'apv_pred_data' buf array */
    UWORD32 u4_is_buf_in_use;

    /* Assumption is that the same stride is used for the */
    /* entire set of buffers above and is equal to the */
    /* CU size */
    WORD32 i4_pred_stride;

} ihevce_inter_pred_buf_data_t;
/** Structure to store the Inter Cand. info in EncLoop */
typedef struct
{
    cu_inter_cand_t *aps_cu_data[MAX_NUM_INTER_RDO_CANDS];

    UWORD32 au4_cost[MAX_NUM_INTER_RDO_CANDS];

    UWORD8 au1_pred_buf_idx[MAX_NUM_INTER_RDO_CANDS];

    UWORD32 u4_src_variance;

    UWORD8 u1_idx_of_worst_cost_in_cost_array;

    UWORD8 u1_idx_of_worst_cost_in_pred_buf_array;

    UWORD8 u1_num_inter_cands;

} inter_cu_mode_info_t;
typedef struct
{
    /*Frame level base pointer of buffers for each ctb row to store the top pixels
    *and top left pixel for the next ctb row.These buffers are common accross all threads
    */
    UWORD8 *apu1_sao_src_frm_top_luma[MAX_NUM_ENC_LOOP_PARALLEL];
    /*Ctb level pointer to buffer to store the top pixels
    *and top left pixel for the next ctb row.These buffers are common accross all threads
    */
    UWORD8 *pu1_curr_sao_src_top_luma;
    /*Buffer to store the left boundary before
    * doing sao on current ctb for the next ctb in the current row
    */
    UWORD8 au1_sao_src_left_luma[MAX_CTB_SIZE];
    /*Frame level base pointer of buffers for each ctb row to store the top pixels
    *and top left pixel for the next ctb row.These buffers are common accross all threads
    */
    UWORD8 *apu1_sao_src_frm_top_chroma[MAX_NUM_ENC_LOOP_PARALLEL];

    WORD32 i4_frm_top_chroma_buf_stride;

    /*Ctb level pointer to buffer to store the top chroma pixels
    *and top left pixel for the next ctb row.These buffers are common accross all threads
    */
    UWORD8 *pu1_curr_sao_src_top_chroma;

    /*Scratch buffer to store the left boundary before
    * doing sao on current ctb for the next ctb in the current row
    */
    UWORD8 au1_sao_src_left_chroma[MAX_CTB_SIZE * 2];

    /**
    * Luma recon buffer
    */
    UWORD8 *pu1_frm_luma_recon_buf;
    /**
    * Chroma recon buffer
    */
    UWORD8 *pu1_frm_chroma_recon_buf;
    /**
    * Luma recon buffer for curr ctb
    */
    UWORD8 *pu1_cur_luma_recon_buf;
    /**
    * Chroma recon buffer for curr ctb
    */
    UWORD8 *pu1_cur_chroma_recon_buf;
    /**
    * Luma src buffer
    */
    UWORD8 *pu1_frm_luma_src_buf;
    /**
    * Chroma src buffer
    */
    UWORD8 *pu1_frm_chroma_src_buf;
    /**
    * Luma src(input yuv) buffer for curr ctb
    */
    UWORD8 *pu1_cur_luma_src_buf;
    /**
    * Chroma src buffer for curr ctb
    */
    UWORD8 *pu1_cur_chroma_src_buf;
    /* Left luma scratch buffer required for sao RD optimisation*/
    UWORD8 au1_left_luma_scratch[MAX_CTB_SIZE];

    /* Left chroma scratch buffer required for sao RD optimisation*/
    /* Min size required= MAX_CTB_SIZE/2 * 2
    * Multiplied by 2 because size reuired is MAX_CTB_SIZE/2 each for U and V
    */
    UWORD8 au1_left_chroma_scratch[MAX_CTB_SIZE * 2];

    /* Top luma scratch buffer required for sao RD optimisation*/
    UWORD8 au1_top_luma_scratch[MAX_CTB_SIZE + 2];  // +1 for top left pixel and +1 for top right

    /* Top chroma scratch buffer required for sao RD optimisation*/
    UWORD8 au1_top_chroma_scratch[MAX_CTB_SIZE + 4];  // +2 for top left pixel and +2 for top right

    /* Scratch buffer to store the sao'ed output during sao RD optimisation*/
    /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence
    MAX_CTB _SIZE + 4*/
    UWORD8 au1_sao_luma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)];

    /* Scratch buffer to store the sao'ed output during sao RD optimisation*/
    /* One extra row(bot pixels) is copied to scratch buf but 2d buf copy func copies multiple of 4 ,hence
    MAX_CTB _SIZE + 4*/
    UWORD8 au1_sao_chroma_scratch[PING_PONG][SCRATCH_BUF_STRIDE * (MAX_CTB_SIZE + 4)];

    /**
    * CTB size
    */
    WORD32 i4_ctb_size;
    /**
    * Luma recon buffer stride
    */
    WORD32 i4_frm_luma_recon_stride;
    /**
    * Chroma recon buffer stride
    */
    WORD32 i4_frm_chroma_recon_stride;
    /**
    * Luma recon buffer stride for curr ctb
    */
    WORD32 i4_cur_luma_recon_stride;
    /**
    * Chroma recon buffer stride for curr ctb
    */
    WORD32 i4_cur_chroma_recon_stride;
    /**
    * Luma src buffer stride
    */
    WORD32 i4_frm_luma_src_stride;
    /**
    * Chroma src buffer stride
    */
    WORD32 i4_frm_chroma_src_stride;

    WORD32 i4_frm_top_luma_buf_stride;
    /**
    * Luma src buffer stride for curr ctb
    */
    WORD32 i4_cur_luma_src_stride;
    /**
    * Chroma src buffer stride for curr ctb
    */
    WORD32 i4_cur_chroma_src_stride;

    /* Top luma buffer size */
    WORD32 i4_top_luma_buf_size;

    /* Top Chroma buffer size */
    WORD32 i4_top_chroma_buf_size;

    /*** Number of CTB units **/
    WORD32 i4_num_ctb_units;

    /**
    * CTB x pos
    */
    WORD32 i4_ctb_x;
    /**
    * CTB y pos
    */
    WORD32 i4_ctb_y;
    /* SAO block width*/
    WORD32 i4_sao_blk_wd;

    /* SAO block height*/
    WORD32 i4_sao_blk_ht;

    /* Last ctb row flag*/
    WORD32 i4_is_last_ctb_row;

    /* Last ctb col flag*/
    WORD32 i4_is_last_ctb_col;

    /* CTB aligned width */
    UWORD32 u4_ctb_aligned_wd;

    /* Number of ctbs in a row*/
    UWORD32 u4_num_ctbs_horz;

    UWORD32 u4_num_ctbs_vert;
    /**
    * Closed loop SSD Lambda
    * This is multiplied with bits for RD cost computations in SSD mode
    * This is represented in q format with shift of LAMBDA_Q_SHIFT
    */
    LWORD64 i8_cl_ssd_lambda_qf;

    /**
    * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp)
    * This is multiplied with bits for RD cost computations in SSD mode
    * This is represented in q format with shift of LAMBDA_Q_SHIFT
    */
    LWORD64 i8_cl_ssd_lambda_chroma_qf;
    /**
    * Pointer to current PPS
    */
    pps_t *ps_pps;  //not used currently
    /**
    * Pointer to current SPS
    */
    sps_t *ps_sps;

    /**
    * Pointer to current slice header structure
    */
    slice_header_t *ps_slice_hdr;
    /**
    * Pointer to current frame ctb out array of structures
    */
    ctb_enc_loop_out_t *ps_ctb_out;
    /**
    *  context for cabac bit estimation used during rdopt stage
    */
    rdopt_entropy_ctxt_t *ps_rdopt_entropy_ctxt;
    /**
    * Pointer to sao_enc_t for the current ctb
    */
    sao_enc_t *ps_sao;
    /*
    * Pointer to an array to store the sao information of the top ctb
    * This is required for to decide top merge
    */
    sao_enc_t *aps_frm_top_ctb_sao[MAX_NUM_ENC_LOOP_PARALLEL];

    /*
    * Pointer to structure to store the sao parameters of (x,y)th ctb
    * for top merge of (x,y+1)th ctb
    */
    sao_enc_t *ps_top_ctb_sao;

    /* structure to store the sao parameters of (x,y)th ctb for
    * the left merge of (x+1,y)th ctb
    */
    sao_enc_t s_left_ctb_sao;

    /* Array of structures for SAO RDO candidates*/
    sao_enc_t as_sao_rd_cand[MAX_SAO_RD_CAND];

    /** array of function pointers for luma sao */
    pf_sao_luma apf_sao_luma[4];

    /** array of function pointers for chroma sao */
    pf_sao_chroma apf_sao_chroma[4];

    /* Flag to do SAO luma and chroma filtering*/
    WORD8 i1_slice_sao_luma_flag;

    WORD8 i1_slice_sao_chroma_flag;

#if DISABLE_SAO_WHEN_NOISY
    ctb_analyse_t *ps_ctb_data;

    WORD32 i4_ctb_data_stride;
#endif

    ihevce_cmn_opt_func_t *ps_cmn_utils_optimised_function_list;

} sao_ctxt_t;

/**
******************************************************************************
*  @brief  Encode loop module context structure
******************************************************************************
*/
typedef struct
{
#if ENABLE_TU_TREE_DETERMINATION_IN_RDOPT
    void *pv_err_func_selector;
#endif

    /**
    * Quality preset for comtrolling numbe of RD opt cand
    * @sa : IHEVCE_QUALITY_CONFIG_T
    */
    WORD32 i4_quality_preset;
    /**
    *
    *
    */
    WORD32 i4_rc_pass;
    /**
    * Lamda to be mulitplied with bits for SATD
    * should be equal to Lamda*Qp
    */
    WORD32 i4_satd_lamda;

    /**
    * Lamda to be mulitplied with bits for SAD
    * should be equal to Lamda*Qp
    */
    WORD32 i4_sad_lamda;

    /**
    * Closed loop SSD Lambda
    * This is multiplied with bits for RD cost computations in SSD mode
    * This is represented in q format with shift of LAMBDA_Q_SHIFT
    */
    LWORD64 i8_cl_ssd_lambda_qf;

    /**
    * Closed loop SSD Lambda for chroma (chroma qp is different from luma qp)
    * This is multiplied with bits for RD cost computations in SSD mode
    * This is represented in q format with shift of LAMBDA_Q_SHIFT
    */
    LWORD64 i8_cl_ssd_lambda_chroma_qf;

    /**
    * Ratio of Closed loop SSD Lambda and Closed loop SSD Lambda for chroma
    * This is multiplied with (1 << CHROMA_COST_WEIGHING_FACTOR_Q_SHIFT)
    * to keep the precision of the ratio
    */
    UWORD32 u4_chroma_cost_weighing_factor;
    /**
    * Frame level QP to be used
    */
    WORD32 i4_frame_qp;

    WORD32 i4_frame_mod_qp;

    WORD32 i4_frame_qstep;

    UWORD8 u1_max_tr_depth;

    /**
    * CU level Qp
    */
    WORD32 i4_cu_qp;

    /**
    * CU level Qp / 6
    */
    WORD32 i4_cu_qp_div6;

    /**
    * CU level Qp % 6
    */
    WORD32 i4_cu_qp_mod6;

    /**
    *  CU level QP to be used
    */
    WORD32 i4_chrm_cu_qp;

    /**
    * CU level Qp / 6
    */
    WORD32 i4_chrm_cu_qp_div6;

    /**
    * CU level Qp % 6
    */
    WORD32 i4_chrm_cu_qp_mod6;

    /** previous cu qp
    * @remarks : This needs to be remembered to handle skip cases in deblocking.
    */
    WORD32 i4_prev_cu_qp;

    /** chroma qp offset
    * @remarks : Used to calculate chroma qp and other qp related parameter at CU level
    */
    WORD32 i4_chroma_qp_offset;

    /**
    * Buffer Pointer to populate the scale matrix for all transform size
    */
    WORD16 *pi2_scal_mat;

    /**
    * Buffer Pointer to populate the rescale matrix for all transform size
    */
    WORD16 *pi2_rescal_mat;

    /** array of pointer to store the scaling matrices for
    *  all transform sizes and qp % 6 (pre computed)
    */
    WORD16 *api2_scal_mat[NUM_TRANS_TYPES * 2];

    /** array of pointer to store the re-scaling matrices for
    *  all transform sizes and qp % 6 (pre computed)
    */
    WORD16 *api2_rescal_mat[NUM_TRANS_TYPES * 2];

    /** array of function pointers for residual and
    *  forward transform for all transform sizes
    */
    pf_res_trans_luma apf_resd_trns[NUM_TRANS_TYPES];

    /** array of function pointers for residual and
    *  forward HAD transform for all transform sizes
    */
    pf_res_trans_luma_had_chroma apf_chrm_resd_trns_had[NUM_TRANS_TYPES - 2];

    /** array of function pointers for residual and
    *  forward transform for all transform sizes
    *  for chroma
    */
    pf_res_trans_chroma apf_chrm_resd_trns[NUM_TRANS_TYPES - 2];

    /** array of function pointers for qunatization and
    *  inv Quant for ssd calc. for all transform sizes
    */
    pf_quant_iquant_ssd apf_quant_iquant_ssd[4];

    /** array of function pointers for inv.transform and
    *  recon for all transform sizes
    */
    pf_it_recon apf_it_recon[NUM_TRANS_TYPES];

    /** array of function pointers for inverse transform
    * and recon for all transform sizes for chroma
    */
    pf_it_recon_chroma apf_chrm_it_recon[NUM_TRANS_TYPES - 2];

    /** array of luma intra prediction function pointers */
    pf_intra_pred apf_lum_ip[NUM_IP_FUNCS];

    /** array of chroma intra prediction function pointers */
    pf_intra_pred apf_chrm_ip[NUM_IP_FUNCS];

    /* - Function pointer to cu_mode_decide function */
    /* - The 'void *' is used since one of the parameters of */
    /* this class of functions is the current structure */
    /* - This function pointer is used to choose the */
    /* appropriate function depending on whether bit_depth is */
    /* chosen as 8 bits or greater */
    /* - This function pointer's type is defined at the end */
    /* of this file */
    void *pv_cu_mode_decide;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_inter_rdopt_cu_mc_mvp;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_inter_rdopt_cu_ntu;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_intra_chroma_pred_mode_selector;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_intra_rdopt_cu_ntu;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_final_rdopt_mode_prcs;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_store_cu_results;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_enc_loop_cu_bot_copy;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_final_mode_reevaluation_with_modified_cu_qp;

    /* Infer from the comment for the variable 'pv_cu_mode_decide' */
    void *pv_enc_loop_ctb_left_copy;

    /** Qunatization rounding factor for inter and intra CUs */
    WORD32 i4_quant_rnd_factor[2];

    /**
    * Frame Buffer Pointer to store the top row luma data.
    * one pixel row in every ctb row
    */
    void *apv_frm_top_row_luma[MAX_NUM_ENC_LOOP_PARALLEL];

    /**
    * One CTB row size of Top row luma data buffer
    */
    WORD32 i4_top_row_luma_stride;

    /**
    * One frm of Top row luma data buffer
    */
    WORD32 i4_frm_top_row_luma_size;

    /**
    * Current luma row bottom data store pointer
    */
    void *pv_bot_row_luma;

    /**
    * Top luma row top data access pointer
    */
    void *pv_top_row_luma;

    /**
    * Frame Buffer Pointer to store the top row chroma data (Cb  Cr pixel interleaved )
    * one pixel row in every ctb row
    */
    void *apv_frm_top_row_chroma[MAX_NUM_ENC_LOOP_PARALLEL];

    /**
    * One CTB row size of Top row chroma data buffer (Cb  Cr pixel interleaved )
    */
    WORD32 i4_top_row_chroma_stride;

    /**
    * One frm size of Top row chroma data buffer (Cb  Cr pixel interleaved )
    */
    WORD32 i4_frm_top_row_chroma_size;

    /**
    * Current chroma row bottom data store pointer
    */
    void *pv_bot_row_chroma;

    /**
    * Top chroma row top data access pointer
    */
    void *pv_top_row_chroma;

    /**
    * Frame Buffer Pointer to store the top row neighbour modes stored at 4x4 level
    * one 4x4 row in every ctb row
    */
    nbr_4x4_t *aps_frm_top_row_nbr[MAX_NUM_ENC_LOOP_PARALLEL];

    /**
    * One CTB row size of Top row nbr 4x4 params buffer
    */
    WORD32 i4_top_row_nbr_stride;

    /**
    * One frm size of Top row nbr 4x4 params buffer
    */
    WORD32 i4_frm_top_row_nbr_size;

    /**
    * Current row nbr prms bottom data store pointer
    */
    nbr_4x4_t *ps_bot_row_nbr;

    /**
    * Top row nbr prms top data access pointer
    */
    nbr_4x4_t *ps_top_row_nbr;

    /**
    * Pointer to (1,1) location in au1_nbr_ctb_map
    */
    UWORD8 *pu1_ctb_nbr_map;

    /**
    * neigbour map buffer stride;
    */
    WORD32 i4_nbr_map_strd;

    /**
    * Array at ctb level to store the neighour map
    * its size is 25x25 for ctb size of 64x64
    */
    UWORD8 au1_nbr_ctb_map[MAX_PU_IN_CTB_ROW + 1 + 8][MAX_PU_IN_CTB_ROW + 1 + 8];

    /**
    * Array to store left ctb data for luma
    * some padding is added to take care of unconditional access
    */
    void *pv_left_luma_data;

    /**
    * Array to store left ctb data for chroma (cb abd cr pixel interleaved
    * some padding is added to take care of unconditional access
    */
    void *pv_left_chrm_data;

    /**
    * Array to store the left neighbour modes at 4x4 level
    */
    nbr_4x4_t as_left_col_nbr[MAX_PU_IN_CTB_ROW];

    /**
    * Array to store currrent CTb pred modes at a 4x4 level
    * used for prediction inside ctb
    */
    nbr_4x4_t as_ctb_nbr_arr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];

    /**
    * array for storing csbf during RD opt stage at CU level
    * one best and one current is required
    */
    UWORD8 au1_cu_csbf[MAX_TU_IN_CTB_ROW * MAX_TU_IN_CTB_ROW];

    /**
    * Stride of csbf buffer. will be useful for scanning access
    * if stored in a 2D order. right now set to max tx size >> 4;
    */
    WORD32 i4_cu_csbf_strd;

    /**
    * Array to store pred modes  during SATD and RD opt stage at CU level
    * one best and one current is required
    */
    nbr_4x4_t as_cu_nbr[2][MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];

    /**
    * array to store the output of reference substitution process output
    * for intra CUs
    * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3)
    */
    void *pv_ref_sub_out;

    /**
    * array to store the filtered reference samples for intra CUs
    * TOP (32 x 2) + Left (32 x 2) + Top left (1) + Alignment (3)
    */
    void *pv_ref_filt_out;

    /**
    * Used for 3 purposes
    *
    * 1. MC Intermediate buffer
    * array for storing intermediate 16-bit value for hxhy subpel
    * generation at CTB level (+ 16) for subpel planes boundary
    * +4 is for horizontal 4pels
    *
    * 2. Temprory scratch buffer for transform and coeffs storage
    * MAX_TRANS_SIZE *2 for trans_scratch(32bit) and MAX_TRANS_SIZE *1 for trans_values
    * The first part i.e. from 0 to MAX_TRANS_SIZE is then reused for storing the quant coeffs
    * Max of both are used
    *
    * 3. MC Intermediate buffer
    * buffer for storing intermediate 16 bit values prior to conversion to 8bit in HBD
    *
    */
    MEM_ALIGN16 WORD16 ai2_scratch[(MAX_CTB_SIZE + 8 + 8) * (MAX_CTB_SIZE + 8 + 8 + 8) * 2];

    /**
    * array for storing cu level final params for a given mode
    * one best and one current is required
    */
    enc_loop_cu_final_prms_t as_cu_prms[2];

    /**
    * Scan index to be used for any gien transform
    * this is a scartch variable used to communicate
    * scan idx at every transform level
    */
    WORD32 i4_scan_idx;

    /**
    * Buffer index in ping pong buffers
    * to be used SATD mode evaluations
    */
    WORD32 i4_satd_buf_idx;

    /**
    * Motion Compensation module context structre
    */
    inter_pred_ctxt_t s_mc_ctxt;

    /**
    * MV pred module context structre
    */
    mv_pred_ctxt_t s_mv_pred_ctxt;

    /**
    * Deblock BS ctb structure
    */
    deblk_bs_ctb_ctxt_t s_deblk_bs_prms;

    /**
    * Deblocking ctb structure
    */
    deblk_ctb_params_t s_deblk_prms;

    /**
    * Deblocking structure. For ctb-row level
    */
    deblk_ctbrow_prms_t s_deblk_ctbrow_prms;

    /**
    * Deblocking enable flag
    */
    WORD32 i4_deblock_type;

    /**
    *  context for cabac bit estimation used during rdopt stage
    */
    rdopt_entropy_ctxt_t s_rdopt_entropy_ctxt;

    /**
    * Context models stored for RDopt store and restore purpose
    */
    UWORD8 au1_rdopt_init_ctxt_models[IHEVC_CAB_CTXT_END];

    /**
    * current picture slice type
    */
    WORD8 i1_slice_type;

    /**
    * strong_intra_smoothing_enable_flag
    */
    WORD8 i1_strong_intra_smoothing_enable_flag;

    /** Pointer to Dep Mngr for controlling Top-Right CU dependency */
    void *pv_dep_mngr_enc_loop_cu_top_right;

    /** Pointer to Dep Mngr for controlling Deblocking Top dependency */
    void *pv_dep_mngr_enc_loop_dblk;

    /** pointer to store the cabac states at end of second CTB in current row */
    UWORD8 *pu1_curr_row_cabac_state;

    /** pointer to copy the cabac states at start of first CTB in current row */
    UWORD8 *pu1_top_rt_cabac_state;
    /** flag to indicate rate control mode.
    * @remarks :  To enable CU level qp modulation only when required.
    */
    WORD8 i1_cu_qp_delta_enable;

    /** flag to indicate rate control mode.
    * @remarks :  Entropy sync enable flag
    */
    WORD8 i1_entropy_coding_sync_enabled_flag;

    /** Use SATD or SAD for best merge candidate evaluation */
    WORD32 i4_use_satd_for_merge_eval;

    UWORD8 u1_use_early_cbf_data;

    /** Use SATD or SAD for best CU merge candidate evaluation */
    WORD32 i4_use_satd_for_cu_merge;

    /** Maximum number of merge candidates to be evaluated */
    WORD32 i4_max_merge_candidates;

    /** Flag to indicate whether current pictute needs to be deblocked,
    padded and hpel planes need to be generated.
    These are turned off typically in non referecne pictures when psnr
    and recon dump is disabled
    */
    WORD32 i4_deblk_pad_hpel_cur_pic;

    /* Array of structures for storing mc predicted data for
    * merge and skip modes
    */
    merge_skip_pred_data_t as_merge_skip_pred_data[MAX_NUM_CU_MERGE_SKIP_CAND];

    /* Sum the Qps of each 8*8 block in CU
    * 8*8 block is considered as Min CU size possible as per standard is 8
    * 0 corresponds to INTER and 1 corresponds to INTRA
    */
    LWORD64 i8_cl_ssd_lambda_qf_array[MAX_HEVC_QP_12bit + 1];
    UWORD32 au4_chroma_cost_weighing_factor_array[MAX_HEVC_QP_12bit + 1];
    LWORD64 i8_cl_ssd_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1];
    WORD32 i4_satd_lamda_array[MAX_HEVC_QP_12bit + 1];
    WORD32 i4_sad_lamda_array[MAX_HEVC_QP_12bit + 1];

    /************************************************************************/
    /* The fields with the string 'type2' in their names are required */
    /* when both 8bit and hbd lambdas are needed. The lambdas corresponding */
    /* to the bit_depth != internal_bit_depth are stored in these fields */
    /************************************************************************/
    LWORD64 i8_cl_ssd_type2_lambda_qf_array[MAX_HEVC_QP_12bit + 1];
    LWORD64 i8_cl_ssd_type2_lambda_chroma_qf_array[MAX_HEVC_QP_12bit + 1];
    WORD32 i4_satd_type2_lamda_array[MAX_HEVC_QP_12bit + 1];
    WORD32 i4_sad_type2_lamda_array[MAX_HEVC_QP_12bit + 1];

    /* Lokesh: Added to find if the CU is the first to be coded in the group */
    WORD32 i4_is_first_cu_qg_coded;

    /* Chroma RDOPT related parameters */
    ihevce_chroma_rdopt_ctxt_t s_chroma_rdopt_ctxt;

    /* Structure to save pred data of ME/Intra cand */
    cu_me_intra_pred_prms_t s_cu_me_intra_pred_prms;

    /* Structure to save the flags required for Final mode Reconstruction
    function. These flags are set based on quality presets and bit-rate
    we are working on */
    cu_final_recon_flags_t s_cu_final_recon_flags;

    /* Parameter to how at which level RDOQ will be implemented:
    0 - RDOQ disbaled
    1 - RDOQ enabled during RDOPT for all candidates
    2 - RDOQ enabled only for the final candidate*/
    WORD32 i4_rdoq_level;

    /* Parameter to how at which level Quant rounding factors are computed:
    FIXED_QUANT_ROUNDING       : Fixed Quant rounding values are used
    NCTB_LEVEL_QUANT_ROUNDING  : NCTB level Cmputed Quant rounding values are used
    CTB_LEVEL_QUANT_ROUNDING   : CTB level Cmputed Quant rounding values are used
    CU_LEVEL_QUANT_ROUNDING    : CU level Cmputed Quant rounding values are used
    TU_LEVEL_QUANT_ROUNDING    : TU level Cmputed Quant rounding values are used*/
    WORD32 i4_quant_rounding_level;

    /* Parameter to how at which level Quant rounding factors are computed:
    CHROMA_QUANT_ROUNDING    : Chroma Quant rounding values are used for chroma */
    WORD32 i4_chroma_quant_rounding_level;

    /* Parameter to how at which level RDOQ will be implemented:
    0 - SBH disbaled
    1 - SBH enabled during RDOPT for all candidates
    2 - SBH enabled only for the final candidate*/
    WORD32 i4_sbh_level;

    /* Parameter to how at which level ZERO CBF RDO will be implemented:
    0 - ZCBF disbaled
    1 - ZCBF enabled during RDOPT for all candidates
    2 - ZCBF enabled only for the final candidate
    */
    WORD32 i4_zcbf_rdo_level;

    /*RDOQ-SBH context structure*/
    rdoq_sbh_ctxt_t s_rdoq_sbh_ctxt;

    /** Structure to store the Merge/Skip Cand. for EncLoop */
    cu_inter_merge_skip_t s_cu_inter_merge_skip;
    /** Structure to store the Mixed mode Cand. for EncLoop */
    cu_mixed_mode_inter_t s_mixed_mode_inter_cu;

    ihevce_inter_pred_buf_data_t s_pred_buf_data;

    void *pv_422_chroma_intra_pred_buf;

    WORD32 i4_max_num_inter_rdopt_cands;

    /* Output Struct per each CU during recursions */
    ihevce_enc_cu_node_ctxt_t as_enc_cu_ctxt[MAX_CU_IN_CTB + 1];

    /* Used to store best inter candidate. Used only when */
    /* 'CU modulated QP override' is enabled */
    cu_inter_cand_t as_best_cand[MAX_CU_IN_CTB + 1];

    cu_inter_cand_t *ps_best_cand;

    UWORD8 au1_cu_init_cabac_state_a_priori[MAX_CU_IN_CTB + 1][IHEVC_CAB_CTXT_END];

    UWORD8 (*pau1_curr_cu_a_priori_cabac_state)[IHEVC_CAB_CTXT_END];

    /* Used to store pred data of each CU in the CTB. */
    /* Used only when 'CU modulated QP override' is enabled */
    void *pv_CTB_pred_luma;

    void *pv_CTB_pred_chroma;

    /**
    * array for storing recon during SATD and RD opt stage at CU level
    * one best and one current is required.Luma and chroma together
    */
    void *pv_cu_luma_recon;

    /**
    * array for storing recon during SATD and RD opt stage at CU level
    * one best and one current is required.Luma and chroma together
    */
    void *pv_cu_chrma_recon;

    /**
    * Array to store pred modes  during SATD and RD opt stage at CU level
    * one best and one current is required
    */
    nbr_4x4_t as_cu_recur_nbr[MAX_PU_IN_CTB_ROW * MAX_PU_IN_CTB_ROW];

    /**
    * Pointer to Array to store pred modes  during SATD and RD opt stage at CU level
    * one best and one current is required
    */
    nbr_4x4_t *ps_cu_recur_nbr;

    /**
    * Context models stored for CU recursion parent evaluation
    */
    UWORD8 au1_rdopt_recur_ctxt_models[4][IHEVC_CAB_CTXT_END];

    ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt;

    /**
    * array for storing coeffs during RD opt stage at CU level
    * one best and one current is required. Luma and chroma together
    */
    /*UWORD8 au1_cu_recur_coeffs[MAX_LUMA_COEFFS_CTB + MAX_CHRM_COEFFS_CTB];*/

    UWORD8 *pu1_cu_recur_coeffs;

    UWORD8 *apu1_cu_level_pingpong_coeff_buf_addr[2];

    WORD16 *api2_cu_level_pingpong_deq_buf_addr[2];

    UWORD8 *pu1_ecd_data;

    /* OPT: flag to skip parent CU=4TU eval during recursion */
    UWORD8 is_parent_cu_rdopt;

    /**
    *   Array of structs containing block merge data for
    *   4 32x32 CU's in indices 1 - 4 and 64x64 CU at 0
    */
    UWORD8 u1_cabac_states_next_row_copied_flag;

    UWORD8 u1_cabac_states_first_cu_copied_flag;

    UWORD32 u4_cur_ctb_wd;

    UWORD32 u4_cur_ctb_ht;

    /* thread id of the current context */
    WORD32 thrd_id;

    /** Number of processing threads created run time */
    WORD32 i4_num_proc_thrds;

    /* Instance number of bit-rate for multiple bit-rate encode */
    WORD32 i4_bitrate_instance_num;

    WORD32 i4_num_bitrates;

    WORD32 i4_enc_frm_id;

    /* Flag to indicate if chroma needs to be considered for cost calculation */
    WORD32 i4_consider_chroma_cost;

    /* Number of modes to be evaluated for intra */
    WORD32 i4_num_modes_to_evaluate_intra;

    /* Number of modes to be evaluated for inter */
    WORD32 i4_num_modes_to_evaluate_inter;
    /*pointers for struct to hold RC parameters for each bit-rate instance */
    enc_loop_rc_params_t
        *aaps_enc_loop_rc_params[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];

    /** Pointer to structure containing function pointers of common*/
    func_selector_t *ps_func_selector;

    /* Flag to control Top Right Sync for during Merge */
    UWORD8 u1_use_top_at_ctb_boundary;

    UWORD8 u1_is_input_data_hbd;

    UWORD8 u1_bit_depth;

    /* 0 - 400; 1 - 420; 2 - 422; 3 - 444 */
    UWORD8 u1_chroma_array_type;

    rc_quant_t *ps_rc_quant_ctxt;

    sao_ctxt_t s_sao_ctxt_t;

    /* Offset to get the Qp for the last CU of upper CTB-row.
    This offset is from the current tile top row QP map start.
    This will only be consumed by the first CU of current CTB-row
    iff [it is skip && entropy sync is off] */
    WORD32 *pi4_offset_for_last_cu_qp;

    double i4_lamda_modifier;
    double i4_uv_lamda_modifier;
    WORD32 i4_temporal_layer_id;

    UWORD8 u1_disable_intra_eval;

    WORD32 i4_quant_round_tu[2][32 * 32];

    WORD32 *pi4_quant_round_factor_tu_0_1[5];
    WORD32 *pi4_quant_round_factor_tu_1_2[5];

    WORD32 i4_quant_round_4x4[2][4 * 4];
    WORD32 i4_quant_round_8x8[2][8 * 8];
    WORD32 i4_quant_round_16x16[2][16 * 16];
    WORD32 i4_quant_round_32x32[2][32 * 32];

    WORD32 *pi4_quant_round_factor_cu_ctb_0_1[5];
    WORD32 *pi4_quant_round_factor_cu_ctb_1_2[5];

    WORD32 i4_quant_round_cr_4x4[2][4 * 4];
    WORD32 i4_quant_round_cr_8x8[2][8 * 8];
    WORD32 i4_quant_round_cr_16x16[2][16 * 16];

    WORD32 *pi4_quant_round_factor_cr_cu_ctb_0_1[3];
    WORD32 *pi4_quant_round_factor_cr_cu_ctb_1_2[3];
    /* cost for not coding cu residue i.e forcing no residue syntax as 1 */
    LWORD64 i8_cu_not_coded_cost;

    /* dependency manager for forward ME  sync */
    void *pv_dep_mngr_encloop_dep_me;

    LWORD64 ai4_source_satd_8x8[64];

    LWORD64 ai4_source_chroma_satd[256];

    UWORD8 u1_is_refPic;

    WORD32 i4_qp_mod;

    WORD32 i4_is_ref_pic;

    WORD32 i4_chroma_format;

    WORD32 i4_temporal_layer;

    WORD32 i4_use_const_lamda_modifier;

    double f_i_pic_lamda_modifier;

    LWORD64 i8_distortion;

    WORD32 i4_use_ctb_level_lamda;

    float f_str_ratio;

    /* Flag to indicate if current frame is to be shared with other clients.
    Used only in distributed-encoding */
    WORD32 i4_share_flag;

    /* Pointer to the current recon being processed.
    Needed for enabling TMVP in dist-encoding */
    void *pv_frm_recon;

    ihevce_cmn_opt_func_t s_cmn_opt_func;

    /* The ME analogue to the struct above was not included since */
    /* that would have entailed inclusion of all ME specific */
    /* header files */
    /*FT_SAD_EVALUATOR **/

    /*FT_SAD_EVALUATOR **/
    void *pv_evalsad_pt_npu_mxn_8bit;
    UWORD8 u1_enable_psyRDOPT;

    UWORD8 u1_is_stasino_enabled;

    UWORD32 u4_psy_strength;
    /*Sub PIC rc context */

    WORD32 i4_sub_pic_level_rc;
    WORD32 i4_num_ctb_for_out_scale;

    /**
     * Accumalated bits of all cu for required CTBS estimated during RDO evaluation.
     * Required for sup pic level RC. Reset when required CU/CTB count is reached.
     */
    UWORD32 u4_total_cu_bits;

    UWORD32 u4_total_cu_bits_mul_qs;

    UWORD32 u4_total_cu_hdr_bits;

    UWORD32 u4_cu_tot_bits_into_qscale;

    UWORD32 u4_cu_tot_bits;

    /*Scale added to the current qscale, output from sub pic rc*/
    WORD32 i4_cu_qp_sub_pic_rc;

    /*Frame level L1 IPE sad*/
    LWORD64 i8_frame_l1_ipe_sad;

    /*Frame level L0 IPE satd*/
    LWORD64 i8_frame_l0_ipe_satd;

    /*Frame level L1 ME sad*/
    LWORD64 i8_frame_l1_me_sad;

    /*Frame level L1 activity factor*/
    LWORD64 i8_frame_l1_activity_fact;
    /*bits esimated for frame calulated for sub pic rc bit control */
    WORD32 ai4_frame_bits_estimated[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];
    /** I Scene cut */
    WORD32 i4_is_I_scenecut;

    /** Non Scene cut */
    WORD32 i4_is_non_I_scenecut;

    /** Frames for which online/offline model is not valid */
    WORD32 i4_is_model_valid;

    /** Steady State Frame */
    //WORD32 i4_is_steady_state;

    WORD32 i4_is_first_query;

    /* Pointer to Tile params base */
    void *pv_tile_params_base;

    /** The index of column tile for which it is working */
    WORD32 i4_tile_col_idx;

    WORD32 i4_max_search_range_horizontal;

    WORD32 i4_max_search_range_vertical;

    WORD32 i4_is_ctb_qp_modified;

    WORD32 i4_display_num;

    WORD32 i4_pred_qp;

    /*assumption of qg size is 8x8 block size*/
    WORD32 ai4_qp_qg[8 * 8];

    WORD32 i4_last_cu_qp_from_prev_ctb;

    WORD32 i4_prev_QP;

    UWORD8 u1_max_inter_tr_depth;

    UWORD8 u1_max_intra_tr_depth;

} ihevce_enc_loop_ctxt_t;

/*****************************************************************************/
/* Enums                                                                     */
/*****************************************************************************/

/** @brief RDOQ_LEVELS_T: This enumeration specifies the RDOQ mode of operation
*
*  NO_RDOQ    : RDOQ is not performed
*  BEST_CAND_RDOQ : RDOQ for final candidate only
*  ALL_CAND_RDOQ : RDOQ for all candidates
*/
typedef enum
{
    NO_RDOQ,
    BEST_CAND_RDOQ,
    ALL_CAND_RDOQ,
} RDOQ_LEVELS_T;

/** @brief QUANT_ROUNDING_COEFF_LEVELS_T: This enumeration specifies the Coef level RDOQ mode of operation
*
*  FIXED_QUANT_ROUNDING       : Fixed Quant rounding values are used
*  NCTB_LEVEL_QUANT_ROUNDING  : NCTB level Cmputed Quant rounding values are used
*  CTB_LEVEL_QUANT_ROUNDING   : CTB level Cmputed Quant rounding values are used
*  CU_LEVEL_QUANT_ROUNDING    : CU level Cmputed Quant rounding values are used
*  TU_LEVEL_QUANT_ROUNDING    : TU level Cmputed Quant rounding values are used
*               Defaulat for all candidtes, based on RDOQ_LEVELS_T choose to best candidate
*/
typedef enum
{
    FIXED_QUANT_ROUNDING,
    NCTB_LEVEL_QUANT_ROUNDING,
    CTB_LEVEL_QUANT_ROUNDING,
    CU_LEVEL_QUANT_ROUNDING,
    TU_LEVEL_QUANT_ROUNDING,
    CHROMA_QUANT_ROUNDING
} QUANT_ROUNDING_COEFF_LEVELS_T;

/*****************************************************************************/
/* Enums                                                                     */
/*****************************************************************************/

/** @brief SBH_LEVELS_T: This enumeration specifies the RDOQ mode of operation
*
*  NO_SBH    : SBH is not performed
*  BEST_CAND_SBH : SBH for final candidate only
*  ALL_CAND_SBH : SBH for all candidates
*/
typedef enum
{
    NO_SBH,
    BEST_CAND_SBH,
    ALL_CAND_SBH,
} SBH_LEVELS_T;

/** @brief ZCBF_LEVELS_T: This enumeration specifies the ZeroCBF RDO mode of operation
*
*  NO_ZCBF    : ZCBF RDO is not performed
*  ALL_CAND_ZCBF : ZCBF RDO for all candidates
*/
typedef enum
{
    NO_ZCBF,
    ZCBF_ENABLE,
} ZCBF_LEVELS_T;

/**
******************************************************************************
*  @brief  Encode loop master context structure
******************************************************************************
*/
typedef struct
{
    /** Array of encode loop structure */
    ihevce_enc_loop_ctxt_t *aps_enc_loop_thrd_ctxt[MAX_NUM_FRM_PROC_THRDS_ENC];

    /** Number of processing threads created run time */
    WORD32 i4_num_proc_thrds;

    /**
    *  Array of top row cu skip flags (1 bit per 8x8CU)
    */
    UWORD8 au1_cu_skip_top_row[HEVCE_MAX_WIDTH >> 6];

    /** Context models stored at the end of second CTB in a row)
    *  stored in packed form pState[bits6-1] | MPS[bit0]
    *  for each CTB row
    *  using entropy sync model in RD opt
    */
    UWORD8 au1_ctxt_models[MAX_NUM_CTB_ROWS_FRM][IHEVC_CAB_CTXT_END];

    /** Dependency manager for controlling EncLoop Top-Right CU dependency
    * One per each bit-rate and one per each frame in parallel
    */
    void *aapv_dep_mngr_enc_loop_cu_top_right[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];

    /** Dependency manager for controlling Deblocking Top dependency
    * One per each bit-rate and one per each frame in parallel
    */
    void *aapv_dep_mngr_enc_loop_dblk[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];

    /** number of bit-rate instances running */
    WORD32 i4_num_bitrates;

    /** number of enc frames running in parallel */
    WORD32 i4_num_enc_loop_frm_pllel;

    /* Pointer to Tile params base */
    void *pv_tile_params_base;
    /* Offset to get the Qp for the last CU of upper CTB-row.
    This offset is from the current tile top row QP map start.

    This will only be consumed by the first CU of current CTB-row
    iff [it is skip && entropy sync is off]
    There is one entry of every tile-column bcoz offset remains constant
    for all tiles lying in a tile-column */
    WORD32 ai4_offset_for_last_cu_qp[MAX_TILE_COLUMNS];
} ihevce_enc_loop_master_ctxt_t;

/**
******************************************************************************
*  @brief  This struct is used for storing data required by the block merge
*          function
******************************************************************************
*/
typedef struct
{
    block_data_8x8_t *ps_8x8_data;

    block_data_16x16_t *ps_16x16_data;

    block_data_32x32_t *ps_32x32_data;

    block_data_64x64_t *ps_64x64_data;

    part_type_results_t **ps_32x32_results;

    cur_ctb_cu_tree_t *ps_cu_tree;

    ipe_l0_ctb_analyse_for_me_t *ps_cur_ipe_ctb;

    mv_pred_ctxt_t *ps_mv_pred_ctxt;

    recon_pic_buf_t *(*aps_ref_list)[HEVCE_MAX_REF_PICS * 2];

    nbr_4x4_t *ps_top_nbr_4x4;

    nbr_4x4_t *ps_left_nbr_4x4;

    nbr_4x4_t *ps_curr_nbr_4x4;

    UWORD8 *pu1_inp;

    UWORD8 *pu1_ctb_nbr_map;

    WORD32 i4_nbr_map_strd;

    WORD32 inp_stride;

    WORD32 i4_ctb_x_off;

    WORD32 i4_ctb_y_off;

    WORD32 use_satd_for_err_calc;

    WORD32 lambda;

    WORD32 lambda_q_shift;

    WORD32 frm_qstep;

    WORD32 num_4x4_in_ctb;

    UWORD8 *pu1_wkg_mem;

    UWORD8 **ppu1_pred;

    UWORD8 u1_bidir_enabled;

    UWORD8 u1_max_tr_depth;

    WORD32 i4_ctb_pos;

    WORD32 i4_ctb_size;

    UWORD8 *apu1_wt_inp[MAX_REFS_SEARCHABLE + 1];

    /** Pointer of Dep Mngr for EncLoop Top-Right CU dependency */
    void *pv_dep_mngr_enc_loop_cu_top_right;
    /** The current cu row no. for Dep Manager to Check */
    WORD32 i4_dep_mngr_cur_cu_row_no;
    /** The Top cu row no. for Dep Manager to Check */
    WORD32 i4_dep_mngr_top_cu_row_no;

    WORD8 i1_quality_preset;

    /* Flag to control Top Right Sync for during Merge */
    UWORD8 u1_use_top_at_ctb_boundary;

} block_merge_input_t;

/* Structure which stores the info regarding the TU's present in the CU*/
typedef struct tu_prms_t
{
    UWORD8 u1_tu_size;

    UWORD8 u1_x_off;

    UWORD8 u1_y_off;

    WORD32 i4_tu_cost;

    WORD32 i4_early_cbf;

} tu_prms_t;

typedef struct
{
    cu_enc_loop_out_t **pps_cu_final;

    pu_t **pps_row_pu;

    tu_enc_loop_out_t **pps_row_tu;

    UWORD8 **ppu1_row_ecd_data;

    WORD32 *pi4_num_pus_in_ctb;

    WORD32 *pi4_last_cu_pos_in_ctb;

    WORD32 *pi4_last_cu_size;

    UWORD8 *pu1_num_cus_in_ctb_out;

} cu_final_update_prms;

typedef struct
{
    cu_nbr_prms_t *ps_cu_nbr_prms;

    cu_inter_cand_t *ps_best_inter_cand;

    enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms;

    WORD32 packed_pred_mode;

    WORD32 rd_opt_best_idx;

    void *pv_src;

    WORD32 src_strd;

    void *pv_pred;

    WORD32 pred_strd;

    void *pv_pred_chrm;

    WORD32 pred_chrm_strd;

    UWORD8 *pu1_final_ecd_data;

    UWORD8 *pu1_csbf_buf;

    WORD32 csbf_strd;

    void *pv_luma_recon;

    WORD32 recon_luma_strd;

    void *pv_chrm_recon;

    WORD32 recon_chrma_strd;

    UWORD8 u1_cu_pos_x;

    UWORD8 u1_cu_pos_y;

    UWORD8 u1_cu_size;

    WORD8 i1_cu_qp;

    UWORD8 u1_will_cabac_state_change;

    UWORD8 u1_recompute_sbh_and_rdoq;

    UWORD8 u1_is_first_pass;

#if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
    UWORD8 u1_is_cu_noisy;
#endif

} final_mode_process_prms_t;

typedef struct
{
    cu_inter_cand_t s_best_cand;

    /* The size is twice of what is required to ensure availability */
    /* of adequate space for 'HBD' case */
    UWORD8 au1_pred_luma[MAX_CU_SIZE * MAX_CU_SIZE * 2];

    /* The size is twice of what is required to ensure availability */
    /* of adequate space for 422 case */
    UWORD8 au1_pred_chroma[MAX_CU_SIZE * MAX_CU_SIZE * 2];
} final_mode_state_t;

typedef struct
{
    cu_mixed_mode_inter_t *ps_mixed_modes_datastore;

    cu_inter_cand_t *ps_me_cands;

    cu_inter_cand_t *ps_merge_cands;

    mv_pred_ctxt_t *ps_mv_pred_ctxt;

    inter_pred_ctxt_t *ps_mc_ctxt;

    UWORD8 *pu1_ctb_nbr_map;

    void *pv_src;

    nbr_4x4_t *ps_cu_nbr_buf;

    nbr_4x4_t *ps_left_nbr_4x4;

    nbr_4x4_t *ps_top_nbr_4x4;

    nbr_4x4_t *ps_topleft_nbr_4x4;

    WORD32 i4_ctb_nbr_map_stride;

    WORD32 i4_src_strd;

    WORD32 i4_nbr_4x4_left_strd;

    UWORD8 u1_cu_size;

    UWORD8 u1_cu_pos_x;

    UWORD8 u1_cu_pos_y;

    UWORD8 u1_num_me_cands;

    UWORD8 u1_num_merge_cands;

    UWORD8 u1_max_num_mixed_mode_cands_to_select;

    UWORD8 u1_max_merge_candidates;

    UWORD8 u1_use_satd_for_merge_eval;

} ihevce_mixed_inter_modes_selector_prms_t;

typedef struct
{
    LWORD64 i8_ssd;

    LWORD64 i8_cost;

#if ENABLE_INTER_ZCU_COST
    LWORD64 i8_not_coded_cost;
#endif

    UWORD32 u4_sad;

    WORD32 i4_bits;

    WORD32 i4_num_bytes_used_for_ecd;

    WORD32 i4_zero_col;

    WORD32 i4_zero_row;

    UWORD8 u1_cbf;

    UWORD8 u1_reconBufId;

    UWORD8 u1_is_valid_node;

    UWORD8 u1_size;

    UWORD8 u1_posx;

    UWORD8 u1_posy;
} tu_node_data_t;

typedef struct tu_tree_node_t
{
    struct tu_tree_node_t *ps_child_node_tl;

    struct tu_tree_node_t *ps_child_node_tr;

    struct tu_tree_node_t *ps_child_node_bl;

    struct tu_tree_node_t *ps_child_node_br;

    tu_node_data_t s_luma_data;

    /* 2 because of the 2 subTU's when input is 422 */
    tu_node_data_t as_cb_data[2];

    tu_node_data_t as_cr_data[2];

    UWORD8 u1_is_valid_node;

} tu_tree_node_t;

/*****************************************************************************/
/* Extern Variable Declarations                                              */
/*****************************************************************************/

/*****************************************************************************/
/* Extern Function Declarations                                              */
/*****************************************************************************/

/*****************************************************************************/
/* Typedefs                                                                  */
/*****************************************************************************/
typedef LWORD64 (*pf_cu_mode_decide)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_cu_prms_t *ps_cu_prms,
    cu_analyse_t *ps_cu_analyse,
    final_mode_state_t *ps_final_mode_state,
    UWORD8 *pu1_ecd_data,
    pu_col_mv_t *ps_col_pu,
    UWORD8 *pu1_col_pu_map,
    WORD32 col_start_pu_idx);

typedef LWORD64 (*pf_inter_rdopt_cu_mc_mvp)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    cu_inter_cand_t *ps_inter_cand,
    WORD32 cu_size,
    WORD32 cu_pos_x,
    WORD32 cu_pos_y,
    nbr_4x4_t *ps_left_nbr_4x4,
    nbr_4x4_t *ps_top_nbr_4x4,
    nbr_4x4_t *ps_topleft_nbr_4x4,
    WORD32 nbr_4x4_left_strd,
    WORD32 curr_buf_idx);

typedef LWORD64 (*pf_inter_rdopt_cu_ntu)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_cu_prms_t *ps_cu_prms,
    void *pv_src,
    WORD32 cu_size,
    WORD32 cu_pos_x,
    WORD32 cu_pos_y,
    WORD32 curr_buf_idx,
    enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
    cu_inter_cand_t *ps_inter_cand,
    cu_analyse_t *ps_cu_analyse,
    WORD32 i4_alpha_stim_multiplier);

typedef void (*pf_intra_chroma_pred_mode_selector)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
    cu_analyse_t *ps_cu_analyse,
    WORD32 rd_opt_curr_idx,
    WORD32 tu_mode,
    WORD32 i4_alpha_stim_multiplier,
    UWORD8 u1_is_cu_noisy);

typedef LWORD64 (*pf_intra_rdopt_cu_ntu)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_cu_prms_t *ps_cu_prms,
    void *pv_pred_org,
    WORD32 pred_strd_org,
    enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
    UWORD8 *pu1_luma_mode,
    cu_analyse_t *ps_cu_analyse,
    void *pv_curr_src,
    void *pv_cu_left,
    void *pv_cu_top,
    void *pv_cu_top_left,
    nbr_4x4_t *ps_left_nbr_4x4,
    nbr_4x4_t *ps_top_nbr_4x4,
    WORD32 nbr_4x4_left_strd,
    WORD32 cu_left_stride,
    WORD32 curr_buf_idx,
    WORD32 func_proc_mode,
    WORD32 i4_alpha_stim_multiplier);

typedef void (*pf_final_rdopt_mode_prcs)(
    ihevce_enc_loop_ctxt_t *ps_ctxt, final_mode_process_prms_t *ps_prms);

typedef void (*pf_store_cu_results)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_cu_prms_t *ps_cu_prms,
    final_mode_state_t *ps_final_state);

typedef void (*pf_enc_loop_cu_bot_copy)(
    ihevce_enc_loop_ctxt_t *ps_ctxt,
    enc_loop_cu_prms_t *ps_cu_prms,
    ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
    WORD32 curr_cu_pos_in_row,
    WORD32 curr_cu_pos_in_ctb);

typedef void (*pf_enc_loop_ctb_left_copy)(
    ihevce_enc_loop_ctxt_t *ps_ctxt, enc_loop_cu_prms_t *ps_cu_prms);

#endif /* _IHEVCE_ENC_LOOP_STRUCTS_H_ */
