/******************************************************************************
 *
 * Copyright (C) 2015 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
*  ih264e_process.c
*
* @brief
*  Contains functions for codec thread
*
* @author
*  ittiam
*
* @par List of Functions:
* - ih264e_generate_sps_pps
* - ih264e_init_entropy_ctxt
* - ih264e_entropy
* - ih264e_pack_header_data
* - ih264e_update_proc_ctxt
* - ih264e_init_proc_ctxt
* - ih264e_pad_recon_buffer
* - ih264e_dblk_pad_hpel_processing_n_mbs
* - ih264e_process
* - ih264e_update_rc_post_enc
* - ih264e_process_thread
*
* @remarks
*  none
*
*******************************************************************************
*/

/*****************************************************************************/
/* File Includes                                                             */
/*****************************************************************************/

/* System Include Files */
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <assert.h>

/* User Include Files */
#include "ih264e_config.h"
#include "ih264_typedefs.h"
#include "iv2.h"
#include "ive2.h"
#include "ithread.h"

#include "ih264_debug.h"
#include "ih264_macros.h"
#include "ih264_error.h"
#include "ih264_defs.h"
#include "ih264_mem_fns.h"
#include "ih264_padding.h"
#include "ih264_structs.h"
#include "ih264_trans_quant_itrans_iquant.h"
#include "ih264_inter_pred_filters.h"
#include "ih264_intra_pred_filters.h"
#include "ih264_deblk_edge_filters.h"
#include "ih264_common_tables.h"
#include "ih264_cavlc_tables.h"
#include "ih264_cabac_tables.h"
#include "ih264_buf_mgr.h"
#include "ih264_list.h"
#include "ih264_platform_macros.h"

#include "ime_defs.h"
#include "ime_distortion_metrics.h"
#include "ime_structs.h"
#include "ime_statistics.h"

#include "irc_mem_req_and_acq.h"
#include "irc_cntrl_param.h"
#include "irc_frame_info_collector.h"
#include "irc_rate_control_api.h"

#include "ih264e_error.h"
#include "ih264e_defs.h"
#include "ih264e_globals.h"
#include "ih264e_rate_control.h"
#include "ih264e_bitstream.h"
#include "ih264e_cabac_structs.h"
#include "ih264e_structs.h"
#include "ih264e_deblk.h"
#include "ih264e_encode_header.h"
#include "ih264e_utils.h"
#include "ih264e_me.h"
#include "ih264e_intra_modes_eval.h"
#include "ih264e_cavlc.h"
#include "ih264e_cabac.h"
#include "ih264e_master.h"
#include "ih264e_process.h"
#include "ih264e_trace.h"
#include "ih264e_statistics.h"
#include "ih264e_platform_macros.h"


/*****************************************************************************/
/* Function Definitions                                                      */
/*****************************************************************************/

/**
******************************************************************************
*
* @brief This function generates sps, pps set on request
*
* @par   Description
*  When the encoder is set in header generation mode, the following function
*  is called. This generates sps and pps headers and returns the control back
*  to caller.
*
* @param[in]    ps_codec
*  pointer to codec context
*
* @return      success or failure error code
*
******************************************************************************
*/
IH264E_ERROR_T ih264e_generate_sps_pps(codec_t *ps_codec)
{
    /* choose between ping-pong process buffer set */
    WORD32 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS;

    /* entropy ctxt */
    entropy_ctxt_t *ps_entropy = &ps_codec->as_process[ctxt_sel * MAX_PROCESS_THREADS].s_entropy;

    /* Bitstream structure */
    bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;

    /* sps */
    sps_t *ps_sps = NULL;

    /* pps */
    pps_t *ps_pps = NULL;

    /* output buff */
    out_buf_t *ps_out_buf = &ps_codec->as_out_buf[ctxt_sel];


    /********************************************************************/
    /*      initialize the bit stream buffer                            */
    /********************************************************************/
    ih264e_bitstrm_init(ps_bitstrm, ps_out_buf->s_bits_buf.pv_buf, ps_out_buf->s_bits_buf.u4_bufsize);

    /********************************************************************/
    /*                    BEGIN HEADER GENERATION                       */
    /********************************************************************/
    /*ps_codec->i4_pps_id ++;*/
    ps_codec->i4_pps_id %= MAX_PPS_CNT;

    /*ps_codec->i4_sps_id ++;*/
    ps_codec->i4_sps_id %= MAX_SPS_CNT;

    /* populate sps header */
    ps_sps = ps_codec->ps_sps_base + ps_codec->i4_sps_id;
    ih264e_populate_sps(ps_codec, ps_sps);

    /* populate pps header */
    ps_pps = ps_codec->ps_pps_base + ps_codec->i4_pps_id;
    ih264e_populate_pps(ps_codec, ps_pps);

    ps_entropy->i4_error_code = IH264E_SUCCESS;

    /* generate sps */
    ps_entropy->i4_error_code = ih264e_generate_sps(ps_bitstrm, ps_sps,
                                                     &ps_codec->s_cfg.s_vui);
    if(ps_entropy->i4_error_code != IH264E_SUCCESS)
    {
        return ps_entropy->i4_error_code;
    }
    /* generate pps */
    ps_entropy->i4_error_code = ih264e_generate_pps(ps_bitstrm, ps_pps, ps_sps);

    /* queue output buffer */
    ps_out_buf->s_bits_buf.u4_bytes = ps_bitstrm->u4_strm_buf_offset;

    return ps_entropy->i4_error_code;
}

/**
*******************************************************************************
*
* @brief   initialize entropy context.
*
* @par Description:
*  Before invoking the call to perform to entropy coding the entropy context
*  associated with the job needs to be initialized. This involves the start
*  mb address, end mb address, slice index and the pointer to location at
*  which the mb residue info and mb header info are packed.
*
* @param[in] ps_proc
*  Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_init_entropy_ctxt(process_ctxt_t *ps_proc)
{
    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* entropy ctxt */
    entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;

    /* start address */
    ps_entropy->i4_mb_start_add = ps_entropy->i4_mb_y * ps_entropy->i4_wd_mbs + ps_entropy->i4_mb_x;

    /* end address */
    ps_entropy->i4_mb_end_add = ps_entropy->i4_mb_start_add + ps_entropy->i4_mb_cnt;

    /* slice index */
    ps_entropy->i4_cur_slice_idx = ps_proc->pu1_slice_idx[ps_entropy->i4_mb_start_add];

    /* sof */
    /* @ start of frame or start of a new slice, set sof flag */
    if (ps_entropy->i4_mb_start_add == 0)
    {
        ps_entropy->i4_sof = 1;
    }

    if (ps_entropy->i4_mb_x == 0)
    {
        /* packed mb coeff data */
        ps_entropy->pv_mb_coeff_data = ((UWORD8 *)ps_entropy->pv_pic_mb_coeff_data) +
                        ps_entropy->i4_mb_y * ps_codec->u4_size_coeff_data;

        /* packed mb header data */
        ps_entropy->pv_mb_header_data = ((UWORD8 *)ps_entropy->pv_pic_mb_header_data) +
                        ps_entropy->i4_mb_y * ps_codec->u4_size_header_data;
    }

    return IH264E_SUCCESS;
}

