18d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/******************************************************************************
28d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
38d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Copyright (C) 2015 The Android Open Source Project
48d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
58d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Licensed under the Apache License, Version 2.0 (the "License");
68d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * you may not use this file except in compliance with the License.
78d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * You may obtain a copy of the License at:
88d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
98d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * http://www.apache.org/licenses/LICENSE-2.0
108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Unless required by applicable law or agreed to in writing, software
128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * distributed under the License is distributed on an "AS IS" BASIS,
138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * See the License for the specific language governing permissions and
158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * limitations under the License.
168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *****************************************************************************
188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *******************************************************************************
238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * @file
248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  ih264e_me.c
258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * @brief
278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  Contains definition of functions for motion estimation
288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * @author
308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  ittiam
318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * @par List of Functions:
338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_init_mv_bits()
348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_skip_analysis_chroma()
358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_skip_analysis_luma()
368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_analyse_skip()
378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_get_search_candidates()
388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_find_skip_motion_vector()
398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_get_mv_predictor()
408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_mv_pred()
418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_mv_pred_me()
428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_init_me()
438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_compute_me()
448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  - ih264e_compute_me_nmb()
458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * @remarks
478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  None
488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *******************************************************************************
508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* File Includes                                                             */
548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* System include files */
578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <stdio.h>
588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <assert.h>
598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <limits.h>
608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* User include files */
628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_typedefs.h"
638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "iv2.h"
648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ive2.h"
658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ithread.h"
668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_platform_macros.h"
678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_defs.h"
688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_defs.h"
698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_distortion_metrics.h"
708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_structs.h"
718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_structs.h"
728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_trans_quant_itrans_iquant.h"
738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_inter_pred_filters.h"
748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_mem_fns.h"
758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_padding.h"
768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_intra_pred_filters.h"
778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_deblk_edge_filters.h"
783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_cabac_tables.h"
798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_defs.h"
808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_error.h"
818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_bitstream.h"
828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "irc_cntrl_param.h"
838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "irc_frame_info_collector.h"
848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_rate_control.h"
853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_cabac_structs.h"
868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_structs.h"
878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_globals.h"
888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_macros.h"
898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_me.h"
908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime.h"
918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_debug.h"
928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_intra_modes_eval.h"
938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_core_coding.h"
948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_mc.h"
958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_debug.h"
968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_half_pel.h"
978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_statistics.h"
988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_platform_macros.h"
998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
1028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Function Definitions                                                      */
1038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
1048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
1068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
1078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief
1098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  This function populates the length of the codewords for motion vectors in the
1108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  range (-search range, search range) in pixels
1118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_me
1138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Pointer to me ctxt
1148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] pu1_mv_bits
1168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  length of the codeword for all mv's
1178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks The length of the code words are derived from signed exponential
1198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* goloumb codes.
1208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
1228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
1238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_init_mv_bits(me_ctxt_t *ps_me_ctxt)
1248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
1258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* temp var */
1268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i, codesize = 3, diff, limit;
1278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_code_num, u4_range;
1288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_uev_min, u4_uev_max, u4_sev_min, u4_sev_max;
1298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* max srch range */
1318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    diff = MAX(DEFAULT_MAX_SRCH_RANGE_X, DEFAULT_MAX_SRCH_RANGE_Y);
1328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* sub pel */
1338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    diff <<= 2;
1348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* delta mv */
1358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    diff <<= 1;
1368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* codeNum for positive integer     =  2x-1     : Table9-3  */
1388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u4_code_num = (diff << 1);
1398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* get range of the bit string and put using put_bits()                 */
1418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    GETRANGE(u4_range, u4_code_num);
1428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    limit = 2*u4_range - 1;
1448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* init mv bits */
1468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_me_ctxt->pu1_mv_bits[0] = 1;
1478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    while (codesize < limit)
1498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
1508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_uev_min = (1 << (codesize >> 1));
1518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_uev_max = 2*u4_uev_min - 1;
1528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_sev_min = u4_uev_min >> 1;
1548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_sev_max = u4_uev_max >> 1;
1558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        DEBUG("\n%d min, %d max %d codesize", u4_sev_min, u4_sev_max, codesize);
1578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for (i = u4_sev_min; i <= (WORD32)u4_sev_max; i++)
1598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
1608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_me_ctxt->pu1_mv_bits[-i] = ps_me_ctxt->pu1_mv_bits[i] = codesize;
1618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
1628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        codesize += 2;
1648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
1658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
1668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
1708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
1718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief Determines the valid candidates for which the initial search shall happen.
1738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* The best of these candidates is used to center the diamond pixel search.
1748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description: The function sends the skip, (0,0), left, top and top-right
1768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* neighbouring MBs MVs. The left, top and top-right MBs MVs are used because
1778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* these are the same MVs that are used to form the MV predictor. This initial MV
1788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* search candidates need not take care of slice boundaries and hence neighbor
1798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* availability checks are not made here.
1808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_left_mb_pu
1828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to left mb motion vector info
1838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_top_mb_pu
1858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to top & top right mb motion vector info
1868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_top_left_mb_pu
1888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to top left mb motion vector info
1898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] ps_skip_mv
1918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to skip motion vectors for the curr mb
1928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] i4_mb_x
1948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  mb index x
1958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] i4_mb_y
1978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  mb index y
1988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
1998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] i4_wd_mbs
2008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pic width in mbs
2018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_motionEst
2038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to me context
2048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  The list of MVs to be used of priming the full pel search and the
2068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* number of such MVs
2078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks
2093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   Assumptions : 1. Assumes Only partition of size 16x16
2108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
2128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
2138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Sstatic void ih264e_get_search_candidates(process_ctxt_t *ps_proc,
2143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                         me_ctxt_t *ps_me_ctxt,
2153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                         WORD32 i4_reflist)
2168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
2178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* curr mb indices */
2188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_mb_x = ps_proc->i4_mb_x;
2198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Motion vector */
2213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t *ps_left_mv, *ps_top_mv, *ps_top_left_mv, *ps_top_right_mv;
2228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Pred modes */
2243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_left_mode, i4_top_mode, i4_top_left_mode, i4_top_right_mode;
2258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* mb part info */
2273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_part_ctxt *ps_mb_part = &ps_me_ctxt->as_mb_part[i4_reflist];
2288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* mvs */
2308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 mvx, mvy;
2318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* ngbr availability */
2338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    block_neighbors_t *ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
2348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Current mode */
2363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_cmpl_predmode = (i4_reflist == 0) ? PRED_L1 : PRED_L0;
2373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
2388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* srch range*/
2398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_srch_range_n = ps_me_ctxt->i4_srch_range_n;
2408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_srch_range_s = ps_me_ctxt->i4_srch_range_s;
2418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_srch_range_e = ps_me_ctxt->i4_srch_range_e;
2428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_srch_range_w = ps_me_ctxt->i4_srch_range_w;
2438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2444b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    /* num of candidate search candidates */
2454b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    UWORD32 u4_num_candidates = 0;
2464b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo
2473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_left_mv = &ps_proc->s_left_mb_pu_ME.s_me_info[i4_reflist].s_mv;
2483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_top_mv = &(ps_proc->ps_top_row_pu_ME + i4_mb_x)->s_me_info[i4_reflist].s_mv;
2493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_top_left_mv = &ps_proc->s_top_left_mb_pu_ME.s_me_info[i4_reflist].s_mv;
2503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_top_right_mv = &(ps_proc->ps_top_row_pu_ME + i4_mb_x + 1)->s_me_info[i4_reflist].s_mv;
2513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
2523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_left_mode = ps_proc->s_left_mb_pu_ME.b2_pred_mode != i4_cmpl_predmode;
2533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_top_mode = (ps_proc->ps_top_row_pu_ME + i4_mb_x)->b2_pred_mode != i4_cmpl_predmode;
2543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_top_left_mode = ps_proc->s_top_left_mb_pu_ME.b2_pred_mode != i4_cmpl_predmode;
2553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_top_right_mode = (ps_proc->ps_top_row_pu_ME + i4_mb_x + 1)->b2_pred_mode != i4_cmpl_predmode;
2563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
2578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Taking the Zero motion vector as one of the candidates   */
2583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = 0;
2593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = 0;
2608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u4_num_candidates++;
2628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Taking the Left MV Predictor as one of the candidates    */
2643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_ngbr_avbl->u1_mb_a && i4_left_mode)
2658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
2668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvx      = (ps_left_mv->i2_mvx + 2) >> 2;
2678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvy      = (ps_left_mv->i2_mvy + 2) >> 2;
2688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
2708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
2718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
2733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
2748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_num_candidates ++;
2768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
2778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Taking the Top MV Predictor as one of the candidates     */
2793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_ngbr_avbl->u1_mb_b && i4_top_mode)
2808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
2818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvx      = (ps_top_mv->i2_mvx + 2) >> 2;
2828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvy      = (ps_top_mv->i2_mvy + 2) >> 2;
2838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
2858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
2868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
2883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
2898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_num_candidates ++;
2918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Taking the TopRt MV Predictor as one of the candidates   */
2933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_ngbr_avbl->u1_mb_c && i4_top_right_mode)
2948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
2958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvx      = (ps_top_right_mv->i2_mvx + 2) >> 2;
2968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvy      = (ps_top_right_mv->i2_mvy + 2)>> 2;
2978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
2998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
3008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
3023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
3038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_num_candidates ++;
3058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
3068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Taking the TopLt MV Predictor as one of the candidates   */
3073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else if(ps_ngbr_avbl->u1_mb_d && i4_top_left_mode)
3088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
3098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvx      = (ps_top_left_mv->i2_mvx + 2) >> 2;
3108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvy      = (ps_top_left_mv->i2_mvy + 2) >> 2;
3118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
3138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
3148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
3163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
3178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_num_candidates ++;
3198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
3208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
3218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /********************************************************************/
3248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*                            MV Prediction                         */
3258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /********************************************************************/
3263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ih264e_mv_pred_me(ps_proc, i4_reflist);
3278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_mb_part->s_mv_pred.i2_mvx = ps_proc->ps_pred_mv[i4_reflist].s_mv.i2_mvx;
3293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_mb_part->s_mv_pred.i2_mvy = ps_proc->ps_pred_mv[i4_reflist].s_mv.i2_mvy;
3308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Get the skip motion vector                               */
3323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
3333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_skip_type = ps_proc->ps_codec->apf_find_skip_params_me
3343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                    [ps_proc->i4_slice_type](ps_proc, i4_reflist);
3358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Taking the Skip motion vector as one of the candidates   */
3373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        mvx = (ps_proc->ps_skip_mv[i4_reflist].s_mv.i2_mvx + 2) >> 2;
3383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        mvy = (ps_proc->ps_skip_mv[i4_reflist].s_mv.i2_mvy + 2) >> 2;
3398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
3413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
3428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
3443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
3453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        u4_num_candidates++;
3468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_proc->i4_slice_type == BSLICE)
3483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
3493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Taking the temporal Skip motion vector as one of the candidates   */
3503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            mvx = (ps_proc->ps_skip_mv[i4_reflist + 2].s_mv.i2_mvx + 2) >> 2;
3513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            mvy = (ps_proc->ps_skip_mv[i4_reflist + 2].s_mv.i2_mvy + 2) >> 2;
3523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
3533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            mvx = CLIP3(i4_srch_range_w, i4_srch_range_e, mvx);
3543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            mvy = CLIP3(i4_srch_range_n, i4_srch_range_s, mvy);
3553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
3563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvx = mvx;
3573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[i4_reflist][u4_num_candidates].i2_mvy = mvy;
3583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            u4_num_candidates++;
3593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
3603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
3618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ASSERT(u4_num_candidates <= 6);
3638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->u4_num_candidates[i4_reflist] = u4_num_candidates;
3658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
3668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
3688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
3698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief The function computes parameters for a PSKIP MB
3718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
3733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  The function updates the skip motion vector and checks if the current
3743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  MB can be a skip PSKIP mB or not
3758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_proc
3773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Pointer to process context
3788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_for_me
3803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Flag to indicate function is called for ME or not
3818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[out] i4_ref_list
3833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Current active refernce list
3848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns Flag indicating if the current MB can be marked as skip
3868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks The code implements the logic as described in sec 8.4.1.2.2 in H264
3888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   specification.
3898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
3918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
3923749f6f435e79624f72841e866245d84195551cdHarinarayanan K KWORD32 ih264e_find_pskip_params(process_ctxt_t *ps_proc, WORD32 i4_reflist)
3938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
3948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* left mb motion vector */
3958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_left_mb_pu ;
3968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* top mb motion vector */
3988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_top_mb_pu ;
3998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Skip mv */
4013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t *ps_skip_mv = &ps_proc->ps_skip_mv[PRED_L0].s_mv;
4023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UNUSED(i4_reflist);
4043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_left_mb_pu = &ps_proc->s_left_mb_pu ;
4063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_top_mb_pu = ps_proc->ps_top_row_pu + ps_proc->i4_mb_x;
4073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((!ps_proc->ps_ngbr_avbl->u1_mb_a) ||
4093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        (!ps_proc->ps_ngbr_avbl->u1_mb_b) ||
4103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        (
4113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].i1_ref_idx == -1) &&
4123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvx == 0) &&
4133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvy == 0)
4143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       ) ||
4153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       (
4163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].i1_ref_idx == -1) &&
4173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvx == 0) &&
4183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvy == 0)
4193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       )
4203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     )
4218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvx = 0;
4243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvy = 0;
4258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
4268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
4278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvx = ps_proc->ps_pred_mv[PRED_L0].s_mv.i2_mvx;
4293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvy = ps_proc->ps_pred_mv[PRED_L0].s_mv.i2_mvy;
4303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
4313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ( (ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvx == ps_skip_mv->i2_mvx)
4333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     && (ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvy == ps_skip_mv->i2_mvy))
4343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
4353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        return 1;
4368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
4378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    return 0;
4393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}
4403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
4423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
4433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief The function computes parameters for a PSKIP MB
4453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par Description:
4473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  The function updates the skip motion vector and checks if the current
4483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  MB can be a skip PSKIP mB or not
4493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_proc
4513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Pointer to process context
4523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_for_me
4543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Flag to dincate fucntion is called for ME or not
4553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[out] i4_ref_list
4573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Current active refernce list
4583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns Flag indicating if the current MB can be marked as skip
4603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks The code implements the logic as described in sec 8.4.1.2.2 in H264
4623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   specification.
4633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
4643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
4653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/
4663749f6f435e79624f72841e866245d84195551cdHarinarayanan K KWORD32 ih264e_find_pskip_params_me(process_ctxt_t *ps_proc, WORD32 i4_reflist)
4673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{
4683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* left mb motion vector */
4693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_left_mb_pu ;
4703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* top mb motion vector */
4723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_top_mb_pu ;
4733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Skip mv */
4753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t *ps_skip_mv = &ps_proc->ps_skip_mv[PRED_L0].s_mv;
4763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UNUSED(i4_reflist);
4783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_left_mb_pu = &ps_proc->s_left_mb_pu_ME;
4803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_top_mb_pu = ps_proc->ps_top_row_pu_ME + ps_proc->i4_mb_x;
4813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((!ps_proc->ps_ngbr_avbl->u1_mb_a) ||
4833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        (!ps_proc->ps_ngbr_avbl->u1_mb_b) ||
4843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        (
4853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].i1_ref_idx == -1) &&
4863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvx == 0) &&
4873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_left_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvy == 0)
4883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ) ||
4893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        (
4903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].i1_ref_idx == -1) &&
4913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvx == 0) &&
4923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K          (ps_top_mb_pu->s_me_info[PRED_L0].s_mv.i2_mvy == 0)
4933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        )
4943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     )
4953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
4968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_skip_mv->i2_mvx = 0;
4988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_skip_mv->i2_mvy = 0;
4998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
5008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
5018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
5023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvx = ps_proc->ps_pred_mv[PRED_L0].s_mv.i2_mvx;
5033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv->i2_mvy = ps_proc->ps_pred_mv[PRED_L0].s_mv.i2_mvy;
5048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
5053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    return PRED_L0;
5078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
5088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
5118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
5128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief motion vector predictor
5148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
5168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  The routine calculates the motion vector predictor for a given block,
5178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  given the candidate MV predictors.
5188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_left_mb_pu
5208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to left mb motion vector info
5218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_top_row_pu
5238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to top & top right mb motion vector info
5248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] ps_pred_mv
5268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to candidate predictors for the current block
5278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  The x & y components of the MV predictor.
5298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks The code implements the logic as described in sec 8.4.1.3 in H264
5318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   specification.
5328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   Assumptions : 1. Assumes Single reference frame
5338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*                 2. Assumes Only partition of size 16x16
5348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
5358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
5368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
5378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_get_mv_predictor(enc_pu_t *ps_left_mb_pu,
5388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                             enc_pu_t *ps_top_row_pu,
5393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                             enc_pu_mv_t *ps_pred_mv,
5403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                             WORD32 i4_ref_list)
5418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
5428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Indicated the current ref */
5443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD8 i1_ref_idx;
5458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* For pred L0 */
5473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i1_ref_idx = -1;
5483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
5493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* temp var */
5503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        WORD32 pred_algo = 3, a, b, c;
5513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* If only one of the candidate blocks has a reference frame equal to
5533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * the current block then use the same block as the final predictor */
5543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        a = (ps_left_mb_pu->s_me_info[i4_ref_list].i1_ref_idx == i1_ref_idx) ? 0 : -1;
5553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        b = (ps_top_row_pu[0].s_me_info[i4_ref_list].i1_ref_idx == i1_ref_idx) ? 0 : -1;
5563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        c = (ps_top_row_pu[1].s_me_info[i4_ref_list].i1_ref_idx == i1_ref_idx) ? 0 : -1;
5573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (a == 0 && b == -1 && c == -1)
5593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pred_algo = 0; /* LEFT */
5603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else if(a == -1 && b == 0 && c == -1)
5613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pred_algo = 1; /* TOP */
5623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else if(a == -1 && b == -1 && c == 0)
5633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pred_algo = 2; /* TOP RIGHT */
5643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        switch (pred_algo)
5663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
5673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            case 0:
5683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* left */
5693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvx = ps_left_mb_pu->s_me_info[i4_ref_list].s_mv.i2_mvx;
5703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvy = ps_left_mb_pu->s_me_info[i4_ref_list].s_mv.i2_mvy;
5713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
5723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            case 1:
5733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* top */
5743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvx = ps_top_row_pu[0].s_me_info[i4_ref_list].s_mv.i2_mvx;
5753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvy = ps_top_row_pu[0].s_me_info[i4_ref_list].s_mv.i2_mvy;
5763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
5773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            case 2:
5783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* top right */
5793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvx = ps_top_row_pu[1].s_me_info[i4_ref_list].s_mv.i2_mvx;
5803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_pred_mv->s_mv.i2_mvy = ps_top_row_pu[1].s_me_info[i4_ref_list].s_mv.i2_mvy;
5813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
5823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            case 3:
5833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* median */
5843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                MEDIAN(ps_left_mb_pu->s_me_info[i4_ref_list].s_mv.i2_mvx,
5853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_top_row_pu[0].s_me_info[i4_ref_list].s_mv.i2_mvx,
5863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_top_row_pu[1].s_me_info[i4_ref_list].s_mv.i2_mvx,
5873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_pred_mv->s_mv.i2_mvx);
5883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                MEDIAN(ps_left_mb_pu->s_me_info[i4_ref_list].s_mv.i2_mvy,
5893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_top_row_pu[0].s_me_info[i4_ref_list].s_mv.i2_mvy,
5903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_top_row_pu[1].s_me_info[i4_ref_list].s_mv.i2_mvy,
5913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                       ps_pred_mv->s_mv.i2_mvy);
5923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
5933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
5943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            default:
5953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
5963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
5978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
5988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
5998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
6018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
6028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief This function performs MV prediction
6048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
6068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc
6088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Process context corresponding to the job
6098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  none
6118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks none
6138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  This function will update the MB availability since intra inter decision
6148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  should be done before the call
6158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
6168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
6178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
6183749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kvoid ih264e_mv_pred(process_ctxt_t *ps_proc, WORD32 i4_slice_type)
6198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
6208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* left mb motion vector */
6223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_left_mb_pu;
6238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* top left mb motion vector */
6253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_top_left_mb_pu;
6268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* top row motion vector info */
6288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_top_row_pu;
6298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* predicted motion vector */
6313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_mv_t *ps_pred_mv = ps_proc->ps_pred_mv;
6328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* zero mv */
6343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t zero_mv = { 0, 0 };
6358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*  mb neighbor availability */
6378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    block_neighbors_t *ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
6388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* mb syntax elements of neighbors */
6403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_info_t *ps_top_syn = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
6413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_info_t *ps_top_left_syn;
6423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD32 u4_left_is_intra;
6433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
6443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Temp var */
6453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_reflist, max_reflist, i4_cmpl_predmode;
6468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_top_left_syn = &(ps_proc->s_top_left_mb_syntax_ele);
6488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u4_left_is_intra = ps_proc->s_left_mb_syntax_ele.u2_is_intra;
6498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_left_mb_pu = &ps_proc->s_left_mb_pu;
6508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_top_left_mb_pu = &ps_proc->s_top_left_mb_pu;
6518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_top_row_pu = (ps_proc->ps_top_row_pu + ps_proc->i4_mb_x);
6528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Number of ref lists to process */
6543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    max_reflist = (i4_slice_type == PSLICE) ? 1 : 2;
6553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
6563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    for (i4_reflist = 0; i4_reflist < max_reflist; i4_reflist++)
6578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
6583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_cmpl_predmode = (i4_reflist == 0) ? PRED_L1 : PRED_L0;
6593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
6603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Before performing mv prediction prepare the ngbr information and
6613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * reset motion vectors basing on their availability */
6623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (!ps_ngbr_avbl->u1_mb_a || (u4_left_is_intra == 1)
6633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        || (ps_left_mb_pu->b2_pred_mode == i4_cmpl_predmode))
6648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
6653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* left mv */
6663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_left_mb_pu->s_me_info[i4_reflist].i1_ref_idx = 0;
6673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_left_mb_pu->s_me_info[i4_reflist].s_mv = zero_mv;
6688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
6693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (!ps_ngbr_avbl->u1_mb_b || ps_top_syn->u2_is_intra
6703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        || (ps_top_row_pu[0].b2_pred_mode == i4_cmpl_predmode))
6718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
6723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* top mv */
6733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_top_row_pu[0].s_me_info[i4_reflist].i1_ref_idx = 0;
6743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_top_row_pu[0].s_me_info[i4_reflist].s_mv = zero_mv;
6758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
6763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
6773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (!ps_ngbr_avbl->u1_mb_c)
6783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
6793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* top right mv - When top right partition is not available for
6803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             * prediction if top left is available use it for prediction else
6813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             * set the mv information to -1 and (0, 0)
6823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             * */
6833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (!ps_ngbr_avbl->u1_mb_d || ps_top_left_syn->u2_is_intra
6843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            || (ps_top_left_mb_pu->b2_pred_mode == i4_cmpl_predmode))
6853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
6863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_top_row_pu[1].s_me_info[i4_reflist].i1_ref_idx = 0;
6873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_top_row_pu[1].s_me_info[i4_reflist].s_mv = zero_mv;
6883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
6893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            else
6903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
6913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_top_row_pu[1].s_me_info[i4_reflist].i1_ref_idx = ps_top_left_mb_pu->s_me_info[i4_reflist].i1_ref_idx;
6923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_top_row_pu[1].s_me_info[i4_reflist].s_mv = ps_top_left_mb_pu->s_me_info[i4_reflist].s_mv;
6933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
6943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
6953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else if(ps_top_syn[1].u2_is_intra
6963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        || (ps_top_row_pu[1].b2_pred_mode == i4_cmpl_predmode))
6973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
6983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_top_row_pu[1].s_me_info[i4_reflist].i1_ref_idx = 0;
6993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_top_row_pu[1].s_me_info[i4_reflist].s_mv = zero_mv;
7003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
7013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
7023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ih264e_get_mv_predictor(ps_left_mb_pu, ps_top_row_pu, &ps_pred_mv[i4_reflist], i4_reflist);
7038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
7068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
7088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
7098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief This function approximates Pred. MV
7118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
7138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc
7158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Process context corresponding to the job
7168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  none
7188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks none
7208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Motion estimation happens at nmb level. For cost calculations, mv is appro
7218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  ximated using this function
7228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
7238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
7248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
7253749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kvoid ih264e_mv_pred_me(process_ctxt_t *ps_proc, WORD32 i4_ref_list)
7268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
7278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* left mb motion vector */
7288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_left_mb_pu ;
7298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* top left mb motion vector */
7318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_top_left_mb_pu ;
7328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* top row motion vector info */
7348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_top_row_pu;
7358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t s_top_row_pu[2];
7378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* predicted motion vector */
7393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_mv_t *ps_pred_mv = ps_proc->ps_pred_mv;
7408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* zero mv */
7428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    mv_t zero_mv = {0, 0};
7438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Complementary pred mode */
7453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_cmpl_predmode = (i4_ref_list == 0) ? PRED_L1 : PRED_L0;
7463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
7478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*  mb neighbor availability */
7488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    block_neighbors_t *ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
7498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_left_mb_pu = &ps_proc->s_left_mb_pu_ME;
7518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_top_left_mb_pu = &ps_proc->s_top_left_mb_pu_ME;
7528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_top_row_pu = (ps_proc->ps_top_row_pu_ME + ps_proc->i4_mb_x);
7538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    s_top_row_pu[0] = ps_top_row_pu[0];
7558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    s_top_row_pu[1] = ps_top_row_pu[1];
7568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /*
7583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Before performing mv prediction prepare the ngbr information and
7593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * reset motion vectors basing on their availability
7603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     */
7613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
7623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (!ps_ngbr_avbl->u1_mb_a || (ps_left_mb_pu->b2_pred_mode == i4_cmpl_predmode))
7638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* left mv */
7653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_left_mb_pu->s_me_info[i4_ref_list].i1_ref_idx = 0;
7663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_left_mb_pu->s_me_info[i4_ref_list].s_mv = zero_mv;
7678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (!ps_ngbr_avbl->u1_mb_b || (s_top_row_pu[0].b2_pred_mode == i4_cmpl_predmode))
7698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* top mv */
7713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_top_row_pu[0].s_me_info[i4_ref_list].i1_ref_idx = 0;
7723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_top_row_pu[0].s_me_info[i4_ref_list].s_mv = zero_mv;
7733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
7748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if (!ps_ngbr_avbl->u1_mb_c)
7768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* top right mv - When top right partition is not available for
7788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * prediction if top left is available use it for prediction else
7798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * set the mv information to -1 and (0, 0)
7808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * */
7813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (!ps_ngbr_avbl->u1_mb_d || (ps_top_left_mb_pu->b2_pred_mode == i4_cmpl_predmode))
7828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
7833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].i1_ref_idx = 0;
7843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].s_mv = zero_mv;
7853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
7863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].i1_ref_idx = 0;
7873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].s_mv = zero_mv;
7888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
7898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
7908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
7913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].i1_ref_idx = ps_top_left_mb_pu->s_me_info[0].i1_ref_idx;
7923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_top_row_pu[1].s_me_info[i4_ref_list].s_mv = ps_top_left_mb_pu->s_me_info[0].s_mv;
7938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
7948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else if (ps_top_row_pu[1].b2_pred_mode == i4_cmpl_predmode)
7963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
7973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_top_row_pu[1].s_me_info[i4_ref_list].i1_ref_idx = 0;
7983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_top_row_pu[1].s_me_info[i4_ref_list].s_mv = zero_mv;
7993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
8008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ih264e_get_mv_predictor(ps_left_mb_pu, &(s_top_row_pu[0]),
8023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            &ps_pred_mv[i4_ref_list], i4_ref_list);
8038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
8048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
8068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
8078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief This function initializes me ctxt
8098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
8118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Before dispatching the current job to me thread, the me context associated
8128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  with the job is initialized.
8138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc
8158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Process context corresponding to the job
8168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  none
8188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks none
8208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
8228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
8238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_init_me(process_ctxt_t *ps_proc)
8248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
8258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* me ctxt */
8268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
8278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* codec context */
8293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    codec_t *ps_codec = ps_proc->ps_codec;
8303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->i4_skip_bias[BSLICE] = SKIP_BIAS_B;
8323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_codec->s_cfg.u4_num_bframes == 0)
8343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
8353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       ps_me_ctxt->i4_skip_bias[PSLICE] = 4 * SKIP_BIAS_P;
8363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
8373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
8383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
8393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       ps_me_ctxt->i4_skip_bias[PSLICE] =  SKIP_BIAS_P;
8403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
8413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* src ptr */
8438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_me_ctxt->pu1_src_buf_luma = ps_proc->pu1_src_buf_luma;
844cb6a43532c0b863d46c82feb25b10dc8732a34f9Martin Storsjo    /* src stride */
845cb6a43532c0b863d46c82feb25b10dc8732a34f9Martin Storsjo    ps_me_ctxt->i4_src_strd = ps_proc->i4_src_strd;
8468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* ref ptrs and corresponding lagrange params */
8483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->apu1_ref_buf_luma[0] = ps_proc->apu1_ref_buf_luma[0];
8493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->apu1_ref_buf_luma[1] = ps_proc->apu1_ref_buf_luma[1];
8508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_me_ctxt->u4_lambda_motion = gu1_qp0[ps_me_ctxt->u1_mb_qp];
8523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
8558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
8578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
8588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
8598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief This function performs motion estimation for the current mb using
8613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   single reference list
8628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
8648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  The current mb is compared with a list of mb's in the reference frame for
8658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  least cost. The mb that offers least cost is chosen as predicted mb and the
8668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  displacement of the predicted mb from index location of the current mb is
8678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  signaled as mv. The list of the mb's that are chosen in the reference frame
8688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  are dependent on the speed of the ME configured.
8698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc
8718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Process context corresponding to the job
8728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns  motion vector of the pred mb, sad, cost.
8748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks none
8768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
8778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
8788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
8793749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kvoid ih264e_compute_me_single_reflist(process_ctxt_t *ps_proc)
8808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
8818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* me ctxt */
8828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
8838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* codec context */
8858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    codec_t *ps_codec = ps_proc->ps_codec;
8868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* recon stride */
8888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i4_rec_strd = ps_proc->i4_rec_strd;
8898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* source buffer for halp pel generation functions */
8918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 *pu1_hpel_src;
8928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* quantization parameters */
8948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    quant_params_t *ps_qp_params = ps_proc->ps_qp_params[0];
8958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Mb part ctxts for SKIP */
8973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_part_ctxt s_skip_mbpart;
8988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8994b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    /* Sad therholds */
9004b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    ps_me_ctxt->pu2_sad_thrsh = ps_qp_params->pu2_sad_thrsh;
9014b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo
9028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
9033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        WORD32 rows_above, rows_below, columns_left, columns_right;
9043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* During evaluation for motion vectors do not search through padded regions */
9063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Obtain number of rows and columns that are effective for computing for me evaluation */
9073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        rows_above = MB_SIZE + ps_proc->i4_mb_y * MB_SIZE;
9083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        rows_below = (ps_proc->i4_ht_mbs - ps_proc->i4_mb_y) * MB_SIZE;
9093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        columns_left = MB_SIZE + ps_proc->i4_mb_x * MB_SIZE;
9103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        columns_right = (ps_proc->i4_wd_mbs - ps_proc->i4_mb_x) * MB_SIZE;
9113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* init srch range */
9133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* NOTE : For now, lets limit the search range by DEFAULT_MAX_SRCH_RANGE_X / 2
9143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * on all sides.
9153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         */
9163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_w = -MIN(columns_left, DEFAULT_MAX_SRCH_RANGE_X >> 1);
9173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_e = MIN(columns_right, DEFAULT_MAX_SRCH_RANGE_X >> 1);
9183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_n = -MIN(rows_above, DEFAULT_MAX_SRCH_RANGE_Y >> 1);
9193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_s = MIN(rows_below, DEFAULT_MAX_SRCH_RANGE_Y >> 1);
9203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* this is to facilitate fast sub pel computation with minimal loads */
9228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_me_ctxt->i4_srch_range_w += 1;
9238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_me_ctxt->i4_srch_range_e -= 1;
9248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_me_ctxt->i4_srch_range_n += 1;
9258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_me_ctxt->i4_srch_range_s -= 1;
9268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
9278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Compute ME and store the MVs */
9298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /***********************************************************************
9313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Compute ME for list L0
9323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     ***********************************************************************/
9338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Init SATQD for the current list */
9353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->u4_min_sad_reached  = 0;
9363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->i4_min_sad = ps_proc->ps_cur_mb->u4_min_sad;
9378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Get the seed motion vector candidates                    */
9393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ih264e_get_search_candidates(ps_proc, ps_me_ctxt, PRED_L0);
9403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* ****************************************************************
9423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *Evaluate the SKIP for current list
9433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * ****************************************************************/
9443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.s_mv_curr.i2_mvx = 0;
9453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.s_mv_curr.i2_mvy = 0;
9463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.i4_mb_cost = INT_MAX;
9473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.i4_mb_distortion = INT_MAX;
9483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ime_compute_skip_cost( ps_me_ctxt,
9503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                           (ime_mv_t *)(&ps_proc->ps_skip_mv[PRED_L0].s_mv),
9513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                           &s_skip_mbpart,
9523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                           ps_proc->ps_codec->s_cfg.u4_enable_satqd,
9533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                           PRED_L0,
9543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                           0 /* Not a Bslice */ );
9553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.s_mv_curr.i2_mvx <<= 2;
9573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    s_skip_mbpart.s_mv_curr.i2_mvy <<= 2;
9583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /******************************************************************
9603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Evaluate ME For current list
9613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *****************************************************************/
9623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvx = 0;
9633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvy = 0;
9643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_cost = INT_MAX;
9653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_distortion = INT_MAX;
9663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Init Hpel */
9683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_me_ctxt->as_mb_part[PRED_L0].pu1_best_hpel_buf = NULL;
9693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* In case we found out the minimum SAD, exit the ME eval */
9713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (!ps_me_ctxt->u4_min_sad_reached)
9728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
9733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Evaluate search candidates for initial mv pt */
9743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ime_evaluate_init_srchposn_16x16(ps_me_ctxt, PRED_L0);
9758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /********************************************************************/
9778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /*                  full pel motion estimation                      */
9788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /********************************************************************/
9793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ime_full_pel_motion_estimation_16x16(ps_me_ctxt, PRED_L0);
9808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Scale the MV to qpel resolution */
9823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvx <<= 2;
9833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvy <<= 2;
9848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if (ps_me_ctxt->u4_enable_hpel)
9868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
9878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* moving src pointer to the converged motion vector location*/
9883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pu1_hpel_src =   ps_me_ctxt->apu1_ref_buf_luma[PRED_L0]
9893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                             + (ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvx >> 2)
9903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                             + (ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvy >> 2)* i4_rec_strd;
9913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
9923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->apu1_subpel_buffs[0] = ps_proc->apu1_subpel_buffs[0];
9933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->apu1_subpel_buffs[1] = ps_proc->apu1_subpel_buffs[1];
9943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->apu1_subpel_buffs[2] = ps_proc->apu1_subpel_buffs[2];
9958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->u4_subpel_buf_strd = HP_BUFF_WD;
9978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* half  pel search is done for both sides of full pel,
9998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * hence half_x of width x height = 17x16 is created
10008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * starting from left half_x of converged full pel */
10018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu1_hpel_src -= 1;
10028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* computing half_x */
10048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_codec->pf_ih264e_sixtapfilter_horz(pu1_hpel_src,
10053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                                  ps_me_ctxt->apu1_subpel_buffs[0],
10068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                  i4_rec_strd,
10073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                                  ps_me_ctxt->u4_subpel_buf_strd);
10088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /*
10108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * Halfpel search is done for both sides of full pel,
10118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * hence half_y of width x height = 16x17 is created
10128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * starting from top half_y of converged full pel
10138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * for half_xy top_left is required
10148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             * hence it starts from pu1_hpel_src = full_pel_converged_point - i4_rec_strd - 1
10158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S             */
10168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu1_hpel_src -= i4_rec_strd;
10178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* computing half_y , and half_xy*/
10198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_codec->pf_ih264e_sixtap_filter_2dvh_vert(
10203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            pu1_hpel_src, ps_me_ctxt->apu1_subpel_buffs[1],
10213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_me_ctxt->apu1_subpel_buffs[2], i4_rec_strd,
10223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_me_ctxt->u4_subpel_buf_strd, ps_proc->ai16_pred1 + 3,
10233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_me_ctxt->u4_subpel_buf_strd);
10248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ime_sub_pel_motion_estimation_16x16(ps_me_ctxt, PRED_L0);
10268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
10278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
10288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /***********************************************************************
10313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * If a particular skiip Mv is giving better sad, copy to the corresponding
10323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * MBPART
10333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * In B slices this loop should go only to PREDL1: If we found min sad
10343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * we will go to the skip ref list only
10353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Have to find a way to make it without too much change or new vars
10363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **********************************************************************/
10373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (s_skip_mbpart.i4_mb_cost < ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_cost)
10383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
10393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_cost = s_skip_mbpart.i4_mb_cost;
10403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_distortion = s_skip_mbpart.i4_mb_distortion;
10413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr = s_skip_mbpart.s_mv_curr;
10428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
10433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else if (ps_me_ctxt->as_mb_part[PRED_L0].pu1_best_hpel_buf)
10448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
10453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Now we have to copy the buffers */
10463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_codec->pf_inter_pred_luma_copy(
10473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_me_ctxt->as_mb_part[PRED_L0].pu1_best_hpel_buf,
10483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_proc->pu1_best_subpel_buf,
10493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_me_ctxt->u4_subpel_buf_strd,
10503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_proc->u4_bst_spel_buf_strd, MB_SIZE, MB_SIZE,
10513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        NULL, 0);
10523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
10538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /**********************************************************************
10553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Now get the minimum of MB part sads by searching over all ref lists
10563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **********************************************************************/
10573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvx = ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvx;
10583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvy = ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvy;
10593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_cur_mb->i4_mb_cost = ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_cost;
10603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_cur_mb->i4_mb_distortion = ps_me_ctxt->as_mb_part[PRED_L0].i4_mb_distortion;
10613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_cur_mb->u4_mb_type = P16x16;
10623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->b2_pred_mode = PRED_L0 ;
10638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Mark the reflists */
10653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[0].i1_ref_idx = -1;
10663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[1].i1_ref_idx =  0;
10678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* number of partitions */
10698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->u4_num_sub_partitions = 1;
10708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    *(ps_proc->pu4_mb_pu_cnt) = 1;
10718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* position in-terms of PU */
10738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->ps_pu->b4_pos_x = 0;
10748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->ps_pu->b4_pos_y = 0;
10758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* PU size */
10778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->ps_pu->b4_wd = 3;
10788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->ps_pu->b4_ht = 3;
10798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Update min sad conditions */
10818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if (ps_me_ctxt->u4_min_sad_reached == 1)
10828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
10838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad_reached = 1;
10848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad = ps_me_ctxt->i4_min_sad;
10858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
10863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
10878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
10888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
10908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
10918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
10928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief This function performs motion estimation for the current NMB
10938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
10948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description:
10958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Intializes input and output pointers required by the function ih264e_compute_me
10968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and calls the function ih264e_compute_me in a loop to process NMBs.
10978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
10988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc
10998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Process context corresponding to the job
11008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
11018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns
11028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
11038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks none
11048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
11058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
11068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
11078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_compute_me_nmb(process_ctxt_t *ps_proc, UWORD32 u4_nmb_count)
11088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
11098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* pic pu */
11108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    enc_pu_t *ps_pu_begin = ps_proc->ps_pu;
11118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* ME map */
11138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 *pu1_me_map = ps_proc->pu1_me_map + (ps_proc->i4_mb_y * ps_proc->i4_wd_mbs);
11148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* temp var */
11168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_i;
11178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->s_me_ctxt.u4_left_is_intra = ps_proc->s_left_mb_syntax_ele.u2_is_intra;
11198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->s_me_ctxt.u4_left_is_skip = (ps_proc->s_left_mb_syntax_ele.u2_mb_type == PSKIP);
11208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    for (u4_i = 0; u4_i < u4_nmb_count; u4_i++)
11228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
11238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Wait for ME map */
11248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if (ps_proc->i4_mb_y > 0)
11258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
11268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Wait for top right ME to be done */
11278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 *pu1_me_map_tp_rw = ps_proc->pu1_me_map + (ps_proc->i4_mb_y - 1) * ps_proc->i4_wd_mbs;
11288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            while (1)
11308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
11318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                volatile UWORD8 *pu1_buf;
11328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                WORD32 idx = ps_proc->i4_mb_x + u4_i + 1;
11338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                idx = MIN(idx, (ps_proc->i4_wd_mbs - 1));
11358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                pu1_buf =  pu1_me_map_tp_rw + idx;
11368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(*pu1_buf)
11378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    break;
11388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ithread_yield();
11398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
11408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
11418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv = &(ps_proc->ps_nmb_info[u4_i].as_skip_mv[0]);
11438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_ngbr_avbl = &(ps_proc->ps_nmb_info[u4_i].s_ngbr_avbl);
11443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_pred_mv = &(ps_proc->ps_nmb_info[u4_i].as_pred_mv[0]);
11458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb = &(ps_proc->ps_nmb_info[u4_i]);
11478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad = ps_proc->u4_min_sad;
11498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad_reached = 0;
11508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->i4_mb_cost = INT_MAX;
11528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->i4_mb_distortion = SHRT_MAX;
11538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Set the best subpel buf to the correct mb so that the buffer can be copied */
11558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu1_best_subpel_buf = ps_proc->ps_nmb_info[u4_i].pu1_best_sub_pel_buf;
11568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->u4_bst_spel_buf_strd = ps_proc->ps_nmb_info[u4_i].u4_bst_spel_buf_strd;
11578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Set the min sad conditions */
11598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad = ps_proc->ps_codec->u4_min_sad;
11608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_cur_mb->u4_min_sad_reached = 0;
11618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Derive neighbor availability for the current macroblock */
11638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264e_derive_nghbr_avbl_of_mbs(ps_proc);
11648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* init me */
11668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264e_init_me(ps_proc);
11678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Compute ME according to slice type */
11693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_codec->apf_compute_me[ps_proc->i4_slice_type](ps_proc);
11708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* update top and left structs */
11728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
11738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mb_info_t *ps_top_syn = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
11748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mb_info_t *ps_top_left_syn = &(ps_proc->s_top_left_mb_syntax_ME);
11758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            enc_pu_t *ps_left_mb_pu = &ps_proc->s_left_mb_pu_ME;
11768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            enc_pu_t *ps_top_left_mb_pu = &ps_proc->s_top_left_mb_pu_ME;
11778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            enc_pu_t *ps_top_mv = ps_proc->ps_top_row_pu_ME + ps_proc->i4_mb_x;
11788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *ps_top_left_syn = *ps_top_syn;
11808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *ps_top_left_mb_pu = *ps_top_mv;
11828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *ps_left_mb_pu = *ps_proc->ps_pu;
11838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
11848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_pu += *ps_proc->pu4_mb_pu_cnt;
11868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Copy the min sad reached info */
11888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_nmb_info[u4_i].u4_min_sad_reached = ps_proc->ps_cur_mb->u4_min_sad_reached;
11898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->ps_nmb_info[u4_i].u4_min_sad   = ps_proc->ps_cur_mb->u4_min_sad;
11908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /*
11928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * To make sure that the MV map is properly sync to the
11938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * cache we need to do a DDB
11948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         */
11958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
11968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            DATA_SYNC();
11978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu1_me_map[ps_proc->i4_mb_x] = 1;
11998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
12008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->i4_mb_x++;
12018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->s_me_ctxt.u4_left_is_intra = 0;
12038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->s_me_ctxt.u4_left_is_skip = (ps_proc->ps_cur_mb->u4_mb_type  == PSKIP);
12048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* update buffers pointers */
12068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu1_src_buf_luma += MB_SIZE;
12078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu1_rec_buf_luma += MB_SIZE;
12083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->apu1_ref_buf_luma[0] += MB_SIZE;
12093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->apu1_ref_buf_luma[1] += MB_SIZE;
12108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /*
12128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * Note: Although chroma mb size is 8, as the chroma buffers are interleaved,
12138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         * the stride per MB is MB_SIZE
12148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S         */
12158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu1_src_buf_chroma += MB_SIZE;
12168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu1_rec_buf_chroma += MB_SIZE;
12173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->apu1_ref_buf_chroma[0] += MB_SIZE;
12183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->apu1_ref_buf_chroma[1] += MB_SIZE;
12193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_proc->pu4_mb_pu_cnt += 1;
12228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
12238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->ps_pu = ps_pu_begin;
12268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->i4_mb_x = ps_proc->i4_mb_x - u4_nmb_count;
12278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* update buffers pointers */
12298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->pu1_src_buf_luma -= MB_SIZE * u4_nmb_count;
12308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->pu1_rec_buf_luma -= MB_SIZE * u4_nmb_count;
12313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->apu1_ref_buf_luma[0] -= MB_SIZE * u4_nmb_count;
12323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->apu1_ref_buf_luma[1] -= MB_SIZE * u4_nmb_count;
12338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*
12358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     * Note: Although chroma mb size is 8, as the chroma buffers are interleaved,
12368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     * the stride per MB is MB_SIZE
12378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     */
12388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->pu1_src_buf_chroma -= MB_SIZE * u4_nmb_count;
12398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->pu1_rec_buf_chroma -= MB_SIZE * u4_nmb_count;
12403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->apu1_ref_buf_chroma[0] -= MB_SIZE * u4_nmb_count;
12413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->apu1_ref_buf_chroma[1] -= MB_SIZE * u4_nmb_count;
12423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_proc->pu4_mb_pu_cnt -= u4_nmb_count;
12458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
12463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
12493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
12503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief The function computes parameters for a BSKIP MB
12523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par Description:
12543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  The function updates the skip motion vector for B Mb, check if the Mb can be
12553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  marked as skip and returns it
12563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_proc
12583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Pointer to process context
12593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_for_me
12613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Dummy
12623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] i4_reflist
12643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Dummy
12653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns Flag indicating if the current Mb can be skip or not
12673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks
12693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   The code implements the logic as described in sec 8.4.1.2.2
12703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   It also computes co-located MB parmas according to sec 8.4.1.2.1
12713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   Need to add condition for this fucntion to be used in ME
12733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
12743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************/
12753749f6f435e79624f72841e866245d84195551cdHarinarayanan K KWORD32 ih264e_find_bskip_params_me(process_ctxt_t *ps_proc, WORD32 i4_reflist)
12763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{
12773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Colzero for co-located MB */
12783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_colzeroflag;
12793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* motion vectors for neighbouring MBs */
12813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_a_pu, *ps_c_pu, *ps_b_pu;
12823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Variables to check if a particular mB is available */
128461791a91be204f985b9ba2537f8d2cf57816b0d2Martin Storsjo    WORD32 i4_a, i4_b, i4_c, i4_c_avail;
12853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Mode availability, init to no modes available     */
12873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_mode_avail;
12883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /*  mb neighbor availability */
12903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    block_neighbors_t *ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
12913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Temp var */
12933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i, i4_cmpl_mode, i4_skip_type = -1;
12943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
12953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /*
12963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Colocated motion vector
12973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     */
12983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t s_mvcol;
12993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /*
13013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Colocated picture idx
13023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     */
13033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_refidxcol;
13043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UNUSED(i4_reflist);
13063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /**************************************************************************
13083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *Find co-located MB parameters
13093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *      See sec 8.4.1.2.1  for reference
13103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **************************************************************************/
13113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /*
13133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Find the co-located Mb and update the skip and pred appropriately
13143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * 1) Default colpic is forward ref : Table 8-6
13153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * 2) Default mb col is current MB : Table 8-8
13163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         */
13173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_proc->ps_colpu->b1_intra_flag)
13193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
13203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_mvcol.i2_mvx = 0;
13213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_mvcol.i2_mvy = 0;
13223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_refidxcol = -1;
13233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
13243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else
13253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
13263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_proc->ps_colpu->b2_pred_mode != PRED_L1)
13273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
13283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                s_mvcol = ps_proc->ps_colpu->s_me_info[PRED_L0].s_mv;
13293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                i4_refidxcol = 0;
13303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
13313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            else // if(ps_proc->ps_colpu->b2_pred_mode != PRED_L0)
13323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
13333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                s_mvcol = ps_proc->ps_colpu->s_me_info[PRED_L1].s_mv;
13343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                i4_refidxcol = 0;
13353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
13363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
13373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* RefPicList1[ 0 ]  is marked as  "used for short-term reference", as default */
13393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_colzeroflag = (!i4_refidxcol && (ABS(s_mvcol.i2_mvx) <= 1)
13403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        && (ABS(s_mvcol.i2_mvy) <= 1));
13413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /***************************************************************************
13453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Evaluating skip params : Spatial Skip
13463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **************************************************************************/
13473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Get the neighbouring MBS according to Section 8.4.1.2.2 */
13493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_a_pu = &ps_proc->s_left_mb_pu_ME;
13503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_b_pu = (ps_proc->ps_top_row_pu_ME + ps_proc->i4_mb_x);
13513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_c_avail = 0;
13533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_ngbr_avbl->u1_mb_c)
13543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_pu = &((ps_proc->ps_top_row_pu_ME + ps_proc->i4_mb_x)[1]);
13563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_c_avail = 1;
13573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
13593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_pu = &ps_proc->s_top_left_mb_pu_ME;
13613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_c_avail = ps_ngbr_avbl->u1_mb_d;
13623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_a = ps_ngbr_avbl->u1_mb_a;
13653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_b = ps_ngbr_avbl->u1_mb_b;
13663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_c = i4_c_avail;
13673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Init to no mode avail */
13693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_mode_avail = 0;
13703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    for (i = 0; i < 2; i++)
13713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_cmpl_mode = (i == 0) ? PRED_L1 : PRED_L0;
13733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_a && (ps_a_pu->b2_pred_mode != i4_cmpl_mode) && (ps_a_pu->s_me_info[i].i1_ref_idx != 0))<<i;
13753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_b && (ps_b_pu->b2_pred_mode != i4_cmpl_mode) && (ps_b_pu->s_me_info[i].i1_ref_idx != 0))<<i;
13763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_c && (ps_c_pu->b2_pred_mode != i4_cmpl_mode) && (ps_c_pu->s_me_info[i].i1_ref_idx != 0))<<i;
13773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (i4_mode_avail == 0x3 || i4_mode_avail == 0x0)
13803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_skip_type= PRED_BI;
13823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else if(i4_mode_avail == 0x1)
13843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_skip_type = PRED_L0;
13863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else if(i4_mode_avail == 0x2)
13883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_skip_type = PRED_L1;
13903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
13923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Update skip MV for L0 */
13933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((i4_mode_avail & 0x1) && (!i4_colzeroflag))
13943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
13953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvx = ps_proc->ps_pred_mv[0].s_mv.i2_mvx;
13963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvy = ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
13973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
13983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
13993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
14003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvx = 0;
14013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvy = 0;
14023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
14033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Update skip MV for L1 */
14053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((i4_mode_avail & 0x2) && (!i4_colzeroflag))
14063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
14073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvx = ps_proc->ps_pred_mv[1].s_mv.i2_mvx;
14083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvy = ps_proc->ps_pred_mv[1].s_mv.i2_mvy;
14093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
14103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
14113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
14123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvx = 0;
14133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvy = 0;
14143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
14153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
14173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /***************************************************************************
14193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Evaluating skip params : Temporal skip
14203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **************************************************************************/
14213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
14223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        pic_buf_t *  ps_ref_pic[MAX_REF_PIC_CNT];
14233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        WORD32 i4_td, i4_tx, i4_tb, i4_dist_scale_factor;
14243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        enc_pu_mv_t *ps_skip_mv = &ps_proc->ps_skip_mv[2];
14253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_ref_pic[PRED_L0] = ps_proc->aps_ref_pic[PRED_L0];
14273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_ref_pic[PRED_L1] = ps_proc->aps_ref_pic[PRED_L1];
14283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_tb = ps_proc->ps_codec->i4_poc - ps_ref_pic[PRED_L0]->i4_abs_poc;
14303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_td = ps_ref_pic[PRED_L1]->i4_abs_poc - ps_ref_pic[PRED_L0]->i4_abs_poc;
14313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_tb = CLIP3(-128, 127, i4_tb);
14333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_td = CLIP3(-128, 127, i4_td);
14343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_tx = ( 16384 + ABS( i4_td / 2 ) ) / i4_td ;
14363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_dist_scale_factor =  CLIP3( -1024, 1023, ( i4_tb * i4_tx + 32 ) >> 6 );
14373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Motion vectors taken in full pel resolution , hence  -> (& 0xfffc) operation */
14393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv[PRED_L0].s_mv.i2_mvx = (( i4_dist_scale_factor * s_mvcol.i2_mvx + 128 ) >> 8) & 0xfffc;
14403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv[PRED_L0].s_mv.i2_mvy = (( i4_dist_scale_factor * s_mvcol.i2_mvy + 128 ) >> 8) & 0xfffc;
14413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv[PRED_L1].s_mv.i2_mvx = (ps_skip_mv[PRED_L0].s_mv.i2_mvx - s_mvcol.i2_mvx) & 0xfffc;
14433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_skip_mv[PRED_L1].s_mv.i2_mvy = (ps_skip_mv[PRED_L0].s_mv.i2_mvy - s_mvcol.i2_mvy) & 0xfffc;
14443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
14463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    return i4_skip_type;
14483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}
14493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
14513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
14523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief The function computes the skip motion vectoe for B mb
14543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par Description:
14563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  The function gives the skip motion vector for B Mb, check if the Mb can be
14573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  marked as skip
14583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_proc
14603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Pointer to process context
14613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_for_me
14633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Dummy
14643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_for_me
14663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Dummy
14673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns Flag indicating if the current Mb can be skip or not
14693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks The code implements the logic as described in sec 8.4.1.2.2 in H264
14713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*   specification. It also computes co-located MB parmas according to sec 8.4.1.2.1
14723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
14733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************/
14743749f6f435e79624f72841e866245d84195551cdHarinarayanan K KWORD32 ih264e_find_bskip_params(process_ctxt_t *ps_proc, WORD32 i4_reflist)
14753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{
14763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_colzeroflag;
14773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* motion vectors */
14793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    enc_pu_t *ps_a_pu, *ps_c_pu, *ps_b_pu;
14803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Syntax elem */
14823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_info_t *ps_a_syn, *ps_b_syn, *ps_c_syn;
14833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Variables to check if a particular mB is available */
14853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_a, i4_b, i4_c, i4_c_avail;
14863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Mode availability, init to no modes available     */
14883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_mode_avail;
14893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /*  mb neighbor availability */
14913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    block_neighbors_t *ps_ngbr_avbl = ps_proc->ps_ngbr_avbl;
14923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Temp var */
14943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i, i4_cmpl_mode;
14953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UNUSED(i4_reflist);
14973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
14983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /**************************************************************************
14993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *Find co-locates parameters
15003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *      See sec 8.4.1.2.1  for reference
15013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **************************************************************************/
15023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /*
15043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Find the co-located Mb and update the skip and pred appropriately
15053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * 1) Default colpic is forward ref : Table 8-6
15063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * 2) Default mb col is current MB : Table 8-8
15073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         */
15083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        mv_t s_mvcol;
15103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        WORD32 i4_refidxcol;
15113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_proc->ps_colpu->b1_intra_flag)
15133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
15143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_mvcol.i2_mvx = 0;
15153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            s_mvcol.i2_mvy = 0;
15163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_refidxcol = -1;
15173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
15183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else
15193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
15203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_proc->ps_colpu->b2_pred_mode != PRED_L1)
15213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
15223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                s_mvcol = ps_proc->ps_colpu->s_me_info[PRED_L0].s_mv;
15233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                i4_refidxcol = 0;
15243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
15253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            else // if(ps_proc->ps_colpu->b2_pred_mode != PRED_L0)
15263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
15273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                s_mvcol = ps_proc->ps_colpu->s_me_info[PRED_L1].s_mv;
15283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                i4_refidxcol = 0;
15293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
15303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
15313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* RefPicList1[ 0 ]  is marked as  "used for short-term reference", as default */
15333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_colzeroflag = (!i4_refidxcol && (ABS(s_mvcol.i2_mvx) <= 1)
15343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        && (ABS(s_mvcol.i2_mvy) <= 1));
15353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /***************************************************************************
15393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     * Evaluating skip params
15403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     **************************************************************************/
15413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Section 8.4.1.2.2 */
15423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_a_syn = &ps_proc->s_left_mb_syntax_ele;
15433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_a_pu = &ps_proc->s_left_mb_pu;
15443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_b_syn = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x;
15463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_b_pu = (ps_proc->ps_top_row_pu + ps_proc->i4_mb_x);
15473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_c_avail = 0;
15493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_ngbr_avbl->u1_mb_c)
15503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_syn = &((ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x)[1]);
15523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_pu = &((ps_proc->ps_top_row_pu + ps_proc->i4_mb_x)[1]);
15533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_c_avail = 1;
15543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
15563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_syn = &(ps_proc->s_top_left_mb_syntax_ele);
15583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_c_pu = &ps_proc->s_top_left_mb_pu;
15593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_c_avail = ps_ngbr_avbl->u1_mb_d;
15603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_a = ps_ngbr_avbl->u1_mb_a;
15643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_a &= !ps_a_syn->u2_is_intra;
15653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_b = ps_ngbr_avbl->u1_mb_b;
15673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_b &= !ps_b_syn->u2_is_intra;
15683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_c = i4_c_avail;
15703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_c &= !ps_c_syn->u2_is_intra;
15713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Init to no mode avail */
15733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_mode_avail = 0;
15743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    for (i = 0; i < 2; i++)
15753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_cmpl_mode = (i == 0) ? PRED_L1 : PRED_L0;
15773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_a && (ps_a_pu->b2_pred_mode != i4_cmpl_mode) && (ps_a_pu->s_me_info[i].i1_ref_idx != 0))<<i;
15793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_b && (ps_b_pu->b2_pred_mode != i4_cmpl_mode) && (ps_b_pu->s_me_info[i].i1_ref_idx != 0))<<i;
15803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mode_avail |= (i4_c && (ps_c_pu->b2_pred_mode != i4_cmpl_mode) && (ps_c_pu->s_me_info[i].i1_ref_idx != 0))<<i;
15813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Update skip MV for L0 */
15843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((i4_mode_avail & 0x1) && (!i4_colzeroflag))
15853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvx = ps_proc->ps_pred_mv[0].s_mv.i2_mvx;
15873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvy = ps_proc->ps_pred_mv[0].s_mv.i2_mvy;
15883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
15903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvx = 0;
15923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[0].s_mv.i2_mvy = 0;
15933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
15943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
15953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Update skip MV for L1 */
15963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if ((i4_mode_avail & 0x2) && (!i4_colzeroflag))
15973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
15983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvx = ps_proc->ps_pred_mv[1].s_mv.i2_mvx;
15993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvy = ps_proc->ps_pred_mv[1].s_mv.i2_mvy;
16003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
16013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    else
16023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
16033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvx = 0;
16043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_skip_mv[1].s_mv.i2_mvy = 0;
16053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
16063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Now see if the ME information matches the SKIP information */
16083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    switch (ps_proc->ps_pu->b2_pred_mode)
16093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
16103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        case PRED_BI:
16113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (  (ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx == ps_proc->ps_skip_mv[0].s_mv.i2_mvx)
16123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy == ps_proc->ps_skip_mv[0].s_mv.i2_mvy)
16133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvx == ps_proc->ps_skip_mv[1].s_mv.i2_mvx)
16143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvy == ps_proc->ps_skip_mv[1].s_mv.i2_mvy)
16153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (i4_mode_avail ==  0x3 || i4_mode_avail == 0x0))
16163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
16173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                return 1;
16183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
16193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            break;
16203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        case PRED_L0:
16223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if ( (ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvx == ps_proc->ps_skip_mv[0].s_mv.i2_mvx)
16233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K              && (ps_proc->ps_pu->s_me_info[0].s_mv.i2_mvy == ps_proc->ps_skip_mv[0].s_mv.i2_mvy)
16243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K              && (i4_mode_avail == 0x1))
16253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
16263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                return 1;
16273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
16283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            break;
16293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        case PRED_L1:
16313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (  (ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvx == ps_proc->ps_skip_mv[1].s_mv.i2_mvx)
16323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (ps_proc->ps_pu->s_me_info[1].s_mv.i2_mvy == ps_proc->ps_skip_mv[1].s_mv.i2_mvy)
16333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K               && (i4_mode_avail == 0x2))
16343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
16353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                return 1;
16363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
16373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            break;
16383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
16393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    return 0;
16413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}
16423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
16453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
16463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief This function computes the best motion vector among the tentative mv
16483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* candidates chosen.
16493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par Description:
16513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  This function determines the position in the search window at which the motion
16523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  estimation should begin in order to minimise the number of search iterations.
16533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_mb_part
16553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  pointer to current mb partition ctxt with respect to ME
16563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_lambda_motion
16583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  lambda motion
16593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] u4_fast_flag
16613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  enable/disable fast sad computation
16623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns  mv pair & corresponding distortion and cost
16643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks Currently onyl 4 search candiates are supported
16663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
16673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
16683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/
16693749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kvoid ih264e_evaluate_bipred(me_ctxt_t *ps_me_ctxt,
16703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            process_ctxt_t *ps_proc,
16713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            mb_part_ctxt *ps_mb_ctxt_bi)
16723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{
16733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD32 i, u4_fast_sad;
16753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_dest_buff;
16773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mv_t *ps_l0_pred_mv, *ps_l1_pred_mv, s_l0_mv, s_l1_mv;
16793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD8 *pu1_ref_mb_l0, *pu1_ref_mb_l1;
16813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD8 *pu1_dst_buf;
16833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_ref_l0_stride, i4_ref_l1_stride;
16853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_mb_distortion, i4_mb_cost;
16873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    u4_fast_sad = ps_me_ctxt->u4_enable_fast_sad;
16893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    i4_dest_buff = 0;
16913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    for (i = 0; i < ps_me_ctxt->u4_num_candidates[PRED_BI]; i += 2)
16923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
16933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        pu1_dst_buf = ps_me_ctxt->apu1_subpel_buffs[i4_dest_buff];
16943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
16953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_l0_mv.i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvx >> 2;
16963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_l0_mv.i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvy >> 2;
16973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_l1_mv.i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvx >> 2;
16983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        s_l1_mv.i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvy >> 2;
16993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_l0_pred_mv = &ps_proc->ps_pred_mv[PRED_L0].s_mv;
17013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_l1_pred_mv = &ps_proc->ps_pred_mv[PRED_L1].s_mv;
17023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if ((ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvx & 0x3)||
17043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        (ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvy & 0x3))
17053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
17063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pu1_ref_mb_l0 = ps_me_ctxt->as_mb_part[PRED_L0].pu1_best_hpel_buf;
17073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_ref_l0_stride = ps_me_ctxt->u4_subpel_buf_strd;
17083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
17093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else
17103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
17113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pu1_ref_mb_l0 = ps_me_ctxt->apu1_ref_buf_luma[PRED_L0] + (s_l0_mv.i2_mvx) + ((s_l0_mv.i2_mvy) * ps_me_ctxt->i4_rec_strd);
17123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_ref_l0_stride = ps_me_ctxt->i4_rec_strd;
17133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
17143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if ((ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvx & 0x3) ||
17173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        (ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvy & 0x3))
17183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
17193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pu1_ref_mb_l1 = ps_me_ctxt->as_mb_part[PRED_L1].pu1_best_hpel_buf;
17203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_ref_l1_stride = ps_me_ctxt->u4_subpel_buf_strd;
17213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
17223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else
17233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
17243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            pu1_ref_mb_l1 = ps_me_ctxt->apu1_ref_buf_luma[PRED_L1] + (s_l1_mv.i2_mvx) + ((s_l1_mv.i2_mvy) * ps_me_ctxt->i4_rec_strd);
17253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_ref_l1_stride = ps_me_ctxt->i4_rec_strd;
17263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
17273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_codec->pf_inter_pred_luma_bilinear(
17293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        pu1_ref_mb_l0, pu1_ref_mb_l1, pu1_dst_buf,
17303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        i4_ref_l0_stride, i4_ref_l1_stride,
17313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_me_ctxt->u4_subpel_buf_strd, MB_SIZE, MB_SIZE);
17323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->pf_ime_compute_sad_16x16[u4_fast_sad](
17343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_me_ctxt->pu1_src_buf_luma, pu1_dst_buf,
17353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                        ps_me_ctxt->i4_src_strd, ps_me_ctxt->u4_subpel_buf_strd,
1736eddf6a33fe731e0dbba56092d5020cc8edc14ca5Martin Storsjo                        INT_MAX, &i4_mb_distortion);
17373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* compute cost */
17398ce82804ab3b5d1d0202b5e6906d85ef70e08899Harinarayanan K K        i4_mb_cost =  ps_me_ctxt->pu1_mv_bits[ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvx - ps_l0_pred_mv->i2_mvx];
17408ce82804ab3b5d1d0202b5e6906d85ef70e08899Harinarayanan K K        i4_mb_cost += ps_me_ctxt->pu1_mv_bits[ps_me_ctxt->as_mv_init_search[PRED_BI][i].i2_mvy - ps_l0_pred_mv->i2_mvy];
17418ce82804ab3b5d1d0202b5e6906d85ef70e08899Harinarayanan K K        i4_mb_cost += ps_me_ctxt->pu1_mv_bits[ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvx - ps_l1_pred_mv->i2_mvx];
17428ce82804ab3b5d1d0202b5e6906d85ef70e08899Harinarayanan K K        i4_mb_cost += ps_me_ctxt->pu1_mv_bits[ps_me_ctxt->as_mv_init_search[PRED_BI][i + 1].i2_mvy - ps_l1_pred_mv->i2_mvy];
17433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mb_cost -= (ps_me_ctxt->i4_skip_bias[BSLICE]) * (ps_me_ctxt->i4_skip_type == PRED_BI) * (i == 0);
17453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mb_cost *= ps_me_ctxt->u4_lambda_motion;
17483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_mb_cost += i4_mb_distortion;
17493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (i4_mb_cost < ps_mb_ctxt_bi->i4_mb_cost)
17513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
17523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_mb_ctxt_bi->i4_srch_pos_idx = (i>>1);
17533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_mb_ctxt_bi->i4_mb_cost = i4_mb_cost;
17543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_mb_ctxt_bi->i4_mb_distortion = i4_mb_distortion;
17553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_mb_ctxt_bi->pu1_best_hpel_buf = pu1_dst_buf;
17563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_dest_buff = (i4_dest_buff + 1) % 2;
17573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
17583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
17593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}
17613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
17633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
17643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @brief This function performs motion estimation for the current mb
17663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @par Description:
17683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  The current mb is compared with a list of mb's in the reference frame for
17693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  least cost. The mb that offers least cost is chosen as predicted mb and the
17703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  displacement of the predicted mb from index location of the current mb is
17713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  signaled as mv. The list of the mb's that are chosen in the reference frame
17723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  are dependent on the speed of the ME configured.
17733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @param[in] ps_proc
17753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*  Process context corresponding to the job
17763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @returns  motion vector of the pred mb, sad, cost.
17783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* @remarks none
17803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*
17813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*******************************************************************************
17823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/
17833749f6f435e79624f72841e866245d84195551cdHarinarayanan K Kvoid ih264e_compute_me_multi_reflist(process_ctxt_t *ps_proc)
17843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{
17853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* me ctxt */
17863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    me_ctxt_t *ps_me_ctxt = &ps_proc->s_me_ctxt;
17873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* codec context */
17893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    codec_t *ps_codec = ps_proc->ps_codec;
17903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Temp variables for looping over ref lists */
17923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_reflist, i4_max_reflist;
17933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* recon stride */
17953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i4_rec_strd = ps_proc->i4_rec_strd;
17963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
17973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* source buffer for halp pel generation functions */
17983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD8 *pu1_hpel_src;
17993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* quantization parameters */
18013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    quant_params_t *ps_qp_params = ps_proc->ps_qp_params[0];
18023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Mb part ctxts for SKIP */
18043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    mb_part_ctxt as_skip_mbpart[2];
18053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18064b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    /* Sad therholds */
18074b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo    ps_me_ctxt->pu2_sad_thrsh = ps_qp_params->pu2_sad_thrsh;
18084b09a8c011279fd5bb29d238ebef17810e446783Martin Storsjo
18093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
18103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        WORD32 rows_above, rows_below, columns_left, columns_right;
18113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* During evaluation for motion vectors do not search through padded regions */
18133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Obtain number of rows and columns that are effective for computing for me evaluation */
18143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        rows_above = MB_SIZE + ps_proc->i4_mb_y * MB_SIZE;
18153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        rows_below = (ps_proc->i4_ht_mbs - ps_proc->i4_mb_y) * MB_SIZE;
18163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        columns_left = MB_SIZE + ps_proc->i4_mb_x * MB_SIZE;
18173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        columns_right = (ps_proc->i4_wd_mbs - ps_proc->i4_mb_x) * MB_SIZE;
18183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* init srch range */
18203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* NOTE : For now, lets limit the search range by DEFAULT_MAX_SRCH_RANGE_X / 2
18213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * on all sides.
18223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         */
18233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_w = -MIN(columns_left, DEFAULT_MAX_SRCH_RANGE_X >> 1);
18243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_e = MIN(columns_right, DEFAULT_MAX_SRCH_RANGE_X >> 1);
18253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_n = -MIN(rows_above, DEFAULT_MAX_SRCH_RANGE_Y >> 1);
18263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_srch_range_s = MIN(rows_below, DEFAULT_MAX_SRCH_RANGE_Y >> 1);
18273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* this is to facilitate fast sub pel computation with minimal loads */
18293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_me_ctxt->u4_enable_hpel)
18303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
18313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->i4_srch_range_w += 1;
18323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->i4_srch_range_e -= 1;
18333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->i4_srch_range_n += 1;
18343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->i4_srch_range_s -= 1;
18353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
18363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
18373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Compute ME and store the MVs */
18393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
18403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /***********************************************************************
18413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Compute ME for lists L0 and L1
18423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  For L0 -> L0 skip + L0
18433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  for L1 -> L0 skip + L0 + L1 skip + L1
18443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         ***********************************************************************/
18453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        i4_max_reflist = (ps_proc->i4_slice_type == PSLICE) ? PRED_L0 : PRED_L1;
18463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /* Init SATQD for the current list */
18483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->u4_min_sad_reached  = 0;
18493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_me_ctxt->i4_min_sad = ps_proc->ps_cur_mb->u4_min_sad;
18503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        for (i4_reflist = PRED_L0; i4_reflist <= i4_max_reflist; i4_reflist++)
18523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
18533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Get the seed motion vector candidates                    */
18553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ih264e_get_search_candidates(ps_proc, ps_me_ctxt, i4_reflist);
18563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* ****************************************************************
18583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             *Evaluate the SKIP for current list
18593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             * ****************************************************************/
18603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].s_mv_curr.i2_mvx = 0;
18613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].s_mv_curr.i2_mvy = 0;
18623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].i4_mb_cost = INT_MAX;
18633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].i4_mb_distortion = INT_MAX;
18643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_me_ctxt->i4_skip_type == i4_reflist)
18663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
18673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ime_compute_skip_cost( ps_me_ctxt,
18683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                       (ime_mv_t *)(&ps_proc->ps_skip_mv[i4_reflist].s_mv),
18693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                       &as_skip_mbpart[i4_reflist],
18703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                       ps_proc->ps_codec->s_cfg.u4_enable_satqd,
18713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                       i4_reflist,
18723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                       (ps_proc->i4_slice_type == BSLICE) );
18733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
18743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].s_mv_curr.i2_mvx <<= 2;
18763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            as_skip_mbpart[i4_reflist].s_mv_curr.i2_mvy <<= 2;
18773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /******************************************************************
18793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             * Evaluate ME For current list
18803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K             *****************************************************************/
18813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvx = 0;
18823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvy = 0;
18833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_cost = INT_MAX;
18843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_distortion = INT_MAX;
18853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Init Hpel */
18873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].pu1_best_hpel_buf = NULL;
18883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* In case we found out the minimum SAD, exit the ME eval */
18903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_me_ctxt->u4_min_sad_reached)
18913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
18923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                i4_max_reflist = i4_reflist;
18933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                break;
18943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
18953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
18973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Evaluate search candidates for initial mv pt */
18983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ime_evaluate_init_srchposn_16x16(ps_me_ctxt, i4_reflist);
18993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /********************************************************************/
19013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /*                  full pel motion estimation                      */
19023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /********************************************************************/
19033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ime_full_pel_motion_estimation_16x16(ps_me_ctxt, i4_reflist);
19043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            DEBUG_MV_HISTOGRAM_ADD((ps_me_ctxt->s_mb_part.s_mv_curr.i2_mvx >> 2),
19063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                   (ps_me_ctxt->s_mb_part.s_mv_curr.i2_mvy >> 2));
19073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            DEBUG_SAD_HISTOGRAM_ADD(ps_me_ctxt->s_mb_part.i4_mb_distortion, 1);
19093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Scale the MV to qpel resolution */
19113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvx <<= 2;
19123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvy <<= 2;
19133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_me_ctxt->u4_enable_hpel)
19153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
19163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* moving src pointer to the converged motion vector location */
19173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                pu1_hpel_src =   ps_me_ctxt->apu1_ref_buf_luma[i4_reflist]
19183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                               + (ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvx >> 2)
19193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                               + ((ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr.i2_mvy >> 2)* i4_rec_strd);
19203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->apu1_subpel_buffs[0] = ps_proc->apu1_subpel_buffs[0];
19223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->apu1_subpel_buffs[1] = ps_proc->apu1_subpel_buffs[1];
19233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->apu1_subpel_buffs[2] = ps_proc->apu1_subpel_buffs[2];
19243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* Init the search position to an invalid number */
19263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->as_mb_part[i4_reflist].i4_srch_pos_idx = 3;
19273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* Incase a buffer is still in use by L0, replace it with spare buff */
19293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->apu1_subpel_buffs[ps_me_ctxt->as_mb_part[PRED_L0].i4_srch_pos_idx] =
19303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                ps_proc->apu1_subpel_buffs[3];
19313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->u4_subpel_buf_strd = HP_BUFF_WD;
19343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* half  pel search is done for both sides of full pel,
19363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * hence half_x of width x height = 17x16 is created
19373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * starting from left half_x of converged full pel */
19383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                pu1_hpel_src -= 1;
19393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* computing half_x */
19413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_codec->pf_ih264e_sixtapfilter_horz(pu1_hpel_src,
19423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                                      ps_me_ctxt->apu1_subpel_buffs[0],
19433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                                      i4_rec_strd,
19443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                                      ps_me_ctxt->u4_subpel_buf_strd);
19453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /*
19473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * Halfpel search is done for both sides of full pel,
19483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * hence half_y of width x height = 16x17 is created
19493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * starting from top half_y of converged full pel
19503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * for half_xy top_left is required
19513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 * hence it starts from pu1_hpel_src = full_pel_converged_point - i4_rec_strd - 1
19523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                 */
19533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                pu1_hpel_src -= i4_rec_strd;
19543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                /* computing half_y and half_xy */
19563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_codec->pf_ih264e_sixtap_filter_2dvh_vert(
19573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                pu1_hpel_src, ps_me_ctxt->apu1_subpel_buffs[1],
19583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                ps_me_ctxt->apu1_subpel_buffs[2], i4_rec_strd,
19593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                ps_me_ctxt->u4_subpel_buf_strd, ps_proc->ai16_pred1 + 3,
19603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                ps_me_ctxt->u4_subpel_buf_strd);
19613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ime_sub_pel_motion_estimation_16x16(ps_me_ctxt, i4_reflist);
19633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
19653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
19663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /***********************************************************************
19683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * If a particular skiip Mv is giving better sad, copy to the corresponding
19693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * MBPART
19703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * In B slices this loop should go only to PREDL1: If we found min sad
19713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * we will go to the skip ref list only
19723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Have to find a way to make it without too much change or new vars
19733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         **********************************************************************/
19743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        for (i4_reflist = 0; i4_reflist <= i4_max_reflist; i4_reflist++)
19753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
19763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (as_skip_mbpart[i4_reflist].i4_mb_cost < ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_cost)
19773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
19783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_cost = as_skip_mbpart[i4_reflist].i4_mb_cost;
19793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_distortion = as_skip_mbpart[i4_reflist].i4_mb_distortion;
19803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_me_ctxt->as_mb_part[i4_reflist].s_mv_curr = as_skip_mbpart[i4_reflist].s_mv_curr;
19813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
19823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
19833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /***********************************************************************
19853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Compute ME for BI
19863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  In case of BI we do ME for two candidates
19873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *   1) The best L0 and L1 Mvs
19883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *   2) Skip L0 and L1 MVs
19893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *
19903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *   TODO
19913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *   one of the search candidates is skip. Hence it may be duplicated
19923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         ***********************************************************************/
19933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (i4_max_reflist == PRED_L1 && ps_me_ctxt->u4_min_sad_reached == 0)
19943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
19953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            WORD32 i, j = 0;
19963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            WORD32 l0_srch_pos_idx, l1_srch_pos_idx;
19973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            WORD32 i4_l0_skip_mv_idx, i4_l1_skip_mv_idx;
19983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
19993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Get the free buffers */
20003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            l0_srch_pos_idx = ps_me_ctxt->as_mb_part[PRED_L0].i4_srch_pos_idx;
20013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            l1_srch_pos_idx = ps_me_ctxt->as_mb_part[PRED_L1].i4_srch_pos_idx;
20023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Search for the two free buffers in subpel list */
20043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            for (i = 0; i < SUBPEL_BUFF_CNT; i++)
20053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
20063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                if (i != l0_srch_pos_idx && i != l1_srch_pos_idx)
20073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                {
20083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                    ps_me_ctxt->apu1_subpel_buffs[j] = ps_proc->apu1_subpel_buffs[i];
20093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                    j++;
20103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                }
20113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
20123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->u4_subpel_buf_strd = HP_BUFF_WD;
20133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Copy the statial SKIP MV of each list */
20153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_l0_skip_mv_idx = ps_me_ctxt->u4_num_candidates[PRED_L0] - 2;
20163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_l1_skip_mv_idx = ps_me_ctxt->u4_num_candidates[PRED_L1] - 2;
20173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][0].i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_L0][i4_l0_skip_mv_idx].i2_mvx << 2;
20183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][0].i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_L0][i4_l0_skip_mv_idx].i2_mvy << 2;
20193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][1].i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_L1][i4_l1_skip_mv_idx].i2_mvx << 2;
20203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][1].i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_L1][i4_l1_skip_mv_idx].i2_mvy << 2;
20213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Copy the SKIP MV temporal of each list */
20233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_l0_skip_mv_idx++;
20243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_l1_skip_mv_idx++;
20253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][2].i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_L0][i4_l0_skip_mv_idx].i2_mvx << 2;
20263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][2].i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_L0][i4_l0_skip_mv_idx].i2_mvy << 2;
20273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][3].i2_mvx = ps_me_ctxt->as_mv_init_search[PRED_L1][i4_l1_skip_mv_idx].i2_mvx << 2;
20283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][3].i2_mvy = ps_me_ctxt->as_mv_init_search[PRED_L1][i4_l1_skip_mv_idx].i2_mvy << 2;
20293749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20303749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Copy the best MV after ME */
20313749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][4] = ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr;
20323749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mv_init_search[PRED_BI][5] = ps_me_ctxt->as_mb_part[PRED_L1].s_mv_curr;
20333749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20343749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->u4_num_candidates[PRED_BI] = 6;
20353749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20363749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[PRED_BI].i4_mb_cost = INT_MAX;
20373749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[PRED_BI].i4_mb_distortion = INT_MAX;
20383749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20393749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ih264e_evaluate_bipred(ps_me_ctxt, ps_proc,
20403749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                   &ps_me_ctxt->as_mb_part[PRED_BI]);
20413749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20423749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            i4_max_reflist = PRED_BI;
20433749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
20443749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20453749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /**********************************************************************
20463749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * Now get the minimum of MB part sads by searching over all ref lists
20473749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         **********************************************************************/
20483749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_pu->b2_pred_mode = 0x3;
20493749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20503749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        for (i4_reflist = 0; i4_reflist <= i4_max_reflist; i4_reflist++)
20513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
20523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            if (ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_cost < ps_proc->ps_cur_mb->i4_mb_cost)
20533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            {
20543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_proc->ps_cur_mb->i4_mb_cost = ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_cost;
20553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_proc->ps_cur_mb->i4_mb_distortion = ps_me_ctxt->as_mb_part[i4_reflist].i4_mb_distortion;
20563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_proc->ps_cur_mb->u4_mb_type = (ps_proc->i4_slice_type == PSLICE) ? P16x16 : B16x16;
20573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                ps_proc->ps_pu->b2_pred_mode = i4_reflist ;
20583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            }
20593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
20603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        /**********************************************************************
20623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         * In case we have a BI MB, we have to copy the buffers and set proer MV's
20633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  1)In case its BI, we need to get the best MVs given by BI and update
20643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *    to their corresponding MB part
20653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  2)We also need to copy the buffer in which bipred buff is populated
20663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *
20673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         *  Not that if we have
20683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K         **********************************************************************/
20693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        if (ps_proc->ps_pu->b2_pred_mode == PRED_BI)
20703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
20713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            WORD32 i4_srch_pos = ps_me_ctxt->as_mb_part[PRED_BI].i4_srch_pos_idx;
20723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            UWORD8 *pu1_bi_buf = ps_me_ctxt->as_mb_part[PRED_BI].pu1_best_hpel_buf;
20733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr = ps_me_ctxt->as_mv_init_search[PRED_BI][i4_srch_pos << 1];
20753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_me_ctxt->as_mb_part[PRED_L1].s_mv_curr = ps_me_ctxt->as_mv_init_search[PRED_BI][(i4_srch_pos << 1) + 1];
20763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Now we have to copy the buffers */
20783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_codec->pf_inter_pred_luma_copy(pu1_bi_buf,
20793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                              ps_proc->pu1_best_subpel_buf,
20803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                              ps_me_ctxt->u4_subpel_buf_strd,
20813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                              ps_proc->u4_bst_spel_buf_strd,
20823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                              MB_SIZE, MB_SIZE, NULL, 0);
20833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
20853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        else if (ps_me_ctxt->as_mb_part[ps_proc->ps_pu->b2_pred_mode].pu1_best_hpel_buf)
20863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        {
20873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            /* Now we have to copy the buffers */
20883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K            ps_codec->pf_inter_pred_luma_copy(
20893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_me_ctxt->as_mb_part[ps_proc->ps_pu->b2_pred_mode].pu1_best_hpel_buf,
20903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_proc->pu1_best_subpel_buf,
20913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_me_ctxt->u4_subpel_buf_strd,
20923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            ps_proc->u4_bst_spel_buf_strd, MB_SIZE, MB_SIZE,
20933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                            NULL, 0);
20943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        }
20953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
20963749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
20973749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /**************************************************************************
20983749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     *Now copy the MVs to the current PU with qpel scaling
20993749f6f435e79624f72841e866245d84195551cdHarinarayanan K K     ***************************************************************************/
21003749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvx = (ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvx);
21013749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L0].s_mv.i2_mvy = (ps_me_ctxt->as_mb_part[PRED_L0].s_mv_curr.i2_mvy);
21023749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L1].s_mv.i2_mvx = (ps_me_ctxt->as_mb_part[PRED_L1].s_mv_curr.i2_mvx);
21033749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[PRED_L1].s_mv.i2_mvy = (ps_me_ctxt->as_mb_part[PRED_L1].s_mv_curr.i2_mvy);
21043749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21053749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21063749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[0].i1_ref_idx = (ps_proc->ps_pu->b2_pred_mode != PRED_L1)? -1:0;
21073749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->s_me_info[1].i1_ref_idx = (ps_proc->ps_pu->b2_pred_mode != PRED_L0)? -1:0;
21083749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21093749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* number of partitions */
21103749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->u4_num_sub_partitions = 1;
21113749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    *(ps_proc->pu4_mb_pu_cnt) = 1;
21123749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21133749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* position in-terms of PU */
21143749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->b4_pos_x = 0;
21153749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->b4_pos_y = 0;
21163749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* PU size */
21183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->b4_wd = 3;
21193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_proc->ps_pu->b4_ht = 3;
21203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
21213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    /* Update min sad conditions */
21223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    if (ps_me_ctxt->u4_min_sad_reached == 1)
21233749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {
21243749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_cur_mb->u4_min_sad_reached = 1;
21253749f6f435e79624f72841e866245d84195551cdHarinarayanan K K        ps_proc->ps_cur_mb->u4_min_sad = ps_me_ctxt->i4_min_sad;
21263749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }
21273749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}
21283749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
2129