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_intra_modes_eval.c 258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This file contains definitions of routines that perform rate distortion 288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* analysis on a macroblock if they are to be coded as intra. 298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @author 318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* ittiam 328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par List of Functions: 348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_derive_neighbor_availability_of_mbs() 358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_derive_ngbr_avbl_of_mb_partitions() 368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff() 378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff() 388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra4x4_modes_for_least_cost_rdoptoff() 398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton() 408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff() 418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra16x16_modes() 428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra4x4_modes() 438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* - ih264e_evaluate_intra_chroma_modes() 448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks 468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* None 478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************* 498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/ 528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* File Includes */ 538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/ 548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* System include files */ 568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <stdio.h> 578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <string.h> 588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <limits.h> 598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <assert.h> 608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* User include files */ 628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_config.h" 638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_typedefs.h" 648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_defs.h" 658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "iv2.h" 668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ive2.h" 678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_debug.h" 688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_defs.h" 698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_macros.h" 708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_intra_pred_filters.h" 718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_structs.h" 728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_common_tables.h" 738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_trans_quant_itrans_iquant.h" 748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_inter_pred_filters.h" 758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_mem_fns.h" 768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_padding.h" 778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_deblk_edge_filters.h" 783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264_cabac_tables.h" 798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_distortion_metrics.h" 808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_error.h" 818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_bitstream.h" 823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ime_defs.h" 838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_structs.h" 848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "irc_cntrl_param.h" 858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "irc_frame_info_collector.h" 868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_rate_control.h" 873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#include "ih264e_cabac_structs.h" 888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_structs.h" 898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_intra_modes_eval.h" 908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264e_globals.h" 918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ime_platform_macros.h" 928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/ 958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Function Definitions */ 968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/ 978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 1008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 1028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* derivation process for macroblock availability 1038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 1058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Calculates the availability of the left, top, topright and topleft macroblocks. 1068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 1088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to proc context (handle) 1098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks Based on section 6.4.5 in H264 spec 1118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 1138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 1148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 1158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 1168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_derive_nghbr_avbl_of_mbs(process_ctxt_t *ps_proc) 1178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 1188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_slice_idx_curr = ps_proc->pu1_slice_idx; 1198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_slice_idx_b; 1208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_slice_idx_a; 1218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_slice_idx_c; 1228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_slice_idx_d; 1238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S block_neighbors_t *ps_ngbr_avbl; 1248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_mb_x, i4_mb_y; 1258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_wd_mbs; 1268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_x = ps_proc->i4_mb_x; 1288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_y = ps_proc->i4_mb_y; 1298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_wd_mbs = ps_proc->i4_wd_mbs; 1318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_slice_idx_curr += (i4_mb_y * i4_wd_mbs) + i4_mb_x; 1338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_slice_idx_a = pu1_slice_idx_curr - 1; 1348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_slice_idx_b = pu1_slice_idx_curr - i4_wd_mbs; 1358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_slice_idx_c = pu1_slice_idx_b + 1; 1368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_slice_idx_d = pu1_slice_idx_b - 1; 1378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl = ps_proc->ps_ngbr_avbl; 1388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 1408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* The macroblock is marked as available, unless one of the following */ 1418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* conditions is true in which case the macroblock shall be marked as */ 1428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* not available. */ 1438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* 1. mbAddr < 0 */ 1448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* 2 mbAddr > CurrMbAddr */ 1458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* 3. the macroblock with address mbAddr belongs to a different slice */ 1468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* than the macroblock with address CurrMbAddr */ 1478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 1488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* left macroblock availability */ 1508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_mb_x == 0) 1518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks along first column */ 1528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_a = 0; 1538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks belong to same slice? */ 1568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (*pu1_slice_idx_a != *pu1_slice_idx_curr) 1578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_a = 0; 1588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_a = 1; 1608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top macroblock availability */ 1638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_mb_y == 0) 1648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks along first row */ 1658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_b = 0; 1668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks belong to same slice? */ 1698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (*pu1_slice_idx_b != *pu1_slice_idx_curr) 1708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_b = 0; 1718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_b = 1; 1738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top right macroblock availability */ 1768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_mb_x == i4_wd_mbs-1 || i4_mb_y == 0) 1778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks along last column */ 1788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_c = 0; 1798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks belong to same slice? */ 1828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (*pu1_slice_idx_c != *pu1_slice_idx_curr) 1838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_c = 0; 1848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_c = 1; 1868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top left macroblock availability */ 1898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_mb_x == 0 || i4_mb_y == 0) 1908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks along first column */ 1918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_d = 0; 1928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* macroblocks belong to same slice? */ 1958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (*pu1_slice_idx_d != *pu1_slice_idx_curr) 1968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_d = 0; 1978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_ngbr_avbl->u1_mb_d = 1; 1998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 2018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 2038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 2048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 2068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* derivation process for subblock/partition availability 2078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 2098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Calculates the availability of the left, top, topright and topleft subblock 2108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* or partitions. 2118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 2138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to macroblock context (handle) 2148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] i1_pel_pos_x 2168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* column position of the pel wrt the current block 2178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] i1_pel_pos_y 2198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* row position of the pel in wrt current block 2208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks Assumptions: before calling this function it is assumed that 2228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the neighbor availability of the current macroblock is already derived. 2238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Based on table 6-3 of H264 specification 2248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return availability status (yes or no) 2268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 2288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 2298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SUWORD8 ih264e_derive_ngbr_avbl_of_mb_partitions(block_neighbors_t *ps_ngbr_avbl, 2308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD8 i1_pel_pos_x, 2318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD8 i1_pel_pos_y) 2328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 2338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_neighbor_avail=0; 2348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 2368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* values of i1_pel_pos_x in the range 0-15 inclusive correspond to */ 2378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* various columns of a macroblock */ 2388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* */ 2398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* values of i1_pel_pos_y in the range 0-15 inclusive correspond to */ 2408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* various rows of a macroblock */ 2418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* */ 2428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* other values of i1_pel_pos_x & i1_pel_pos_y represents elements */ 2438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* outside the bound of an mb ie., represents its neighbors. */ 2448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 2458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i1_pel_pos_x < 0) 2468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* column(-1) */ 2478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i1_pel_pos_y < 0) 2488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* row(-1) */ 2498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = ps_ngbr_avbl->u1_mb_d; /* current mb topleft availability */ 2508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i1_pel_pos_y >= 0 && i1_pel_pos_y < 16) 2528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* all rows of a macroblock */ 2538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = ps_ngbr_avbl->u1_mb_a; /* current mb left availability */ 2548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else /* if (i1_pel_pos_y >= 16) */ 2568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* rows(+16) */ 2578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = 0; /* current mb bottom left availability */ 2588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i1_pel_pos_x >= 0 && i1_pel_pos_x < 16) 2618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* all columns of a macroblock */ 2628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i1_pel_pos_y < 0) 2638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* row(-1) */ 2648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = ps_ngbr_avbl->u1_mb_b; /* current mb top availability */ 2658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i1_pel_pos_y >= 0 && i1_pel_pos_y < 16) 2678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* all rows of a macroblock */ 2688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = 1; /* current mb availability */ 2698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* availability of the partition is dependent on the position of the partition inside the mb */ 2708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* although the availability is declared as 1 in all cases these needs to be corrected somewhere else and this is not done in here */ 2718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else /* if (i1_pel_pos_y >= 16) */ 2738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* rows(+16) */ 2748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = 0; /* current mb bottom availability */ 2758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i1_pel_pos_x >= 16) 2788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* column(+16) */ 2798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i1_pel_pos_y < 0) 2808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* row(-1) */ 2818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = ps_ngbr_avbl->u1_mb_c; /* current mb top right availability */ 2828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else /* if (i1_pel_pos_y >= 0) */ 2848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { /* all other rows */ 2858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_neighbor_avail = 0; /* current mb right & bottom right availability */ 2868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return u1_neighbor_avail; 2908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 2918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 2938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 2948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 2968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* evaluate best intra 16x16 mode (rate distortion opt off) 2978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 2988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 2998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates all the possible intra 16x16 modes and finds the mode 3008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* that best represents the macro-block (least distortion) and occupies fewer 3018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits in the bit-stream. 3028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 3038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 3048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to process context (handle) 3058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 3068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks 3078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Ideally the cost of encoding a macroblock is calculated as 3088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* (distortion + lambda*rate). Where distortion is SAD/SATD,... between the 3098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* input block and the reconstructed block and rate is the number of bits taken 3108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to place the macroblock in the bit-stream. In this routine the rate does not 3118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* exactly point to the total number of bits it takes, rather it points to header 3128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits 3138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and residual bits fall in to texture bits the number of bits taken to encoding 3148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* mbtype is considered as rate, we compute cost. Further we will approximate 3158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the distortion as the deviation b/w input and the predicted block as opposed 3168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to input and reconstructed block. 3178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 3188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* NOTE: As per the Document JVT-O079, for intra 16x16 macroblock, 3198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the SAD and cost are one and the same. 3208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 3218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 3228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 3238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 3248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 3258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra16x16_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_proc) 3278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 3288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Codec Context */ 3298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S codec_t *ps_codec = ps_proc->ps_codec; 3308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* SAD(distortion metric) of an 8x8 block */ 3328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_mb_distortion = INT_MAX, i4_mb_distortion_least = INT_MAX; 3338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* lambda */ 3358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_lambda = ps_proc->u4_lambda; 3368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 3388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_mb_cost= INT_MAX, i4_mb_cost_least = INT_MAX; 3398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra mode */ 3418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_intra_mode, u4_best_intra_16x16_mode = DC_I16x16; 3428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor pels for intra prediction */ 3448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_i16 = ps_proc->au1_ngbr_pels; 3458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor availability */ 3478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ngbr_avbl; 3488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to src macro block */ 3508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_curr_mb = ps_proc->pu1_src_buf_luma; 3518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ref_mb = ps_proc->pu1_rec_buf_luma; 3528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to prediction macro block */ 3548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb_intra_16x16 = ps_proc->pu1_pred_mb_intra_16x16; 3558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb_intra_16x16_plane = ps_proc->pu1_pred_mb_intra_16x16_plane; 3568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* strides */ 3588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_src_strd = ps_proc->i4_src_strd; 3598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_pred_strd = ps_proc->i4_pred_strd; 3608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_rec_strd = ps_proc->i4_rec_strd; 3618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to neighbors left, top, topleft */ 3638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_a = pu1_ref_mb - 1; 3648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_b = pu1_ref_mb - i4_rec_strd; 3658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_d = pu1_mb_b - 1; 3668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* valid intra modes map */ 3688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes; 3698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* lut for valid intra modes */ 3718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S const UWORD8 u1_valid_intra_modes[8] = {4, 6, 12, 14, 5, 7, 13, 15}; 3728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* temp var */ 3748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 i, u4_enable_fast_sad = 0, offset = 0; 3758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* init temp var */ 3773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K if (ps_proc->i4_slice_type != ISLICE) 3788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K /* Offset for MBtype */ 3803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K offset = (ps_proc->i4_slice_type == PSLICE) ? 5 : 23; 3818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_enable_fast_sad = ps_proc->s_me_ctxt.u4_enable_fast_sad; 3828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* locating neighbors that are available for prediction */ 3858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : update the neighbor availability information basing on constrained intra pred information */ 3868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines 3878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * basing on neighbors available and hence evade the computation of neighbor availability totally. */ 3888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */ 3898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1); 3908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_ngbr_avbl_16x16_mb = i4_ngbr_avbl; 3918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* gather prediction pels from the neighbors, if particular set is not available 3938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * it is set to zero*/ 3948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* left pels */ 3958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_a) 3968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < 16; i++) 3988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i16[16-1-i] = pu1_mb_a[i * i4_rec_strd]; 3998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 4018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_set_mul8(pu1_ngbr_pels_i16,0,MB_SIZE); 4038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top pels */ 4058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_b) 4068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_cpy_mul8(pu1_ngbr_pels_i16+16+1,pu1_mb_b,16); 4088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*for(i = 0; i < 16; i++) 4098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i16[16+1+i] = pu1_mb_b[i];*/ 4108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 4128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_set_mul8(pu1_ngbr_pels_i16+16+1,0,MB_SIZE); 4148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* topleft pels */ 4168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_d) 4178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i16[16] = *pu1_mb_d; 4188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 4198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i16[16] = 0; 4208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* set valid intra modes for evaluation */ 4228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// u4_valid_intra_modes = 15; 4238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//// ih264e_filter_intra16x16modes(pu1_mb_curr, i4_src_strd, &u4_valid_intra_modes); 4248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// if (!ps_proc->ps_ngbr_avbl->u1_mb_a) 4258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// u4_valid_intra_modes &= ~(1 << HORZ_I16x16); 4268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// if (!ps_proc->ps_ngbr_avbl->u1_mb_b) 4278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// u4_valid_intra_modes &= ~(1 << VERT_I16x16); 4288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//// if (!ps_proc->ps_ngbr_avbl->u1_mb_a || !ps_proc->ps_ngbr_avbl->u1_mb_b || !ps_proc->ps_ngbr_avbl->u1_mb_d) 4298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// if (i4_ngbr_avbl != 7) 4308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// u4_valid_intra_modes &= ~(1 << PLANE_I16x16); 4318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes = u1_valid_intra_modes[i4_ngbr_avbl]; 4338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FAST) 4358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << PLANE_I16x16); 4368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* evaluate b/w HORZ_I16x16, VERT_I16x16 & DC_I16x16 */ 4388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_ih264e_evaluate_intra16x16_modes(pu1_curr_mb, pu1_ngbr_pels_i16, pu1_pred_mb_intra_16x16, 4398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_src_strd, i4_pred_strd, 4408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl, &u4_intra_mode, &i4_mb_distortion_least, 4418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes); 4428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 4448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_cost_least = i4_mb_distortion_least; 4458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (( (u4_valid_intra_modes >> 3) & 1) != 0 && (ps_codec->s_cfg.u4_enc_speed_preset != IVE_FASTEST || 4478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_slice_type == ISLICE)) 4488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra prediction for PLANE mode*/ 4508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ps_codec->apf_intra_pred_16_l)[PLANE_I16x16](pu1_ngbr_pels_i16, pu1_pred_mb_intra_16x16_plane, 0, i4_pred_strd, i4_ngbr_avbl); 4518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* evaluate distortion between the actual blk and the estimated blk for the given mode */ 4538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->apf_compute_sad_16x16[u4_enable_fast_sad](pu1_curr_mb, pu1_pred_mb_intra_16x16_plane, i4_src_strd, i4_pred_strd, i4_mb_cost_least, &i4_mb_distortion); 4548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 4568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_cost = i4_mb_distortion; 4578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the least cost information if necessary */ 4598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_mb_cost < i4_mb_distortion_least) 4608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_intra_mode = PLANE_I16x16; 4628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_cost_least = i4_mb_cost; 4648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_distortion_least = i4_mb_distortion; 4658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_best_intra_16x16_mode = u4_intra_mode; 4698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S DEBUG("%d partition cost, %d intra mode\n", i4_mb_cost_least * 32, u4_best_intra_16x16_mode); 4718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u1_l_i16_mode = u4_best_intra_16x16_mode; 4738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 4758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_mb_cost_least = i4_mb_distortion_least + u4_lambda*u1_uev_codelength[offset + u4_best_intra_16x16_mode]; 4768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the type of the mb if necessary */ 4798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_mb_cost_least < ps_proc->i4_mb_cost) 4808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_cost = i4_mb_cost_least; 4828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_distortion = i4_mb_distortion_least; 4838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u4_mb_type = I16x16; 4848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ; 4878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 4888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 4918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 4928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 4938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 4948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* evaluate best intra 8x8 mode (rate distortion opt on) 4958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 4968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 4978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates all the possible intra 8x8 modes and finds the mode 4988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* that best represents the macro-block (least distortion) and occupies fewer 4998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits in the bit-stream. 5008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 5018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 5028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to proc ctxt 5038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 5048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks Ideally the cost of encoding a macroblock is calculated as 5058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* (distortion + lambda*rate). Where distortion is SAD/SATD,... between the 5068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* input block and the reconstructed block and rate is the number of bits taken 5078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to place the macroblock in the bit-stream. In this routine the rate does not 5088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* exactly point to the total number of bits it takes, rather it points to header 5098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits 5108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and residual bits fall in to texture bits the number of bits taken to encoding 5118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* mbtype is considered as rate, we compute cost. Further we will approximate 5128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the distortion as the deviation b/w input and the predicted block as opposed 5138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to input and reconstructed block. 5148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 5158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* NOTE: TODO: This function needs to be tested 5168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 5178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 5188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 5198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 5208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 5218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_proc) 5228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 5238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Codec Context */ 5248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S codec_t *ps_codec = ps_proc->ps_codec; 5258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* SAD(distortion metric) of an 4x4 block */ 5278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_distortion, i4_partition_distortion_least = INT_MAX, i4_total_distortion = 0; 5288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* lambda */ 5308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_lambda = ps_proc->u4_lambda; 5318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 5338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_cost, i4_partition_cost_least, i4_total_cost = u4_lambda; 5348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost due to mbtype */ 5368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_cost_one_bit = u4_lambda, u4_cost_four_bits = 4 * u4_lambda; 5378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra mode */ 5398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_intra_mode, u4_best_intra_8x8_mode = DC_I8x8, u4_estimated_intra_8x8_mode; 5408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor pels for intra prediction */ 5428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_i8 = ps_proc->au1_ngbr_pels; 5438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to curr partition */ 5458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_curr; 5468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to prediction macro block */ 5488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb = ps_proc->pu1_pred_mb; 5498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* strides */ 5518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_src_strd = ps_proc->i4_src_strd; 5528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_pred_strd = ps_proc->i4_pred_strd; 5538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbors left, top, top right, top left */ 5558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_a; 5568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_b; 5578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_d; 5588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor availability */ 5608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ngbr_avbl; 5618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S block_neighbors_t s_ngbr_avbl; 5628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* temp vars */ 5648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 b8, u4_pix_x, u4_pix_y; 5658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* ngbr mb syntax information */ 5678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4); 5688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x; 5698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* valid intra modes map */ 5718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes; 5728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(b8 = 0; b8 < 4; b8++) 5748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 5758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_x = (b8 & 0x01) << 3; 5768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_y = (b8 >> 1) << 3; 5778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_curr = ps_proc->pu1_src_buf_luma + u4_pix_x + (u4_pix_y * i4_src_strd); 5798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* when rdopt is off, we use the input as reference for constructing prediction buffer */ 5808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* as opposed to using the recon pels. (open loop intra prediction) */ 5818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_a = pu1_mb_curr - 1; /* pointer to left macro block */ 5828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_b = pu1_mb_curr - i4_src_strd; /* pointer to top macro block */ 5838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_d = pu1_mb_b - 1; /* pointer to top left macro block */ 5848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* locating neighbors that are available for prediction */ 5868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : update the neighbor availability information basing on constrained intra pred information */ 5878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines */ 5888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* basing on neighbors available and hence evade the computation of neighbor availability totally. */ 5898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_a = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x - 1, u4_pix_y); /* xD = -1, yD = 0 */ 5908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_b = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x, u4_pix_y - 1); /* xD = 0, yD = -1 */ 5918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_c = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x + 8, u4_pix_y - 1); /* xD = BLK_8x8_SIZE, yD = -1 */ 5928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_d = ih264e_derive_ngbr_avbl_of_mb_partitions(ps_proc->ps_ngbr_avbl, u4_pix_x - 1, u4_pix_y - 1); /* xD = -1, yD = -1 */ 5938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_c * TOP_RIGHT_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */ 5958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = (s_ngbr_avbl.u1_mb_a) + (s_ngbr_avbl.u1_mb_d << 1) + (s_ngbr_avbl.u1_mb_b << 2) + (s_ngbr_avbl.u1_mb_c << 3) + 5968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (s_ngbr_avbl.u1_mb_a << 4); 5978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* if top partition is available and top right is not available for intra prediction, then */ 5988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* padd top right samples using top sample and make top right also available */ 5998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = (s_ngbr_avbl.u1_mb_a) + (s_ngbr_avbl.u1_mb_d << 1) + (s_ngbr_avbl.u1_mb_b << 2) + ((s_ngbr_avbl.u1_mb_b | s_ngbr_avbl.u1_mb_c) << 3); */ 6008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->ai4_neighbor_avail_8x8_subblks[b8] = i4_ngbr_avbl; 6018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_intra_pred_luma_8x8_mode_ref_filtering(pu1_mb_a, pu1_mb_b, pu1_mb_d, pu1_ngbr_pels_i8, 6048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_src_strd, i4_ngbr_avbl); 6058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_cost_least = INT_MAX; 6078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* set valid intra modes for evaluation */ 6088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes = 0x1ff; 6098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_b) 6118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << VERT_I4x4); 6138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << DIAG_DL_I4x4); 6148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << VERT_L_I4x4); 6158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_a) 6178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << HORZ_I4x4); 6198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << HORZ_U_I4x4); 6208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_a || !s_ngbr_avbl.u1_mb_b || !s_ngbr_avbl.u1_mb_d) 6228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << DIAG_DR_I4x4); 6248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << VERT_R_I4x4); 6258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << HORZ_D_I4x4); 6268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* estimate the intra 8x8 mode for the current partition (for evaluating cost) */ 6298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_a || !s_ngbr_avbl.u1_mb_b) 6308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_8x8_mode = DC_I8x8; 6328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 6348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_left_intra_8x8_mode = DC_I8x8; 6368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_top_intra_8x8_mode = DC_I8x8; 6378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_x == 0) 6398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I8x8) 6418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_8x8_mode = ps_proc->au1_left_mb_intra_modes[b8+1]; 6438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I4x4) 6458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_8x8_mode = ps_proc->au1_left_mb_intra_modes[(b8+1)*4+2]; 6478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 6508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_8x8_mode = ps_proc->au1_intra_luma_mb_8x8_modes[b8-1]; 6528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_y == 0) 6558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_top_mb_syn_ele->u2_mb_type == I8x8) 6578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_8x8_mode = pu1_top_mb_intra_modes[b8+2]; 6598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_top_mb_syn_ele->u2_mb_type == I4x4) 6618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_8x8_mode = pu1_top_mb_intra_modes[(b8+2)*4+2]; 6638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 6668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_8x8_mode = ps_proc->au1_intra_luma_mb_8x8_modes[b8-2]; 6688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_8x8_mode = MIN(u4_left_intra_8x8_mode, u4_top_intra_8x8_mode); 6718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* perform intra mode 8x8 evaluation */ 6748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (u4_intra_mode = VERT_I8x8; u4_valid_intra_modes != 0; u4_intra_mode++, u4_valid_intra_modes >>= 1) 6758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ( (u4_valid_intra_modes & 1) == 0) 6778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S continue; 6788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra prediction */ 6808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ps_codec->apf_intra_pred_8_l)[u4_intra_mode](pu1_ngbr_pels_i8, pu1_pred_mb, 0, i4_pred_strd, i4_ngbr_avbl); 6818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* evaluate distortion between the actual blk and the estimated blk for the given mode */ 6838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ime_compute_sad_8x8(pu1_mb_curr, pu1_pred_mb, i4_src_strd, i4_pred_strd, i4_partition_cost_least, &i4_partition_distortion); 6848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_cost = i4_partition_distortion + ((u4_estimated_intra_8x8_mode == u4_intra_mode)?u4_cost_one_bit:u4_cost_four_bits); 6868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the least cost information if necessary */ 6888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_partition_cost < i4_partition_cost_least) 6898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_cost_least = i4_partition_cost; 6918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_distortion_least = i4_partition_distortion; 6928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_best_intra_8x8_mode = u4_intra_mode; 6938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* macroblock distortion */ 6968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_cost += i4_partition_cost_least; 6978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_distortion += i4_partition_distortion_least; 6988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* mb partition mode */ 6998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->au1_intra_luma_mb_8x8_modes[b8] = u4_best_intra_8x8_mode; 7008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the type of the mb if necessary */ 7048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_total_cost < ps_proc->i4_mb_cost) 7058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_cost = i4_total_cost; 7078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_distortion = i4_total_distortion; 7088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u4_mb_type = I8x8; 7098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ; 7128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 7138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 7168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 7178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 7198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* evaluate best intra 4x4 mode (rate distortion opt off) 7208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 7228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates all the possible intra 4x4 modes and finds the mode 7238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* that best represents the macro-block (least distortion) and occupies fewer 7248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits in the bit-stream. 7258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 7278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to proc ctxt 7288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks 7308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Ideally the cost of encoding a macroblock is calculated as 7318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* (distortion + lambda*rate). Where distortion is SAD/SATD,... between the 7328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* input block and the reconstructed block and rate is the number of bits taken 7338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to place the macroblock in the bit-stream. In this routine the rate does not 7348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* exactly point to the total number of bits it takes, rather it points to header 7358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits 7368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and residual bits fall in to texture bits the number of bits taken to encoding 7378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* mbtype is considered as rate, we compute cost. Further we will approximate 7388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the distortion as the deviation b/w input and the predicted block as opposed 7398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to input and reconstructed block. 7408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* NOTE: As per the Document JVT-O079, for the whole intra 4x4 macroblock, 7428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 24*lambda is added to the SAD before comparison with the best SAD for 7438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* inter prediction. This is an empirical value to prevent using too many intra 7448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* blocks. 7458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 7478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 7488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 7498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 7508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra4x4_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_proc) 7518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 7528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Codec Context */ 7538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S codec_t *ps_codec = ps_proc->ps_codec; 7548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* SAD(distortion metric) of an 4x4 block */ 7568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_distortion_least = INT_MAX, i4_total_distortion = 0; 7578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* lambda */ 7598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_lambda = ps_proc->u4_lambda; 7608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 7628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_cost_least, i4_total_cost = (24 + 1) * u4_lambda; 7638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost due to mbtype */ 7658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_cost_one_bit = u4_lambda, u4_cost_four_bits = 4 * u4_lambda; 7668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra mode */ 7688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_best_intra_4x4_mode = DC_I4x4, u4_estimated_intra_4x4_mode; 7698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor pels for intra prediction */ 7718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_i4 = ps_proc->au1_ngbr_pels; 7728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to curr partition */ 7748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_curr; 7758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to prediction macro block */ 7778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb = ps_proc->pu1_pred_mb; 7788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* strides */ 7808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_src_strd = ps_proc->i4_src_strd; 7818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_pred_strd = ps_proc->i4_pred_strd; 7828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbors left, top, top right, top left */ 7848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_a; 7858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_b; 7868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_c; 7878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_d; 7888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor availability */ 7908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ngbr_avbl; 7918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S block_neighbors_t s_ngbr_avbl; 7928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* temp vars */ 7948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 i, b8, b4, u4_blk_x, u4_blk_y, u4_pix_x, u4_pix_y; 7958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* scan order inside 4x4 block */ 7978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S const UWORD8 u1_scan_order[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15}; 7988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* ngbr sub mb modes */ 8008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4); 8018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x; 8028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* valid intra modes map */ 8048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes; 8058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_valid_modes[8] = {4, 262, 4, 262, 141, 399, 141, 511}; 8068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_c << 3); 8088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(ps_proc->au1_ngbr_avbl_4x4_subblks, gau1_ih264_4x4_ngbr_avbl[i4_ngbr_avbl], 16); 8098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (b8 = 0; b8 < 4; b8++) 8118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_blk_x = (b8 & 0x01) << 3; 8138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_blk_y = (b8 >> 1) << 3; 8148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (b4 = 0; b4 < 4; b4++) 8158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_x = u4_blk_x + ((b4 & 0x01) << 2); 8178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_y = u4_blk_y + ((b4 >> 1) << 2); 8188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_curr = ps_proc->pu1_src_buf_luma + u4_pix_x + (u4_pix_y * i4_src_strd); 8208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* when rdopt is off, we use the input as reference for constructing prediction buffer */ 8218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* as opposed to using the recon pels. (open loop intra prediction) */ 8228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_a = pu1_mb_curr - 1; /* pointer to left macro block */ 8238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_b = pu1_mb_curr - i4_src_strd; /* pointer to top macro block */ 8248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_c = pu1_mb_b + 4; /* pointer to top macro block */ 8258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_d = pu1_mb_b - 1; /* pointer to top left macro block */ 8268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* locating neighbors that are available for prediction */ 8288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : update the neighbor availability information basing on constrained intra pred information */ 8298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines */ 8308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* basing on neighbors available and hence evade the computation of neighbor availability totally. */ 8318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = ps_proc->au1_ngbr_avbl_4x4_subblks[(b8 << 2) + b4]; 8338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_a = (i4_ngbr_avbl & 0x1); 8348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_d = (i4_ngbr_avbl & 0x2) >> 1; 8358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_b = (i4_ngbr_avbl & 0x4) >> 2; 8368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_c = (i4_ngbr_avbl & 0x8) >> 3; 8378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* set valid intra modes for evaluation */ 8388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes = u2_valid_modes[i4_ngbr_avbl & 0x7]; 8398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* if top partition is available and top right is not available for intra prediction, then */ 8418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* padd top right samples using top sample and make top right also available */ 8428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = (s_ngbr_avbl.u1_mb_a) + (s_ngbr_avbl.u1_mb_d << 1) + (s_ngbr_avbl.u1_mb_b << 2) + ((s_ngbr_avbl.u1_mb_b | s_ngbr_avbl.u1_mb_c) << 3); */ 8438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* gather prediction pels from the neighbors */ 8458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_a) 8468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < 4; i++) 8488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4 - 1 -i] = pu1_mb_a[i * i4_src_strd]; 8498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 8518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4, 0, 4); 8538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_b) 8568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_ngbr_pels_i4 + 4 + 1, pu1_mb_b, 4); 8588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 8608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4 + 5, 0, 4); 8628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_d) 8658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4] = *pu1_mb_d; 8668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 8678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4] = 0; 8688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_c) 8708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_ngbr_pels_i4 + 8 + 1, pu1_mb_c, 4); 8728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (s_ngbr_avbl.u1_mb_b) 8748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4 + 8 + 1, pu1_ngbr_pels_i4[8], 4); 8768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_c = s_ngbr_avbl.u1_mb_b; 8778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_cost_least = INT_MAX; 8808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* predict the intra 4x4 mode for the current partition (for evaluating cost) */ 8828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_a || !s_ngbr_avbl.u1_mb_b) 8838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode = DC_I4x4; 8858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 8878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_left_intra_4x4_mode = DC_I4x4; 8898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_top_intra_4x4_mode = DC_I4x4; 8908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_x == 0) 8928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I4x4) 8948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_left_mb_intra_modes[u1_scan_order[3 + u4_pix_y]]; 8968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I8x8) 8988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_left_mb_intra_modes[b8 + 1]; 9008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 9038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_intra_luma_mb_4x4_modes[u1_scan_order[(u4_pix_x >> 2) + u4_pix_y - 1]]; 9058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_y == 0) 9088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_top_mb_syn_ele->u2_mb_type == I4x4) 9108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = pu1_top_mb_intra_modes[u1_scan_order[12 + (u4_pix_x >> 2)]]; 9128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_top_mb_syn_ele->u2_mb_type == I8x8) 9148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = pu1_top_mb_intra_modes[b8 + 2]; 9168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 9198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = ps_proc->au1_intra_luma_mb_4x4_modes[u1_scan_order[(u4_pix_x >> 2) + u4_pix_y - 4]]; 9218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode = MIN(u4_left_intra_4x4_mode, u4_top_intra_4x4_mode); 9248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->au1_predicted_intra_luma_mb_4x4_modes[(b8 << 2) + b4] = u4_estimated_intra_4x4_mode; 9278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* mode evaluation and prediction */ 9298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_ih264e_evaluate_intra_4x4_modes(pu1_mb_curr, 9308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4, 9318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_mb, i4_src_strd, 9328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_pred_strd, i4_ngbr_avbl, 9338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &u4_best_intra_4x4_mode, 9348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &i4_partition_cost_least, 9358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes, 9368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda, 9378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode); 9388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_distortion_least = i4_partition_cost_least - ((u4_estimated_intra_4x4_mode == u4_best_intra_4x4_mode) ? u4_cost_one_bit : u4_cost_four_bits); 9418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S DEBUG("%d partition cost, %d intra mode\n", i4_partition_cost_least, u4_best_intra_4x4_mode); 9438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* macroblock distortion */ 9448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_distortion += i4_partition_distortion_least; 9458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_cost += i4_partition_cost_least; 9468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* mb partition mode */ 9478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->au1_intra_luma_mb_4x4_modes[(b8 << 2) + b4] = u4_best_intra_4x4_mode; 9488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the type of the mb if necessary */ 9528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_total_cost < ps_proc->i4_mb_cost) 9538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_cost = i4_total_cost; 9558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_distortion = i4_total_distortion; 9568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u4_mb_type = I4x4; 9578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ; 9608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 9618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 9638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 9648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief evaluate best intra 4x4 mode (rate distortion opt on) 9668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 9688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates all the possible intra 4x4 modes and finds the mode 9698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* that best represents the macro-block (least distortion) and occupies fewer 9708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits in the bit-stream. 9718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 9738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to proc ctxt 9748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks 9768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Ideally the cost of encoding a macroblock is calculated as 9778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* (distortion + lambda*rate). Where distortion is SAD/SATD,... between the 9788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* input block and the reconstructed block and rate is the number of bits taken 9798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to place the macroblock in the bit-stream. In this routine the rate does not 9808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* exactly point to the total number of bits it takes, rather it points to header 9818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* bits necessary for encoding the macroblock. Assuming the deltaQP, cbp bits 9828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and residual bits fall in to texture bits the number of bits taken to encoding 9838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* mbtype is considered as rate, we compute cost. Further we will approximate 9848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the distortion as the deviation b/w input and the predicted block as opposed 9858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* to input and reconstructed block. 9868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* NOTE: As per the Document JVT-O079, for the whole intra 4x4 macroblock, 9888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 24*lambda is added to the SAD before comparison with the best SAD for 9898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* inter prediction. This is an empirical value to prevent using too many intra 9908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* blocks. 9918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 9938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 9948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 9958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 9968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra4x4_modes_for_least_cost_rdopton(process_ctxt_t *ps_proc) 9978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 9988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Codec Context */ 9998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S codec_t *ps_codec = ps_proc->ps_codec; 10008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* SAD(distortion metric) of an 4x4 block */ 10028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_distortion_least = INT_MAX, i4_total_distortion = 0; 10038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* lambda */ 10058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_lambda = ps_proc->u4_lambda; 10068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost = distortion + lambda*rate */ 10088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_partition_cost_least, i4_total_cost = (24 + 1) * u4_lambda; 10098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* cost due to mbtype */ 10118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_cost_one_bit = u4_lambda, u4_cost_four_bits = 4 * u4_lambda; 10128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra mode */ 10148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_best_intra_4x4_mode = DC_I4x4, u4_estimated_intra_4x4_mode; 10158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor pels for intra prediction */ 10178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_i4 = ps_proc->au1_ngbr_pels; 10188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to curr partition */ 10208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_curr; 10218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_ref_left, *pu1_mb_ref_top; 10228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ref_mb_intra_4x4; 10238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to residual macro block */ 10258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD16 *pi2_res_mb = ps_proc->pi2_res_buf_intra_4x4; 10268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to prediction macro block */ 10288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb = ps_proc->pu1_pred_mb; 10298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* strides */ 10318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_src_strd = ps_proc->i4_src_strd; 10328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_pred_strd = ps_proc->i4_pred_strd; 10338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ref_strd_left, i4_ref_strd_top; 10348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbors left, top, top right, top left */ 10368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_a; 10378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_b; 10388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_c; 10398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_d; 10408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* number of non zero coeffs*/ 10428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_nnz = (UWORD8 *)ps_proc->au4_nnz_intra_4x4; 10438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* quantization parameters */ 10458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S quant_params_t *ps_qp_params = ps_proc->ps_qp_params[0]; 10468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor availability */ 10488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ngbr_avbl; 10498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S block_neighbors_t s_ngbr_avbl; 10508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* temp vars */ 10528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 i, b8, b4, u4_blk_x, u4_blk_y, u4_pix_x, u4_pix_y; 10538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* scan order inside 4x4 block */ 10558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S const UWORD8 u1_scan_order[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15}; 10568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* ngbr sub mb modes */ 10588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_top_mb_intra_modes = ps_proc->pu1_top_mb_intra_modes + (ps_proc->i4_mb_x << 4); 10598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S mb_info_t *ps_top_mb_syn_ele = ps_proc->ps_top_row_mb_syntax_ele + ps_proc->i4_mb_x; 10608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* valid intra modes map */ 10628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes; 10638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_valid_modes[8] = {4, 262, 4, 262, 141, 399, 141, 511}; 10648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Dummy variable for 4x4 trans function */ 10668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD16 i2_dc_dummy; 10678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* compute ngbr availability for sub blks */ 10698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_c << 3); 10708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(ps_proc->au1_ngbr_avbl_4x4_subblks, gau1_ih264_4x4_ngbr_avbl[i4_ngbr_avbl], 16); 10718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(b8 = 0; b8 < 4; b8++) 10738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_blk_x = (b8 & 0x01) << 3; 10758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_blk_y = (b8 >> 1) << 3; 10768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(b4 = 0; b4 < 4; b4++, pu1_nnz++, pi2_res_mb += MB_SIZE) 10778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_x = u4_blk_x + ((b4 & 0x01) << 2); 10798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_pix_y = u4_blk_y + ((b4 >> 1) << 2); 10808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ref_mb_intra_4x4 = ps_proc->pu1_ref_mb_intra_4x4 + u4_pix_x + (u4_pix_y * i4_pred_strd); 10828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_curr = ps_proc->pu1_src_buf_luma + u4_pix_x + (u4_pix_y * i4_src_strd); 10838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_x == 0) 10848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ref_strd_left = ps_proc->i4_rec_strd; 10868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_ref_left = ps_proc->pu1_rec_buf_luma + u4_pix_x + (u4_pix_y * i4_ref_strd_left); 10878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 10898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ref_strd_left = i4_pred_strd; 10918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_ref_left = pu1_ref_mb_intra_4x4; 10928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_y == 0) 10948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ref_strd_top = ps_proc->i4_rec_strd; 10968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_ref_top = ps_proc->pu1_rec_buf_luma + u4_pix_x + (u4_pix_y * i4_ref_strd_top); 10978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 10998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ref_strd_top = i4_pred_strd; 11018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_ref_top = pu1_ref_mb_intra_4x4; 11028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_a = pu1_mb_ref_left - 1; /* pointer to left macro block */ 11058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_b = pu1_mb_ref_top - i4_ref_strd_top; /* pointer to top macro block */ 11068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_c = pu1_mb_b + 4; /* pointer to top right macro block */ 11078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_y == 0) 11088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_d = pu1_mb_b - 1; 11098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_mb_d = pu1_mb_a - i4_ref_strd_left; /* pointer to top left macro block */ 11118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* locating neighbors that are available for prediction */ 11138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : update the neighbor availability information basing on constrained intra pred information */ 11148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines */ 11158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* basing on neighbors available and hence evade the computation of neighbor availability totally. */ 11168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = ps_proc->au1_ngbr_avbl_4x4_subblks[(b8 << 2) + b4]; 11188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_a = (i4_ngbr_avbl & 0x1); 11198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_d = (i4_ngbr_avbl & 0x2) >> 1; 11208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_b = (i4_ngbr_avbl & 0x4) >> 2; 11218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_c = (i4_ngbr_avbl & 0x8) >> 3; 11228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* set valid intra modes for evaluation */ 11238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes = u2_valid_modes[i4_ngbr_avbl & 0x7]; 11248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* if top partition is available and top right is not available for intra prediction, then */ 11268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* padd top right samples using top sample and make top right also available */ 11278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = (s_ngbr_avbl.u1_mb_a) + (s_ngbr_avbl.u1_mb_d << 1) + (s_ngbr_avbl.u1_mb_b << 2) + ((s_ngbr_avbl.u1_mb_b | s_ngbr_avbl.u1_mb_c) << 3); */ 11288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* gather prediction pels from the neighbors */ 11308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_a) 11318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < 4; i++) 11338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4 - 1 -i] = pu1_mb_a[i * i4_ref_strd_left]; 11348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4,0,4); 11388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(s_ngbr_avbl.u1_mb_b) 11408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_ngbr_pels_i4 + 4 + 1, pu1_mb_b, 4); 11428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4 + 4 + 1, 0, 4); 11468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_d) 11488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4] = *pu1_mb_d; 11498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4[4] = 0; 11518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (s_ngbr_avbl.u1_mb_c) 11528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_ngbr_pels_i4 + 8 + 1, pu1_mb_c, 4); 11548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (s_ngbr_avbl.u1_mb_b) 11568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_ngbr_pels_i4 + 8 + 1, pu1_ngbr_pels_i4[8], 4); 11588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_ngbr_avbl.u1_mb_c = s_ngbr_avbl.u1_mb_b; 11598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_cost_least = INT_MAX; 11628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* predict the intra 4x4 mode for the current partition (for evaluating cost) */ 11648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!s_ngbr_avbl.u1_mb_a || !s_ngbr_avbl.u1_mb_b) 11658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode = DC_I4x4; 11678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_left_intra_4x4_mode = DC_I4x4; 11718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_top_intra_4x4_mode = DC_I4x4; 11728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_x == 0) 11748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I4x4) 11768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_left_mb_intra_modes[u1_scan_order[3 + u4_pix_y]]; 11788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_proc->s_left_mb_syntax_ele.u2_mb_type == I8x8) 11808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_left_mb_intra_modes[b8 + 1]; 11828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_left_intra_4x4_mode = ps_proc->au1_intra_luma_mb_4x4_modes[u1_scan_order[(u4_pix_x >> 2) + u4_pix_y - 1]]; 11878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_pix_y == 0) 11908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_top_mb_syn_ele->u2_mb_type == I4x4) 11928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = pu1_top_mb_intra_modes[u1_scan_order[12 + (u4_pix_x >> 2)]]; 11948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (ps_top_mb_syn_ele->u2_mb_type == I8x8) 11968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = pu1_top_mb_intra_modes[b8 + 2]; 11988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 12018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_top_intra_4x4_mode = ps_proc->au1_intra_luma_mb_4x4_modes[u1_scan_order[(u4_pix_x >> 2) + u4_pix_y - 4]]; 12038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode = MIN(u4_left_intra_4x4_mode, u4_top_intra_4x4_mode); 12068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->au1_predicted_intra_luma_mb_4x4_modes[(b8 << 2) + b4] = u4_estimated_intra_4x4_mode; 12098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*mode evaluation and prediction*/ 12118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_ih264e_evaluate_intra_4x4_modes(pu1_mb_curr, 12128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_i4, 12138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_mb, i4_src_strd, 12148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_pred_strd, i4_ngbr_avbl, 12158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &u4_best_intra_4x4_mode, 12168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &i4_partition_cost_least, 12178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes, 12188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda, 12198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_estimated_intra_4x4_mode); 12208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_partition_distortion_least = i4_partition_cost_least - ((u4_estimated_intra_4x4_mode == u4_best_intra_4x4_mode)?u4_cost_one_bit:u4_cost_four_bits); 12238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S DEBUG("%d partition cost, %d intra mode\n", i4_partition_cost_least, u4_best_intra_4x4_mode); 12258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* macroblock distortion */ 12278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_distortion += i4_partition_distortion_least; 12288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_total_cost += i4_partition_cost_least; 12298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* mb partition mode */ 12318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->au1_intra_luma_mb_4x4_modes[(b8 << 2) + b4] = u4_best_intra_4x4_mode; 12328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************/ 12358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* error estimation, */ 12368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* transform */ 12378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* quantization */ 12388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************/ 12398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_resi_trans_quant_4x4(pu1_mb_curr, pu1_pred_mb, 12408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pi2_res_mb, i4_src_strd, 12418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_pred_strd, 12428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* No op stride, this implies a buff of lenght 1x16 */ 12438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->pu2_scale_mat, 12448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->pu2_thres_mat, 12458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->u1_qbits, 12468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->u4_dead_zone, 12478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_nnz, &i2_dc_dummy); 12488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************/ 12508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* ierror estimation, */ 12518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* itransform */ 12528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* iquantization */ 12538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************/ 12548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_iquant_itrans_recon_4x4(pi2_res_mb, pu1_pred_mb, 12558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ref_mb_intra_4x4, 12568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_pred_strd, i4_pred_strd, 12578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->pu2_iscale_mat, 12588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->pu2_weigh_mat, 12598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_qp_params->u1_qp_div, 12608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->pv_scratch_buff, 0, 12618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S NULL); 12628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the type of the mb if necessary */ 12668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_total_cost < ps_proc->i4_mb_cost) 12678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_cost = i4_total_cost; 12698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_mb_distortion = i4_total_distortion; 12708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u4_mb_type = I4x4; 12718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ; 12748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 12758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 12778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 12788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 12808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* evaluate best chroma intra 8x8 mode (rate distortion opt off) 12818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 12838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates all the possible chroma intra 8x8 modes and finds 12848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* the mode that best represents the macroblock (least distortion) and occupies 12858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* fewer bits in the bitstream. 12868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] ps_proc_ctxt 12888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* pointer to macroblock context (handle) 12898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks 12918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* For chroma best intra pred mode is calculated based only on SAD 12928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns none 12948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 12958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 12968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 12978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_chroma_intra8x8_modes_for_least_cost_rdoptoff(process_ctxt_t *ps_proc) 12998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 13008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Codec Context */ 13018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S codec_t *ps_codec = ps_proc->ps_codec; 13028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* SAD(distortion metric) of an 8x8 block */ 13048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_mb_distortion, i4_chroma_mb_distortion; 13058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra mode */ 13078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_best_chroma_intra_8x8_mode = DC_CH_I8x8; 13088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor pels for intra prediction */ 13108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_c_i8x8 = ps_proc->au1_ngbr_pels; 13118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to curr macro block */ 13138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_curr_mb = ps_proc->pu1_src_buf_chroma; 13148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ref_mb = ps_proc->pu1_rec_buf_chroma; 13158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* pointer to prediction macro block */ 13178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb = ps_proc->pu1_pred_mb_intra_chroma; 13188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_mb_plane = ps_proc->pu1_pred_mb_intra_chroma_plane; 13198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* strides */ 13219113f5615cb4b2be179b288a59324de723d2ec9aMartin Storsjo WORD32 i4_src_strd_c = ps_proc->i4_src_chroma_strd; 13228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_pred_strd = ps_proc->i4_pred_strd; 13238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_rec_strd_c = ps_proc->i4_rec_strd; 13248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbors left, top, top left */ 13268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_a = pu1_ref_mb - 2; 13278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_b = pu1_ref_mb - i4_rec_strd_c; 13288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_mb_d = pu1_mb_b - 2; 13298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* neighbor availability */ 13318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S const UWORD8 u1_valid_intra_modes[8] = {1, 3, 9, 11, 5, 7, 13, 15,}; 13328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_ngbr_avbl; 13338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* valid intra modes map */ 13358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes; 13368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* temp var */ 13388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 i; 13398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* locating neighbors that are available for prediction */ 13418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : update the neighbor availability information basing on constrained intra pred information */ 13428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* TODO : i4_ngbr_avbl is only being used in DC mode. Can the DC mode be split in to distinct routines 13438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * basing on neighbors available and hence evade the computation of neighbor availability totally. */ 13448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* i4_ngbr_avbl = blk_a * LEFT_MB_AVAILABLE_MASK + blk_b * TOP_MB_AVAILABLE_MASK + blk_d * TOP_LEFT_MB_AVAILABLE_MASK */ 13458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl = (ps_proc->ps_ngbr_avbl->u1_mb_a) + (ps_proc->ps_ngbr_avbl->u1_mb_b << 2) + (ps_proc->ps_ngbr_avbl->u1_mb_d << 1); 13468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->i4_chroma_neighbor_avail_8x8_mb = i4_ngbr_avbl; 13478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* gather prediction pels from the neighbors */ 13498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* left pels */ 13508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_a) 13518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 16; i += 2) 13538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_c_i8x8[16 - 2 - i] = pu1_mb_a[(i / 2) * i4_rec_strd_c]; 13558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_c_i8x8[16 - 1 - i] = pu1_mb_a[(i / 2) * i4_rec_strd_c + 1]; 13568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 13598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_set_mul8(pu1_ngbr_pels_c_i8x8, 0, MB_SIZE); 13618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top pels */ 13648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_b) 13658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_cpy_mul8(&pu1_ngbr_pels_c_i8x8[18], pu1_mb_b, 16); 13678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 13698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_mem_set_mul8((pu1_ngbr_pels_c_i8x8 + 18), 0, MB_SIZE); 13718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top left pels */ 13748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_proc->ps_ngbr_avbl->u1_mb_d) 13758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 13768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_c_i8x8[16] = *pu1_mb_d; 13778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_c_i8x8[17] = *(pu1_mb_d + 1); 13788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 13798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes = u1_valid_intra_modes[i4_ngbr_avbl]; 13818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (ps_codec->s_cfg.u4_enc_speed_preset == IVE_FAST) 13838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes &= ~(1 << PLANE_CH_I8x8); 13848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_chroma_mb_distortion = INT_MAX; 13868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* perform intra mode chroma 8x8 evaluation */ 13888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* intra prediction */ 13898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_ih264e_evaluate_intra_chroma_modes(pu1_curr_mb, 13908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_ngbr_pels_c_i8x8, 13918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_mb, 13928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_src_strd_c, 13938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_pred_strd, 13948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_ngbr_avbl, 13958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &u4_best_chroma_intra_8x8_mode, 13968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &i4_chroma_mb_distortion, 13978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_valid_intra_modes); 13988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 13998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 8)/* if Chroma PLANE is valid*/ 14008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ps_codec->apf_intra_pred_c)[PLANE_CH_I8x8](pu1_ngbr_pels_c_i8x8, pu1_pred_mb_plane, 0, i4_pred_strd, i4_ngbr_avbl); 14028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* evaluate distortion(sad) */ 14048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_codec->pf_compute_sad_16x8(pu1_curr_mb, pu1_pred_mb_plane, i4_src_strd_c, i4_pred_strd, i4_chroma_mb_distortion, &i4_mb_distortion); 14058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* update the least distortion information if necessary */ 14078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_mb_distortion < i4_chroma_mb_distortion) 14088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_chroma_mb_distortion = i4_mb_distortion; 14108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_best_chroma_intra_8x8_mode = PLANE_CH_I8x8; 14118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S DEBUG("%d partition cost, %d intra mode\n", i4_chroma_mb_distortion, u4_best_chroma_intra_8x8_mode); 14158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_proc->u1_c_i8_mode = u4_best_chroma_intra_8x8_mode; 14178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ; 14198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 14208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 14238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 14248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 14268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Evaluate best intra 16x16 mode (among VERT, HORZ and DC) and do the 14278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* prediction. 14288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 14308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates first three 16x16 modes and compute corresponding sad 14318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and return the buffer predicted with best mode. 14328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_src 14348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the source 14358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_ngbr_pels_i16 14378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to neighbouring pels 14388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] pu1_dst 14408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the destination 14418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] src_strd 14438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer source stride 14448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] dst_strd 14468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer destination stride 14478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_n_avblty 14498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* availability of neighbouring pixels 14508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_intra_mode 14528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which best mode is returned 14538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu4_sadmin 14558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which minimum sad is returned 14568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_valid_intra_modes 14588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Says what all modes are valid 14598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns none 14618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 14628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 14638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 14648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra16x16_modes(UWORD8 *pu1_src, 14658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels_i16, 14668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_dst, 14678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 src_strd, 14688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 dst_strd, 14698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_n_avblty, 14708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *u4_intra_mode, 14718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 *pu4_sadmin, 14728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes) 14738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 14748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_neighbour; 14758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_src_temp = pu1_src; 14768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 left = 0, top = 0; 14778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_dcval = 0; 14788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i, j; 14798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_sad_vert = INT_MAX, i4_sad_horz = INT_MAX, i4_sad_dc = INT_MAX, 14808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_min_sad = INT_MAX; 14818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 val; 14828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S left = (u4_n_avblty & LEFT_MB_AVAILABLE_MASK); 14848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S top = (u4_n_avblty & TOP_MB_AVAILABLE_MASK) >> 2; 14858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* left available */ 14878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (left) 14888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz = 0; 14908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 16; i++) 14928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val = pu1_ngbr_pels_i16[15 - i]; 14948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += val; 14968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 14988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz += ABS(val - pu1_src_temp[j]); 15008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 15038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += 8; 15058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 15088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* top available */ 15098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (top) 15108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert = 0; 15128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 16; i++) 15148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += pu1_ngbr_pels_i16[17 + i]; 15168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 15188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert += ABS(pu1_ngbr_pels_i16[17 + j] - pu1_src_temp[j]); 15208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 15228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += 8; 15258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval = (u4_dcval) >> (3 + left + top); 15288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 15308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* none available */ 15328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += (left == 0) * (top == 0) * 128; 15338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc = 0; 15358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 16; i++) 15378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 15398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc += ABS(u4_dcval - pu1_src_temp[j]); 15418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 15438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 04) == 0)/* If DC is disabled */ 15468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc = INT_MAX; 15478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 01) == 0)/* If VERT is disabled */ 15498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert = INT_MAX; 15508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 02) == 0)/* If HORZ is disabled */ 15528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz = INT_MAX; 15538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_min_sad = MIN3(i4_sad_horz, i4_sad_dc, i4_sad_vert); 15558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Finding Minimum sad and doing corresponding prediction */ 15578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_min_sad < *pu4_sadmin) 15588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *pu4_sadmin = i4_min_sad; 15608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_min_sad == i4_sad_vert) 15618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = VERT_I16x16; 15638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_neighbour = pu1_ngbr_pels_i16 + 17; 15648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 15658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, pu1_neighbour, MB_SIZE); 15678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 15688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_sad == i4_sad_horz) 15718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = HORZ_I16x16; 15738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 15748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val = pu1_ngbr_pels_i16[15 - j]; 15768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, val, MB_SIZE); 15778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 15788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 15818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = DC_I16x16; 15838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 15848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, u4_dcval, MB_SIZE); 15868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 15878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return; 15918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 15928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 15948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 15958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 15968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief 15978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Evaluate best intra 4x4 mode and perform prediction. 15988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 15998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 16008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates 4x4 modes and compute corresponding sad 16018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and return the buffer predicted with best mode. 16028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_src 16048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the source 16058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_ngbr_pels 16078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to neighbouring pels 16088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] pu1_dst 16108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the destination 16118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] src_strd 16138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer source stride 16148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] dst_strd 16168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer destination stride 16178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_n_avblty 16198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* availability of neighbouring pixels 16208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_intra_mode 16228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which best mode is returned 16238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu4_sadmin 16258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which minimum cost is returned 16268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_valid_intra_modes 16288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Says what all modes are valid 16298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_lambda 16318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Lamda value for computing cost from SAD 16328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_predictd_mode 16348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Predicted mode for cost computation 16358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @returns none 16378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 16388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 16398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 16408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra_4x4_modes(UWORD8 *pu1_src, 16418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels, 16428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_dst, 16438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 src_strd, 16448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 dst_strd, 16458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_n_avblty, 16468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *u4_intra_mode, 16478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 *pu4_sadmin, 16488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes, 16498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_lambda, 16508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_predictd_mode) 16518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 16528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_src_temp = pu1_src; 16538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred = pu1_ngbr_pels; 16548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 left = 0, top = 0; 16558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_val = 0; 16568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals[4] = {0}; 16578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_pred_val = NULL; 16588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* To store FILT121 operated values*/ 16598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals_diag_121[15] = {0}; 16608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* To store FILT11 operated values*/ 16618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals_diag_11[15] = {0}; 16628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals_vert_r[8] = {0}; 16638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals_horz_d[10] = {0}; 16648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_pred_vals_horz_u[10] = {0}; 16658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_dcval = 0; 16668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_sad[MAX_I4x4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX, 16678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S INT_MAX, INT_MAX, INT_MAX, INT_MAX}; 16688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_cost[MAX_I4x4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX, 16708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S INT_MAX, INT_MAX, INT_MAX, INT_MAX}; 16718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i, i4_min_cost = INT_MAX; 16728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S left = (u4_n_avblty & LEFT_MB_AVAILABLE_MASK); 16748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S top = (u4_n_avblty & TOP_MB_AVAILABLE_MASK) >> 2; 16758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Computing SAD */ 16778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* VERT mode valid */ 16798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 1) 16808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred = pu1_ngbr_pels + 5; 16828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[VERT_I4x4] = 0; 16838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[VERT_I4x4] = 0; 16848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred, i4_sad[VERT_I4x4]); 16868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 16878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred, i4_sad[VERT_I4x4]); 16888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 16898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred, i4_sad[VERT_I4x4]); 16908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 16918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred, i4_sad[VERT_I4x4]); 16928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[VERT_I4x4] = i4_sad[VERT_I4x4] + ((u4_predictd_mode == VERT_I4x4) ? 16948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 16958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* HORZ mode valid */ 16988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 2) 16998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_I4x4] = 0; 17018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[HORZ_I4x4] =0; 17028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 17038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_val = pu1_ngbr_pels[3]; 17058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_I4x4] += ABS(pu1_src_temp[0] - u1_pred_val) 17078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[1] - u1_pred_val) 17088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[2] - u1_pred_val) 17098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[3] - u1_pred_val); 17108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_val = pu1_ngbr_pels[2]; 17138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_I4x4] += ABS(pu1_src_temp[0] - u1_pred_val) 17158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[1] - u1_pred_val) 17168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[2] - u1_pred_val) 17178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[3] - u1_pred_val); 17188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_val = pu1_ngbr_pels[1]; 17218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_I4x4] += ABS(pu1_src_temp[0] - u1_pred_val) 17238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[1] - u1_pred_val) 17248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[2] - u1_pred_val) 17258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[3] - u1_pred_val); 17268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_val = pu1_ngbr_pels[0]; 17298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_I4x4] += ABS(pu1_src_temp[0] - u1_pred_val) 17318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[1] - u1_pred_val) 17328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[2] - u1_pred_val) 17338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ABS(pu1_src_temp[3] - u1_pred_val); 17348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[HORZ_I4x4] = i4_sad[HORZ_I4x4] + ((u4_predictd_mode == HORZ_I4x4) ? 17368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 17378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* DC mode valid */ 17408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 4) 17418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[DC_I4x4] = 0; 17438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DC_I4x4] = 0; 17448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 17458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (left) 17478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval = pu1_ngbr_pels[0] + pu1_ngbr_pels[1] + pu1_ngbr_pels[2] 17488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + pu1_ngbr_pels[3] + 2; 17498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (top) 17508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval += pu1_ngbr_pels[5] + pu1_ngbr_pels[6] + pu1_ngbr_pels[7] 17518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + pu1_ngbr_pels[8] + 2; 17528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval = (u4_dcval) ? (u4_dcval >> (1 + left + top)) : 128; 17548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* none available */ 17568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(u1_pred_vals, u4_dcval, 4); 17578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, u1_pred_vals, i4_sad[DC_I4x4]); 17588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, u1_pred_vals, i4_sad[DC_I4x4]); 17608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, u1_pred_vals, i4_sad[DC_I4x4]); 17628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, u1_pred_vals, i4_sad[DC_I4x4]); 17648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DC_I4x4] = i4_sad[DC_I4x4] + ((u4_predictd_mode == DC_I4x4) ? 17678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 17688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* if modes other than VERT, HORZ and DC are valid */ 17718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes > 7) 17728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred = pu1_ngbr_pels; 17748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred[13] = pu1_pred[14] = pu1_pred[12]; 17758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Performing FILT121 and FILT11 operation for all neighbour values*/ 17778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 13; i++) 17788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_diag_121[i] = FILT121(pu1_pred[0], pu1_pred[1], pu1_pred[2]); 17808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_diag_11[i] = FILT11(pu1_pred[0], pu1_pred[1]); 17818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred++; 17838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 8)/* DIAG_DL */ 17868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[DIAG_DL_I4x4] = 0; 17888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DIAG_DL_I4x4] = 0; 17898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 17908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 5; 17918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred_val, i4_sad[DIAG_DL_I4x4]); 17938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 1), i4_sad[DIAG_DL_I4x4]); 17958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 2), i4_sad[DIAG_DL_I4x4]); 17978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 17988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 3), i4_sad[DIAG_DL_I4x4]); 17998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DIAG_DL_I4x4] = i4_sad[DIAG_DL_I4x4] + ((u4_predictd_mode == DIAG_DL_I4x4) ? 18018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 18028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 16)/* DIAG_DR */ 18058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[DIAG_DR_I4x4] = 0; 18078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DIAG_DR_I4x4] = 0; 18088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 18098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 3; 18108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred_val, i4_sad[DIAG_DR_I4x4]); 18128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val - 1), i4_sad[DIAG_DR_I4x4]); 18148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val - 2), i4_sad[DIAG_DR_I4x4]); 18168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val - 3), i4_sad[DIAG_DR_I4x4]); 18188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[DIAG_DR_I4x4] = i4_sad[DIAG_DR_I4x4] + ((u4_predictd_mode == DIAG_DR_I4x4) ? 18208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 18218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 32)/* VERT_R mode valid ????*/ 18258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[VERT_R_I4x4] = 0; 18278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 18298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_vert_r[0] = u1_pred_vals_diag_121[2]; 18308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy((u1_pred_vals_vert_r + 1), (u1_pred_vals_diag_11 + 4), 3); 18318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_vert_r[4] = u1_pred_vals_diag_121[1]; 18328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy((u1_pred_vals_vert_r + 5), (u1_pred_vals_diag_121 + 3), 3); 18338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 4; 18358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred_val, i4_sad[VERT_R_I4x4]); 18368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 3; 18378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, pu1_pred_val, i4_sad[VERT_R_I4x4]); 18398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (u1_pred_vals_vert_r), i4_sad[VERT_R_I4x4]); 18418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (u1_pred_vals_vert_r + 4), 18438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[VERT_R_I4x4]); 18448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[VERT_R_I4x4] = i4_sad[VERT_R_I4x4] + ((u4_predictd_mode == VERT_R_I4x4) ? 18468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 18478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 64)/* HORZ_D mode valid ????*/ 18508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_D_I4x4] = 0; 18528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 18548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[6] = u1_pred_vals_diag_11[3]; 18558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy((u1_pred_vals_horz_d + 7), (u1_pred_vals_diag_121 + 3), 3); 18568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[0] = u1_pred_vals_diag_11[0]; 18578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[1] = u1_pred_vals_diag_121[0]; 18588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[2] = u1_pred_vals_diag_11[1]; 18598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[3] = u1_pred_vals_diag_121[1]; 18608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[4] = u1_pred_vals_diag_11[2]; 18618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_d[5] = u1_pred_vals_diag_121[2]; 18628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_horz_d; 18648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 6), i4_sad[HORZ_D_I4x4]); 18658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 4), i4_sad[HORZ_D_I4x4]); 18678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 2), i4_sad[HORZ_D_I4x4]); 18698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[HORZ_D_I4x4]); 18718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[HORZ_D_I4x4] = i4_sad[HORZ_D_I4x4] + ((u4_predictd_mode == HORZ_D_I4x4) ? 18738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 18748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 128)/* VERT_L mode valid ????*/ 18778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[VERT_L_I4x4] = 0; 18798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 18808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 5; 18818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[VERT_L_I4x4]); 18828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 5; 18848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[VERT_L_I4x4]); 18858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 6; 18878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[VERT_L_I4x4]); 18888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 18898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 6; 18908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[VERT_L_I4x4]); 18918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[VERT_L_I4x4] = i4_sad[VERT_L_I4x4] + ((u4_predictd_mode == VERT_L_I4x4) ? 18938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 18948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (u4_valid_intra_modes & 256)/* HORZ_U mode valid ????*/ 18978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad[HORZ_U_I4x4] = 0; 18998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 19008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[0] = u1_pred_vals_diag_11[2]; 19018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[1] = u1_pred_vals_diag_121[1]; 19028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[2] = u1_pred_vals_diag_11[1]; 19038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[3] = u1_pred_vals_diag_121[0]; 19048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[4] = u1_pred_vals_diag_11[0]; 19058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pred_vals_horz_u[5] = FILT121(pu1_ngbr_pels[0], pu1_ngbr_pels[0], pu1_ngbr_pels[1]); 19068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset((u1_pred_vals_horz_u + 6), pu1_ngbr_pels[0], 4); 19088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_horz_u; 19108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val), i4_sad[HORZ_U_I4x4]); 19118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 19128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 2), i4_sad[HORZ_U_I4x4]); 19138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 19148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 4), i4_sad[HORZ_U_I4x4]); 19158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 19168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S USADA8(pu1_src_temp, (pu1_pred_val + 6), i4_sad[HORZ_U_I4x4]); 19178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_cost[HORZ_U_I4x4] = i4_sad[HORZ_U_I4x4] + ((u4_predictd_mode == HORZ_U_I4x4) ? 19198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_lambda : 4 * u4_lambda); 19208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_min_cost = MIN3(MIN3(i4_cost[0], i4_cost[1], i4_cost[2]), 19238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S MIN3(i4_cost[3], i4_cost[4], i4_cost[5]), 19248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S MIN3(i4_cost[6], i4_cost[7], i4_cost[8])); 19258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 19288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Only first three modes valid */ 19308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_min_cost = MIN3(i4_cost[0], i4_cost[1], i4_cost[2]); 19318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *pu4_sadmin = i4_min_cost; 19348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_min_cost == i4_cost[0]) 19368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = VERT_I4x4; 19388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = pu1_ngbr_pels + 5; 19398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[1]) 19488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = HORZ_I4x4; 19508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, pu1_ngbr_pels[3], 4); 19518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, pu1_ngbr_pels[2], 4); 19538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, pu1_ngbr_pels[1], 4); 19558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, pu1_ngbr_pels[0], 4); 19578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[2]) 19598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = DC_I4x4; 19618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, u4_dcval, 4); 19628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, u4_dcval, 4); 19648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, u4_dcval, 4); 19668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset(pu1_dst, u4_dcval, 4); 19688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[3]) 19718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = DIAG_DL_I4x4; 19738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 5; 19748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 1), 4); 19778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 2), 4); 19798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 3), 4); 19818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[4]) 19838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = DIAG_DR_I4x4; 19858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 3; 19868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 19888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val - 1), 4); 19908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val - 2), 4); 19928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 19938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val - 3), 4); 19948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[5]) 19978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = VERT_R_I4x4; 19998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 4; 20008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 3; 20038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (u1_pred_vals_vert_r), 4); 20068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (u1_pred_vals_vert_r + 4), 4); 20088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 20098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[6]) 20108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 20118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = HORZ_D_I4x4; 20128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_horz_d; 20138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 6), 4); 20148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 4), 4); 20168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 2), 4); 20188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 20228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[7]) 20238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 20248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = VERT_L_I4x4; 20258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 5; 20268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 5; 20298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_11 + 6; 20328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_diag_121 + 6; 20358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 20378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_cost == i4_cost[8]) 20388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 20398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = HORZ_U_I4x4; 20408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_pred_val = u1_pred_vals_horz_u; 20418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val), 4); 20428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 2), 4); 20448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 4), 4); 20468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, (pu1_pred_val + 6), 4); 20488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 20498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 20508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 20518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return; 20528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 20538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 20548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/** 20558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 20568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief: 20588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Evaluate best intr chroma mode (among VERT, HORZ and DC ) and do the prediction. 20598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @par Description 20618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* This function evaluates first three intra chroma modes and compute corresponding sad 20628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* and return the buffer predicted with best mode. 20638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_src 20658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the source 20668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu1_ngbr_pels 20688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to neighbouring pels 20698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[out] pu1_dst 20718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* UWORD8 pointer to the destination 20728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] src_strd 20748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer source stride 20758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] dst_strd 20778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* integer destination stride 20788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_n_avblty 20808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* availability of neighbouring pixels 20818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_intra_mode 20838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which best mode is returned 20848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] pu4_sadmin 20868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Pointer to the variable in which minimum sad is returned 20878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @param[in] u4_valid_intra_modes 20898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* Says what all modes are valid 20908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @return none 20928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* 20938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S****************************************************************************** 20948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 20958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264e_evaluate_intra_chroma_modes(UWORD8 *pu1_src, 20968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_ngbr_pels, 20978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_dst, 20988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 src_strd, 20998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 dst_strd, 21008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_n_avblty, 21018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *u4_intra_mode, 21028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 *pu4_sadmin, 21038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_valid_intra_modes) 21048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 21058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_neighbour; 21068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_src_temp = pu1_src; 21078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 left = 0, top = 0; 21088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_dcval_u_l[2] = { 0, 0 }, /*sum left neighbours for 'U' ,two separate sets - sum of first four from top,and sum of four values from bottom */ 21098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_t[2] = { 0, 0 }; /*sum top neighbours for 'U'*/ 21108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_dcval_v_l[2] = { 0, 0 }, /*sum left neighbours for 'V'*/ 21128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_t[2] = { 0, 0 }; /*sum top neighbours for 'V'*/ 21138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i, j, row, col, i4_sad_vert = INT_MAX, i4_sad_horz = INT_MAX, 21158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc = INT_MAX, i4_min_sad = INT_MAX; 21168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 val_u, val_v; 21178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 u4_dc_val[2][2][2];/* ----------- 21198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S | | | Chroma can have four 21208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S | 00 | 01 | separate dc value... 21218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ----------- u4_dc_val corresponds to this dc values 21228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S | | | with u4_dc_val[2][2][U] and u4_dc_val[2][2][V] 21238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S | 10 | 11 | 21248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ----------- */ 21258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S left = (u4_n_avblty & LEFT_MB_AVAILABLE_MASK); 21268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S top = (u4_n_avblty & TOP_MB_AVAILABLE_MASK) >> 2; 21278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*Evaluating HORZ*/ 21298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (left)/* Ifleft available*/ 21308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz = 0; 21328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 8; i++) 21348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_v = pu1_ngbr_pels[15 - 2 * i]; 21368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_u = pu1_ngbr_pels[15 - 2 * i - 1]; 21378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S row = i / 4; 21388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_l[row] += val_u; 21398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_l[row] += val_v; 21408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 8; j++) 21418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz += ABS(val_u - pu1_src_temp[2 * j]);/* Finding SAD for HORZ mode*/ 21438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz += ABS(val_v - pu1_src_temp[2 * j + 1]); 21448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 21478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_l[0] += 2; 21498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_l[1] += 2; 21508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_l[0] += 2; 21518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_l[1] += 2; 21528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*Evaluating VERT**/ 21558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 21568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (top) /* top available*/ 21578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert = 0; 21598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 8; i++) 21618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S col = i / 4; 21638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_u = pu1_ngbr_pels[18 + i * 2]; 21658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_v = pu1_ngbr_pels[18 + i * 2 + 1]; 21668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_t[col] += val_u; 21678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_t[col] += val_v; 21688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 16; j++) 21708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert += ABS(pu1_ngbr_pels[18 + j] - pu1_src_temp[j]);/* Finding SAD for VERT mode*/ 21728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 21748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_t[0] += 2; 21778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_u_t[1] += 2; 21788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_t[0] += 2; 21798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dcval_v_t[1] += 2; 21808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* computing DC value*/ 21838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Equation 8-128 in spec*/ 21848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][0][0] = (u4_dcval_u_l[0] + u4_dcval_u_t[0]) >> (1 + left + top); 21858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][0][1] = (u4_dcval_v_l[0] + u4_dcval_v_t[0]) >> (1 + left + top); 21868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][1][0] = (u4_dcval_u_l[1] + u4_dcval_u_t[1]) >> (1 + left + top); 21878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][1][1] = (u4_dcval_v_l[1] + u4_dcval_v_t[1]) >> (1 + left + top); 21888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 21898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (top) 21908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Equation 8-132 in spec*/ 21928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][1][0] = (u4_dcval_u_t[1]) >> (1 + top); 21938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][1][1] = (u4_dcval_v_t[1]) >> (1 + top); 21948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 21958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 21968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 21978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][1][0] = (u4_dcval_u_l[0]) >> (1 + left); 21988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][1][1] = (u4_dcval_v_l[0]) >> (1 + left); 21998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (left) 22028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][0][0] = (u4_dcval_u_l[1]) >> (1 + left); 22048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][0][1] = (u4_dcval_v_l[1]) >> (1 + left); 22058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 22078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][0][0] = (u4_dcval_u_t[0]) >> (1 + top); 22098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][0][1] = (u4_dcval_v_t[0]) >> (1 + top); 22108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (!(left || top)) 22138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*none available*/ 22158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][0][0] = u4_dc_val[0][0][1] = 22168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[0][1][0] = u4_dc_val[0][1][1] = 22178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][0][0] = u4_dc_val[1][0][1] = 22188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_dc_val[1][1][0] = u4_dc_val[1][1][1] = 128; 22198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Evaluating DC */ 22228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp = pu1_src; 22238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc = 0; 22248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 8; i++) 22258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 8; j++) 22278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S col = j / 4; 22298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S row = i / 4; 22308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_u = u4_dc_val[row][col][0]; 22318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_v = u4_dc_val[row][col][1]; 22328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc += ABS(val_u - pu1_src_temp[2 * j]);/* Finding SAD for DC mode*/ 22348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc += ABS(val_v - pu1_src_temp[2 * j + 1]); 22358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_src_temp += src_strd; 22378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 01) == 0)/* If DC is disabled*/ 22408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_dc = INT_MAX; 22418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 02) == 0)/* If HORZ is disabled*/ 22428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_horz = INT_MAX; 22438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if ((u4_valid_intra_modes & 04) == 0)/* If VERT is disabled*/ 22448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_sad_vert = INT_MAX; 22458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_min_sad = MIN3(i4_sad_horz, i4_sad_dc, i4_sad_vert); 22478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Finding Minimum sad and doing corresponding prediction*/ 22498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_min_sad < *pu4_sadmin) 22508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *pu4_sadmin = i4_min_sad; 22528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if (i4_min_sad == i4_sad_dc) 22548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = DC_CH_I8x8; 22568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 8; i++) 22578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 8; j++) 22598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S col = j / 4; 22618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S row = i / 4; 22628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst[2 * j] = u4_dc_val[row][col][0]; 22648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst[2 * j + 1] = u4_dc_val[row][col][1]; 22658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 22678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if (i4_min_sad == i4_sad_horz) 22708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = HORZ_CH_I8x8; 22728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 8; j++) 22738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_v = pu1_ngbr_pels[15 - 2 * j]; 22758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S val_u = pu1_ngbr_pels[15 - 2 * j - 1]; 22768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (i = 0; i < 8; i++) 22788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst[2 * i] = val_u; 22808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst[2 * i + 1] = val_v; 22818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 22848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 22878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *u4_intra_mode = VERT_CH_I8x8; 22898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_neighbour = pu1_ngbr_pels + 18; 22908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for (j = 0; j < 8; j++) 22918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 22928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(pu1_dst, pu1_neighbour, MB_SIZE); 22938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_dst += dst_strd; 22948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 22978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 22988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return; 22998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 2300