/**
*******************************************************************************
*
* @brief entry point for entropy coding
*
* @par Description
*  This function calls lower level functions to perform entropy coding for a
*  group (n rows) of mb's. After encoding 1 row of mb's,  the function takes
*  back the control, updates the ctxt and calls lower level functions again.
*  This process is repeated till all the rows or group of mb's (which ever is
*  minimum) are coded
*
* @param[in] ps_proc
*  process context
*
* @returns  error status
*
* @remarks
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_entropy(process_ctxt_t *ps_proc)
{
    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* entropy context */
    entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;

    /* cabac context */
    cabac_ctxt_t *ps_cabac_ctxt = ps_entropy->ps_cabac;

    /* sps */
    sps_t *ps_sps = ps_entropy->ps_sps_base + (ps_entropy->u4_sps_id % MAX_SPS_CNT);

    /* pps */
    pps_t *ps_pps = ps_entropy->ps_pps_base + (ps_entropy->u4_pps_id % MAX_PPS_CNT);

    /* slice header */
    slice_header_t *ps_slice_hdr = ps_entropy->ps_slice_hdr_base + (ps_entropy->i4_cur_slice_idx % MAX_SLICE_HDR_CNT);

    /* slice type */
    WORD32 i4_slice_type = ps_proc->i4_slice_type;

    /* Bitstream structure */
    bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;

    /* output buff */
    out_buf_t s_out_buf;

    /* sei params */
    sei_params_t s_sei;

    /* proc map */
    UWORD8  *pu1_proc_map;

    /* entropy map */
    UWORD8  *pu1_entropy_map_curr;

    /* proc base idx */
    WORD32 ctxt_sel = ps_proc->i4_encode_api_call_cnt % MAX_CTXT_SETS;

    /* temp var */
    WORD32 i4_wd_mbs, i4_ht_mbs;
    UWORD32 u4_mb_cnt, u4_mb_idx, u4_mb_end_idx, u4_insert_per_idr;
    WORD32 bitstream_start_offset, bitstream_end_offset;
    /********************************************************************/
    /*                            BEGIN INIT                            */
    /********************************************************************/

    /* entropy encode start address */
    u4_mb_idx = ps_entropy->i4_mb_start_add;

    /* entropy encode end address */
    u4_mb_end_idx = ps_entropy->i4_mb_end_add;

    /* width in mbs */
    i4_wd_mbs = ps_entropy->i4_wd_mbs;

    /* height in mbs */
    i4_ht_mbs = ps_entropy->i4_ht_mbs;

    /* total mb cnt */
    u4_mb_cnt = i4_wd_mbs * i4_ht_mbs;

    /* proc map */
    pu1_proc_map = ps_proc->pu1_proc_map + ps_entropy->i4_mb_y * i4_wd_mbs;

    /* entropy map */
    pu1_entropy_map_curr = ps_entropy->pu1_entropy_map + ps_entropy->i4_mb_y * i4_wd_mbs;

    /********************************************************************/
    /* @ start of frame / slice,                                        */
    /*      initialize the output buffer,                               */
    /*      initialize the bit stream buffer,                           */
    /*      check if sps and pps headers have to be generated,          */
    /*      populate and generate slice header                          */
    /********************************************************************/
    if (ps_entropy->i4_sof)
    {
        /********************************************************************/
        /*      initialize the output buffer                                */
        /********************************************************************/
        s_out_buf = ps_codec->as_out_buf[ctxt_sel];

        /* is last frame to encode */
        s_out_buf.u4_is_last = ps_entropy->u4_is_last;

        /* frame idx */
        s_out_buf.u4_timestamp_high = ps_entropy->u4_timestamp_high;
        s_out_buf.u4_timestamp_low = ps_entropy->u4_timestamp_low;

        /********************************************************************/
        /*      initialize the bit stream buffer                            */
        /********************************************************************/
        ih264e_bitstrm_init(ps_bitstrm, s_out_buf.s_bits_buf.pv_buf, s_out_buf.s_bits_buf.u4_bufsize);

        /********************************************************************/
        /*                    BEGIN HEADER GENERATION                       */
        /********************************************************************/
        if (1 == ps_entropy->i4_gen_header)
        {
            /* generate sps */
            ps_entropy->i4_error_code = ih264e_generate_sps(ps_bitstrm, ps_sps,
                                                             &ps_codec->s_cfg.s_vui);
            RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
            /* generate pps */
            ps_entropy->i4_error_code = ih264e_generate_pps(ps_bitstrm, ps_pps, ps_sps);
            RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);

            /* reset i4_gen_header */
            ps_entropy->i4_gen_header = 0;
        }

        /* populate slice header */
        ih264e_populate_slice_header(ps_proc, ps_slice_hdr, ps_pps, ps_sps);

        /* Starting bitstream offset for header in bits */
        bitstream_start_offset = GET_NUM_BITS(ps_bitstrm);

        /* generate sei */
        u4_insert_per_idr = (NAL_SLICE_IDR == ps_slice_hdr->i1_nal_unit_type);

        memset(&s_sei, 0, sizeof(sei_params_t));
        s_sei.u1_sei_mdcv_params_present_flag =
                    ps_codec->s_cfg.s_sei.u1_sei_mdcv_params_present_flag;
        s_sei.s_sei_mdcv_params = ps_codec->s_cfg.s_sei.s_sei_mdcv_params;
        s_sei.u1_sei_cll_params_present_flag =
                    ps_codec->s_cfg.s_sei.u1_sei_cll_params_present_flag;
        s_sei.s_sei_cll_params = ps_codec->s_cfg.s_sei.s_sei_cll_params;
        s_sei.u1_sei_ave_params_present_flag =
                    ps_codec->s_cfg.s_sei.u1_sei_ave_params_present_flag;
        s_sei.s_sei_ave_params = ps_codec->s_cfg.s_sei.s_sei_ave_params;
        s_sei.u1_sei_ccv_params_present_flag = 0;
        s_sei.s_sei_ccv_params =
                    ps_codec->as_inp_list[ps_codec->i4_poc % MAX_NUM_BFRAMES].s_sei_ccv;
        s_sei.u1_sei_sii_params_present_flag = ps_codec->s_cfg.s_sei.u1_sei_sii_params_present_flag;
        s_sei.s_sei_sii_params = ps_codec->s_cfg.s_sei.s_sei_sii_params;

        if((1 == ps_sps->i1_vui_parameters_present_flag) &&
           (1 == ps_codec->s_cfg.s_vui.u1_video_signal_type_present_flag) &&
           (1 == ps_codec->s_cfg.s_vui.u1_colour_description_present_flag) &&
           (2 != ps_codec->s_cfg.s_vui.u1_colour_primaries) &&
           (2 != ps_codec->s_cfg.s_vui.u1_matrix_coefficients) &&
           (2 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics) &&
           (4 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics) &&
           (5 != ps_codec->s_cfg.s_vui.u1_transfer_characteristics))
        {
            s_sei.u1_sei_ccv_params_present_flag =
            ps_codec->as_inp_list[ps_codec->i4_poc % MAX_NUM_BFRAMES].u1_sei_ccv_params_present_flag;
        }

        if((1 == s_sei.u1_sei_mdcv_params_present_flag && u4_insert_per_idr) ||
           (1 == s_sei.u1_sei_cll_params_present_flag && u4_insert_per_idr) ||
           (1 == s_sei.u1_sei_ave_params_present_flag && u4_insert_per_idr) ||
           (1 == s_sei.u1_sei_ccv_params_present_flag) ||
           (1 == s_sei.u1_sei_sii_params_present_flag))
        {
            ps_entropy->i4_error_code =
                    ih264e_generate_sei(ps_bitstrm, &s_sei, u4_insert_per_idr);
            RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
        }
        ps_codec->as_inp_list[ps_codec->i4_poc % MAX_NUM_BFRAMES].u1_sei_ccv_params_present_flag = 0;

        /* generate slice header */
        ps_entropy->i4_error_code = ih264e_generate_slice_header(ps_bitstrm, ps_slice_hdr,
                                                                  ps_pps, ps_sps);
        RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
        /* once start of frame / slice is done, you can reset it */
        /* it is the responsibility of the caller to set this flag */
        ps_entropy->i4_sof = 0;

        if (CABAC == ps_entropy->u1_entropy_coding_mode_flag)
        {
            BITSTREAM_BYTE_ALIGN(ps_bitstrm);
            BITSTREAM_FLUSH(ps_bitstrm, ps_entropy->i4_error_code);
            RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
            ih264e_init_cabac_ctxt(ps_entropy);
        }

        /* Ending bitstream offset for header in bits */
        bitstream_end_offset = GET_NUM_BITS(ps_bitstrm);
        ps_entropy->u4_header_bits[i4_slice_type == PSLICE] +=
                        bitstream_end_offset - bitstream_start_offset;
    }

    /* begin entropy coding for the mb set */
    while (u4_mb_idx < u4_mb_end_idx)
    {
        /* init ptrs/indices */
        if (ps_entropy->i4_mb_x == i4_wd_mbs)
        {
            ps_entropy->i4_mb_y++;
            ps_entropy->i4_mb_x = 0;

            /* packed mb coeff data */
            ps_entropy->pv_mb_coeff_data = ((UWORD8 *)ps_entropy->pv_pic_mb_coeff_data) +
                            ps_entropy->i4_mb_y * ps_codec->u4_size_coeff_data;

            /* packed mb header data */
            ps_entropy->pv_mb_header_data = ((UWORD8 *)ps_entropy->pv_pic_mb_header_data) +
                            ps_entropy->i4_mb_y * ps_codec->u4_size_header_data;

            /* proc map */
            pu1_proc_map = ps_proc->pu1_proc_map + ps_entropy->i4_mb_y * i4_wd_mbs;

            /* entropy map */
            pu1_entropy_map_curr = ps_entropy->pu1_entropy_map + ps_entropy->i4_mb_y * i4_wd_mbs;
        }

        DEBUG("\nmb indices x, y %d, %d", ps_entropy->i4_mb_x, ps_entropy->i4_mb_y);
        ENTROPY_TRACE("mb index x %d", ps_entropy->i4_mb_x);
        ENTROPY_TRACE("mb index y %d", ps_entropy->i4_mb_y);

        /* wait until the curr mb is core coded */
        /* The wait for curr mb to be core coded is essential when entropy is launched
         * as a separate job
         */
        while (1)
        {
            volatile UWORD8 *pu1_buf1;
            WORD32 idx = ps_entropy->i4_mb_x;

            pu1_buf1 = pu1_proc_map + idx;
            if (*pu1_buf1)
                break;
            ithread_yield();
        }


        /* write mb layer */
        ps_entropy->i4_error_code = ps_codec->pf_write_mb_syntax_layer
                        [ps_entropy->u1_entropy_coding_mode_flag][i4_slice_type](ps_entropy);
        RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);

        /* Starting bitstream offset for header in bits */
        bitstream_start_offset = GET_NUM_BITS(ps_bitstrm);

        /* set entropy map */
        pu1_entropy_map_curr[ps_entropy->i4_mb_x] = 1;

        u4_mb_idx++;
        ps_entropy->i4_mb_x++;
        /* check for eof */
        if (CABAC == ps_entropy->u1_entropy_coding_mode_flag)
        {
            if (ps_entropy->i4_mb_x < i4_wd_mbs)
            {
                ih264e_cabac_encode_terminate(ps_cabac_ctxt, 0);
            }
        }

        if (ps_entropy->i4_mb_x == i4_wd_mbs)
        {
            /* if slices are enabled */
            if (ps_codec->s_cfg.e_slice_mode == IVE_SLICE_MODE_BLOCKS)
            {
                /* current slice index */
                WORD32 i4_curr_slice_idx = ps_entropy->i4_cur_slice_idx;

                /* slice map */
                UWORD8 *pu1_slice_idx = ps_entropy->pu1_slice_idx;

                /* No need to open a slice at end of frame. The current slice can be closed at the time
                 * of signaling eof flag.
                 */
                if ((u4_mb_idx != u4_mb_cnt) && (i4_curr_slice_idx
                                                != pu1_slice_idx[u4_mb_idx]))
                {
                    if (CAVLC == ps_entropy->u1_entropy_coding_mode_flag)
                    { /* mb skip run */
                        if ((i4_slice_type != ISLICE)
                                        && *ps_entropy->pi4_mb_skip_run)
                        {
                            if (*ps_entropy->pi4_mb_skip_run)
                            {
                                PUT_BITS_UEV(ps_bitstrm, *ps_entropy->pi4_mb_skip_run,
                                            ps_entropy->i4_error_code, "mb skip run");
                                *ps_entropy->pi4_mb_skip_run = 0;
                                RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
                            }
                        }
                        /* put rbsp trailing bits for the previous slice */
                        ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
                        RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
                    }
                    else
                    {
                        ih264e_cabac_encode_terminate(ps_cabac_ctxt, 1);
                    }

                    /* update slice header pointer */
                    i4_curr_slice_idx = pu1_slice_idx[u4_mb_idx];
                    ps_entropy->i4_cur_slice_idx = i4_curr_slice_idx;
                    ps_slice_hdr = ps_entropy->ps_slice_hdr_base+ (i4_curr_slice_idx % MAX_SLICE_HDR_CNT);

                    /* populate slice header */
                    ps_entropy->i4_mb_start_add = u4_mb_idx;
                    ih264e_populate_slice_header(ps_proc, ps_slice_hdr, ps_pps,
                                                 ps_sps);

                    /* generate slice header */
                    ps_entropy->i4_error_code = ih264e_generate_slice_header(
                                    ps_bitstrm, ps_slice_hdr, ps_pps, ps_sps);
                    RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
                    if (CABAC == ps_entropy->u1_entropy_coding_mode_flag)
                    {
                        BITSTREAM_BYTE_ALIGN(ps_bitstrm);
                        BITSTREAM_FLUSH(ps_bitstrm, ps_entropy->i4_error_code);
                        ih264e_init_cabac_ctxt(ps_entropy);
                    }
                }
                else
                {
                    if (CABAC == ps_entropy->u1_entropy_coding_mode_flag
                                    && u4_mb_idx != u4_mb_cnt)
                    {
                        ih264e_cabac_encode_terminate(ps_cabac_ctxt, 0);
                    }
                }
            }
        }

        /* Ending bitstream offset for header in bits */
        bitstream_end_offset = GET_NUM_BITS(ps_bitstrm);
        ps_entropy->u4_header_bits[i4_slice_type == PSLICE] +=
                        bitstream_end_offset - bitstream_start_offset;
    }

    /* check for eof */
    if (u4_mb_idx == u4_mb_cnt)
    {
        /* set end of frame flag */
        ps_entropy->i4_eof = 1;
    }
    else
    {
        if (CABAC == ps_entropy->u1_entropy_coding_mode_flag
                        && ps_codec->s_cfg.e_slice_mode
                                        != IVE_SLICE_MODE_BLOCKS)
        {
            bitstream_start_offset = GET_NUM_BITS(ps_bitstrm);
            ih264e_cabac_encode_terminate(ps_cabac_ctxt, 0);
            bitstream_end_offset = GET_NUM_BITS(ps_bitstrm);
            ps_entropy->u4_header_bits[i4_slice_type == PSLICE] +=
                            bitstream_end_offset - bitstream_start_offset;
        }
    }

    if (ps_entropy->i4_eof)
    {
        bitstream_start_offset = GET_NUM_BITS(ps_bitstrm);
        if (CAVLC == ps_entropy->u1_entropy_coding_mode_flag)
        {
            /* mb skip run */
            if ((i4_slice_type != ISLICE) && *ps_entropy->pi4_mb_skip_run)
            {
                if (*ps_entropy->pi4_mb_skip_run)
                {
                    PUT_BITS_UEV(ps_bitstrm, *ps_entropy->pi4_mb_skip_run,
                                 ps_entropy->i4_error_code, "mb skip run");
                    *ps_entropy->pi4_mb_skip_run = 0;
                    RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
                }
            }
            /* put rbsp trailing bits */
             ps_entropy->i4_error_code = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
             RETURN_ENTROPY_IF_ERROR(ps_codec, ps_entropy, ctxt_sel);
        }
        else
        {
            ih264e_cabac_encode_terminate(ps_cabac_ctxt, 1);
        }
        bitstream_end_offset = GET_NUM_BITS(ps_bitstrm);
        ps_entropy->u4_header_bits[i4_slice_type == PSLICE] +=
                        bitstream_end_offset - bitstream_start_offset;

        DEBUG("entropy status %x", ps_entropy->i4_error_code);
    }

    return ps_entropy->i4_error_code;
}

