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