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