/**
*******************************************************************************
*
* @brief Packs header information of a mb in to a buffer
*
* @par Description:
*  After the deciding the mode info of a macroblock, the syntax elements
*  associated with the mb are packed and stored. The entropy thread unpacks
*  this buffer and generates the end bit stream.
*
* @param[in] ps_proc
*  Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_pack_header_data(process_ctxt_t *ps_proc)
{
    /* curr mb type */
    UWORD32 u4_mb_type = ps_proc->u4_mb_type;

    /* pack mb syntax layer of curr mb (used for entropy coding) */
    if (u4_mb_type == I4x4)
    {
        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_i4x4_t *ps_mb_hdr = (mb_hdr_i4x4_t *)ps_proc->pv_mb_header_data;

        /* temp var */
        WORD32 i4, byte;

        /* mb type plus mode */
        ps_mb_hdr->common.u1_mb_type_mode = (ps_proc->u1_c_i8_mode << 6) + u4_mb_type;

        /* cbp */
        ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;

        /* mb qp delta */
        ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;

        /* sub mb modes */
        for (i4 = 0; i4 < 16; i4 ++)
        {
            byte = 0;

            if (ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4] ==
                            ps_proc->au1_intra_luma_mb_4x4_modes[i4])
            {
                byte |= 1;
            }
            else
            {

                if (ps_proc->au1_intra_luma_mb_4x4_modes[i4] <
                                ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4])
                {
                    byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] << 1);
                }
                else
                {
                    byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] - 1) << 1;
                }
            }

            i4++;

            if (ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4] ==
                            ps_proc->au1_intra_luma_mb_4x4_modes[i4])
            {
                byte |= 16;
            }
            else
            {

                if (ps_proc->au1_intra_luma_mb_4x4_modes[i4] <
                                ps_proc->au1_predicted_intra_luma_mb_4x4_modes[i4])
                {
                    byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] << 5);
                }
                else
                {
                    byte |= (ps_proc->au1_intra_luma_mb_4x4_modes[i4] - 1) << 5;
                }
            }

            ps_mb_hdr->au1_sub_blk_modes[i4 >> 1] =  byte;
        }

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_i4x4_t);
        ps_proc->pv_mb_header_data = pu1_ptr;
    }
    else if (u4_mb_type == I16x16)
    {
        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_i16x16_t *ps_mb_hdr = (mb_hdr_i16x16_t *)ps_proc->pv_mb_header_data;

        /* mb type plus mode */
        ps_mb_hdr->common.u1_mb_type_mode = (ps_proc->u1_c_i8_mode << 6) + (ps_proc->u1_l_i16_mode << 4) + u4_mb_type;

        /* cbp */
        ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;

        /* mb qp delta */
        ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_i16x16_t);
        ps_proc->pv_mb_header_data = pu1_ptr;
    }
    else if (u4_mb_type == P16x16)
    {
        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_p16x16_t *ps_mb_hdr = (mb_hdr_p16x16_t *)ps_proc->pv_mb_header_data;

        /* mb type */
        ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;

        /* cbp */
        ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;

        /* mb qp delta */
        ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;

        ps_mb_hdr->ai2_mv[0] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx - ps_proc->ps_pred_mv[0].s_mv.i2_mvx;

        ps_mb_hdr->ai2_mv[1] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy - ps_proc->ps_pred_mv[0].s_mv.i2_mvy;

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_p16x16_t);
        ps_proc->pv_mb_header_data = pu1_ptr;
    }
    else if (u4_mb_type == PSKIP)
    {
        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_pskip_t *ps_mb_hdr = (mb_hdr_pskip_t *)ps_proc->pv_mb_header_data;

        /* mb type */
        ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_pskip_t);
        ps_proc->pv_mb_header_data = pu1_ptr;
    }
    else if(u4_mb_type == B16x16)
    {

        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_b16x16_t *ps_mb_hdr = (mb_hdr_b16x16_t *)ps_proc->pv_mb_header_data;

        UWORD32 u4_pred_mode = ps_proc->ps_pu->b2_pred_mode;

        /* mb type plus mode */
        ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;

        /* cbp */
        ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;

        /* mb qp delta */
        ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;

        /* l0 & l1 me data */
        if (u4_pred_mode != PRED_L1)
        {
            ps_mb_hdr->ai2_mv[0][0] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx
                            - ps_proc->ps_pred_mv[0].s_mv.i2_mvx;

            ps_mb_hdr->ai2_mv[0][1] = ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy
                            - ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
        }
        if (u4_pred_mode != PRED_L0)
        {
            ps_mb_hdr->ai2_mv[1][0] = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvx
                            - ps_proc->ps_pred_mv[1].s_mv.i2_mvx;

            ps_mb_hdr->ai2_mv[1][1] = ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvy
                            - ps_proc->ps_pred_mv[1].s_mv.i2_mvy;
        }

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_b16x16_t);
        ps_proc->pv_mb_header_data = pu1_ptr;

    }
    else if(u4_mb_type == BDIRECT)
    {
        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_bdirect_t *ps_mb_hdr = (mb_hdr_bdirect_t *)ps_proc->pv_mb_header_data;

        /* mb type plus mode */
        ps_mb_hdr->common.u1_mb_type_mode = u4_mb_type;

        /* cbp */
        ps_mb_hdr->common.u1_cbp = ps_proc->u4_cbp;

        /* mb qp delta */
        ps_mb_hdr->common.u1_mb_qp_delta = ps_proc->u4_mb_qp - ps_proc->u4_mb_qp_prev;

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_bdirect_t);
        ps_proc->pv_mb_header_data = pu1_ptr;

    }
    else if(u4_mb_type == BSKIP)
    {
        UWORD32 u4_pred_mode = ps_proc->ps_pu->b2_pred_mode;

        /* pointer to mb header storage space */
        UWORD8 *pu1_ptr = ps_proc->pv_mb_header_data;
        mb_hdr_bskip_t *ps_mb_hdr = (mb_hdr_bskip_t *)ps_proc->pv_mb_header_data;

        /* mb type plus mode */
        ps_mb_hdr->common.u1_mb_type_mode = (u4_pred_mode << 4) + u4_mb_type;

        /* end of mb layer */
        pu1_ptr += sizeof(mb_hdr_bskip_t);
        ps_proc->pv_mb_header_data = pu1_ptr;
    }

    return IH264E_SUCCESS;
}

/**
*******************************************************************************
*
* @brief   update process context after encoding an mb. This involves preserving
* the current mb information for later use, initialize the proc ctxt elements to
* encode next mb.
*
* @par Description:
*  This function performs house keeping tasks after encoding an mb.
*  After encoding an mb, various elements of the process context needs to be
*  updated to encode the next mb. For instance, the source, recon and reference
*  pointers, mb indices have to be adjusted to the next mb. The slice index of
*  the current mb needs to be updated. If mb qp modulation is enabled, then if
*  the qp changes the quant param structure needs to be updated. Also to encoding
*  the next mb, the current mb info is used as part of mode prediction or mv
*  prediction. Hence the current mb info has to preserved at top/top left/left
*  locations.
*
* @param[in] ps_proc
*  Pointer to the current process context
*
* @returns none
*
* @remarks none
*
*******************************************************************************
*/
WORD32 ih264e_update_proc_ctxt(process_ctxt_t *ps_proc)
{
    /* error status */
    WORD32 error_status = IH264_SUCCESS;

    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* curr mb indices */
    WORD32 i4_mb_x = ps_proc->i4_mb_x;
    WORD32 i4_mb_y = ps_proc->i4_mb_y;

    /* mb syntax elements of neighbors */
    mb_info_t *ps_left_syn =  &ps_proc->s_left_mb_syntax_ele;
    mb_info_t *ps_top_syn = ps_proc->ps_top_row_mb_syntax_ele + i4_mb_x;
    mb_info_t *ps_top_left_syn = &ps_proc->s_top_left_mb_syntax_ele;

    /* curr mb type */
    UWORD32 u4_mb_type = ps_proc->u4_mb_type;

    /* curr mb type */
    UWORD32 u4_is_intra = ps_proc->u4_is_intra;

    /* width in mbs */
    WORD32 i4_wd_mbs = ps_proc->i4_wd_mbs;

    /*height in mbs*/
    WORD32 i4_ht_mbs = ps_proc->i4_ht_mbs;

    /* proc map */
    UWORD8 *pu1_proc_map = ps_proc->pu1_proc_map + (i4_mb_y * i4_wd_mbs);

    /* deblk context */
    deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;

    /* deblk bs context */
    bs_ctxt_t *ps_bs = &(ps_deblk->s_bs_ctxt);

    /* top row motion vector info */
    enc_pu_t *ps_top_row_pu = ps_proc->ps_top_row_pu + i4_mb_x;

    /* top left mb motion vector */
    enc_pu_t *ps_top_left_mb_pu = &ps_proc->s_top_left_mb_pu;

    /* left mb motion vector */
    enc_pu_t *ps_left_mb_pu = &ps_proc->s_left_mb_pu;

    /* sub mb modes */
    UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (i4_mb_x << 4);

    /*************************************************************/
    /* During MV prediction, when top right mb is not available, */
    /* top left mb info. is used for prediction. Hence the curr  */
    /* top, which will be top left for the next mb needs to be   */
    /* preserved before updating it with curr mb info.           */
    /*************************************************************/

    /* mb type, mb class, csbp */
    *ps_top_left_syn = *ps_top_syn;

    if (ps_proc->i4_slice_type != ISLICE)
    {
        /*****************************************/
        /* update top left with top info results */
        /*****************************************/
        /* mv */
        *ps_top_left_mb_pu = *ps_top_row_pu;
    }

    /*************************************************/
    /* update top and left with curr mb info results */
    /*************************************************/

    /* mb type */
    ps_left_syn->u2_mb_type = ps_top_syn->u2_mb_type = u4_mb_type;

    /* mb class */
    ps_left_syn->u2_is_intra = ps_top_syn->u2_is_intra = u4_is_intra;

    /* csbp */
    ps_left_syn->u4_csbp = ps_top_syn->u4_csbp = ps_proc->u4_csbp;

    /* distortion */
    ps_left_syn->i4_mb_distortion = ps_top_syn->i4_mb_distortion = ps_proc->i4_mb_distortion;

    if (u4_is_intra)
    {
        /* mb / sub mb modes */
        if (I16x16 == u4_mb_type)
        {
            pu1_top_mb_intra_modes[0] = ps_proc->au1_left_mb_intra_modes[0] = ps_proc->u1_l_i16_mode;
        }
        else if (I4x4 == u4_mb_type)
        {
            ps_codec->pf_mem_cpy_mul8(ps_proc->au1_left_mb_intra_modes, ps_proc->au1_intra_luma_mb_4x4_modes, 16);
            ps_codec->pf_mem_cpy_mul8(pu1_top_mb_intra_modes, ps_proc->au1_intra_luma_mb_4x4_modes, 16);
        }
        else if (I8x8 == u4_mb_type)
        {
            memcpy(ps_proc->au1_left_mb_intra_modes, ps_proc->au1_intra_luma_mb_8x8_modes, 4);
            memcpy(pu1_top_mb_intra_modes, ps_proc->au1_intra_luma_mb_8x8_modes, 4);
        }

        if ((ps_proc->i4_slice_type == PSLICE) ||(ps_proc->i4_slice_type == BSLICE))
        {
            /* mv */
            *ps_left_mb_pu = *ps_top_row_pu = *(ps_proc->ps_pu);
        }

        *ps_proc->pu4_mb_pu_cnt = 1;
    }
    else
    {
        /* mv */
        *ps_left_mb_pu = *ps_top_row_pu = *(ps_proc->ps_pu);
    }

    /*
     * Mark that the MB has been coded intra
     * So that future AIRs can skip it
     */
    ps_proc->pu1_is_intra_coded[i4_mb_x + (i4_mb_y * i4_wd_mbs)] = u4_is_intra;

    /**************************************************/
    /* pack mb header info. for entropy coding        */
    /**************************************************/
    ih264e_pack_header_data(ps_proc);

    /* update previous mb qp */
    ps_proc->u4_mb_qp_prev = ps_proc->u4_mb_qp;

    /* store qp */
    ps_proc->s_deblk_ctxt.s_bs_ctxt.pu1_pic_qp[(i4_mb_y * i4_wd_mbs) + i4_mb_x] = ps_proc->u4_mb_qp;

    /*
     * We need to sync the cache to make sure that the nmv content of proc
     * is updated to cache properly
     */
    DATA_SYNC();

    /* Just before finishing the row, enqueue the job in to entropy queue.
     * The master thread depending on its convenience shall dequeue it and
     * performs entropy.
     *
     * WARN !! Placing this block post proc map update can cause queuing of
     * entropy jobs in out of order.
     */
    if (i4_mb_x == i4_wd_mbs - 1)
    {
        /* job structures */
        job_t s_job;

        /* job class */
        s_job.i4_cmd = CMD_ENTROPY;

        /* number of mbs to be processed in the current job */
        s_job.i2_mb_cnt = ps_codec->s_cfg.i4_wd_mbs;

        /* job start index x */
        s_job.i2_mb_x = 0;

        /* job start index y */
        s_job.i2_mb_y = ps_proc->i4_mb_y;

        /* proc base idx */
        s_job.i2_proc_base_idx = (ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS) ? (MAX_PROCESS_CTXT / 2) : 0;

        /* queue the job */
        error_status = ih264_list_queue(ps_proc->pv_entropy_jobq, &s_job, 1);
        if(error_status != IH264_SUCCESS)
        {
            return error_status;
        }
        if(ps_proc->i4_mb_y == (i4_ht_mbs - 1))
            ih264_list_terminate(ps_codec->pv_entropy_jobq);
    }

    /* update intra cost if valid */
    if (ps_proc->i4_mb_intra_cost != INT_MAX)
    {
        ps_codec->pi4_mb_intra_cost[(i4_mb_y * i4_wd_mbs) + i4_mb_x] = ps_proc->i4_mb_intra_cost;
    }

    /* update proc map */
    pu1_proc_map[i4_mb_x] = 1;

    /**************************************************/
    /* update proc ctxt elements for encoding next mb */
    /**************************************************/
    /* update indices */
    i4_mb_x ++;
    ps_proc->i4_mb_x = i4_mb_x;

    if (ps_proc->i4_mb_x == i4_wd_mbs)
    {
        ps_proc->i4_mb_y++;
        ps_proc->i4_mb_x = 0;
    }

    /* update slice index */
    ps_proc->i4_cur_slice_idx = ps_proc->pu1_slice_idx[ps_proc->i4_mb_y * i4_wd_mbs + ps_proc->i4_mb_x];

    /* update buffers pointers */
    ps_proc->pu1_src_buf_luma += MB_SIZE;
    ps_proc->pu1_rec_buf_luma += MB_SIZE;
    ps_proc->apu1_ref_buf_luma[0] += MB_SIZE;
    ps_proc->apu1_ref_buf_luma[1] += MB_SIZE;

    /*
     * Note: Although chroma mb size is 8, as the chroma buffers are interleaved,
     * the stride per MB is MB_SIZE
     */
    ps_proc->pu1_src_buf_chroma += MB_SIZE;
    ps_proc->pu1_rec_buf_chroma += MB_SIZE;
    ps_proc->apu1_ref_buf_chroma[0] += MB_SIZE;
    ps_proc->apu1_ref_buf_chroma[1] += MB_SIZE;

    /* Reset cost, distortion params */
    ps_proc->i4_mb_cost = INT_MAX;
    ps_proc->i4_mb_intra_cost = INT_MAX;
    ps_proc->i4_mb_distortion = SHRT_MAX;

    ps_proc->ps_pu += *ps_proc->pu4_mb_pu_cnt;

    ps_proc->pu4_mb_pu_cnt += 1;

    /* Update colocated pu */
    if (ps_proc->i4_slice_type == BSLICE)
        ps_proc->ps_colpu += *(ps_proc->aps_mv_buf[1]->pu4_mb_pu_cnt +  (i4_mb_y * ps_proc->i4_wd_mbs) + i4_mb_x);

    /* deblk ctxts */
    if (ps_proc->u4_disable_deblock_level != 1)
    {
        /* indices */
        ps_bs->i4_mb_x = ps_proc->i4_mb_x;
        ps_bs->i4_mb_y = ps_proc->i4_mb_y;

#ifndef N_MB_ENABLE /* For N MB processing update take place inside deblocking function */
        ps_deblk->i4_mb_x ++;

        ps_deblk->pu1_cur_pic_luma += MB_SIZE;
        /*
         * Note: Although chroma mb size is 8, as the chroma buffers are interleaved,
         * the stride per MB is MB_SIZE
         */
        ps_deblk->pu1_cur_pic_chroma += MB_SIZE;
#endif
    }

    return error_status;
}

