10d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/******************************************************************************
20d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
30d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
40d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
50d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Licensed under the Apache License, Version 2.0 (the "License");
60d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* you may not use this file except in compliance with the License.
70d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* You may obtain a copy of the License at:
80d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
90d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* http://www.apache.org/licenses/LICENSE-2.0
100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* Unless required by applicable law or agreed to in writing, software
120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* distributed under the License is distributed on an "AS IS" BASIS,
130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* See the License for the specific language governing permissions and
150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* limitations under the License.
160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar******************************************************************************/
180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*******************************************************************************
200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @file
210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  ihevc_sao.c
220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @brief
240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Contains leaf level function definitions for sample adaptive offset process
250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @author
270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  Srinivas T
280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @par List of Functions:
300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_band_offset_luma()
310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_band_offset_chroma()
320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class0()
330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class0_chroma()
340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class1()
350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class1_chroma()
360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class2()
370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class2_chroma()
380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class3()
390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*   - ihevc_sao_edge_offset_class3_chroma()
400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar* @remarks
410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*  None
420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*
430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*******************************************************************************
440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar*/
450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <stdlib.h>
460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <assert.h>
470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include <string.h>
480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_typedefs.h"
490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_macros.h"
500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_platform_macros.h"
510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_func_selector.h"
520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_defs.h"
530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_structs.h"
540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "ihevc_sao.h"
550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#define NUM_BAND_TABLE  32
570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarconst WORD32 gi4_ihevc_table_edge_idx[5] = { 1, 2, 0, 3, 4 };
590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/**
600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail is an array of flags - one for each neighboring block specifying if the block is available
610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[0] - left
620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[1] - right
630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[2] - top
640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[3] - bottom
650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[4] - top-left
660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[5] - top-right
670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[6] - bottom-left
680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * au4_avail[7] - bottom-right
690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */
700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_band_offset_luma(UWORD8 *pu1_src,
730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                WORD32 src_strd,
740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                UWORD8 *pu1_src_left,
750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                UWORD8 *pu1_src_top,
760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                UWORD8 *pu1_src_top_left,
770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                WORD32 sao_band_pos,
780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                WORD8 *pi1_sao_offset,
790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                WORD32 wd,
800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                WORD32 ht)
810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 band_shift;
830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 band_table[NUM_BAND_TABLE];
840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 i;
850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Updating left and top and top-left */
880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = pu1_src[row * src_strd + (wd - 1)];
910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = pu1_src_top[wd - 1];
930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = pu1_src[(ht - 1) * src_strd + col];
960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    band_shift = BIT_DEPTH_LUMA - 5;
990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(i = 0; i < NUM_BAND_TABLE; i++)
1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table[i] = 0;
1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(i = 0; i < 4; i++)
1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table[(i + sao_band_pos) & 31] = i + 1;
1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 band_idx;
1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            band_idx = band_table[pu1_src[col] >> band_shift];
1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[band_idx], 0, (1 << (band_shift + 5)) - 1);
1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* input 'wd' has to be for the interleaved block and not for each color component */
1240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_band_offset_chroma(UWORD8 *pu1_src,
1250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 src_strd,
1260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_left,
1270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top,
1280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_left,
1290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 sao_band_pos_u,
1300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 sao_band_pos_v,
1310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset_u,
1320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset_v,
1330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 wd,
1340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 ht)
1350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 band_shift;
1370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 band_table_u[NUM_BAND_TABLE];
1380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 band_table_v[NUM_BAND_TABLE];
1390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 i;
1400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
1410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Updating left and top and top-left */
1430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
1440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[2 * row] = pu1_src[row * src_strd + (wd - 2)];
1460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[2 * row + 1] = pu1_src[row * src_strd + (wd - 1)];
1470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = pu1_src_top[wd - 2];
1490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[1] = pu1_src_top[wd - 1];
1500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
1510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = pu1_src[(ht - 1) * src_strd + col];
1530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    band_shift = BIT_DEPTH_CHROMA - 5;
1570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(i = 0; i < NUM_BAND_TABLE; i++)
1580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table_u[i] = 0;
1600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table_v[i] = 0;
1610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(i = 0; i < 4; i++)
1630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table_u[(i + sao_band_pos_u) & 31] = i + 1;
1650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        band_table_v[(i + sao_band_pos_v) & 31] = i + 1;
1660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
1690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
1700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
1710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
1720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD32 band_idx;
1730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            WORD8 *pi1_sao_offset;
1740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pi1_sao_offset = (0 == col % 2) ? pi1_sao_offset_u : pi1_sao_offset_v;
1760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            band_idx = (0 == col % 2) ? band_table_u[pu1_src[col] >> band_shift] : band_table_v[pu1_src[col] >> band_shift];
1770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[band_idx], 0, (1 << (band_shift + 5)) - 1);
1780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
1790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
1800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
1810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
1820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
1850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Horizontal filtering */
1860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class0(UWORD8 *pu1_src,
1870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 src_strd,
1880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_left,
1890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top,
1900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_left,
1910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_right,
1920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_bot_left,
1930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_avail,
1940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset,
1950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 wd,
1960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 ht)
1970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
1980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
1990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
2000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[MAX_CTB_SIZE];
2010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_left, u1_sign_right;
2020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
2030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
2040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
2050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_LUMA;
2060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
2080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
2090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update top and top-left arrays */
2110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    *pu1_src_top_left = pu1_src_top[wd - 1];
2120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
2130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[row] = pu1_src[row * src_strd + wd - 1];
2150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
2170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = pu1_src[(ht - 1) * src_strd + col];
2190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update masks based on the availability flags */
2220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
2230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
2250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
2270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[wd - 1] = 0;
2290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
2320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
2340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
2350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_sign_left = SIGN(pu1_src[0] - pu1_src_left[row]);
2360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
2370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
2380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
2390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_right = SIGN(pu1_src[col] - pu1_src[col + 1]);
2410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + u1_sign_left + u1_sign_right;
2420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_left = -u1_sign_right;
2430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col];
2450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
2470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
2480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
2490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
2500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
2510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
2530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
2540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left array */
2570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
2580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
2600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
2610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
2630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* input 'wd' has to be for the interleaved block and not for each color component */
2680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class0_chroma(UWORD8 *pu1_src,
2690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 src_strd,
2700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_left,
2710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top,
2720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_left,
2730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_right,
2740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_bot_left,
2750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_avail,
2760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_u,
2770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_v,
2780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 wd,
2790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 ht)
2800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
2810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
2820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
2830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[2 * MAX_CTB_SIZE];
2840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_left_u, u1_sign_right_u;
2850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_left_v, u1_sign_right_v;
2860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
2870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
2880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
2890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_CHROMA;
2900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
2920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
2930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
2940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
2950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = pu1_src_top[wd - 2];
2960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[1] = pu1_src_top[wd - 1];
2970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
2980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
2990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row] = pu1_src[row * src_strd + wd - 2];
3000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row + 1] = pu1_src[row * src_strd + wd - 1];
3010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
3030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = pu1_src[(ht - 1) * src_strd + col];
3050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update masks based on the availability flags */
3080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
3090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
3110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
3130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[(wd - 1) >> 1] = 0;
3150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
3180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
3200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
3210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_sign_left_u = SIGN(pu1_src[0] - pu1_src_left[2 * row]);
3220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_sign_left_v = SIGN(pu1_src[1] - pu1_src_left[2 * row + 1]);
3230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
3240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
3250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
3260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pi1_sao_offset;
3270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 == col % 2)
3290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
3300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pi1_sao_offset = pi1_sao_offset_u;
3310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    u1_sign_right_u = SIGN(pu1_src[col] - pu1_src[col + 2]);
3320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    edge_idx = 2 + u1_sign_left_u + u1_sign_right_u;
3330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    u1_sign_left_u = -u1_sign_right_u;
3340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
3350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                else
3360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
3370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pi1_sao_offset = pi1_sao_offset_v;
3380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    u1_sign_right_v = SIGN(pu1_src[col] - pu1_src[col + 2]);
3390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    edge_idx = 2 + u1_sign_left_v + u1_sign_right_v;
3400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    u1_sign_left_v = -u1_sign_right_v;
3410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
3420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col >> 1];
3440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
3460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
3470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
3480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
3490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
3500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
3520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
3530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < 2 * ht; row++)
3560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
3580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
3610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* Vertical filtering */
3650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class1(UWORD8 *pu1_src,
3660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 src_strd,
3670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_left,
3680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top,
3690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_left,
3700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_right,
3710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_bot_left,
3720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_avail,
3730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset,
3740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 wd,
3750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 ht)
3760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
3770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
3780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
3790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_top_tmp[MAX_CTB_SIZE];
3800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE];
3810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
3820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
3830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
3840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
3850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_LUMA;
3870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
3890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
3900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
3910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
3920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    *pu1_src_top_left = pu1_src_top[wd - 1];
3930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
3940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = pu1_src[row * src_strd + wd - 1];
3960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
3970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
3980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
3990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
4000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update height and source pointers based on the availability flags */
4030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
4040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
4060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
4070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
4080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col - src_strd]);
4100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
4130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
4150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col]);
4170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
4200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
4220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
4250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
4270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
4280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
4290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
4300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
4310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - pu1_src[col + src_strd]);
4330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + au1_sign_up[col] + u1_sign_down;
4340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                au1_sign_up[col] = -u1_sign_down;
4350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col];
4370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
4390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
4400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
4410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
4420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
4430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
4450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
4460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
4490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
4510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
4540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* input 'wd' has to be for the interleaved block and not for each color component */
4580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class1_chroma(UWORD8 *pu1_src,
4590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 src_strd,
4600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_left,
4610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top,
4620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_left,
4630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_right,
4640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_bot_left,
4650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_avail,
4660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_u,
4670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_v,
4680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 wd,
4690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 ht)
4700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
4710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
4720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
4730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_top_tmp[MAX_CTB_SIZE];
4740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE];
4750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
4760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
4770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
4780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
4790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_CHROMA;
4810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
4830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
4840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
4860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = pu1_src_top[wd - 2];
4870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[1] = pu1_src_top[wd - 1];
4880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
4890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[2 * row] = pu1_src[row * src_strd + wd - 2];
4910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[2 * row + 1] = pu1_src[row * src_strd + wd - 1];
4920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
4940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
4950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
4960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
4970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
4980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update height and source pointers based on the availability flags */
4990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
5000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
5020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
5030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
5040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col - src_strd]);
5060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
5090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd; col++)
5110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col]);
5130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
5160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
5180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
5210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
5230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
5240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
5250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
5260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
5270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pi1_sao_offset;
5280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi1_sao_offset = (0 == col % 2) ? pi1_sao_offset_u : pi1_sao_offset_v;
5300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - pu1_src[col + src_strd]);
5320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + au1_sign_up[col] + u1_sign_down;
5330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                au1_sign_up[col] = -u1_sign_down;
5340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col >> 1];
5360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
5380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
5390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
5400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
5410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
5420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
5440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
5450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
5480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
5500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
5530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* 135 degree filtering */
5570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class2(UWORD8 *pu1_src,
5580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 src_strd,
5590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_left,
5600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top,
5610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_left,
5620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_right,
5630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_bot_left,
5640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_avail,
5650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset,
5660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 wd,
5670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 ht)
5680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
5690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
5700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
5710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[MAX_CTB_SIZE], au1_src_top_tmp[MAX_CTB_SIZE];
5720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_src_top_left_tmp;
5730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE + 1], au1_sign_up_tmp[MAX_CTB_SIZE + 1];
5740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
5750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 *pu1_sign_up;
5760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 *pu1_sign_up_tmp;
5770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 *pu1_src_left_cpy;
5780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
5800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_0_tmp;
5810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_ht_tmp;
5820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
5830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
5840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_LUMA;
5860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_sign_up = au1_sign_up;
5870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_sign_up_tmp = au1_sign_up_tmp;
5880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_left_cpy = pu1_src_left;
5890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
5910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
5920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
5930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
5940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    u1_src_top_left_tmp = pu1_src_top[wd - 1];
5950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
5960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
5970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[row] = pu1_src[row * src_strd + wd - 1];
5980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
5990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
6000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
6020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If top-left is available, process separately */
6060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[4])
6070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
6090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[0] - pu1_src_top_left[0]) +
6110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[0] - pu1_src[1 + src_strd]);
6120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
6140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
6160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp = CLIP3(pu1_src[0] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
6180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
6200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp = pu1_src[0];
6220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
6250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_0_tmp = pu1_src[0];
6270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If bottom-right is available, process separately */
6300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[7])
6310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
6330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 1 + (ht - 1) * src_strd] - pu1_src[wd - 1 + (ht - 1) * src_strd - 1 - src_strd]) +
6350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 1 + (ht - 1) * src_strd] - pu1_src[wd - 1 + (ht - 1) * src_strd + 1 + src_strd]);
6360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
6380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
6400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp = CLIP3(pu1_src[wd - 1 + (ht - 1) * src_strd] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
6420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
6440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp = pu1_src[wd - 1 + (ht - 1) * src_strd];
6460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
6490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_ht_tmp = pu1_src[wd - 1 + (ht - 1) * src_strd];
6510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Left is not available */
6540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
6550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
6570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Top is not available */
6600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
6610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
6630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
6640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left_cpy += 1;
6650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 1; col < wd; col++)
6660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col - 1 - src_strd]);
6680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
6710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 1; col < wd; col++)
6730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col - 1]);
6750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
6760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Right is not available */
6790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
6800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[wd - 1] = 0;
6820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Bottom is not available */
6850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
6860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
6880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
6890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
6910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
6920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
6930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
6940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[0] = SIGN(pu1_src[0] - pu1_src_left_cpy[row - 1]);
6950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
6960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
6970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
6980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
6990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - pu1_src[col + 1 + src_strd]);
7000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + pu1_sign_up[col] + u1_sign_down;
7010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up_tmp[col + 1] = -u1_sign_down;
7020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col];
7040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
7060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
7070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
7080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
7090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
7100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Swapping pu1_sign_up_tmp and pu1_sign_up */
7120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
7130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pu1_swap_tmp = pu1_sign_up;
7140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up = pu1_sign_up_tmp;
7150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up_tmp = pu1_swap_tmp;
7160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
7170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
7190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
7200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd] = u1_pos_0_0_tmp;
7220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ? wd - 1 - src_strd : wd - 1)] = u1_pos_wd_ht_tmp;
7230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
7240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
7260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
7270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
7280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
7290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    *pu1_src_top_left = u1_src_top_left_tmp;
7300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
7310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
7320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
7330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
7340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
7350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
7360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
7370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
7380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
7400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* 135 degree filtering */
7450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class2_chroma(UWORD8 *pu1_src,
7460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 src_strd,
7470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_left,
7480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top,
7490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_left,
7500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_right,
7510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_bot_left,
7520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_avail,
7530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_u,
7540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_v,
7550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 wd,
7560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 ht)
7570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
7580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
7590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
7600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[2 * MAX_CTB_SIZE], au1_src_top_tmp[MAX_CTB_SIZE];
7610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_top_left_tmp[2];
7620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE + 2], au1_sign_up_tmp[MAX_CTB_SIZE + 2];
7630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
7640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 *pu1_sign_up;
7650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 *pu1_sign_up_tmp;
7660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 *pu1_src_left_cpy;
7670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
7690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_0_tmp_u;
7710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_0_tmp_v;
7720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_ht_tmp_u;
7730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_ht_tmp_v;
7740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_top_right);
7750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UNUSED(pu1_src_bot_left);
7760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_CHROMA;
7790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_sign_up = au1_sign_up;
7800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_sign_up_tmp = au1_sign_up_tmp;
7810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_left_cpy = pu1_src_left;
7820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
7840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
7850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
7870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    au1_src_top_left_tmp[0] = pu1_src_top[wd - 2];
7880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    au1_src_top_left_tmp[1] = pu1_src_top[wd - 1];
7890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
7900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
7910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row] = pu1_src[row * src_strd + wd - 2];
7920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row + 1] = pu1_src[row * src_strd + wd - 1];
7930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
7940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
7950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
7960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
7970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
7980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
7990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If top-left is available, process separately */
8010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[4])
8020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
8040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* U */
8060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[0] - pu1_src_top_left[0]) +
8070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[0] - pu1_src[2 + src_strd]);
8080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
8100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
8120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp_u = CLIP3(pu1_src[0] + pi1_sao_offset_u[edge_idx], 0, (1 << bit_depth) - 1);
8140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
8160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp_u = pu1_src[0];
8180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* V */
8210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[1] - pu1_src_top_left[1]) +
8220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[1] - pu1_src[1 + 2 + src_strd]);
8230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
8250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
8270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp_v = CLIP3(pu1_src[1] + pi1_sao_offset_v[edge_idx], 0, (1 << bit_depth) - 1);
8290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
8310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_0_tmp_v = pu1_src[1];
8330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
8360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_0_tmp_u = pu1_src[0];
8380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_0_tmp_v = pu1_src[1];
8390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If bottom-right is available, process separately */
8420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[7])
8430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
8450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* U */
8470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 2 + (ht - 1) * src_strd] - pu1_src[wd - 2 + (ht - 1) * src_strd - 2 - src_strd]) +
8480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 2 + (ht - 1) * src_strd] - pu1_src[wd - 2 + (ht - 1) * src_strd + 2 + src_strd]);
8490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
8510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
8530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp_u = CLIP3(pu1_src[wd - 2 + (ht - 1) * src_strd] + pi1_sao_offset_u[edge_idx], 0, (1 << bit_depth) - 1);
8550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
8570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp_u = pu1_src[wd - 2 + (ht - 1) * src_strd];
8590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* V */
8620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 1 + (ht - 1) * src_strd] - pu1_src[wd - 1 + (ht - 1) * src_strd - 2 - src_strd]) +
8630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 1 + (ht - 1) * src_strd] - pu1_src[wd - 1 + (ht - 1) * src_strd + 2 + src_strd]);
8640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
8660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
8680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp_v = CLIP3(pu1_src[wd - 1 + (ht - 1) * src_strd] + pi1_sao_offset_v[edge_idx], 0, (1 << bit_depth) - 1);
8700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
8720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_ht_tmp_v = pu1_src[wd - 1 + (ht - 1) * src_strd];
8740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
8770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_ht_tmp_u = pu1_src[wd - 2 + (ht - 1) * src_strd];
8790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_ht_tmp_v = pu1_src[wd - 1 + (ht - 1) * src_strd];
8800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Left is not available */
8830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
8840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
8860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
8880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Top is not available */
8890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
8900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
8910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
8920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left_cpy += 2;
8930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
8940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 2; col < wd; col++)
8950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
8960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col - 2 - src_strd]);
8970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
8980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
8990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
9000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 2; col < wd; col++)
9020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
9030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col - 2]);
9040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
9050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Right is not available */
9080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
9090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[(wd - 1) >> 1] = 0;
9110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Bottom is not available */
9140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
9150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
9170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
9200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
9220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
9230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[0] = SIGN(pu1_src[0] - pu1_src_left_cpy[2 * (row - 1)]);
9240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_sign_up[1] = SIGN(pu1_src[1] - pu1_src_left_cpy[2 * (row - 1) + 1]);
9250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
9260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
9270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
9280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pi1_sao_offset;
9290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi1_sao_offset = (0 == col % 2) ? pi1_sao_offset_u : pi1_sao_offset_v;
9310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - pu1_src[col + 2 + src_strd]);
9330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + pu1_sign_up[col] + u1_sign_down;
9340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up_tmp[col + 2] = -u1_sign_down;
9350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col >> 1];
9370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
9390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
9400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
9410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
9420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
9430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            /* Swapping pu1_sign_up_tmp and pu1_sign_up */
9450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
9460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pu1_swap_tmp = pu1_sign_up;
9470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up = pu1_sign_up_tmp;
9480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pu1_sign_up_tmp = pu1_swap_tmp;
9490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
9500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
9520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
9530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd] = u1_pos_0_0_tmp_u;
9550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd + 1] = u1_pos_0_0_tmp_v;
9560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ? wd - 2 - src_strd : wd - 2)] = u1_pos_wd_ht_tmp_u;
9570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ? wd - 1 - src_strd : wd - 1)] = u1_pos_wd_ht_tmp_v;
9580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
9610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
9620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
9630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
9640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = au1_src_top_left_tmp[0];
9650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[1] = au1_src_top_left_tmp[1];
9660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < 2 * ht; row++)
9670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
9690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
9710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
9720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
9730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
9740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
9760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
9800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* 45 degree filtering */
9810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class3(UWORD8 *pu1_src,
9820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 src_strd,
9830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_left,
9840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top,
9850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_left,
9860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_top_right,
9870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_src_bot_left,
9880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  UWORD8 *pu1_avail,
9890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD8 *pi1_sao_offset,
9900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 wd,
9910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                  WORD32 ht)
9920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
9930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
9940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
9950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_top_tmp[MAX_CTB_SIZE];
9960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[MAX_CTB_SIZE];
9970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_src_top_left_tmp;
9980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE];
9990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 *pu1_src_left_cpy;
10000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
10010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
10020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_ht_tmp;
10040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_0_tmp;
10050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_LUMA;
10070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_left_cpy = pu1_src_left;
10080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
10100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
10110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
10130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    u1_src_top_left_tmp = pu1_src_top[wd - 1];
10140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
10150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[row] = pu1_src[row * src_strd + wd - 1];
10170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
10190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
10210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If top-right is available, process separately */
10240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[5])
10250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
10270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 1] - pu1_src_top_right[0]) +
10290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 1] - pu1_src[wd - 1 - 1 + src_strd]);
10300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
10320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
10340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp = CLIP3(pu1_src[wd - 1] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
10360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
10380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp = pu1_src[wd - 1];
10400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
10430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_0_tmp = pu1_src[wd - 1];
10450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If bottom-left is available, process separately */
10480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[6])
10490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
10510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[(ht - 1) * src_strd] - pu1_src[(ht - 1) * src_strd + 1 - src_strd]) +
10530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[(ht - 1) * src_strd] - pu1_src_bot_left[0]);
10540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
10560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
10580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp = CLIP3(pu1_src[(ht - 1) * src_strd] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
10600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
10620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp = pu1_src[(ht - 1) * src_strd];
10640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
10670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_ht_tmp = pu1_src[(ht - 1) * src_strd];
10690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Left is not available */
10720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
10730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
10750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Top is not available */
10780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
10790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
10810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
10820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left_cpy += 1;
10830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd - 1; col++)
10840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col + 1 - src_strd]);
10860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
10890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd - 1; col++)
10910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
10920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col + 1]);
10930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
10940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
10950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
10960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Right is not available */
10970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
10980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
10990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[wd - 1] = 0;
11000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Bottom is not available */
11030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
11040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
11050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
11060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
11090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
11100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
11110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
11120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[wd - 1] = SIGN(pu1_src[wd - 1] - pu1_src[wd - 1 + 1 - src_strd]);
11130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
11140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
11150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
11160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - ((col == 0) ? pu1_src_left_cpy[row + 1] :
11180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                 pu1_src[col - 1 + src_strd]));
11190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + au1_sign_up[col] + u1_sign_down;
11200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(col > 0)
11210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    au1_sign_up[col - 1] = -u1_sign_down;
11220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col];
11240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
11260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
11270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
11280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
11290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
11300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
11320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
11330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd + wd - 1] = u1_pos_wd_0_tmp;
11350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ?  (-src_strd) : 0)] = u1_pos_0_ht_tmp;
11360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
11390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
11400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
11410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
11420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    *pu1_src_top_left = u1_src_top_left_tmp;
11430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
11440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
11450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
11460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
11480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
11490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
11500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
11530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarvoid ihevc_sao_edge_offset_class3_chroma(UWORD8 *pu1_src,
11580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 src_strd,
11590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_left,
11600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top,
11610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_left,
11620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_top_right,
11630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_src_bot_left,
11640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         UWORD8 *pu1_avail,
11650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_u,
11660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD8 *pi1_sao_offset_v,
11670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 wd,
11680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                         WORD32 ht)
11690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{
11700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 row, col;
11710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_mask[MAX_CTB_SIZE];
11720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_left_tmp[2 * MAX_CTB_SIZE], au1_src_top_tmp[MAX_CTB_SIZE];
11730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 au1_src_top_left_tmp[2];
11740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 au1_sign_up[MAX_CTB_SIZE];
11750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 *pu1_src_left_cpy;
11760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD8 u1_sign_down;
11770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    WORD32 bit_depth;
11780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_0_tmp_u;
11800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_wd_0_tmp_v;
11810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_ht_tmp_u;
11820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    UWORD8 u1_pos_0_ht_tmp_v;
11830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    bit_depth = BIT_DEPTH_CHROMA;
11850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_left_cpy = pu1_src_left;
11860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Initialize the mask values */
11880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    memset(au1_mask, 0xFF, MAX_CTB_SIZE);
11890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
11900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Update left, top and top-left arrays */
11910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    au1_src_top_left_tmp[0] = pu1_src_top[wd - 2];
11920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    au1_src_top_left_tmp[1] = pu1_src_top[wd - 1];
11930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < ht; row++)
11940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
11950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row] = pu1_src[row * src_strd + wd - 2];
11960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_left_tmp[2 * row + 1] = pu1_src[row * src_strd + wd - 1];
11970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
11980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
11990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_src_top_tmp[col] = pu1_src[(ht - 1) * src_strd + col];
12010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If top-right is available, process separately */
12050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[5])
12060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
12080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* U */
12100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 2] - pu1_src_top_right[0]) +
12110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 2] - pu1_src[wd - 2 - 2 + src_strd]);
12120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
12140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
12160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp_u = CLIP3(pu1_src[wd - 2] + pi1_sao_offset_u[edge_idx], 0, (1 << bit_depth) - 1);
12180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
12200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp_u = pu1_src[wd - 2];
12220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* V */
12250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[wd - 1] - pu1_src_top_right[1]) +
12260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[wd - 1] - pu1_src[wd - 1 - 2 + src_strd]);
12270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
12290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
12310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp_v = CLIP3(pu1_src[wd - 1] + pi1_sao_offset_v[edge_idx], 0, (1 << bit_depth) - 1);
12330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
12350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_wd_0_tmp_v = pu1_src[wd - 1];
12370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
12400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_0_tmp_u = pu1_src[wd - 2];
12420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_wd_0_tmp_v = pu1_src[wd - 1];
12430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If bottom-left is available, process separately */
12460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 != pu1_avail[6])
12470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        WORD32 edge_idx;
12490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* U */
12510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[(ht - 1) * src_strd] - pu1_src[(ht - 1) * src_strd + 2 - src_strd]) +
12520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[(ht - 1) * src_strd] - pu1_src_bot_left[0]);
12530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
12550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
12570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp_u = CLIP3(pu1_src[(ht - 1) * src_strd] + pi1_sao_offset_u[edge_idx], 0, (1 << bit_depth) - 1);
12590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
12610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp_u = pu1_src[(ht - 1) * src_strd];
12630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        /* V */
12660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = 2 + SIGN(pu1_src[(ht - 1) * src_strd + 1] - pu1_src[(ht - 1) * src_strd + 1 + 2 - src_strd]) +
12670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                        SIGN(pu1_src[(ht - 1) * src_strd + 1] - pu1_src_bot_left[1]);
12680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        edge_idx = gi4_ihevc_table_edge_idx[edge_idx];
12700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        if(0 != edge_idx)
12720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp_v = CLIP3(pu1_src[(ht - 1) * src_strd + 1] + pi1_sao_offset_v[edge_idx], 0, (1 << bit_depth) - 1);
12740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        else
12760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
12770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            u1_pos_0_ht_tmp_v = pu1_src[(ht - 1) * src_strd + 1];
12780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
12790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
12810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_ht_tmp_u = pu1_src[(ht - 1) * src_strd];
12830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        u1_pos_0_ht_tmp_v = pu1_src[(ht - 1) * src_strd + 1];
12840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Left is not available */
12870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[0])
12880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[0] = 0;
12900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
12910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
12920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Top is not available */
12930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
12940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
12950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src += src_strd;
12960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
12970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left_cpy += 2;
12980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd - 2; col++)
12990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
13000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src[col + 2 - src_strd]);
13010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
13020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    else
13040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(col = 0; col < wd - 2; col++)
13060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
13070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[col] = SIGN(pu1_src[col] - pu1_src_top[col + 2]);
13080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
13090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Right is not available */
13120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[1])
13130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        au1_mask[(wd - 1) >> 1] = 0;
13150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* If Bottom is not available */
13180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
13190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht--;
13210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    /* Processing is done on the intermediate buffer and the output is written to the source buffer */
13240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        for(row = 0; row < ht; row++)
13260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        {
13270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[wd - 2] = SIGN(pu1_src[wd - 2] - pu1_src[wd - 2 + 2 - src_strd]);
13280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            au1_sign_up[wd - 1] = SIGN(pu1_src[wd - 1] - pu1_src[wd - 1 + 2 - src_strd]);
13290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            for(col = 0; col < wd; col++)
13300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            {
13310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD32 edge_idx;
13320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                WORD8 *pi1_sao_offset;
13330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                pi1_sao_offset = (0 == col % 2) ? pi1_sao_offset_u : pi1_sao_offset_v;
13350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                u1_sign_down = SIGN(pu1_src[col] - ((col < 2) ? pu1_src_left_cpy[2 * (row + 1) + col] :
13370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                                                                pu1_src[col - 2 + src_strd]));
13380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = 2 + au1_sign_up[col] + u1_sign_down;
13390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(col > 1)
13400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    au1_sign_up[col - 2] = -u1_sign_down;
13410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                edge_idx = gi4_ihevc_table_edge_idx[edge_idx] & au1_mask[col >> 1];
13430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                if(0 != edge_idx)
13450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                {
13460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                    pu1_src[col] = CLIP3(pu1_src[col] + pi1_sao_offset[edge_idx], 0, (1 << bit_depth) - 1);
13470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar                }
13480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            }
13490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar            pu1_src += src_strd;
13510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        }
13520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd + wd - 2] = u1_pos_wd_0_tmp_u;
13540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[-(pu1_avail[2] ? ht : ht + 1) * src_strd + wd - 1] = u1_pos_wd_0_tmp_v;
13550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ?  (-src_strd) : 0)] = u1_pos_0_ht_tmp_u;
13560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src[(pu1_avail[3] ?  (-src_strd) : 0) + 1] = u1_pos_0_ht_tmp_v;
13570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[2])
13600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
13610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    if(0 == pu1_avail[3])
13620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        ht++;
13630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[0] = au1_src_top_left_tmp[0];
13640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    pu1_src_top_left[1] = au1_src_top_left_tmp[1];
13650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(row = 0; row < 2 * ht; row++)
13660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_left[row] = au1_src_left_tmp[row];
13680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    for(col = 0; col < wd; col++)
13700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    {
13710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar        pu1_src_top[col] = au1_src_top_tmp[col];
13720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar    }
13730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar
13740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar}
1375