18520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/******************************************************************************
28520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
38520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Copyright (C) 2015 The Android Open Source Project
48520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
58520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Licensed under the Apache License, Version 2.0 (the "License");
68520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * you may not use this file except in compliance with the License.
78520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * You may obtain a copy of the License at:
88520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
98520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * http://www.apache.org/licenses/LICENSE-2.0
108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Unless required by applicable law or agreed to in writing, software
128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * distributed under the License is distributed on an "AS IS" BASIS,
138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * See the License for the specific language governing permissions and
158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * limitations under the License.
168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *****************************************************************************
188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/**
218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @file
238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  ideint_cac.c
248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @brief
268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  This file include the definitions of the combing  artifact check function
278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* of the de-interlacer and some  variant of that.
288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @author
308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Ittiam
318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @par List of Functions:
338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  cac_4x8()
348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  ideint_cac()
358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @remarks
378520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  In the de-interlacer workspace, cac is not a seperate  assembly module as
388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* it comes along with the  de_int_decision() function. But in C-Model, to
398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* keep  the things cleaner, it was made to be a separate  function during
408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* cac experiments long after the  assembly was written by Mudit.
418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/*****************************************************************************/
458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* File Includes                                                             */
468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/*****************************************************************************/
478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* System include files */
488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdio.h>
498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdint.h>
508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <string.h>
518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdlib.h>
528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* User include files */
548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_datatypes.h"
558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_macros.h"
568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv.h"
578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_variance.h"
588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_sad.h"
598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint.h"
608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_defs.h"
618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_structs.h"
628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_cac.h"
638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/**
658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
668520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
678520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @brief
688520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* Combing artifact check function for 8x4 block
698520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
708520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @par   Description
718520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Adjacent and alternate SADs are calculated by row based and column-based
728520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  collapsing. The adjacent and alternate SADs are then compared with some
738520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  biasing to get CAC
748520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
758520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_top
768520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field
778520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
788520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_bot
798520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field
808520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
818520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] top_strd
828520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field Stride
838520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
848520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] bot_strd
858520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field stride
868520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
878520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pi4_adj_sad
888520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Pointer to return adjacent SAD
898520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
908520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pi4_alt_sad
918520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Pointer to return alternate SAD
928520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
938520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @returns
948520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* combing artifact flag (1 = detected, 0 = not detected)
958520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
968520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @remarks
978520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
988520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
998520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
1008520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakarstatic WORD32 cac_4x8(UWORD8 *pu1_top,
1018520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      UWORD8 *pu1_bot,
1028520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      WORD32 top_strd,
1038520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      WORD32 bot_strd)
1048520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar{
1058520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 ca;
1068520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 adj;
1078520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 alt;
1088520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_tmp_top;
1098520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_tmp_bot;
1108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 i;
1118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 j;
1128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_top_0;
1138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_top_1;
1148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_top_2;
1158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_top_3;
1168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_bot_0;
1178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_bot_1;
1188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_bot_2;
1198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    UWORD8 *pu1_bot_3;
1208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 rsum_csum_thresh;
1218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 sad_bias_mult_shift;
1228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 sad_bias_additive;
1238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 diff_sum;
1258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 top_row_end_incr;
1268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 bot_row_end_incr;
1278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    ca = 0;
1298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    adj = 0;
1318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    alt = 0;
1328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    rsum_csum_thresh    = RSUM_CSUM_THRESH;
1348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    sad_bias_additive   = SAD_BIAS_ADDITIVE;
1358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    sad_bias_mult_shift = SAD_BIAS_MULT_SHIFT;
1368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1378520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* In the adjacent sad calculation by row-method, the absolute           */
1398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* difference is taken between the adjacent rows. The pixels of the diff */
1408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* row, thus obtained, are then summed up. If this sum of absolute       */
1418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* differace (sad) is greater than a threshold value, it is added to the */
1428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* adjcacent SAD value.                                                  */
1438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Adj dif: Row based                                                    */
1478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_tmp_top = pu1_top;
1508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_tmp_bot = pu1_bot;
1518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    top_row_end_incr = top_strd - SUB_BLK_WD;
1538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    bot_row_end_incr = bot_strd - SUB_BLK_WD;
1548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* The outer-loop runs for BLK_HT/2 times, because one pixel   */
1578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* is touched only once.                                                 */
1588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
1598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(j = 0; j < BLK_HT; j += 4)
1608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
1618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 sum_1, sum_2, sum_3, sum_4;
1628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 sum_diff;
1638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
1658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Because the 8x4 is split into two halves of 4x4, the width of the */
1668520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* block is now 4.                                                   */
1678520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
1688520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_1 = 0;
1698520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_2 = 0;
1708520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1718520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        for(i = 0; i < SUB_BLK_WD; i ++)
1728520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        {
1738520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            sum_1 += *pu1_tmp_top++;
1748520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            sum_2 += *pu1_tmp_bot++;
1758520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        }
1768520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1778520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_1, sum_2);
1788520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1798520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
1808520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Thresholding.                                                     */
1818520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
1828520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= rsum_csum_thresh)
1838520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj += sum_diff;
1848520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1858520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_tmp_top += top_row_end_incr;
1868520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_tmp_bot += bot_row_end_incr;
1878520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1888520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1898520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_3 = 0;
1908520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_4 = 0;
1918520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1928520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        for(i = 0; i < SUB_BLK_WD; i ++)
1938520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        {
1948520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            sum_3 += *pu1_tmp_top++;
1958520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            sum_4 += *pu1_tmp_bot++;
1968520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        }
1978520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1988520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_3, sum_4);
1998520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2008520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
2018520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Thresholding.                                                     */
2028520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*********************************************************************/
2038520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= rsum_csum_thresh)
2048520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj += sum_diff;
2058520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2068520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_tmp_top += top_row_end_incr;
2078520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_tmp_bot += bot_row_end_incr;
2088520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2098520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*************************************************************************/
2108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Alt diff : Row based                                                  */
2118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /*************************************************************************/
2128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt += ABS_DIF(sum_1, sum_3);
2138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt += ABS_DIF(sum_2, sum_4);
2148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
2168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* In the adjacent sad calculation by column-method, the rows of both    */
2198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* the fields are averaged separately and then summed across the column. */
2208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* The difference of the two values, thus obtained, is added to the      */
2218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* adjacent sad value, if it is beyond the threshold.                    */
2228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_top_0 = pu1_top;
2258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_top_1 = pu1_top_0 + top_strd;
2268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_top_2 = pu1_top_1 + top_strd;
2278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_top_3 = pu1_top_2 + top_strd;
2288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_bot_0 = pu1_bot;
2308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_bot_1 = pu1_bot_0 + bot_strd;
2318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_bot_2 = pu1_bot_1 + bot_strd;
2328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_bot_3 = pu1_bot_2 + bot_strd;
2338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Adj dif: Col based                                                    */
2368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2378520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    diff_sum = 0;
2388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* As the DSP implementation of this modules is anyway going to assume   */
2418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* the size of the block to the fixed (8x4 or two 4x4's), the height of  */
2428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* block is also kept to be 8, to have a clean implementation.           */
2438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(i = 0; i < SUB_BLK_WD; i ++)
2458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
2468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 val_1;
2478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 val_2;
2488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 tmp_1, tmp_2;
2498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 tmp_diff;
2508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_1 = AVG(pu1_top_0[i], pu1_top_1[i]);
2528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_2 = AVG(pu1_top_2[i], pu1_top_3[i]);
2538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        val_1 = AVG(tmp_1,        tmp_2);
2548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_1 = AVG(pu1_bot_0[i], pu1_bot_1[i]);
2568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_2 = AVG(pu1_bot_2[i], pu1_bot_3[i]);
2578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        val_2 = AVG(tmp_1,        tmp_2);
2588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_diff = ABS_DIF(val_1, val_2);
2608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(tmp_diff >= (rsum_csum_thresh >> 2))
2628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            diff_sum += tmp_diff;
2638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
2648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2668520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    adj += diff_sum << 2;
2678520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2688520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2698520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Alt diff : Col based                                                  */
2708520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2718520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    diff_sum = 0;
2728520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2738520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(i = 0; i < SUB_BLK_WD; i ++)
2748520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
2758520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 val_1;
2768520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 val_2;
2778520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 tmp_1, tmp_2;
2788520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        WORD32 tmp_diff;
2798520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2808520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_1 = AVG(pu1_top_0[i], pu1_bot_0[i]);
2818520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_2 = AVG(pu1_top_2[i], pu1_bot_2[i]);
2828520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        val_1 = AVG(tmp_1,        tmp_2);
2838520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2848520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_1 = AVG(pu1_top_1[i], pu1_bot_1[i]);
2858520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_2 = AVG(pu1_top_3[i], pu1_bot_3[i]);
2868520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        val_2 = AVG(tmp_1, tmp_2);
2878520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2888520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        tmp_diff = ABS_DIF(val_1, val_2);
2898520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2908520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += tmp_diff;
2918520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
2928520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2938520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2948520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* because of the averaging used in place of summation, a factor of 4 is */
2958520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* needed while adding the the diff_sum to the sad.                      */
2968520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
2978520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2988520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    alt += diff_sum << 2;
2998520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3008520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_top += SUB_BLK_WD;
3018520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    pu1_bot += SUB_BLK_WD;
3028520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3038520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    alt += (alt >> sad_bias_mult_shift) + (sad_bias_additive >> 1);
3048520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    ca   = (alt < adj);
3058520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3068520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    return ca;
3078520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar}
3088520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3098520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/**
3108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
3118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @brief
3138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* Combing artifact check function for 8x8 block
3148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @par   Description
3168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* Determines CAC for 8x8 block by calling 8x4 CAC function
3178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_top
3198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field
3208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_bot
3228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field
3238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] top_strd
3258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field Stride
3268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] bot_strd
3288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field stride
3298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @returns
3318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* combing artifact flag (1 = detected, 0 = not detected)
3328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @remarks
3348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
3358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
3368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
3378520690e241ad92a07893e198b2df417fe045d79Harish MahendrakarWORD32 ideint_cac_8x8(UWORD8 *pu1_top,
3388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      UWORD8 *pu1_bot,
3398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      WORD32 top_strd,
3408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                      WORD32 bot_strd)
3418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar{
3428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 ca;        /* combing artifact result                          */
3438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 k;
3448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    ca = 0;
3468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
3478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* This loop runs for the two halves of the 4x8 block.                   */
3488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /*************************************************************************/
3498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(k = 0; k < 2; k ++)
3508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
3518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        ca |= cac_4x8(pu1_top, pu1_bot, top_strd, bot_strd);
3528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_top += SUB_BLK_WD;
3548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_bot += SUB_BLK_WD;
3558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* If Combing Artifact is detected, then return. Else continue to
3578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar         * check the next half
3588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar         */
3598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(ca)
3608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            return ca;
3618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
3628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
3638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    return ca;
3648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar}
3658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
366