/**
*******************************************************************************
*
* @brief   initialize process context.
*
* @par Description:
*  Before dispatching the current job to process thread, the process context
*  associated with the job is initialized. Usually every job aims to encode one
*  row of mb's. Basing on the row indices provided by the job, the process
*  context's buffer ptrs, slice indices and other elements that are necessary
*  during core-coding are initialized.
*
* @param[in] ps_proc
*  Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
{
    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* nmb processing context*/
    n_mb_process_ctxt_t *ps_n_mb_ctxt = &ps_proc->s_n_mb_ctxt;

    /* indices */
    WORD32 i4_mb_x, i4_mb_y;

    /* strides */
    WORD32 i4_src_strd = ps_proc->i4_src_strd;
    WORD32 i4_src_chroma_strd = ps_proc->i4_src_chroma_strd;
    WORD32 i4_rec_strd = ps_proc->i4_rec_strd;

    /* quant params */
    quant_params_t *ps_qp_params = ps_proc->ps_qp_params[0];

    /* deblk ctxt */
    deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;

    /* deblk bs context */
    bs_ctxt_t *ps_bs = &(ps_deblk->s_bs_ctxt);

    /* Pointer to mv_buffer of current frame */
    mv_buf_t *ps_cur_mv_buf = ps_proc->ps_cur_mv_buf;

    /* Pointers for color space conversion */
    UWORD8 *pu1_y_buf_base, *pu1_u_buf_base, *pu1_v_buf_base;

    /* Pad the MB to support non standard sizes */
    UWORD32 u4_pad_right_sz = ps_codec->s_cfg.u4_wd - ps_codec->s_cfg.u4_disp_wd;
    UWORD32 u4_pad_bottom_sz = ps_codec->s_cfg.u4_ht - ps_codec->s_cfg.u4_disp_ht;
    UWORD16 u2_num_rows = MB_SIZE;
    WORD32 convert_uv_only;

    /********************************************************************/
    /*                            BEGIN INIT                            */
    /********************************************************************/

    i4_mb_x = ps_proc->i4_mb_x;
    i4_mb_y = ps_proc->i4_mb_y;

    /* Number of mbs processed in one loop of process function */
    ps_proc->i4_nmb_ntrpy = ps_proc->i4_wd_mbs;
    ps_proc->u4_nmb_me = ps_proc->i4_wd_mbs;

    /* init buffer pointers */
    convert_uv_only = 1;
    if (u4_pad_bottom_sz || u4_pad_right_sz ||
        ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE ||
        ps_codec->s_cfg.u4_enable_quality_metrics & QUALITY_MASK_PSNR ||
        ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
    {
        if (ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1)
            u2_num_rows = (UWORD16) MB_SIZE - u4_pad_bottom_sz;
        ps_proc->pu1_src_buf_luma_base = ps_codec->pu1_y_csc_buf_base;
        i4_src_strd = ps_proc->i4_src_strd = ps_codec->s_cfg.u4_max_wd;
        ps_proc->pu1_src_buf_luma = ps_proc->pu1_src_buf_luma_base + (i4_mb_x * MB_SIZE) + ps_codec->s_cfg.u4_max_wd * (i4_mb_y * MB_SIZE);
        convert_uv_only = 0;
    }
    else
    {
        i4_src_strd = ps_proc->i4_src_strd = ps_proc->s_inp_buf.s_raw_buf.au4_strd[0];
        ps_proc->pu1_src_buf_luma = ps_proc->pu1_src_buf_luma_base + (i4_mb_x * MB_SIZE) + i4_src_strd * (i4_mb_y * MB_SIZE);
    }


    if (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE ||
        ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420P ||
        ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1) ||
        ps_codec->s_cfg.u4_enable_quality_metrics & QUALITY_MASK_PSNR ||
        u4_pad_bottom_sz || u4_pad_right_sz)
    {
        if ((ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420SP_UV) ||
            (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420SP_VU))
            ps_proc->pu1_src_buf_chroma_base = ps_codec->pu1_uv_csc_buf_base;

        ps_proc->pu1_src_buf_chroma = ps_proc->pu1_src_buf_chroma_base + (i4_mb_x * MB_SIZE) + ps_codec->s_cfg.u4_max_wd * (i4_mb_y * BLK8x8SIZE);
        i4_src_chroma_strd = ps_proc->i4_src_chroma_strd = ps_codec->s_cfg.u4_max_wd;
    }
    else
    {
        i4_src_chroma_strd = ps_proc->i4_src_chroma_strd = ps_proc->s_inp_buf.s_raw_buf.au4_strd[1];
        ps_proc->pu1_src_buf_chroma = ps_proc->pu1_src_buf_chroma_base + (i4_mb_x * MB_SIZE) + i4_src_chroma_strd * (i4_mb_y * BLK8x8SIZE);
    }

    ps_proc->pu1_rec_buf_luma = ps_proc->pu1_rec_buf_luma_base + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * MB_SIZE);
    ps_proc->pu1_rec_buf_chroma = ps_proc->pu1_rec_buf_chroma_base + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * BLK8x8SIZE);

    /* Temporal back and forward reference buffer */
    ps_proc->apu1_ref_buf_luma[0] = ps_proc->apu1_ref_buf_luma_base[0] + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * MB_SIZE);
    ps_proc->apu1_ref_buf_chroma[0] = ps_proc->apu1_ref_buf_chroma_base[0] + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * BLK8x8SIZE);
    ps_proc->apu1_ref_buf_luma[1] = ps_proc->apu1_ref_buf_luma_base[1] + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * MB_SIZE);
    ps_proc->apu1_ref_buf_chroma[1] = ps_proc->apu1_ref_buf_chroma_base[1] + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * BLK8x8SIZE);

    /*
     * Do color space conversion
     * NOTE : We assume there that the number of MB's to process will not span multiple rows
     */
    switch (ps_codec->s_cfg.e_inp_color_fmt)
    {
        case IV_YUV_420SP_UV:
        case IV_YUV_420SP_VU:
            /* In case of 420 semi-planar input, copy last few rows to intermediate
               buffer as few SIMD functions access upto 16 more bytes.
               This data will be padded if required */
            if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1) || u4_pad_bottom_sz || u4_pad_right_sz)
            {
                WORD32 num_rows = MB_SIZE;
                UWORD8 *pu1_src;
                UWORD8 *pu1_dst;
                WORD32 i;
                pu1_src = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[0] + (i4_mb_x * MB_SIZE) +
                          ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] * (i4_mb_y * MB_SIZE);

                pu1_dst = ps_proc->pu1_src_buf_luma;

                if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
                    num_rows = MB_SIZE - u4_pad_bottom_sz;
                for (i = 0; i < num_rows; i++)
                {
                    memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_disp_wd);
                    pu1_src += ps_proc->s_inp_buf.s_raw_buf.au4_strd[0];
                    pu1_dst += ps_proc->i4_src_strd;
                }
                pu1_src = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[1] + (i4_mb_x * BLK8x8SIZE) +
                          ps_proc->s_inp_buf.s_raw_buf.au4_strd[1] * (i4_mb_y * BLK8x8SIZE);
                pu1_dst = ps_proc->pu1_src_buf_chroma;

                /* Last MB row of chroma is copied unconditionally, since trans functions access an extra byte
                 * due to interleaved input
                 */
                if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
                    num_rows = (ps_codec->s_cfg.u4_disp_ht >> 1) - (ps_proc->i4_mb_y * BLK8x8SIZE);
                else
                    num_rows = BLK8x8SIZE;
                for (i = 0; i < num_rows; i++)
                {
                    memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_disp_wd);
                    pu1_src += ps_proc->s_inp_buf.s_raw_buf.au4_strd[1];
                    pu1_dst += ps_proc->i4_src_chroma_strd;
                }

            }
            break;

        case IV_YUV_420P :
            pu1_y_buf_base = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[0] + (i4_mb_x * MB_SIZE) +
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] * (i4_mb_y * MB_SIZE);

            pu1_u_buf_base = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[1] + (i4_mb_x * BLK8x8SIZE) +
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[1] * (i4_mb_y * BLK8x8SIZE);

            pu1_v_buf_base = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[2] + (i4_mb_x * BLK8x8SIZE) +
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[2] * (i4_mb_y * BLK8x8SIZE);

            ps_codec->pf_ih264e_conv_420p_to_420sp(
                            pu1_y_buf_base, pu1_u_buf_base, pu1_v_buf_base,
                            ps_proc->pu1_src_buf_luma,
                            ps_proc->pu1_src_buf_chroma, u2_num_rows,
                            ps_codec->s_cfg.u4_disp_wd,
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[0],
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[1],
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[2],
                            ps_proc->i4_src_strd, ps_proc->i4_src_chroma_strd,
                            convert_uv_only);
            break;

        case IV_YUV_422ILE :
            pu1_y_buf_base =  (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[0] + (i4_mb_x * MB_SIZE * 2)
                              + ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] * (i4_mb_y * MB_SIZE);

            ps_codec->pf_ih264e_fmt_conv_422i_to_420sp(
                            ps_proc->pu1_src_buf_luma,
                            ps_proc->pu1_src_buf_chroma,
                            ps_proc->pu1_src_buf_chroma + 1, pu1_y_buf_base,
                            ps_codec->s_cfg.u4_disp_wd, u2_num_rows,
                            ps_proc->i4_src_strd, ps_proc->i4_src_chroma_strd,
                            ps_proc->i4_src_chroma_strd,
                            ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] >> 1);
            break;

        default:
            break;
    }

    if (u4_pad_right_sz && (ps_proc->i4_mb_x == 0))
    {
        UWORD32 u4_pad_wd, u4_pad_ht;
        u4_pad_wd = (UWORD32)(ps_proc->i4_src_strd - ps_codec->s_cfg.u4_disp_wd);
        u4_pad_wd = MIN(u4_pad_right_sz, u4_pad_wd);
        u4_pad_ht = MB_SIZE;
        if(ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1)
            u4_pad_ht = MIN(MB_SIZE, (MB_SIZE - u4_pad_bottom_sz));

        ih264_pad_right_luma(
                        ps_proc->pu1_src_buf_luma + ps_codec->s_cfg.u4_disp_wd,
                        ps_proc->i4_src_strd, u4_pad_ht, u4_pad_wd);

        ih264_pad_right_chroma(
                        ps_proc->pu1_src_buf_chroma + ps_codec->s_cfg.u4_disp_wd,
                        ps_proc->i4_src_chroma_strd, u4_pad_ht / 2, u4_pad_wd);
    }

    if (ps_proc->i4_mb_y && ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1) {
        UWORD8 *pu1_src = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[0] +
                        ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] * (i4_mb_y * MB_SIZE) -
                        ps_proc->s_inp_buf.s_raw_buf.au4_strd[0];
        UWORD8 *pu1_dst = ps_proc->pu1_src_buf_luma - ps_proc->i4_src_strd;
        memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_disp_wd);
        if (u4_pad_right_sz && (ps_proc->i4_mb_x == 0)) {
            pu1_dst += ps_codec->s_cfg.u4_disp_wd;
            memset(pu1_dst, pu1_dst[-1], u4_pad_right_sz);
        }
    }

    /* pad bottom edge */
    if (u4_pad_bottom_sz && (ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1) && ps_proc->i4_mb_x == 0)
    {
        ih264_pad_bottom(ps_proc->pu1_src_buf_luma + (MB_SIZE - u4_pad_bottom_sz) * ps_proc->i4_src_strd,
                         ps_proc->i4_src_strd, ps_proc->i4_src_strd, u4_pad_bottom_sz);

        ih264_pad_bottom(ps_proc->pu1_src_buf_chroma + (MB_SIZE - u4_pad_bottom_sz) * ps_proc->i4_src_chroma_strd / 2,
                         ps_proc->i4_src_chroma_strd, ps_proc->i4_src_chroma_strd, (u4_pad_bottom_sz / 2));
    }


    /* packed mb coeff data */
    ps_proc->pv_mb_coeff_data = ((UWORD8 *)ps_proc->pv_pic_mb_coeff_data) + i4_mb_y * ps_codec->u4_size_coeff_data;

    /* packed mb header data */
    ps_proc->pv_mb_header_data = ((UWORD8 *)ps_proc->pv_pic_mb_header_data) + i4_mb_y * ps_codec->u4_size_header_data;

    /* slice index */
    ps_proc->i4_cur_slice_idx = ps_proc->pu1_slice_idx[i4_mb_y * ps_proc->i4_wd_mbs + i4_mb_x];

    /*********************************************************************/
    /* ih264e_init_quant_params() routine is called at the pic init level*/
    /* this would have initialized the qp.                               */
    /* TODO_LATER: currently it is assumed that quant params donot change*/
    /* across mb's. When they do calculate update ps_qp_params accordingly*/
    /*********************************************************************/

    /* init mv buffer ptr */
    ps_proc->ps_pu = ps_cur_mv_buf->ps_pic_pu + (i4_mb_y * ps_proc->i4_wd_mbs *
                     ((MB_SIZE * MB_SIZE) / (ENC_MIN_PU_SIZE * ENC_MIN_PU_SIZE)));

    /* Init co-located mv buffer */
    ps_proc->ps_colpu = ps_proc->aps_mv_buf[1]->ps_pic_pu + (i4_mb_y * ps_proc->i4_wd_mbs *
                        ((MB_SIZE * MB_SIZE) / (ENC_MIN_PU_SIZE * ENC_MIN_PU_SIZE)));

    if (i4_mb_y == 0)
    {
        ps_proc->ps_top_row_pu_ME = ps_cur_mv_buf->ps_pic_pu;
    }
    else
    {
        ps_proc->ps_top_row_pu_ME = ps_cur_mv_buf->ps_pic_pu + ((i4_mb_y - 1) * ps_proc->i4_wd_mbs *
                                    ((MB_SIZE * MB_SIZE) / (ENC_MIN_PU_SIZE * ENC_MIN_PU_SIZE)));
    }

    ps_proc->pu4_mb_pu_cnt = ps_cur_mv_buf->pu4_mb_pu_cnt + (i4_mb_y * ps_proc->i4_wd_mbs);

    /* mb type */
    ps_proc->u4_mb_type = I16x16;

    /* lambda */
    if (ps_codec->pic_type == PIC_B)
    {
        ps_proc->u4_lambda = gu1_qp_lambdaB[ps_qp_params->u1_mb_qp];
    }
    else
    {
        ps_proc->u4_lambda = gu1_qp_lambdaIP[ps_qp_params->u1_mb_qp];
    }

    /* mb distortion */
    ps_proc->i4_mb_distortion = SHRT_MAX;

    if (i4_mb_x == 0)
    {
        ps_proc->s_left_mb_syntax_ele.i4_mb_distortion = 0;

        ps_proc->s_top_left_mb_syntax_ele.i4_mb_distortion = 0;

        ps_proc->s_top_left_mb_syntax_ME.i4_mb_distortion = 0;

        if (i4_mb_y == 0)
        {
            memset(ps_proc->ps_top_row_mb_syntax_ele, 0, (ps_proc->i4_wd_mbs + 1)*sizeof(mb_info_t));
        }
    }

    /* mb cost */
    ps_proc->i4_mb_cost = INT_MAX;
    ps_proc->i4_mb_intra_cost = INT_MAX;

    /**********************/
    /* init deblk context */
    /**********************/
    ps_deblk->i4_mb_x = ps_proc->i4_mb_x;
    /* deblk lags the current mb proc by 1 row */
    /* NOTE: Intra prediction has to happen with non deblocked samples used as reference */
    /* Hence to deblk MB 0 of row 0, you have wait till MB 0 of row 1 is encoded. */
    /* For simplicity, we chose to lag deblking by 1 Row wrt to proc */
    ps_deblk->i4_mb_y = ps_proc->i4_mb_y - 1;

    /* buffer ptrs */
    ps_deblk->pu1_cur_pic_luma = ps_proc->pu1_rec_buf_luma_base + i4_rec_strd * (ps_deblk->i4_mb_y * MB_SIZE);
    ps_deblk->pu1_cur_pic_chroma = ps_proc->pu1_rec_buf_chroma_base + i4_rec_strd * (ps_deblk->i4_mb_y * BLK8x8SIZE);

    /* init deblk bs context */
    /* mb indices */
    ps_bs->i4_mb_x = ps_proc->i4_mb_x;
    ps_bs->i4_mb_y = ps_proc->i4_mb_y;

    /* init n_mb_process  context */
    ps_n_mb_ctxt->i4_mb_x = 0;
    ps_n_mb_ctxt->i4_mb_y = ps_deblk->i4_mb_y;
    ps_n_mb_ctxt->i4_n_mbs = ps_proc->i4_nmb_ntrpy;

    return IH264E_SUCCESS;
}

