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