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