/**
*******************************************************************************
*
* @brief This function performs luma & chroma padding
*
* @par Description:
*
* @param[in] ps_proc
*  Process context corresponding to the job
*
* @param[in] pu1_curr_pic_luma
*  Pointer to luma buffer
*
* @param[in] pu1_curr_pic_chroma
*  Pointer to chroma buffer
*
* @param[in] i4_mb_x
*  mb index x
*
* @param[in] i4_mb_y
*  mb index y
*
*  @param[in] i4_pad_ht
*  number of rows to be padded
*
* @returns  error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_pad_recon_buffer(process_ctxt_t *ps_proc,
                                       UWORD8 *pu1_curr_pic_luma,
                                       UWORD8 *pu1_curr_pic_chroma,
                                       WORD32 i4_mb_x,
                                       WORD32 i4_mb_y,
                                       WORD32 i4_pad_ht)
{
    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* strides */
    WORD32 i4_rec_strd = ps_proc->i4_rec_strd;

    if (i4_mb_x == 0)
    {
        /* padding left luma */
        ps_codec->pf_pad_left_luma(pu1_curr_pic_luma, i4_rec_strd, i4_pad_ht, PAD_LEFT);

        /* padding left chroma */
        ps_codec->pf_pad_left_chroma(pu1_curr_pic_chroma, i4_rec_strd, i4_pad_ht >> 1, PAD_LEFT);
    }
    if (i4_mb_x == ps_proc->i4_wd_mbs - 1)
    {
        /* padding right luma */
        ps_codec->pf_pad_right_luma(pu1_curr_pic_luma + MB_SIZE, i4_rec_strd, i4_pad_ht, PAD_RIGHT);

        /* padding right chroma */
        ps_codec->pf_pad_right_chroma(pu1_curr_pic_chroma + MB_SIZE, i4_rec_strd, i4_pad_ht >> 1, PAD_RIGHT);

        if (i4_mb_y == ps_proc->i4_ht_mbs - 1)
        {
            UWORD8 *pu1_rec_luma = pu1_curr_pic_luma + MB_SIZE + PAD_RIGHT + ((i4_pad_ht - 1) * i4_rec_strd);
            UWORD8 *pu1_rec_chroma = pu1_curr_pic_chroma + MB_SIZE + PAD_RIGHT + (((i4_pad_ht >> 1) - 1) * i4_rec_strd);

            /* padding bottom luma */
            ps_codec->pf_pad_bottom(pu1_rec_luma, i4_rec_strd, i4_rec_strd, PAD_BOT);

            /* padding bottom chroma */
            ps_codec->pf_pad_bottom(pu1_rec_chroma, i4_rec_strd, i4_rec_strd, (PAD_BOT >> 1));
        }
    }

    if (i4_mb_y == 0)
    {
        UWORD8 *pu1_rec_luma = pu1_curr_pic_luma;
        UWORD8 *pu1_rec_chroma = pu1_curr_pic_chroma;
        WORD32 wd = MB_SIZE;

        if (i4_mb_x == 0)
        {
            pu1_rec_luma -= PAD_LEFT;
            pu1_rec_chroma -= PAD_LEFT;

            wd += PAD_LEFT;
        }
        if (i4_mb_x == ps_proc->i4_wd_mbs - 1)
        {
            wd += PAD_RIGHT;
        }

        /* padding top luma */
        ps_codec->pf_pad_top(pu1_rec_luma, i4_rec_strd, wd, PAD_TOP);

        /* padding top chroma */
        ps_codec->pf_pad_top(pu1_rec_chroma, i4_rec_strd, wd, (PAD_TOP >> 1));
    }

    return IH264E_SUCCESS;
}

