180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/****************************************************************************** 280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * 380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * Copyright (C) 2015 The Android Open Source Project 480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * 580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * Licensed under the Apache License, Version 2.0 (the "License"); 680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * you may not use this file except in compliance with the License. 780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * You may obtain a copy of the License at: 880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * 980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * http://www.apache.org/licenses/LICENSE-2.0 1080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * 1180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * Unless required by applicable law or agreed to in writing, software 1280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * distributed under the License is distributed on an "AS IS" BASIS, 1380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * See the License for the specific language governing permissions and 1580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * limitations under the License. 1680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * 1780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar ***************************************************************************** 1880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 1980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar*/ 2080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/** 2180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 2280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @file 2380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* ideint_cac.c 2480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 2580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @brief 2680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* This file include the definitions of the combing artifact check function 2780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* of the de-interlacer and some variant of that. 2880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 2980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @author 3080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Ittiam 3180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 3280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @par List of Functions: 3380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* cac_4x8() 3480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* ideint_cac() 3580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 3680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @remarks 3780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* In the de-interlacer workspace, cac is not a seperate assembly module as 3880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* it comes along with the de_int_decision() function. But in C-Model, to 3980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* keep the things cleaner, it was made to be a separate function during 4080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* cac experiments long after the assembly was written by Mudit. 4180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 4280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 4380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar*/ 4480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/*****************************************************************************/ 4580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/* File Includes */ 4680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/*****************************************************************************/ 4780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/* System include files */ 4880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include <stdio.h> 4980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include <stdint.h> 5080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include <string.h> 5180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include <stdlib.h> 5280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 5380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/* User include files */ 5480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "icv_datatypes.h" 5580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "icv_macros.h" 5680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "icv.h" 5780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "icv_variance.h" 5880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "icv_sad.h" 5980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "ideint.h" 6080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "ideint_defs.h" 6180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "ideint_structs.h" 6280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar#include "ideint_cac.h" 6380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 6480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/** 6580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 6680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 6780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @brief 6880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Combing artifact check function for 8x4 block 6980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 7080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @par Description 7180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Adjacent and alternate SADs are calculated by row based and column-based 7280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* collapsing. The adjacent and alternate SADs are then compared with some 7380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* biasing to get CAC 7480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 7580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pu1_top 7680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Top field 7780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 7880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pu1_bot 7980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Bottom field 8080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 8180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] top_strd 8280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Top field Stride 8380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 8480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] bot_strd 8580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Bottom field stride 8680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 8780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pi4_adj_sad 8880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Pointer to return adjacent SAD 8980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 9080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pi4_alt_sad 9180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Pointer to return alternate SAD 9280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 9380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @returns 9480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* combing artifact flag (1 = detected, 0 = not detected) 9580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 9680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @remarks 9780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 9880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 9980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar*/ 10080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakarstatic WORD32 cac_4x8(UWORD8 *pu1_top, 10180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot, 10280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 top_strd, 10380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 bot_strd) 10480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar{ 10580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 ca; 10680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 adj; 10780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 alt; 10880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_tmp_top; 10980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_tmp_bot; 11080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 i; 11180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 j; 11280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_top_0; 11380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_top_1; 11480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_top_2; 11580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_top_3; 11680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot_0; 11780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot_1; 11880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot_2; 11980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot_3; 12080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 rsum_csum_thresh; 12180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 sad_bias_mult_shift; 12280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 sad_bias_additive; 12380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 12480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 diff_sum; 12580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 top_row_end_incr; 12680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 bot_row_end_incr; 12780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 12880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar ca = 0; 12980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 13080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar adj = 0; 13180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar alt = 0; 13280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 13380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar rsum_csum_thresh = RSUM_CSUM_THRESH; 13480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sad_bias_additive = SAD_BIAS_ADDITIVE; 13580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sad_bias_mult_shift = SAD_BIAS_MULT_SHIFT; 13680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 13780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 13880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* In the adjacent sad calculation by row-method, the absolute */ 13980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* difference is taken between the adjacent rows. The pixels of the diff */ 14080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* row, thus obtained, are then summed up. If this sum of absolute */ 14180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* differace (sad) is greater than a threshold value, it is added to the */ 14280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* adjcacent SAD value. */ 14380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 14480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 14580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 14680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Adj dif: Row based */ 14780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 14880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 14980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_top = pu1_top; 15080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_bot = pu1_bot; 15180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 15280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar top_row_end_incr = top_strd - SUB_BLK_WD; 15380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar bot_row_end_incr = bot_strd - SUB_BLK_WD; 15480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 15580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 15680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* The outer-loop runs for BLK_HT/2 times, because one pixel */ 15780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* is touched only once. */ 15880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 15980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(j = 0; j < BLK_HT; j += 4) 16080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 16180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 sum_1, sum_2, sum_3, sum_4; 16280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 sum_diff; 16380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 16480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 16580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Because the 8x4 is split into two halves of 4x4, the width of the */ 16680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* block is now 4. */ 16780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 16880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_1 = 0; 16980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_2 = 0; 17080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 17180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(i = 0; i < SUB_BLK_WD; i ++) 17280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 17380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_1 += *pu1_tmp_top++; 17480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_2 += *pu1_tmp_bot++; 17580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 17680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 17780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_diff = ABS_DIF(sum_1, sum_2); 17880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 17980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 18080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Thresholding. */ 18180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 18280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar if(sum_diff >= rsum_csum_thresh) 18380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar adj += sum_diff; 18480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 18580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_top += top_row_end_incr; 18680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_bot += bot_row_end_incr; 18780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 18880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 18980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_3 = 0; 19080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_4 = 0; 19180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 19280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(i = 0; i < SUB_BLK_WD; i ++) 19380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 19480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_3 += *pu1_tmp_top++; 19580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_4 += *pu1_tmp_bot++; 19680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 19780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 19880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar sum_diff = ABS_DIF(sum_3, sum_4); 19980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 20080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 20180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Thresholding. */ 20280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*********************************************************************/ 20380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar if(sum_diff >= rsum_csum_thresh) 20480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar adj += sum_diff; 20580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 20680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_top += top_row_end_incr; 20780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_tmp_bot += bot_row_end_incr; 20880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 20980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 21080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Alt diff : Row based */ 21180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 21280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar alt += ABS_DIF(sum_1, sum_3); 21380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar alt += ABS_DIF(sum_2, sum_4); 21480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 21580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 21680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 21780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 21880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* In the adjacent sad calculation by column-method, the rows of both */ 21980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* the fields are averaged separately and then summed across the column. */ 22080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* The difference of the two values, thus obtained, is added to the */ 22180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* adjacent sad value, if it is beyond the threshold. */ 22280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 22380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 22480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top_0 = pu1_top; 22580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top_1 = pu1_top_0 + top_strd; 22680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top_2 = pu1_top_1 + top_strd; 22780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top_3 = pu1_top_2 + top_strd; 22880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 22980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot_0 = pu1_bot; 23080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot_1 = pu1_bot_0 + bot_strd; 23180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot_2 = pu1_bot_1 + bot_strd; 23280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot_3 = pu1_bot_2 + bot_strd; 23380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 23480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 23580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Adj dif: Col based */ 23680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 23780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar diff_sum = 0; 23880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 23980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 24080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* As the DSP implementation of this modules is anyway going to assume */ 24180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* the size of the block to the fixed (8x4 or two 4x4's), the height of */ 24280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* block is also kept to be 8, to have a clean implementation. */ 24380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 24480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(i = 0; i < SUB_BLK_WD; i ++) 24580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 24680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 val_1; 24780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 val_2; 24880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 tmp_1, tmp_2; 24980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 tmp_diff; 25080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 25180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_1 = AVG(pu1_top_0[i], pu1_top_1[i]); 25280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_2 = AVG(pu1_top_2[i], pu1_top_3[i]); 25380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar val_1 = AVG(tmp_1, tmp_2); 25480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 25580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_1 = AVG(pu1_bot_0[i], pu1_bot_1[i]); 25680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_2 = AVG(pu1_bot_2[i], pu1_bot_3[i]); 25780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar val_2 = AVG(tmp_1, tmp_2); 25880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 25980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_diff = ABS_DIF(val_1, val_2); 26080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 26180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar if(tmp_diff >= (rsum_csum_thresh >> 2)) 26280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar diff_sum += tmp_diff; 26380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 26480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 26580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 26680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar adj += diff_sum << 2; 26780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 26880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 26980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* Alt diff : Col based */ 27080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 27180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar diff_sum = 0; 27280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 27380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(i = 0; i < SUB_BLK_WD; i ++) 27480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 27580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 val_1; 27680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 val_2; 27780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 tmp_1, tmp_2; 27880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 tmp_diff; 27980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 28080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_1 = AVG(pu1_top_0[i], pu1_bot_0[i]); 28180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_2 = AVG(pu1_top_2[i], pu1_bot_2[i]); 28280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar val_1 = AVG(tmp_1, tmp_2); 28380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 28480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_1 = AVG(pu1_top_1[i], pu1_bot_1[i]); 28580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_2 = AVG(pu1_top_3[i], pu1_bot_3[i]); 28680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar val_2 = AVG(tmp_1, tmp_2); 28780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 28880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar tmp_diff = ABS_DIF(val_1, val_2); 28980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 29080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar diff_sum += tmp_diff; 29180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 29280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 29380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 29480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* because of the averaging used in place of summation, a factor of 4 is */ 29580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* needed while adding the the diff_sum to the sad. */ 29680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 29780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 29880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar alt += diff_sum << 2; 29980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 30080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top += SUB_BLK_WD; 30180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot += SUB_BLK_WD; 30280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 30380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar alt += (alt >> sad_bias_mult_shift) + (sad_bias_additive >> 1); 30480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar ca = (alt < adj); 30580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 30680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar return ca; 30780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar} 30880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 30980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar/** 31080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 31180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 31280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @brief 31380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Combing artifact check function for 8x8 block 31480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 31580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @par Description 31680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Determines CAC for 8x8 block by calling 8x4 CAC function 31780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 31880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pu1_top 31980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Top field 32080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 32180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] pu1_bot 32280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Bottom field 32380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 32480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] top_strd 32580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Top field Stride 32680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 32780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @param[in] bot_strd 32880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* Bottom field stride 32980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 33080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @returns 33180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* combing artifact flag (1 = detected, 0 = not detected) 33280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 33380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* @remarks 33480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar* 33580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar******************************************************************************* 33680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar*/ 33780a14110036632549a272c812f92b791fb08e87aHarish MahendrakarWORD32 ideint_cac_8x8(UWORD8 *pu1_top, 33880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar UWORD8 *pu1_bot, 33980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 top_strd, 34080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 bot_strd) 34180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar{ 34280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 ca; /* combing artifact result */ 34380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar WORD32 k; 34480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 34580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar ca = 0; 34680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 34780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* This loop runs for the two halves of the 4x8 block. */ 34880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /*************************************************************************/ 34980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar for(k = 0; k < 2; k ++) 35080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar { 35180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar ca |= cac_4x8(pu1_top, pu1_bot, top_strd, bot_strd); 35280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 35380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_top += SUB_BLK_WD; 35480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar pu1_bot += SUB_BLK_WD; 35580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 35680a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar /* If Combing Artifact is detected, then return. Else continue to 35780a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar * check the next half 35880a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar */ 35980a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar if(ca) 36080a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar return ca; 36180a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar } 36280a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 36380a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar return ca; 36480a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar} 36580a14110036632549a272c812f92b791fb08e87aHarish Mahendrakar 366