/**
*******************************************************************************
*
* @brief This function performs deblocking, padding and halfpel generation for
*  'n' MBs
*
* @par Description:
*
* @param[in] ps_proc
*  Process context corresponding to the job
*
* @param[in] pu1_curr_pic_luma
* Current MB being processed(Luma)
*
* @param[in] pu1_curr_pic_chroma
* Current MB being processed(Chroma)
*
* @param[in] i4_mb_x
* Column value of current MB processed
*
* @param[in] i4_mb_y
* Curent row processed
*
* @returns  error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_dblk_pad_hpel_processing_n_mbs(process_ctxt_t *ps_proc,
                                                     UWORD8 *pu1_curr_pic_luma,
                                                     UWORD8 *pu1_curr_pic_chroma,
                                                     WORD32 i4_mb_x,
                                                     WORD32 i4_mb_y)
{
    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* n_mb processing context */
    n_mb_process_ctxt_t *ps_n_mb_ctxt = &ps_proc->s_n_mb_ctxt;

    /* deblk context */
    deblk_ctxt_t *ps_deblk = &ps_proc->s_deblk_ctxt;

    /* strides */
    WORD32 i4_rec_strd = ps_proc->i4_rec_strd;

    /* loop variables */
    WORD32 row, i, j, col;

    /* Padding Width */
    UWORD32 u4_pad_wd;

    /* deblk_map of the row being deblocked */
    UWORD8 *pu1_deblk_map = ps_proc->pu1_deblk_map + ps_deblk->i4_mb_y * ps_proc->i4_wd_mbs;

    /* deblk_map_previous row */
    UWORD8 *pu1_deblk_map_prev_row = pu1_deblk_map - ps_proc->i4_wd_mbs;

    WORD32 u4_pad_top = 0;

    WORD32 u4_deblk_prev_row = 0;

    /* Number of mbs to be processed */
    WORD32 i4_n_mbs = ps_n_mb_ctxt->i4_n_mbs;

    /* Number of mbs  actually processed
     * (at the end of a row, when remaining number of MBs are less than i4_n_mbs) */
    WORD32 i4_n_mb_process_count = 0;

    UWORD8 *pu1_pad_bottom_src = NULL;

    UWORD8 *pu1_pad_src_luma = NULL;
    UWORD8 *pu1_pad_src_chroma = NULL;

    if (ps_proc->u4_disable_deblock_level == 1)
    {
        /* If left most MB is processed, then pad left */
        if (i4_mb_x == 0)
        {
            /* padding left luma */
            ps_codec->pf_pad_left_luma(pu1_curr_pic_luma, i4_rec_strd, MB_SIZE, PAD_LEFT);

            /* padding left chroma */
            ps_codec->pf_pad_left_chroma(pu1_curr_pic_chroma, i4_rec_strd, MB_SIZE >> 1, PAD_LEFT);
        }
        /*last col*/
        if (i4_mb_x == (ps_proc->i4_wd_mbs - 1))
        {
            /* padding right luma */
            ps_codec->pf_pad_right_luma(pu1_curr_pic_luma + MB_SIZE, i4_rec_strd, MB_SIZE, PAD_RIGHT);

            /* padding right chroma */
            ps_codec->pf_pad_right_chroma(pu1_curr_pic_chroma + MB_SIZE, i4_rec_strd, MB_SIZE >> 1, PAD_RIGHT);
        }
    }

    if ((i4_mb_y > 0) || (i4_mb_y == (ps_proc->i4_ht_mbs - 1)))
    {
        /* if number of mb's to be processed are less than 'N', go back.
         * exception to the above clause is end of row */
        if ( ((i4_mb_x - (ps_n_mb_ctxt->i4_mb_x - 1)) < i4_n_mbs) && (i4_mb_x < (ps_proc->i4_wd_mbs - 1)) )
        {
            return IH264E_SUCCESS;
        }
        else
        {
            i4_n_mb_process_count = MIN(i4_mb_x - (ps_n_mb_ctxt->i4_mb_x - 1), i4_n_mbs);

            /* performing deblocking for required number of MBs */
            if ((i4_mb_y > 0) && (ps_proc->u4_disable_deblock_level != 1))
            {
                u4_deblk_prev_row = 1;

                /* checking whether the top rows are deblocked */
                for (col = 0; col < i4_n_mb_process_count; col++)
                {
                    u4_deblk_prev_row &= pu1_deblk_map_prev_row[ps_deblk->i4_mb_x + col];
                }

                /* checking whether the top right MB is deblocked */
                if ((ps_deblk->i4_mb_x + i4_n_mb_process_count) != ps_proc->i4_wd_mbs)
                {
                    u4_deblk_prev_row &= pu1_deblk_map_prev_row[ps_deblk->i4_mb_x + i4_n_mb_process_count];
                }

                /* Top or Top right MBs not deblocked */
                if ((u4_deblk_prev_row != 1) && (i4_mb_y > 0))
                {
                    return IH264E_SUCCESS;
                }

                for (row = 0; row < i4_n_mb_process_count; row++)
                {
                    ih264e_deblock_mb(ps_proc, ps_deblk);

                    pu1_deblk_map[ps_deblk->i4_mb_x] = 1;

                    if (ps_deblk->i4_mb_y > 0)
                    {
                        if (ps_deblk->i4_mb_x == 0)/* If left most MB is processed, then pad left*/
                        {
                            /* padding left luma */
                            ps_codec->pf_pad_left_luma(ps_deblk->pu1_cur_pic_luma - i4_rec_strd * MB_SIZE, i4_rec_strd, MB_SIZE, PAD_LEFT);

                            /* padding left chroma */
                            ps_codec->pf_pad_left_chroma(ps_deblk->pu1_cur_pic_chroma - i4_rec_strd * BLK8x8SIZE, i4_rec_strd, MB_SIZE >> 1, PAD_LEFT);
                        }

                        if (ps_deblk->i4_mb_x == (ps_proc->i4_wd_mbs - 1))/*last column*/
                        {
                            /* padding right luma */
                            ps_codec->pf_pad_right_luma(ps_deblk->pu1_cur_pic_luma - i4_rec_strd * MB_SIZE + MB_SIZE, i4_rec_strd, MB_SIZE, PAD_RIGHT);

                            /* padding right chroma */
                            ps_codec->pf_pad_right_chroma(ps_deblk->pu1_cur_pic_chroma - i4_rec_strd * BLK8x8SIZE + MB_SIZE, i4_rec_strd, MB_SIZE >> 1, PAD_RIGHT);
                        }
                    }
                    ps_deblk->i4_mb_x++;

                    ps_deblk->pu1_cur_pic_luma += MB_SIZE;
                    ps_deblk->pu1_cur_pic_chroma += MB_SIZE;

                }
            }
            else if(i4_mb_y > 0)
            {
                ps_deblk->i4_mb_x += i4_n_mb_process_count;

                ps_deblk->pu1_cur_pic_luma += i4_n_mb_process_count * MB_SIZE;
                ps_deblk->pu1_cur_pic_chroma += i4_n_mb_process_count * MB_SIZE;
            }

            if (i4_mb_y == 2)
            {
                u4_pad_wd = i4_n_mb_process_count * MB_SIZE;
                u4_pad_top = ps_n_mb_ctxt->i4_mb_x * MB_SIZE;

                if (ps_n_mb_ctxt->i4_mb_x == 0)
                {
                    u4_pad_wd += PAD_LEFT;
                    u4_pad_top = -PAD_LEFT;
                }

                if (i4_mb_x == ps_proc->i4_wd_mbs - 1)
                {
                    u4_pad_wd += PAD_RIGHT;
                }

                /* padding top luma */
                ps_codec->pf_pad_top(ps_proc->pu1_rec_buf_luma_base + u4_pad_top, i4_rec_strd, u4_pad_wd, PAD_TOP);

                /* padding top chroma */
                ps_codec->pf_pad_top(ps_proc->pu1_rec_buf_chroma_base + u4_pad_top, i4_rec_strd, u4_pad_wd, (PAD_TOP >> 1));
            }

            ps_n_mb_ctxt->i4_mb_x += i4_n_mb_process_count;

            if (i4_mb_x == ps_proc->i4_wd_mbs - 1)
            {
                if (ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1)
                {
                    /* Bottom Padding is done in one stretch for the entire width */
                    if (ps_proc->u4_disable_deblock_level != 1)
                    {
                        ps_deblk->pu1_cur_pic_luma = ps_proc->pu1_rec_buf_luma_base + (ps_proc->i4_ht_mbs - 1) * i4_rec_strd * MB_SIZE;

                        ps_deblk->pu1_cur_pic_chroma = ps_proc->pu1_rec_buf_chroma_base + (ps_proc->i4_ht_mbs - 1) * i4_rec_strd * BLK8x8SIZE;

                        ps_n_mb_ctxt->i4_mb_x = 0;
                        ps_n_mb_ctxt->i4_mb_y = ps_proc->i4_mb_y;
                        ps_deblk->i4_mb_x = 0;
                        ps_deblk->i4_mb_y = ps_proc->i4_mb_y;

                        /* update pic qp map (as update_proc_ctxt is still not called for the last MB) */
                        ps_proc->s_deblk_ctxt.s_bs_ctxt.pu1_pic_qp[(i4_mb_y * ps_proc->i4_wd_mbs) + i4_mb_x] = ps_proc->u4_mb_qp;

                        i4_n_mb_process_count = (ps_proc->i4_wd_mbs) % i4_n_mbs;

                        j = (ps_proc->i4_wd_mbs) / i4_n_mbs;

                        for (i = 0; i < j; i++)
                        {
                            for (col = 0; col < i4_n_mbs; col++)
                            {
                                ih264e_deblock_mb(ps_proc, ps_deblk);

                                pu1_deblk_map[ps_deblk->i4_mb_x] = 1;

                                ps_deblk->i4_mb_x++;
                                ps_deblk->pu1_cur_pic_luma += MB_SIZE;
                                ps_deblk->pu1_cur_pic_chroma += MB_SIZE;
                                ps_n_mb_ctxt->i4_mb_x++;
                            }
                        }

                        for (col = 0; col < i4_n_mb_process_count; col++)
                        {
                            ih264e_deblock_mb(ps_proc, ps_deblk);

                            pu1_deblk_map[ps_deblk->i4_mb_x] = 1;

                            ps_deblk->i4_mb_x++;
                            ps_deblk->pu1_cur_pic_luma += MB_SIZE;
                            ps_deblk->pu1_cur_pic_chroma += MB_SIZE;
                            ps_n_mb_ctxt->i4_mb_x++;
                        }

                        pu1_pad_src_luma = ps_proc->pu1_rec_buf_luma_base + (ps_proc->i4_ht_mbs - 2) * MB_SIZE * i4_rec_strd;

                        pu1_pad_src_chroma = ps_proc->pu1_rec_buf_chroma_base + (ps_proc->i4_ht_mbs - 2) * BLK8x8SIZE * i4_rec_strd;

                        /* padding left luma */
                        ps_codec->pf_pad_left_luma(pu1_pad_src_luma, i4_rec_strd, MB_SIZE, PAD_LEFT);

                        /* padding left chroma */
                        ps_codec->pf_pad_left_chroma(pu1_pad_src_chroma, i4_rec_strd, BLK8x8SIZE, PAD_LEFT);

                        pu1_pad_src_luma += i4_rec_strd * MB_SIZE;
                        pu1_pad_src_chroma += i4_rec_strd * BLK8x8SIZE;

                        /* padding left luma */
                        ps_codec->pf_pad_left_luma(pu1_pad_src_luma, i4_rec_strd, MB_SIZE, PAD_LEFT);

                        /* padding left chroma */
                        ps_codec->pf_pad_left_chroma(pu1_pad_src_chroma, i4_rec_strd, BLK8x8SIZE, PAD_LEFT);

                        pu1_pad_src_luma = ps_proc->pu1_rec_buf_luma_base + (ps_proc->i4_ht_mbs - 2) * MB_SIZE * i4_rec_strd + (ps_proc->i4_wd_mbs) * MB_SIZE;

                        pu1_pad_src_chroma = ps_proc->pu1_rec_buf_chroma_base + (ps_proc->i4_ht_mbs - 2) * BLK8x8SIZE * i4_rec_strd + (ps_proc->i4_wd_mbs) * MB_SIZE;

                        /* padding right luma */
                        ps_codec->pf_pad_right_luma(pu1_pad_src_luma, i4_rec_strd, MB_SIZE, PAD_RIGHT);

                        /* padding right chroma */
                        ps_codec->pf_pad_right_chroma(pu1_pad_src_chroma, i4_rec_strd, BLK8x8SIZE, PAD_RIGHT);

                        pu1_pad_src_luma += i4_rec_strd * MB_SIZE;
                        pu1_pad_src_chroma += i4_rec_strd * BLK8x8SIZE;

                        /* padding right luma */
                        ps_codec->pf_pad_right_luma(pu1_pad_src_luma, i4_rec_strd, MB_SIZE, PAD_RIGHT);

                        /* padding right chroma */
                        ps_codec->pf_pad_right_chroma(pu1_pad_src_chroma, i4_rec_strd, BLK8x8SIZE, PAD_RIGHT);

                    }

                    /* In case height is less than 2 MBs pad top */
                    if (ps_proc->i4_ht_mbs <= 2)
                    {
                        UWORD8 *pu1_pad_top_src;
                        /* padding top luma */
                        pu1_pad_top_src = ps_proc->pu1_rec_buf_luma_base - PAD_LEFT;
                        ps_codec->pf_pad_top(pu1_pad_top_src, i4_rec_strd, i4_rec_strd, PAD_TOP);

                        /* padding top chroma */
                        pu1_pad_top_src = ps_proc->pu1_rec_buf_chroma_base - PAD_LEFT;
                        ps_codec->pf_pad_top(pu1_pad_top_src, i4_rec_strd, i4_rec_strd, (PAD_TOP >> 1));
                    }

                    /* padding bottom luma */
                    pu1_pad_bottom_src = ps_proc->pu1_rec_buf_luma_base + ps_proc->i4_ht_mbs * MB_SIZE * i4_rec_strd - PAD_LEFT;
                    ps_codec->pf_pad_bottom(pu1_pad_bottom_src, i4_rec_strd, i4_rec_strd, PAD_BOT);

                    /* padding bottom chroma */
                    pu1_pad_bottom_src = ps_proc->pu1_rec_buf_chroma_base + ps_proc->i4_ht_mbs * (MB_SIZE >> 1) * i4_rec_strd - PAD_LEFT;
                    ps_codec->pf_pad_bottom(pu1_pad_bottom_src, i4_rec_strd, i4_rec_strd, (PAD_BOT >> 1));
                }
            }
        }
    }

    return IH264E_SUCCESS;
}


/**
*******************************************************************************
*
* @brief This function performs luma & chroma encoding for a set of mb's.
*
* @par Description:
*  The mb to be coded is taken and is evaluated over a predefined set of modes
*  (intra (i16, i4, i8)/inter (mv, skip)) for best cost. The mode with least cost
*  is selected and using intra/inter prediction filters, prediction is carried out.
*  The deviation between src and pred signal constitutes error signal. This error
*  signal is transformed (hierarchical transform if necessary) and quantized. The
*  quantized residue is packed in to entropy buffer for entropy coding. This is
*  repeated for all the mb's enlisted under the job.
*
* @param[in] ps_proc
*  Process context corresponding to the job
*
* @returns  error status
*
* @remarks none
*
*******************************************************************************
*/
WORD32 ih264e_process(process_ctxt_t *ps_proc)
{
    /* error status */
    WORD32 error_status = IH264_SUCCESS;

    /* codec context */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* cbp luma, chroma */
    UWORD32 u4_cbp_l, u4_cbp_c;

    /* width in mbs */
    WORD32 i4_wd_mbs = ps_proc->i4_wd_mbs;

    /* loop var */
    WORD32  i4_mb_idx, i4_mb_cnt = ps_proc->i4_mb_cnt;

    /* valid modes */
    UWORD32 u4_valid_modes = 0;

    /* gate threshold */
    WORD32 i4_gate_threshold = 0;

    /* is intra */
    WORD32 luma_idx, chroma_idx, is_intra;

    /* temp variables */
    WORD32 ctxt_sel = ps_proc->i4_encode_api_call_cnt % MAX_CTXT_SETS;

    /*
     * list of modes for evaluation
     * -------------------------------------------------------------------------
     * Note on enabling I4x4 and I16x16
     * At very low QP's the hadamard transform in I16x16 will push up the maximum
     * coeff value very high. CAVLC may not be able to represent the value and
     * hence the stream may not be decodable in some clips.
     * Hence at low QPs, we will enable I4x4 and disable I16x16 irrespective of preset.
     */
    if (ps_proc->i4_slice_type == ISLICE)
    {
        if (ps_proc->u4_frame_qp > 10)
        {
            /* enable intra 16x16 */
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;

            /* enable intra 8x8 */
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_8x8 ? (1 << I8x8) : 0;
        }

        /* enable intra 4x4 */
        u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
        u4_valid_modes |= (ps_proc->u4_frame_qp <= 10) << I4x4;

    }
    else if (ps_proc->i4_slice_type == PSLICE)
    {
        if (ps_proc->u4_frame_qp > 10)
        {
            /* enable intra 16x16 */
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;
        }

        /* enable intra 4x4 */
        if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
        {
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
        }
        u4_valid_modes |= (ps_proc->u4_frame_qp <= 10) << I4x4;

        /* enable inter P16x16 */
        u4_valid_modes |= (1 << P16x16);
    }
    else if (ps_proc->i4_slice_type == BSLICE)
    {
        if (ps_proc->u4_frame_qp > 10)
        {
            /* enable intra 16x16 */
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_16x16 ? (1 << I16x16) : 0;
        }

        /* enable intra 4x4 */
        if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
        {
            u4_valid_modes |= ps_codec->s_cfg.u4_enable_intra_4x4 ? (1 << I4x4) : 0;
        }
        u4_valid_modes |= (ps_proc->u4_frame_qp <= 10) << I4x4;

        /* enable inter B16x16 */
        u4_valid_modes |= (1 << B16x16);
    }

    /* init entropy */
    ps_proc->s_entropy.i4_mb_x = ps_proc->i4_mb_x;
    ps_proc->s_entropy.i4_mb_y = ps_proc->i4_mb_y;
    ps_proc->s_entropy.i4_mb_cnt = MIN(ps_proc->i4_nmb_ntrpy, i4_wd_mbs - ps_proc->i4_mb_x);

    /* compute recon when :
     *   1. current frame is to be used as a reference
     *   2. dump recon for bit stream sanity check
     */
    ps_proc->u4_compute_recon = ps_codec->u4_is_curr_frm_ref ||
                                ps_codec->s_cfg.u4_enable_recon ||
                                ps_codec->s_cfg.u4_enable_quality_metrics & QUALITY_MASK_PSNR;

    /* Encode 'n' macroblocks,
     * 'n' being the number of mbs dictated by current proc ctxt */
    for (i4_mb_idx = 0; i4_mb_idx < i4_mb_cnt; i4_mb_idx ++)
    {
        /* since we have not yet found sad, we have not yet got min sad */
        /* we need to initialize these variables for each MB */
        /* TODO how to get the min sad into the codec */
        ps_proc->u4_min_sad = ps_codec->s_cfg.i4_min_sad;
        ps_proc->u4_min_sad_reached = 0;

        /* mb analysis */
        {
            /* temp var */
            WORD32 i4_mb_id = ps_proc->i4_mb_x + ps_proc->i4_mb_y * i4_wd_mbs;

            /* force intra refresh ? */
            WORD32 i4_air_enable_inter = (ps_codec->s_cfg.e_air_mode == IVE_AIR_MODE_NONE) ||
                            (ps_codec->pu2_intr_rfrsh_map[i4_mb_id] != ps_codec->i4_air_pic_cnt);

            /* evaluate inter 16x16 modes */
            if ((u4_valid_modes & (1 << P16x16)) || (u4_valid_modes & (1 << B16x16)))
            {
                /* compute nmb me */
                if (ps_proc->i4_mb_x % ps_proc->u4_nmb_me == 0)
                {
                    ih264e_compute_me_nmb(ps_proc, MIN((WORD32)ps_proc->u4_nmb_me,
                                                       i4_wd_mbs - ps_proc->i4_mb_x));
                }

                /* set pointers to ME data appropriately for other modules to use */
                {
                    UWORD32 u4_mb_index = ps_proc->i4_mb_x % ps_proc->u4_nmb_me ;

                    /* get the min sad condition for current mb */
                    ps_proc->u4_min_sad_reached = ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad_reached;
                    ps_proc->u4_min_sad = ps_proc->ps_nmb_info[u4_mb_index].u4_min_sad;
                    ps_proc->i4_mb_distortion = ps_proc->ps_nmb_info[u4_mb_index].i4_mb_distortion;
                    ps_proc->i4_mb_cost = ps_proc->ps_nmb_info[u4_mb_index].i4_mb_cost;
                    ps_proc->u4_mb_type = ps_proc->ps_nmb_info[u4_mb_index].u4_mb_type;

                    ps_proc->ps_skip_mv = &(ps_proc->ps_nmb_info[u4_mb_index].as_skip_mv[0]);
                    ps_proc->ps_ngbr_avbl = &(ps_proc->ps_nmb_info[u4_mb_index].s_ngbr_avbl);
                    ps_proc->ps_pred_mv = &(ps_proc->ps_nmb_info[u4_mb_index].as_pred_mv[0]);

                    /* get the best sub pel buffer */
                    ps_proc->pu1_best_subpel_buf = ps_proc->ps_nmb_info[u4_mb_index].pu1_best_sub_pel_buf;
                    ps_proc->u4_bst_spel_buf_strd = ps_proc->ps_nmb_info[u4_mb_index].u4_bst_spel_buf_strd;
                }
                ih264e_derive_nghbr_avbl_of_mbs(ps_proc);
            }
            else
            {
                /* Derive neighbor availability for the current macroblock */
                ps_proc->ps_ngbr_avbl = &ps_proc->s_ngbr_avbl;

                ih264e_derive_nghbr_avbl_of_mbs(ps_proc);
            }

            /*
             * If air says intra, we need to force the following code path to evaluate intra
             * The easy way is just to say that the inter cost is too much
             */
            if (!i4_air_enable_inter)
            {
                ps_proc->u4_min_sad_reached = 0;
                ps_proc->i4_mb_cost = INT_MAX;
                ps_proc->i4_mb_distortion = INT_MAX;
            }
            else if (ps_proc->u4_mb_type == PSKIP)
            {
                goto UPDATE_MB_INFO;
            }

            /* wait until the proc of [top + 1] mb is computed.
             * We wait till the proc dependencies are satisfied */
             if(ps_proc->i4_mb_y > 0)
             {
                /* proc map */
                UWORD8  *pu1_proc_map_top;

                pu1_proc_map_top = ps_proc->pu1_proc_map + ((ps_proc->i4_mb_y - 1) * i4_wd_mbs);

                while (1)
                {
                    volatile UWORD8 *pu1_buf;
                    WORD32 idx = i4_mb_idx + 1;

                    idx = MIN(idx, ((WORD32)ps_codec->s_cfg.i4_wd_mbs - 1));
                    pu1_buf =  pu1_proc_map_top + idx;
                    if(*pu1_buf)
                        break;
                    ithread_yield();
                }
            }

            /* If we already have the minimum sad, there is no point in searching for sad again */
            if (ps_proc->u4_min_sad_reached == 0 || ps_codec->s_cfg.u4_enc_speed_preset != IVE_FASTEST)
            {
                /* intra gating in inter slices */
                /* No need of gating if we want to force intra, we need to find the threshold only if inter is enabled by AIR*/
                if (i4_air_enable_inter && ps_proc->i4_slice_type != ISLICE && ps_codec->u4_inter_gate)
                {
                    /* distortion of neighboring blocks */
                    WORD32 i4_distortion[4];

                    i4_distortion[0] = ps_proc->s_left_mb_syntax_ele.i4_mb_distortion;

                    i4_distortion[1] = ps_proc->ps_top_row_mb_syntax_ele[ps_proc->i4_mb_x].i4_mb_distortion;

                    i4_distortion[2] = ps_proc->ps_top_row_mb_syntax_ele[ps_proc->i4_mb_x + 1].i4_mb_distortion;

                    i4_distortion[3] = ps_proc->s_top_left_mb_syntax_ele.i4_mb_distortion;

                    i4_gate_threshold = (i4_distortion[0] + i4_distortion[1] + i4_distortion[2] + i4_distortion[3]) >> 2;

                }


                /* If we are going to force intra we need to evaluate intra irrespective of gating */
                if ( (!i4_air_enable_inter) || ((i4_gate_threshold + 16 *((WORD32) ps_proc->u4_lambda)) < ps_proc->i4_mb_distortion))
                {
                    /* evaluate intra 4x4 modes */
                    if (u4_valid_modes & (1 << I4x4))
                    {
                        if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_SLOWEST)
                        {
                            ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton(ps_proc);
                        }
                        else
                        {
                            ih264e_evaluate_intra4x4_modes_for_least_cost_rdoptoff(ps_proc);
                        }
                    }

                    /* evaluate intra 16x16 modes */
                    if (u4_valid_modes & (1 << I16x16))
                    {
                        ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(ps_proc);
                    }

                    /* evaluate intra 8x8 modes */
                    if (u4_valid_modes & (1 << I8x8))
                    {
                        ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff(ps_proc);
                    }

                }
            }
        }

        /* is intra */
        if (ps_proc->u4_mb_type == I4x4 || ps_proc->u4_mb_type == I16x16 || ps_proc->u4_mb_type == I8x8)
        {
            luma_idx = ps_proc->u4_mb_type;
            chroma_idx = 0;
            is_intra = 1;

            /* evaluate chroma blocks for intra */
            ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(ps_proc);
        }
        else
        {
            luma_idx = 3;
            chroma_idx = 1;
            is_intra = 0;
        }
        ps_proc->u4_is_intra = is_intra;
        ps_proc->ps_pu->b1_intra_flag = is_intra;

        /* redo MV pred of neighbors in the case intra mb */
        /* TODO : currently called unconditionally, needs to be called only in the case of intra
         * to modify neighbors */
        if (ps_proc->i4_slice_type != ISLICE)
        {
            ih264e_mv_pred(ps_proc, ps_proc->i4_slice_type);
        }

        /* Perform luma mb core coding */
        u4_cbp_l = (ps_codec->luma_energy_compaction)[luma_idx](ps_proc);

        /* Perform luma mb core coding */
        u4_cbp_c = (ps_codec->chroma_energy_compaction)[chroma_idx](ps_proc);

        /* coded block pattern */
        ps_proc->u4_cbp = (u4_cbp_c << 4) | u4_cbp_l;

        if (!ps_proc->u4_is_intra)
        {
            if (ps_proc->i4_slice_type == BSLICE)
            {
                if (ih264e_find_bskip_params(ps_proc, PRED_L0))
                {
                    ps_proc->u4_mb_type = (ps_proc->u4_cbp) ? BDIRECT : BSKIP;
                }
            }
            else if(!ps_proc->u4_cbp)
            {
                if (ih264e_find_pskip_params(ps_proc, PRED_L0))
                {
                    ps_proc->u4_mb_type = PSKIP;
                }
            }
        }

UPDATE_MB_INFO:

        /* Update mb sad, mb qp and intra mb cost. Will be used by rate control */
        ih264e_update_rc_mb_info(&ps_proc->s_frame_info, ps_proc);

        /**********************************************************************/
        /* if disable deblock level is '0' this implies enable deblocking for */
        /* all edges of all macroblocks with out any restrictions             */
        /*                                                                    */
        /* if disable deblock level is '1' this implies disable deblocking for*/
        /* all edges of all macroblocks with out any restrictions             */
        /*                                                                    */
        /* if disable deblock level is '2' this implies enable deblocking for */
        /* all edges of all macroblocks except edges overlapping with slice   */
        /* boundaries. This option is not currently supported by the encoder  */
        /* hence the slice map should be of no significance to perform debloc */
        /* king                                                               */
        /**********************************************************************/

        if (ps_proc->u4_compute_recon)
        {
            /* deblk context */
            /* src pointers */
            UWORD8 *pu1_cur_pic_luma = ps_proc->pu1_rec_buf_luma;
            UWORD8 *pu1_cur_pic_chroma = ps_proc->pu1_rec_buf_chroma;

            /* src indices */
            UWORD32 i4_mb_x = ps_proc->i4_mb_x;
            UWORD32 i4_mb_y = ps_proc->i4_mb_y;

            /* compute blocking strength */
            if (ps_proc->u4_disable_deblock_level != 1)
            {
                ih264e_compute_bs(ps_proc);
            }

            /* nmb deblocking and hpel and padding */
            ih264e_dblk_pad_hpel_processing_n_mbs(ps_proc, pu1_cur_pic_luma,
                                                  pu1_cur_pic_chroma, i4_mb_x,
                                                  i4_mb_y);
        }

        /* update the context after for coding next mb */
        error_status = ih264e_update_proc_ctxt(ps_proc);
        if(error_status != IH264E_SUCCESS)
        {
            return error_status;
        }
        /* Once the last row is processed, mark the buffer status appropriately */
        if (ps_proc->i4_ht_mbs == ps_proc->i4_mb_y)
        {
            /* Pointer to current picture buffer structure */
            pic_buf_t *ps_cur_pic = ps_proc->ps_cur_pic;

            /* Pointer to current picture's mv buffer structure */
            mv_buf_t *ps_cur_mv_buf = ps_proc->ps_cur_mv_buf;

            /**********************************************************************/
            /* if disable deblock level is '0' this implies enable deblocking for */
            /* all edges of all macroblocks with out any restrictions             */
            /*                                                                    */
            /* if disable deblock level is '1' this implies disable deblocking for*/
            /* all edges of all macroblocks with out any restrictions             */
            /*                                                                    */
            /* if disable deblock level is '2' this implies enable deblocking for */
            /* all edges of all macroblocks except edges overlapping with slice   */
            /* boundaries. This option is not currently supported by the encoder  */
            /* hence the slice map should be of no significance to perform debloc */
            /* king                                                               */
            /**********************************************************************/
            error_status = ih264_buf_mgr_release(ps_codec->pv_mv_buf_mgr,
                                                ps_cur_mv_buf->i4_buf_id , BUF_MGR_CODEC);
            if(error_status != IH264E_SUCCESS)
            {
                return error_status;
            }
            error_status = ih264_buf_mgr_release(ps_codec->pv_ref_buf_mgr,
                                                ps_cur_pic->i4_buf_id , BUF_MGR_CODEC);
            if(error_status != IH264E_SUCCESS)
            {
                return error_status;
            }
            if (ps_codec->s_cfg.u4_enable_recon)
            {
                /* pic cnt */
                ps_codec->as_rec_buf[ctxt_sel].i4_pic_cnt = ps_proc->i4_pic_cnt;

                /* rec buffers */
                ps_codec->as_rec_buf[ctxt_sel].s_pic_buf  = *ps_proc->ps_cur_pic;

                /* is last? */
                ps_codec->as_rec_buf[ctxt_sel].u4_is_last = ps_proc->s_entropy.u4_is_last;

                /* frame time stamp */
                ps_codec->as_rec_buf[ctxt_sel].u4_timestamp_high = ps_proc->s_entropy.u4_timestamp_high;
                ps_codec->as_rec_buf[ctxt_sel].u4_timestamp_low = ps_proc->s_entropy.u4_timestamp_low;
            }

        }
    }

    DEBUG_HISTOGRAM_DUMP(ps_codec->s_cfg.i4_ht_mbs == ps_proc->i4_mb_y);

    return error_status;
}

/**
*******************************************************************************
*
* @brief
*  Function to update rc context after encoding
*
* @par   Description
*  This function updates the rate control context after the frame is encoded.
*  Number of bits consumed by the current frame, frame distortion, frame cost,
*  number of intra/inter mb's, ... are passed on to rate control context for
*  updating the rc model.
*
* @param[in] ps_codec
*  Handle to codec context
*
* @param[in] ctxt_sel
*  frame context selector
*
* @param[in] pic_cnt
*  pic count
*
* @returns i4_stuffing_byte
*  number of stuffing bytes (if necessary)
*
* @remarks
*
*******************************************************************************
*/
WORD32 ih264e_update_rc_post_enc(codec_t *ps_codec, WORD32 ctxt_sel, WORD32 i4_is_first_frm)
{
    /* proc set base idx */
    WORD32 i4_proc_ctxt_sel_base = ctxt_sel ? (MAX_PROCESS_CTXT / 2) : 0;

    /* proc ctxt */
    process_ctxt_t *ps_proc = &ps_codec->as_process[i4_proc_ctxt_sel_base];

    /* entropy context */
    entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;

    /* Bitstream structure */
    bitstrm_t *ps_bitstrm = ps_entropy->ps_bitstrm;

    /* frame qp */
    UWORD8 u1_frame_qp = ps_codec->u4_frame_qp;

    /* cbr rc return status */
    WORD32 i4_stuffing_byte = 0;

    /* current frame stats */
    frame_info_t s_frame_info;
    picture_type_e rc_pic_type;

    /* temp var */
    WORD32 i, j;

    /********************************************************************/
    /*                            BEGIN INIT                            */
    /********************************************************************/

    /* init frame info */
    irc_init_frame_info(&s_frame_info);

    /* get frame info */
    for (i = 0; i < (WORD32)ps_codec->s_cfg.u4_num_cores; i++)
    {
        /*****************************************************************/
        /* One frame can be encoded by max of u4_num_cores threads       */
        /* Accumulating the num mbs, sad, qp and intra_mb_cost from      */
        /* u4_num_cores threads                                          */
        /*****************************************************************/
        for (j = 0; j< MAX_MB_TYPE; j++)
        {
            s_frame_info.num_mbs[j] += ps_proc[i].s_frame_info.num_mbs[j];

            s_frame_info.tot_mb_sad[j] += ps_proc[i].s_frame_info.tot_mb_sad[j];

            s_frame_info.qp_sum[j] += ps_proc[i].s_frame_info.qp_sum[j];
        }

        s_frame_info.intra_mb_cost_sum += ps_proc[i].s_frame_info.intra_mb_cost_sum;

        s_frame_info.activity_sum += ps_proc[i].s_frame_info.activity_sum;

        /*****************************************************************/
        /* gather number of residue and header bits consumed by the frame*/
        /*****************************************************************/
        ih264e_update_rc_bits_info(&s_frame_info, &ps_proc[i].s_entropy);
    }

    /* get pic type */
    switch (ps_codec->pic_type)
    {
        case PIC_I:
        case PIC_IDR:
            rc_pic_type = I_PIC;
            break;
        case PIC_P:
            rc_pic_type = P_PIC;
            break;
        case PIC_B:
            rc_pic_type = B_PIC;
            break;
        default:
            assert(0);
            break;
    }

    /* update rc lib with current frame stats */
    i4_stuffing_byte =  ih264e_rc_post_enc(ps_codec->s_rate_control.pps_rate_control_api,
                                          &(s_frame_info),
                                          ps_codec->s_rate_control.pps_pd_frm_rate,
                                          ps_codec->s_rate_control.pps_time_stamp,
                                          ps_codec->s_rate_control.pps_frame_time,
                                          (ps_proc->i4_wd_mbs * ps_proc->i4_ht_mbs),
                                          &rc_pic_type,
                                          i4_is_first_frm,
                                          &ps_codec->s_rate_control.post_encode_skip[ctxt_sel],
                                          u1_frame_qp,
                                          &ps_codec->s_rate_control.num_intra_in_prev_frame,
                                          &ps_codec->s_rate_control.i4_avg_activity);

    /* cbr rc - house keeping */
    if (ps_codec->s_rate_control.post_encode_skip[ctxt_sel])
    {
         ps_entropy->ps_bitstrm->u4_strm_buf_offset = 0;
         // If an IDR frame was skipped, restore frame num and IDR pic id
         if (ps_codec->u4_is_idr == 1)
         {
             ps_codec->i4_frame_num = ps_codec->i4_restore_frame_num;
             ps_codec->i4_idr_pic_id--;
         }
    }
    else if (i4_stuffing_byte)
    {
        /* add filler nal units */
        ps_entropy->i4_error_code = ih264e_add_filler_nal_unit(ps_bitstrm, i4_stuffing_byte);
    }

    /*
     * Frame number is to be incremented only if the current frame is a
     * reference frame. After each successful frame encode, we increment
     * frame number by 1
     */
    if (!ps_codec->s_rate_control.post_encode_skip[ctxt_sel]
                    && ps_codec->u4_is_curr_frm_ref)
    {
        ps_codec->i4_frame_num++;
    }
    /********************************************************************/
    /*      signal the output                                           */
    /********************************************************************/
    ps_codec->as_out_buf[ctxt_sel].s_bits_buf.u4_bytes =
                    ps_entropy->ps_bitstrm->u4_strm_buf_offset;

    return ps_entropy->i4_error_code;
}

/**
*******************************************************************************
*
* @brief
*  entry point of a spawned encoder thread
*
* @par Description:
*  The encoder thread dequeues a proc/entropy job from the encoder queue and
*  calls necessary routines.
*
* @param[in] pv_proc
*  Process context corresponding to the thread
*
* @returns  error status
*
* @remarks
*
*******************************************************************************
*/
WORD32 ih264e_process_thread(void *pv_proc)
{
    /* error status */
    IH264_ERROR_T ret = IH264_SUCCESS;
    WORD32 error_status = IH264_SUCCESS;

    /* proc ctxt */
    process_ctxt_t *ps_proc = pv_proc;

    /* codec ctxt */
    codec_t *ps_codec = ps_proc->ps_codec;

    /* structure to represent a processing job entry */
    job_t s_job;

    /* blocking call : entropy dequeue is non-blocking till all
     * the proc jobs are processed */
    WORD32 is_blocking = 0;

    /* codec context selector */
    WORD32 ctxt_sel = ps_codec->i4_encode_api_call_cnt % MAX_CTXT_SETS;

    /* set affinity */
    ithread_set_affinity(ps_proc->i4_id);

    ps_proc->i4_error_code = IH264_SUCCESS;
    while(1)
    {
        /* dequeue a job from the entropy queue */
        {
            int error = ithread_mutex_lock(ps_codec->pv_entropy_mutex);

            volatile UWORD32 *pu4_buf = &ps_codec->au4_entropy_thread_active[ctxt_sel];

            /* have the lock */
            if (error == 0)
            {
                if (*pu4_buf == 0)
                {
                    /* no entropy threads are active, try dequeuing a job from the entropy queue */
                    ret = ih264_list_dequeue(ps_proc->pv_entropy_jobq, &s_job, is_blocking);
                    if (IH264_SUCCESS == ret)
                    {
                        *pu4_buf = 1;
                        ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
                        goto WORKER;
                    }
                    else if(is_blocking)
                    {
                        ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
                        break;
                    }
                }
                ithread_mutex_unlock(ps_codec->pv_entropy_mutex);
            }
        }

        /* dequeue a job from the process queue */
        ret = ih264_list_dequeue(ps_proc->pv_proc_jobq, &s_job, 1);
        if (IH264_SUCCESS != ret)
        {
            if(ps_proc->i4_id)
                break;
            else
            {
                is_blocking = 1;
                continue;
            }
        }

WORKER:
        /* choose appropriate proc context based on proc_base_idx */
        ps_proc = &ps_codec->as_process[ps_proc->i4_id + s_job.i2_proc_base_idx];

        switch (s_job.i4_cmd)
        {
            case CMD_PROCESS:
                ps_proc->i4_mb_cnt = s_job.i2_mb_cnt;
                ps_proc->i4_mb_x = s_job.i2_mb_x;
                ps_proc->i4_mb_y = s_job.i2_mb_y;

                /* init process context */
                ih264e_init_proc_ctxt(ps_proc);

                /* core code all mbs enlisted under the current job */
                error_status = ih264e_process(ps_proc);
                if(error_status !=IH264_SUCCESS)
                {
                    ps_proc->i4_error_code = error_status;
                    return ret;
                }
                break;

            case CMD_ENTROPY:
                ps_proc->s_entropy.i4_mb_x = s_job.i2_mb_x;
                ps_proc->s_entropy.i4_mb_y = s_job.i2_mb_y;
                ps_proc->s_entropy.i4_mb_cnt = s_job.i2_mb_cnt;

                /* init entropy */
                ih264e_init_entropy_ctxt(ps_proc);

                /* entropy code all mbs enlisted under the current job */
                error_status = ih264e_entropy(ps_proc);

                /* Dont execute any further instructions until store synchronization took place */
                DATA_SYNC();

                /* allow threads to dequeue entropy jobs */
                ps_codec->au4_entropy_thread_active[ctxt_sel] = 0;

                if (error_status != IH264_SUCCESS)
                {
                    ps_proc->i4_error_code = error_status;
                    return ret;
                }
                break;

            default:
                ps_proc->i4_error_code = IH264_FAIL;
                return ret;
        }
    }

    return ret;
}
