1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar * ihevc_sao.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar * Contains function definitions for sample adaptive offset process
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar * Srinivas T
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar * None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar
37*c83a76b0SSuyog Pawar #include <stdio.h>
38*c83a76b0SSuyog Pawar #include <stddef.h>
39*c83a76b0SSuyog Pawar #include <stdlib.h>
40*c83a76b0SSuyog Pawar #include <string.h>
41*c83a76b0SSuyog Pawar #include <assert.h>
42*c83a76b0SSuyog Pawar
43*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
44*c83a76b0SSuyog Pawar #include "iv.h"
45*c83a76b0SSuyog Pawar #include "ivd.h"
46*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
47*c83a76b0SSuyog Pawar #include "ithread.h"
48*c83a76b0SSuyog Pawar
49*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
50*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
51*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
53*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
54*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
55*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
56*c83a76b0SSuyog Pawar #include "ihevc_sao.h"
57*c83a76b0SSuyog Pawar #include "ihevc_mem_fns.h"
58*c83a76b0SSuyog Pawar
59*c83a76b0SSuyog Pawar #include "ihevc_error.h"
60*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
61*c83a76b0SSuyog Pawar
62*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
63*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_utils.h"
71*c83a76b0SSuyog Pawar
72*c83a76b0SSuyog Pawar #include "ihevc_deblk.h"
73*c83a76b0SSuyog Pawar #include "ihevc_deblk_tables.h"
74*c83a76b0SSuyog Pawar #include "ihevcd_profile.h"
75*c83a76b0SSuyog Pawar #include "ihevcd_sao.h"
76*c83a76b0SSuyog Pawar #include "ihevcd_debug.h"
77*c83a76b0SSuyog Pawar
78*c83a76b0SSuyog Pawar #define SAO_SHIFT_CTB 8
79*c83a76b0SSuyog Pawar
80*c83a76b0SSuyog Pawar /**
81*c83a76b0SSuyog Pawar * SAO at CTB level is implemented for a shifted CTB(8 pixels in x and y directions)
82*c83a76b0SSuyog Pawar */
ihevcd_sao_ctb(sao_ctxt_t * ps_sao_ctxt)83*c83a76b0SSuyog Pawar void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt)
84*c83a76b0SSuyog Pawar {
85*c83a76b0SSuyog Pawar codec_t *ps_codec = ps_sao_ctxt->ps_codec;
86*c83a76b0SSuyog Pawar UWORD8 *pu1_src_luma;
87*c83a76b0SSuyog Pawar UWORD8 *pu1_src_chroma;
88*c83a76b0SSuyog Pawar WORD32 src_strd;
89*c83a76b0SSuyog Pawar WORD32 ctb_size;
90*c83a76b0SSuyog Pawar WORD32 log2_ctb_size;
91*c83a76b0SSuyog Pawar sps_t *ps_sps;
92*c83a76b0SSuyog Pawar sao_t *ps_sao;
93*c83a76b0SSuyog Pawar WORD32 row, col;
94*c83a76b0SSuyog Pawar UWORD8 au1_avail_luma[8];
95*c83a76b0SSuyog Pawar UWORD8 au1_avail_chroma[8];
96*c83a76b0SSuyog Pawar WORD32 i;
97*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_luma;
98*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_chroma;
99*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left_luma;
100*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left_chroma;
101*c83a76b0SSuyog Pawar UWORD8 au1_src_top_right[2];
102*c83a76b0SSuyog Pawar UWORD8 au1_src_bot_left[2];
103*c83a76b0SSuyog Pawar UWORD8 *pu1_no_loop_filter_flag;
104*c83a76b0SSuyog Pawar WORD32 loop_filter_strd;
105*c83a76b0SSuyog Pawar
106*c83a76b0SSuyog Pawar /* Only first 5 values are used, but arrays are large
107*c83a76b0SSuyog Pawar enough so that SIMD functions can read 64 bits at a time */
108*c83a76b0SSuyog Pawar WORD8 ai1_offset_y[8] = {0};
109*c83a76b0SSuyog Pawar WORD8 ai1_offset_cb[8] = {0};
110*c83a76b0SSuyog Pawar WORD8 ai1_offset_cr[8] = {0};
111*c83a76b0SSuyog Pawar
112*c83a76b0SSuyog Pawar PROFILE_DISABLE_SAO();
113*c83a76b0SSuyog Pawar
114*c83a76b0SSuyog Pawar ps_sps = ps_sao_ctxt->ps_sps;
115*c83a76b0SSuyog Pawar log2_ctb_size = ps_sps->i1_log2_ctb_size;
116*c83a76b0SSuyog Pawar ctb_size = (1 << log2_ctb_size);
117*c83a76b0SSuyog Pawar src_strd = ps_sao_ctxt->ps_codec->i4_strd;
118*c83a76b0SSuyog Pawar pu1_src_luma = ps_sao_ctxt->pu1_cur_pic_luma + ((ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sao_ctxt->ps_codec->i4_strd) << (log2_ctb_size));
119*c83a76b0SSuyog Pawar pu1_src_chroma = ps_sao_ctxt->pu1_cur_pic_chroma + ((ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sao_ctxt->ps_codec->i4_strd / 2) << (log2_ctb_size));
120*c83a76b0SSuyog Pawar
121*c83a76b0SSuyog Pawar ps_sao = ps_sao_ctxt->ps_pic_sao + ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sps->i2_pic_wd_in_ctb;
122*c83a76b0SSuyog Pawar loop_filter_strd = (ps_sps->i2_pic_width_in_luma_samples + 63) / 64;
123*c83a76b0SSuyog Pawar
124*c83a76b0SSuyog Pawar /* Current CTB */
125*c83a76b0SSuyog Pawar {
126*c83a76b0SSuyog Pawar WORD32 sao_wd_luma;
127*c83a76b0SSuyog Pawar WORD32 sao_wd_chroma;
128*c83a76b0SSuyog Pawar WORD32 sao_ht_luma;
129*c83a76b0SSuyog Pawar WORD32 sao_ht_chroma;
130*c83a76b0SSuyog Pawar
131*c83a76b0SSuyog Pawar WORD32 remaining_rows;
132*c83a76b0SSuyog Pawar WORD32 remaining_cols;
133*c83a76b0SSuyog Pawar
134*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
135*c83a76b0SSuyog Pawar sao_wd_luma = MIN(ctb_size, remaining_cols);
136*c83a76b0SSuyog Pawar sao_wd_chroma = MIN(ctb_size, remaining_cols);
137*c83a76b0SSuyog Pawar
138*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
139*c83a76b0SSuyog Pawar sao_ht_luma = MIN(ctb_size, remaining_rows);
140*c83a76b0SSuyog Pawar sao_ht_chroma = MIN(ctb_size, remaining_rows) / 2;
141*c83a76b0SSuyog Pawar
142*c83a76b0SSuyog Pawar pu1_src_top_luma = ps_sao_ctxt->pu1_sao_src_top_luma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
143*c83a76b0SSuyog Pawar pu1_src_top_chroma = ps_sao_ctxt->pu1_sao_src_top_chroma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
144*c83a76b0SSuyog Pawar pu1_src_left_luma = ps_sao_ctxt->pu1_sao_src_left_luma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
145*c83a76b0SSuyog Pawar pu1_src_left_chroma = ps_sao_ctxt->pu1_sao_src_left_chroma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
146*c83a76b0SSuyog Pawar
147*c83a76b0SSuyog Pawar pu1_no_loop_filter_flag = ps_sao_ctxt->pu1_pic_no_loop_filter_flag +
148*c83a76b0SSuyog Pawar ((ps_sao_ctxt->i4_ctb_y * ctb_size) / 8) * loop_filter_strd +
149*c83a76b0SSuyog Pawar ((ps_sao_ctxt->i4_ctb_x * ctb_size) / 64);
150*c83a76b0SSuyog Pawar
151*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
152*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
153*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
154*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
155*c83a76b0SSuyog Pawar
156*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
157*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
158*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
159*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
160*c83a76b0SSuyog Pawar
161*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
162*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
163*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
164*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
165*c83a76b0SSuyog Pawar
166*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
167*c83a76b0SSuyog Pawar {
168*c83a76b0SSuyog Pawar au1_avail_luma[i] = 255;
169*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 255;
170*c83a76b0SSuyog Pawar }
171*c83a76b0SSuyog Pawar
172*c83a76b0SSuyog Pawar
173*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
174*c83a76b0SSuyog Pawar {
175*c83a76b0SSuyog Pawar au1_avail_luma[0] = 0;
176*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
177*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
178*c83a76b0SSuyog Pawar
179*c83a76b0SSuyog Pawar au1_avail_chroma[0] = 0;
180*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
181*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
182*c83a76b0SSuyog Pawar }
183*c83a76b0SSuyog Pawar
184*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_wd_in_ctb - 1 == ps_sao_ctxt->i4_ctb_x)
185*c83a76b0SSuyog Pawar {
186*c83a76b0SSuyog Pawar au1_avail_luma[1] = 0;
187*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
188*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
189*c83a76b0SSuyog Pawar
190*c83a76b0SSuyog Pawar au1_avail_chroma[1] = 0;
191*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
192*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
193*c83a76b0SSuyog Pawar }
194*c83a76b0SSuyog Pawar
195*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
196*c83a76b0SSuyog Pawar {
197*c83a76b0SSuyog Pawar au1_avail_luma[2] = 0;
198*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
199*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
200*c83a76b0SSuyog Pawar
201*c83a76b0SSuyog Pawar au1_avail_chroma[2] = 0;
202*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
203*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
204*c83a76b0SSuyog Pawar }
205*c83a76b0SSuyog Pawar
206*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_ht_in_ctb - 1 == ps_sao_ctxt->i4_ctb_y)
207*c83a76b0SSuyog Pawar {
208*c83a76b0SSuyog Pawar au1_avail_luma[3] = 0;
209*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
210*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
211*c83a76b0SSuyog Pawar
212*c83a76b0SSuyog Pawar au1_avail_chroma[3] = 0;
213*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
214*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
215*c83a76b0SSuyog Pawar }
216*c83a76b0SSuyog Pawar
217*c83a76b0SSuyog Pawar
218*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_y_type_idx)
219*c83a76b0SSuyog Pawar {
220*c83a76b0SSuyog Pawar /* Update left, top and top-left */
221*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
222*c83a76b0SSuyog Pawar {
223*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
224*c83a76b0SSuyog Pawar }
225*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_luma_curr_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
226*c83a76b0SSuyog Pawar
227*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
228*c83a76b0SSuyog Pawar
229*c83a76b0SSuyog Pawar }
230*c83a76b0SSuyog Pawar else
231*c83a76b0SSuyog Pawar {
232*c83a76b0SSuyog Pawar UWORD8 au1_src_copy[(MAX_CTB_SIZE + 2) * (MAX_CTB_SIZE + 2)];
233*c83a76b0SSuyog Pawar UWORD8 *pu1_src_copy = au1_src_copy + (MAX_CTB_SIZE + 2) + 1;
234*c83a76b0SSuyog Pawar WORD32 tmp_strd = MAX_CTB_SIZE + 2;
235*c83a76b0SSuyog Pawar WORD32 no_loop_filter_enabled = 0;
236*c83a76b0SSuyog Pawar
237*c83a76b0SSuyog Pawar /* Check the loop filter flags and copy the original values for back up */
238*c83a76b0SSuyog Pawar {
239*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
240*c83a76b0SSuyog Pawar WORD32 min_cu = 8;
241*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp = pu1_src_luma;
242*c83a76b0SSuyog Pawar
243*c83a76b0SSuyog Pawar for(i = 0; i < (sao_ht_luma + min_cu - 1) / min_cu; i++)
244*c83a76b0SSuyog Pawar {
245*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >>
246*c83a76b0SSuyog Pawar ((((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma) / 8) % 8);
247*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((sao_wd_luma + (min_cu - 1)) / min_cu)) - 1;
248*c83a76b0SSuyog Pawar
249*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
250*c83a76b0SSuyog Pawar {
251*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_wd_luma;
252*c83a76b0SSuyog Pawar no_loop_filter_enabled = 1;
253*c83a76b0SSuyog Pawar while(tmp_wd > 0)
254*c83a76b0SSuyog Pawar {
255*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
256*c83a76b0SSuyog Pawar {
257*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
258*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
259*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
260*c83a76b0SSuyog Pawar tmp_wd -= CTZ(u4_no_loop_filter_flag) * min_cu;
261*c83a76b0SSuyog Pawar }
262*c83a76b0SSuyog Pawar else
263*c83a76b0SSuyog Pawar {
264*c83a76b0SSuyog Pawar for(row = 0; row < MIN(min_cu, sao_ht_luma - (i - 1) * min_cu); row++)
265*c83a76b0SSuyog Pawar {
266*c83a76b0SSuyog Pawar for(col = 0; col < MIN((WORD32)CTZ(~u4_no_loop_filter_flag) * min_cu, tmp_wd); col++)
267*c83a76b0SSuyog Pawar {
268*c83a76b0SSuyog Pawar pu1_src_copy[row * src_strd + col] = pu1_src_tmp[row * tmp_strd + col];
269*c83a76b0SSuyog Pawar }
270*c83a76b0SSuyog Pawar }
271*c83a76b0SSuyog Pawar
272*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
273*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
274*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
275*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu);
276*c83a76b0SSuyog Pawar }
277*c83a76b0SSuyog Pawar }
278*c83a76b0SSuyog Pawar
279*c83a76b0SSuyog Pawar pu1_src_tmp -= sao_wd_luma;
280*c83a76b0SSuyog Pawar }
281*c83a76b0SSuyog Pawar
282*c83a76b0SSuyog Pawar pu1_src_tmp += min_cu * src_strd;
283*c83a76b0SSuyog Pawar pu1_src_copy += min_cu * tmp_strd;
284*c83a76b0SSuyog Pawar }
285*c83a76b0SSuyog Pawar }
286*c83a76b0SSuyog Pawar
287*c83a76b0SSuyog Pawar if(1 == ps_sao->b3_y_type_idx)
288*c83a76b0SSuyog Pawar {
289*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_luma_fptr(pu1_src_luma,
290*c83a76b0SSuyog Pawar src_strd,
291*c83a76b0SSuyog Pawar pu1_src_left_luma,
292*c83a76b0SSuyog Pawar pu1_src_top_luma,
293*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_luma_curr_ctb,
294*c83a76b0SSuyog Pawar ps_sao->b5_y_band_pos,
295*c83a76b0SSuyog Pawar ai1_offset_y,
296*c83a76b0SSuyog Pawar sao_wd_luma,
297*c83a76b0SSuyog Pawar sao_ht_luma);
298*c83a76b0SSuyog Pawar }
299*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_y_type_idx)
300*c83a76b0SSuyog Pawar {
301*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_luma[sao_wd_luma];
302*c83a76b0SSuyog Pawar au1_src_bot_left[0] = pu1_src_luma[sao_ht_luma * src_strd - 1];
303*c83a76b0SSuyog Pawar ps_codec->apf_sao_luma[ps_sao->b3_y_type_idx - 2](pu1_src_luma,
304*c83a76b0SSuyog Pawar src_strd,
305*c83a76b0SSuyog Pawar pu1_src_left_luma,
306*c83a76b0SSuyog Pawar pu1_src_top_luma,
307*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_luma_curr_ctb,
308*c83a76b0SSuyog Pawar au1_src_top_right,
309*c83a76b0SSuyog Pawar au1_src_bot_left,
310*c83a76b0SSuyog Pawar au1_avail_luma,
311*c83a76b0SSuyog Pawar ai1_offset_y,
312*c83a76b0SSuyog Pawar sao_wd_luma,
313*c83a76b0SSuyog Pawar sao_ht_luma);
314*c83a76b0SSuyog Pawar }
315*c83a76b0SSuyog Pawar
316*c83a76b0SSuyog Pawar /* Check the loop filter flags and copy the original values back if they are set */
317*c83a76b0SSuyog Pawar if(no_loop_filter_enabled)
318*c83a76b0SSuyog Pawar {
319*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
320*c83a76b0SSuyog Pawar WORD32 min_cu = 8;
321*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp = pu1_src_luma;
322*c83a76b0SSuyog Pawar
323*c83a76b0SSuyog Pawar for(i = 0; i < (sao_ht_luma + min_cu - 1) / min_cu; i++)
324*c83a76b0SSuyog Pawar {
325*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >> ((((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma) / 8) % 8);
326*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((sao_wd_luma + (min_cu - 1)) / min_cu)) - 1;
327*c83a76b0SSuyog Pawar
328*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
329*c83a76b0SSuyog Pawar {
330*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_wd_luma;
331*c83a76b0SSuyog Pawar while(tmp_wd > 0)
332*c83a76b0SSuyog Pawar {
333*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
334*c83a76b0SSuyog Pawar {
335*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
336*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
337*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
338*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu);
339*c83a76b0SSuyog Pawar }
340*c83a76b0SSuyog Pawar else
341*c83a76b0SSuyog Pawar {
342*c83a76b0SSuyog Pawar for(row = 0; row < MIN(min_cu, sao_ht_luma - (i - 1) * min_cu); row++)
343*c83a76b0SSuyog Pawar {
344*c83a76b0SSuyog Pawar for(col = 0; col < MIN((WORD32)CTZ(~u4_no_loop_filter_flag) * min_cu, tmp_wd); col++)
345*c83a76b0SSuyog Pawar {
346*c83a76b0SSuyog Pawar pu1_src_tmp[row * src_strd + col] = pu1_src_copy[row * tmp_strd + col];
347*c83a76b0SSuyog Pawar }
348*c83a76b0SSuyog Pawar }
349*c83a76b0SSuyog Pawar
350*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
351*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
352*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
353*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu);
354*c83a76b0SSuyog Pawar }
355*c83a76b0SSuyog Pawar }
356*c83a76b0SSuyog Pawar
357*c83a76b0SSuyog Pawar pu1_src_tmp -= sao_wd_luma;
358*c83a76b0SSuyog Pawar }
359*c83a76b0SSuyog Pawar
360*c83a76b0SSuyog Pawar pu1_src_tmp += min_cu * src_strd;
361*c83a76b0SSuyog Pawar pu1_src_copy += min_cu * tmp_strd;
362*c83a76b0SSuyog Pawar }
363*c83a76b0SSuyog Pawar }
364*c83a76b0SSuyog Pawar
365*c83a76b0SSuyog Pawar }
366*c83a76b0SSuyog Pawar
367*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_cb_type_idx)
368*c83a76b0SSuyog Pawar {
369*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
370*c83a76b0SSuyog Pawar {
371*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
372*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
373*c83a76b0SSuyog Pawar }
374*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_chroma_curr_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
375*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_chroma_curr_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
376*c83a76b0SSuyog Pawar
377*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
378*c83a76b0SSuyog Pawar }
379*c83a76b0SSuyog Pawar else
380*c83a76b0SSuyog Pawar {
381*c83a76b0SSuyog Pawar UWORD8 au1_src_copy[(MAX_CTB_SIZE + 4) * (MAX_CTB_SIZE + 2)];
382*c83a76b0SSuyog Pawar UWORD8 *pu1_src_copy = au1_src_copy + (MAX_CTB_SIZE + 4) + 2;
383*c83a76b0SSuyog Pawar WORD32 tmp_strd = MAX_CTB_SIZE + 4;
384*c83a76b0SSuyog Pawar WORD32 no_loop_filter_enabled = 0;
385*c83a76b0SSuyog Pawar
386*c83a76b0SSuyog Pawar /* Check the loop filter flags and copy the original values for back up */
387*c83a76b0SSuyog Pawar {
388*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
389*c83a76b0SSuyog Pawar WORD32 min_cu = 4;
390*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp = pu1_src_chroma;
391*c83a76b0SSuyog Pawar
392*c83a76b0SSuyog Pawar for(i = 0; i < (sao_ht_chroma + min_cu - 1) / min_cu; i++)
393*c83a76b0SSuyog Pawar {
394*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >> ((((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma) / 8) % 8);
395*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((sao_wd_chroma + (min_cu - 1)) / min_cu)) - 1;
396*c83a76b0SSuyog Pawar
397*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
398*c83a76b0SSuyog Pawar {
399*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_wd_chroma;
400*c83a76b0SSuyog Pawar no_loop_filter_enabled = 1;
401*c83a76b0SSuyog Pawar while(tmp_wd > 0)
402*c83a76b0SSuyog Pawar {
403*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
404*c83a76b0SSuyog Pawar {
405*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
406*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
407*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
408*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu);
409*c83a76b0SSuyog Pawar }
410*c83a76b0SSuyog Pawar else
411*c83a76b0SSuyog Pawar {
412*c83a76b0SSuyog Pawar for(row = 0; row < MIN(min_cu, sao_ht_chroma - (i - 1) * min_cu); row++)
413*c83a76b0SSuyog Pawar {
414*c83a76b0SSuyog Pawar for(col = 0; col < MIN((WORD32)CTZ(~u4_no_loop_filter_flag) * min_cu, tmp_wd); col++)
415*c83a76b0SSuyog Pawar {
416*c83a76b0SSuyog Pawar pu1_src_copy[row * src_strd + col] = pu1_src_tmp[row * tmp_strd + col];
417*c83a76b0SSuyog Pawar }
418*c83a76b0SSuyog Pawar }
419*c83a76b0SSuyog Pawar
420*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
421*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
422*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
423*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu);
424*c83a76b0SSuyog Pawar }
425*c83a76b0SSuyog Pawar }
426*c83a76b0SSuyog Pawar
427*c83a76b0SSuyog Pawar pu1_src_tmp -= sao_wd_chroma;
428*c83a76b0SSuyog Pawar }
429*c83a76b0SSuyog Pawar
430*c83a76b0SSuyog Pawar pu1_src_tmp += min_cu * src_strd;
431*c83a76b0SSuyog Pawar pu1_src_copy += min_cu * tmp_strd;
432*c83a76b0SSuyog Pawar }
433*c83a76b0SSuyog Pawar }
434*c83a76b0SSuyog Pawar
435*c83a76b0SSuyog Pawar if(1 == ps_sao->b3_cb_type_idx)
436*c83a76b0SSuyog Pawar {
437*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
438*c83a76b0SSuyog Pawar src_strd,
439*c83a76b0SSuyog Pawar pu1_src_left_chroma,
440*c83a76b0SSuyog Pawar pu1_src_top_chroma,
441*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_chroma_curr_ctb,
442*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
443*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
444*c83a76b0SSuyog Pawar ai1_offset_cb,
445*c83a76b0SSuyog Pawar ai1_offset_cr,
446*c83a76b0SSuyog Pawar sao_wd_chroma,
447*c83a76b0SSuyog Pawar sao_ht_chroma
448*c83a76b0SSuyog Pawar );
449*c83a76b0SSuyog Pawar }
450*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_cb_type_idx)
451*c83a76b0SSuyog Pawar {
452*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_chroma[sao_wd_chroma];
453*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_src_top_chroma[sao_wd_chroma + 1];
454*c83a76b0SSuyog Pawar au1_src_bot_left[0] = pu1_src_chroma[sao_ht_chroma * src_strd - 2];
455*c83a76b0SSuyog Pawar au1_src_bot_left[1] = pu1_src_chroma[sao_ht_chroma * src_strd - 1];
456*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
457*c83a76b0SSuyog Pawar src_strd,
458*c83a76b0SSuyog Pawar pu1_src_left_chroma,
459*c83a76b0SSuyog Pawar pu1_src_top_chroma,
460*c83a76b0SSuyog Pawar ps_sao_ctxt->pu1_sao_src_top_left_chroma_curr_ctb,
461*c83a76b0SSuyog Pawar au1_src_top_right,
462*c83a76b0SSuyog Pawar au1_src_bot_left,
463*c83a76b0SSuyog Pawar au1_avail_chroma,
464*c83a76b0SSuyog Pawar ai1_offset_cb,
465*c83a76b0SSuyog Pawar ai1_offset_cr,
466*c83a76b0SSuyog Pawar sao_wd_chroma,
467*c83a76b0SSuyog Pawar sao_ht_chroma);
468*c83a76b0SSuyog Pawar }
469*c83a76b0SSuyog Pawar
470*c83a76b0SSuyog Pawar /* Check the loop filter flags and copy the original values back if they are set */
471*c83a76b0SSuyog Pawar if(no_loop_filter_enabled)
472*c83a76b0SSuyog Pawar {
473*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
474*c83a76b0SSuyog Pawar WORD32 min_cu = 4;
475*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp = pu1_src_chroma;
476*c83a76b0SSuyog Pawar
477*c83a76b0SSuyog Pawar for(i = 0; i < (sao_ht_chroma + min_cu - 1) / min_cu; i++)
478*c83a76b0SSuyog Pawar {
479*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >> ((((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma) / 8) % 8);
480*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((sao_wd_chroma + (min_cu - 1)) / min_cu)) - 1;
481*c83a76b0SSuyog Pawar
482*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
483*c83a76b0SSuyog Pawar {
484*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_wd_chroma;
485*c83a76b0SSuyog Pawar while(tmp_wd > 0)
486*c83a76b0SSuyog Pawar {
487*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
488*c83a76b0SSuyog Pawar {
489*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
490*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
491*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd);
492*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu);
493*c83a76b0SSuyog Pawar }
494*c83a76b0SSuyog Pawar else
495*c83a76b0SSuyog Pawar {
496*c83a76b0SSuyog Pawar for(row = 0; row < MIN(min_cu, sao_ht_chroma - (i - 1) * min_cu); row++)
497*c83a76b0SSuyog Pawar {
498*c83a76b0SSuyog Pawar for(col = 0; col < MIN((WORD32)CTZ(~u4_no_loop_filter_flag) * min_cu, tmp_wd); col++)
499*c83a76b0SSuyog Pawar {
500*c83a76b0SSuyog Pawar pu1_src_tmp[row * src_strd + col] = pu1_src_copy[row * tmp_strd + col];
501*c83a76b0SSuyog Pawar }
502*c83a76b0SSuyog Pawar }
503*c83a76b0SSuyog Pawar
504*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
505*c83a76b0SSuyog Pawar pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
506*c83a76b0SSuyog Pawar pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd);
507*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu);
508*c83a76b0SSuyog Pawar }
509*c83a76b0SSuyog Pawar }
510*c83a76b0SSuyog Pawar
511*c83a76b0SSuyog Pawar pu1_src_tmp -= sao_wd_chroma;
512*c83a76b0SSuyog Pawar }
513*c83a76b0SSuyog Pawar
514*c83a76b0SSuyog Pawar pu1_src_tmp += min_cu * src_strd;
515*c83a76b0SSuyog Pawar pu1_src_copy += min_cu * tmp_strd;
516*c83a76b0SSuyog Pawar }
517*c83a76b0SSuyog Pawar }
518*c83a76b0SSuyog Pawar
519*c83a76b0SSuyog Pawar }
520*c83a76b0SSuyog Pawar
521*c83a76b0SSuyog Pawar }
522*c83a76b0SSuyog Pawar }
523*c83a76b0SSuyog Pawar
ihevcd_sao_shift_ctb(sao_ctxt_t * ps_sao_ctxt)524*c83a76b0SSuyog Pawar void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt)
525*c83a76b0SSuyog Pawar {
526*c83a76b0SSuyog Pawar codec_t *ps_codec = ps_sao_ctxt->ps_codec;
527*c83a76b0SSuyog Pawar UWORD8 *pu1_src_luma;
528*c83a76b0SSuyog Pawar UWORD8 *pu1_src_chroma;
529*c83a76b0SSuyog Pawar WORD32 src_strd;
530*c83a76b0SSuyog Pawar WORD32 ctb_size;
531*c83a76b0SSuyog Pawar WORD32 log2_ctb_size;
532*c83a76b0SSuyog Pawar sps_t *ps_sps;
533*c83a76b0SSuyog Pawar sao_t *ps_sao;
534*c83a76b0SSuyog Pawar pps_t *ps_pps;
535*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr, *ps_slice_hdr_base;
536*c83a76b0SSuyog Pawar tile_t *ps_tile;
537*c83a76b0SSuyog Pawar UWORD16 *pu1_slice_idx;
538*c83a76b0SSuyog Pawar UWORD16 *pu1_tile_idx;
539*c83a76b0SSuyog Pawar WORD32 row, col;
540*c83a76b0SSuyog Pawar UWORD8 au1_avail_luma[8];
541*c83a76b0SSuyog Pawar UWORD8 au1_avail_chroma[8];
542*c83a76b0SSuyog Pawar UWORD8 au1_tile_slice_boundary[8];
543*c83a76b0SSuyog Pawar UWORD8 au4_ilf_across_tile_slice_enable[8];
544*c83a76b0SSuyog Pawar WORD32 i;
545*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_luma;
546*c83a76b0SSuyog Pawar UWORD8 *pu1_src_top_chroma;
547*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left_luma;
548*c83a76b0SSuyog Pawar UWORD8 *pu1_src_left_chroma;
549*c83a76b0SSuyog Pawar UWORD8 au1_src_top_right[2];
550*c83a76b0SSuyog Pawar UWORD8 au1_src_bot_left[2];
551*c83a76b0SSuyog Pawar UWORD8 *pu1_no_loop_filter_flag;
552*c83a76b0SSuyog Pawar UWORD8 *pu1_src_backup_luma;
553*c83a76b0SSuyog Pawar UWORD8 *pu1_src_backup_chroma;
554*c83a76b0SSuyog Pawar WORD32 backup_strd;
555*c83a76b0SSuyog Pawar WORD32 loop_filter_strd;
556*c83a76b0SSuyog Pawar
557*c83a76b0SSuyog Pawar WORD32 no_loop_filter_enabled_luma = 0;
558*c83a76b0SSuyog Pawar WORD32 no_loop_filter_enabled_chroma = 0;
559*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_chroma_curr_ctb;
560*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_luma_curr_ctb;
561*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_luma_top_left_ctb;
562*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_chroma_top_left_ctb;
563*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_luma_top_right;
564*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_chroma_top_right;
565*c83a76b0SSuyog Pawar UWORD8 u1_sao_src_top_left_luma_bot_left;
566*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_luma_bot_left;
567*c83a76b0SSuyog Pawar UWORD8 *au1_sao_src_top_left_chroma_bot_left;
568*c83a76b0SSuyog Pawar UWORD8 *pu1_sao_src_top_left_chroma_bot_left;
569*c83a76b0SSuyog Pawar /* Only first 5 values are used, but arrays are large
570*c83a76b0SSuyog Pawar enough so that SIMD functions can read 64 bits at a time */
571*c83a76b0SSuyog Pawar WORD8 ai1_offset_y[8] = {0};
572*c83a76b0SSuyog Pawar WORD8 ai1_offset_cb[8] = {0};
573*c83a76b0SSuyog Pawar WORD8 ai1_offset_cr[8] = {0};
574*c83a76b0SSuyog Pawar WORD32 chroma_yuv420sp_vu = ps_sao_ctxt->is_chroma_yuv420sp_vu;
575*c83a76b0SSuyog Pawar
576*c83a76b0SSuyog Pawar PROFILE_DISABLE_SAO();
577*c83a76b0SSuyog Pawar
578*c83a76b0SSuyog Pawar ps_sps = ps_sao_ctxt->ps_sps;
579*c83a76b0SSuyog Pawar ps_pps = ps_sao_ctxt->ps_pps;
580*c83a76b0SSuyog Pawar ps_tile = ps_sao_ctxt->ps_tile;
581*c83a76b0SSuyog Pawar
582*c83a76b0SSuyog Pawar log2_ctb_size = ps_sps->i1_log2_ctb_size;
583*c83a76b0SSuyog Pawar ctb_size = (1 << log2_ctb_size);
584*c83a76b0SSuyog Pawar src_strd = ps_sao_ctxt->ps_codec->i4_strd;
585*c83a76b0SSuyog Pawar ps_slice_hdr_base = ps_sao_ctxt->ps_codec->ps_slice_hdr_base;
586*c83a76b0SSuyog Pawar ps_slice_hdr = ps_slice_hdr_base + (ps_sao_ctxt->i4_cur_slice_idx & (MAX_SLICE_HDR_CNT - 1));
587*c83a76b0SSuyog Pawar
588*c83a76b0SSuyog Pawar pu1_slice_idx = ps_sao_ctxt->pu1_slice_idx;
589*c83a76b0SSuyog Pawar pu1_tile_idx = ps_sao_ctxt->pu1_tile_idx;
590*c83a76b0SSuyog Pawar pu1_src_luma = ps_sao_ctxt->pu1_cur_pic_luma + ((ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sao_ctxt->ps_codec->i4_strd) << (log2_ctb_size));
591*c83a76b0SSuyog Pawar pu1_src_chroma = ps_sao_ctxt->pu1_cur_pic_chroma + ((ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sao_ctxt->ps_codec->i4_strd / 2) << (log2_ctb_size));
592*c83a76b0SSuyog Pawar
593*c83a76b0SSuyog Pawar /*Stores the left value for each row ctbs- Needed for column tiles*/
594*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb = ps_sao_ctxt->pu1_sao_src_top_left_luma_curr_ctb + ((ps_sao_ctxt->i4_ctb_y));
595*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb = ps_sao_ctxt->pu1_sao_src_top_left_chroma_curr_ctb + (2 * (ps_sao_ctxt->i4_ctb_y));
596*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb = ps_sao_ctxt->pu1_sao_src_luma_top_left_ctb + ((ps_sao_ctxt->i4_ctb_y));
597*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb = ps_sao_ctxt->pu1_sao_src_chroma_top_left_ctb + (2 * ps_sao_ctxt->i4_ctb_y);
598*c83a76b0SSuyog Pawar u1_sao_src_top_left_luma_bot_left = ps_sao_ctxt->u1_sao_src_top_left_luma_bot_left; // + ((ps_sao_ctxt->i4_ctb_y));
599*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_bot_left = ps_sao_ctxt->pu1_sao_src_top_left_luma_bot_left + ((ps_sao_ctxt->i4_ctb_y));
600*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left = ps_sao_ctxt->au1_sao_src_top_left_chroma_bot_left; // + (2 * ps_sao_ctxt->i4_ctb_y);
601*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_bot_left = ps_sao_ctxt->pu1_sao_src_top_left_chroma_bot_left + (2 * ps_sao_ctxt->i4_ctb_y);
602*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_top_right = ps_sao_ctxt->pu1_sao_src_top_left_luma_top_right + ((ps_sao_ctxt->i4_ctb_x));
603*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right = ps_sao_ctxt->pu1_sao_src_top_left_chroma_top_right + (2 * ps_sao_ctxt->i4_ctb_x);
604*c83a76b0SSuyog Pawar
605*c83a76b0SSuyog Pawar ps_sao = ps_sao_ctxt->ps_pic_sao + ps_sao_ctxt->i4_ctb_x + ps_sao_ctxt->i4_ctb_y * ps_sps->i2_pic_wd_in_ctb;
606*c83a76b0SSuyog Pawar loop_filter_strd = (ps_sps->i2_pic_width_in_luma_samples + 63) >> 6;
607*c83a76b0SSuyog Pawar backup_strd = 2 * MAX_CTB_SIZE;
608*c83a76b0SSuyog Pawar
609*c83a76b0SSuyog Pawar DEBUG_INIT_TMP_BUF(ps_sao_ctxt->pu1_tmp_buf_luma, ps_sao_ctxt->pu1_tmp_buf_chroma);
610*c83a76b0SSuyog Pawar
611*c83a76b0SSuyog Pawar {
612*c83a76b0SSuyog Pawar /* Check the loop filter flags and copy the original values for back up */
613*c83a76b0SSuyog Pawar /* Luma */
614*c83a76b0SSuyog Pawar
615*c83a76b0SSuyog Pawar /* Done unconditionally since SAO is done on a shifted CTB and the constituent CTBs
616*c83a76b0SSuyog Pawar * can belong to different slice with their own sao_enable flag */
617*c83a76b0SSuyog Pawar {
618*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
619*c83a76b0SSuyog Pawar WORD32 loop_filter_bit_pos;
620*c83a76b0SSuyog Pawar WORD32 log2_min_cu = 3;
621*c83a76b0SSuyog Pawar WORD32 min_cu = (1 << log2_min_cu);
622*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp_luma = pu1_src_luma;
623*c83a76b0SSuyog Pawar WORD32 sao_blk_ht = ctb_size - SAO_SHIFT_CTB;
624*c83a76b0SSuyog Pawar WORD32 sao_blk_wd = ctb_size;
625*c83a76b0SSuyog Pawar WORD32 remaining_rows;
626*c83a76b0SSuyog Pawar WORD32 remaining_cols;
627*c83a76b0SSuyog Pawar
628*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + ctb_size - SAO_SHIFT_CTB);
629*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + ctb_size - SAO_SHIFT_CTB);
630*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
631*c83a76b0SSuyog Pawar sao_blk_ht += remaining_rows;
632*c83a76b0SSuyog Pawar if(remaining_cols <= SAO_SHIFT_CTB)
633*c83a76b0SSuyog Pawar sao_blk_wd += remaining_cols;
634*c83a76b0SSuyog Pawar
635*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= ps_sao_ctxt->i4_ctb_x ? SAO_SHIFT_CTB : 0;
636*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB * src_strd : 0;
637*c83a76b0SSuyog Pawar
638*c83a76b0SSuyog Pawar pu1_src_backup_luma = ps_sao_ctxt->pu1_tmp_buf_luma;
639*c83a76b0SSuyog Pawar
640*c83a76b0SSuyog Pawar loop_filter_bit_pos = (ps_sao_ctxt->i4_ctb_x << (log2_ctb_size - 3)) +
641*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 3)) * (loop_filter_strd << 3);
642*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0)
643*c83a76b0SSuyog Pawar loop_filter_bit_pos -= 1;
644*c83a76b0SSuyog Pawar
645*c83a76b0SSuyog Pawar pu1_no_loop_filter_flag = ps_sao_ctxt->pu1_pic_no_loop_filter_flag +
646*c83a76b0SSuyog Pawar (loop_filter_bit_pos >> 3);
647*c83a76b0SSuyog Pawar
648*c83a76b0SSuyog Pawar for(i = -(ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB : 0) >> log2_min_cu;
649*c83a76b0SSuyog Pawar i < (sao_blk_ht + (min_cu - 1)) >> log2_min_cu; i++)
650*c83a76b0SSuyog Pawar {
651*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_blk_wd;
652*c83a76b0SSuyog Pawar
653*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >>
654*c83a76b0SSuyog Pawar (loop_filter_bit_pos & 7);
655*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((tmp_wd + (min_cu - 1)) >> log2_min_cu)) - 1;
656*c83a76b0SSuyog Pawar
657*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
658*c83a76b0SSuyog Pawar {
659*c83a76b0SSuyog Pawar no_loop_filter_enabled_luma = 1;
660*c83a76b0SSuyog Pawar while(tmp_wd > 0)
661*c83a76b0SSuyog Pawar {
662*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
663*c83a76b0SSuyog Pawar {
664*c83a76b0SSuyog Pawar pu1_src_tmp_luma += MIN((WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
665*c83a76b0SSuyog Pawar pu1_src_backup_luma += MIN((WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
666*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu);
667*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
668*c83a76b0SSuyog Pawar }
669*c83a76b0SSuyog Pawar else
670*c83a76b0SSuyog Pawar {
671*c83a76b0SSuyog Pawar for(row = 0; row < min_cu; row++)
672*c83a76b0SSuyog Pawar {
673*c83a76b0SSuyog Pawar for(col = 0; col < MIN((WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); col++)
674*c83a76b0SSuyog Pawar {
675*c83a76b0SSuyog Pawar pu1_src_backup_luma[row * backup_strd + col] = pu1_src_tmp_luma[row * src_strd + col];
676*c83a76b0SSuyog Pawar }
677*c83a76b0SSuyog Pawar }
678*c83a76b0SSuyog Pawar pu1_src_tmp_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
679*c83a76b0SSuyog Pawar pu1_src_backup_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
680*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu);
681*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
682*c83a76b0SSuyog Pawar }
683*c83a76b0SSuyog Pawar }
684*c83a76b0SSuyog Pawar
685*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= sao_blk_wd;
686*c83a76b0SSuyog Pawar pu1_src_backup_luma -= sao_blk_wd;
687*c83a76b0SSuyog Pawar }
688*c83a76b0SSuyog Pawar
689*c83a76b0SSuyog Pawar pu1_src_tmp_luma += (src_strd << log2_min_cu);
690*c83a76b0SSuyog Pawar pu1_src_backup_luma += (backup_strd << log2_min_cu);
691*c83a76b0SSuyog Pawar }
692*c83a76b0SSuyog Pawar }
693*c83a76b0SSuyog Pawar
694*c83a76b0SSuyog Pawar /* Chroma */
695*c83a76b0SSuyog Pawar
696*c83a76b0SSuyog Pawar {
697*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
698*c83a76b0SSuyog Pawar WORD32 loop_filter_bit_pos;
699*c83a76b0SSuyog Pawar WORD32 log2_min_cu = 3;
700*c83a76b0SSuyog Pawar WORD32 min_cu = (1 << log2_min_cu);
701*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp_chroma = pu1_src_chroma;
702*c83a76b0SSuyog Pawar WORD32 sao_blk_ht = ctb_size - 2 * SAO_SHIFT_CTB;
703*c83a76b0SSuyog Pawar WORD32 sao_blk_wd = ctb_size;
704*c83a76b0SSuyog Pawar WORD32 remaining_rows;
705*c83a76b0SSuyog Pawar WORD32 remaining_cols;
706*c83a76b0SSuyog Pawar
707*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + ctb_size - 2 * SAO_SHIFT_CTB);
708*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + ctb_size - 2 * SAO_SHIFT_CTB);
709*c83a76b0SSuyog Pawar if(remaining_rows <= 2 * SAO_SHIFT_CTB)
710*c83a76b0SSuyog Pawar sao_blk_ht += remaining_rows;
711*c83a76b0SSuyog Pawar if(remaining_cols <= 2 * SAO_SHIFT_CTB)
712*c83a76b0SSuyog Pawar sao_blk_wd += remaining_cols;
713*c83a76b0SSuyog Pawar
714*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= ps_sao_ctxt->i4_ctb_x ? SAO_SHIFT_CTB * 2 : 0;
715*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB * src_strd : 0;
716*c83a76b0SSuyog Pawar
717*c83a76b0SSuyog Pawar pu1_src_backup_chroma = ps_sao_ctxt->pu1_tmp_buf_chroma;
718*c83a76b0SSuyog Pawar
719*c83a76b0SSuyog Pawar loop_filter_bit_pos = (ps_sao_ctxt->i4_ctb_x << (log2_ctb_size - 3)) +
720*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 3)) * (loop_filter_strd << 3);
721*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0)
722*c83a76b0SSuyog Pawar loop_filter_bit_pos -= 2;
723*c83a76b0SSuyog Pawar
724*c83a76b0SSuyog Pawar pu1_no_loop_filter_flag = ps_sao_ctxt->pu1_pic_no_loop_filter_flag +
725*c83a76b0SSuyog Pawar (loop_filter_bit_pos >> 3);
726*c83a76b0SSuyog Pawar
727*c83a76b0SSuyog Pawar for(i = -(ps_sao_ctxt->i4_ctb_y ? 2 * SAO_SHIFT_CTB : 0) >> log2_min_cu;
728*c83a76b0SSuyog Pawar i < (sao_blk_ht + (min_cu - 1)) >> log2_min_cu; i++)
729*c83a76b0SSuyog Pawar {
730*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_blk_wd;
731*c83a76b0SSuyog Pawar
732*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >>
733*c83a76b0SSuyog Pawar (loop_filter_bit_pos & 7);
734*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((tmp_wd + (min_cu - 1)) >> log2_min_cu)) - 1;
735*c83a76b0SSuyog Pawar
736*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
737*c83a76b0SSuyog Pawar {
738*c83a76b0SSuyog Pawar no_loop_filter_enabled_chroma = 1;
739*c83a76b0SSuyog Pawar while(tmp_wd > 0)
740*c83a76b0SSuyog Pawar {
741*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
742*c83a76b0SSuyog Pawar {
743*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
744*c83a76b0SSuyog Pawar pu1_src_backup_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
745*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu);
746*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
747*c83a76b0SSuyog Pawar }
748*c83a76b0SSuyog Pawar else
749*c83a76b0SSuyog Pawar {
750*c83a76b0SSuyog Pawar for(row = 0; row < min_cu / 2; row++)
751*c83a76b0SSuyog Pawar {
752*c83a76b0SSuyog Pawar for(col = 0; col < MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); col++)
753*c83a76b0SSuyog Pawar {
754*c83a76b0SSuyog Pawar pu1_src_backup_chroma[row * backup_strd + col] = pu1_src_tmp_chroma[row * src_strd + col];
755*c83a76b0SSuyog Pawar }
756*c83a76b0SSuyog Pawar }
757*c83a76b0SSuyog Pawar
758*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
759*c83a76b0SSuyog Pawar pu1_src_backup_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
760*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu);
761*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
762*c83a76b0SSuyog Pawar }
763*c83a76b0SSuyog Pawar }
764*c83a76b0SSuyog Pawar
765*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= sao_blk_wd;
766*c83a76b0SSuyog Pawar pu1_src_backup_chroma -= sao_blk_wd;
767*c83a76b0SSuyog Pawar }
768*c83a76b0SSuyog Pawar
769*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += ((src_strd / 2) << log2_min_cu);
770*c83a76b0SSuyog Pawar pu1_src_backup_chroma += ((backup_strd / 2) << log2_min_cu);
771*c83a76b0SSuyog Pawar }
772*c83a76b0SSuyog Pawar }
773*c83a76b0SSuyog Pawar }
774*c83a76b0SSuyog Pawar
775*c83a76b0SSuyog Pawar DEBUG_PROCESS_TMP_BUF(ps_sao_ctxt->pu1_tmp_buf_luma, ps_sao_ctxt->pu1_tmp_buf_chroma);
776*c83a76b0SSuyog Pawar
777*c83a76b0SSuyog Pawar /* Top-left CTB */
778*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0 && ps_sao_ctxt->i4_ctb_y > 0)
779*c83a76b0SSuyog Pawar {
780*c83a76b0SSuyog Pawar WORD32 sao_wd_luma = SAO_SHIFT_CTB;
781*c83a76b0SSuyog Pawar WORD32 sao_wd_chroma = 2 * SAO_SHIFT_CTB;
782*c83a76b0SSuyog Pawar WORD32 sao_ht_luma = SAO_SHIFT_CTB;
783*c83a76b0SSuyog Pawar WORD32 sao_ht_chroma = SAO_SHIFT_CTB;
784*c83a76b0SSuyog Pawar
785*c83a76b0SSuyog Pawar WORD32 ctbx_tl_t = 0, ctbx_tl_l = 0, ctbx_tl_r = 0, ctbx_tl_d = 0, ctbx_tl = 0;
786*c83a76b0SSuyog Pawar WORD32 ctby_tl_t = 0, ctby_tl_l = 0, ctby_tl_r = 0, ctby_tl_d = 0, ctby_tl = 0;
787*c83a76b0SSuyog Pawar WORD32 au4_idx_tl[8], idx_tl;
788*c83a76b0SSuyog Pawar
789*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr_top_left;
790*c83a76b0SSuyog Pawar {
791*c83a76b0SSuyog Pawar WORD32 top_left_ctb_indx = (ps_sao_ctxt->i4_ctb_y - 1) * ps_sps->i2_pic_wd_in_ctb +
792*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_x - 1);
793*c83a76b0SSuyog Pawar ps_slice_hdr_top_left = ps_slice_hdr_base + pu1_slice_idx[top_left_ctb_indx];
794*c83a76b0SSuyog Pawar }
795*c83a76b0SSuyog Pawar
796*c83a76b0SSuyog Pawar
797*c83a76b0SSuyog Pawar pu1_src_luma -= (sao_wd_luma + sao_ht_luma * src_strd);
798*c83a76b0SSuyog Pawar pu1_src_chroma -= (sao_wd_chroma + sao_ht_chroma * src_strd);
799*c83a76b0SSuyog Pawar ps_sao -= (1 + ps_sps->i2_pic_wd_in_ctb);
800*c83a76b0SSuyog Pawar pu1_src_top_luma = ps_sao_ctxt->pu1_sao_src_top_luma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma;
801*c83a76b0SSuyog Pawar pu1_src_top_chroma = ps_sao_ctxt->pu1_sao_src_top_chroma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma;
802*c83a76b0SSuyog Pawar pu1_src_left_luma = ps_sao_ctxt->pu1_sao_src_left_luma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - sao_ht_luma;
803*c83a76b0SSuyog Pawar pu1_src_left_chroma = ps_sao_ctxt->pu1_sao_src_left_chroma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - (2 * sao_ht_chroma);
804*c83a76b0SSuyog Pawar
805*c83a76b0SSuyog Pawar if(ps_slice_hdr_top_left->i1_slice_sao_luma_flag)
806*c83a76b0SSuyog Pawar {
807*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_y_type_idx)
808*c83a76b0SSuyog Pawar {
809*c83a76b0SSuyog Pawar /* Update left, top and top-left */
810*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
811*c83a76b0SSuyog Pawar {
812*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
813*c83a76b0SSuyog Pawar }
814*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
815*c83a76b0SSuyog Pawar
816*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
817*c83a76b0SSuyog Pawar
818*c83a76b0SSuyog Pawar
819*c83a76b0SSuyog Pawar }
820*c83a76b0SSuyog Pawar
821*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_y_type_idx)
822*c83a76b0SSuyog Pawar {
823*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
824*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
825*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
826*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
827*c83a76b0SSuyog Pawar
828*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_luma_fptr(pu1_src_luma,
829*c83a76b0SSuyog Pawar src_strd,
830*c83a76b0SSuyog Pawar pu1_src_left_luma,
831*c83a76b0SSuyog Pawar pu1_src_top_luma,
832*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb,
833*c83a76b0SSuyog Pawar ps_sao->b5_y_band_pos,
834*c83a76b0SSuyog Pawar ai1_offset_y,
835*c83a76b0SSuyog Pawar sao_wd_luma,
836*c83a76b0SSuyog Pawar sao_ht_luma
837*c83a76b0SSuyog Pawar );
838*c83a76b0SSuyog Pawar }
839*c83a76b0SSuyog Pawar
840*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_y_type_idx)
841*c83a76b0SSuyog Pawar {
842*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
843*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
844*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
845*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
846*c83a76b0SSuyog Pawar
847*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
848*c83a76b0SSuyog Pawar {
849*c83a76b0SSuyog Pawar au1_avail_luma[i] = 255;
850*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
851*c83a76b0SSuyog Pawar au4_idx_tl[i] = 0;
852*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
853*c83a76b0SSuyog Pawar }
854*c83a76b0SSuyog Pawar
855*c83a76b0SSuyog Pawar /******************************************************************
856*c83a76b0SSuyog Pawar * Derive the Top-left CTB's neighbor pixel's slice indices.
857*c83a76b0SSuyog Pawar *
858*c83a76b0SSuyog Pawar * TL_T
859*c83a76b0SSuyog Pawar * 4 _2__5________
860*c83a76b0SSuyog Pawar * 0 | | |
861*c83a76b0SSuyog Pawar * TL_L | TL | 1 TL_R|
862*c83a76b0SSuyog Pawar * |____|_______|____
863*c83a76b0SSuyog Pawar * 6|TL_D|7 | |
864*c83a76b0SSuyog Pawar * | 3 | | |
865*c83a76b0SSuyog Pawar * |____|_______| |
866*c83a76b0SSuyog Pawar * | |
867*c83a76b0SSuyog Pawar * | |
868*c83a76b0SSuyog Pawar * |____________|
869*c83a76b0SSuyog Pawar *
870*c83a76b0SSuyog Pawar *****************************************************************/
871*c83a76b0SSuyog Pawar
872*c83a76b0SSuyog Pawar /*In case of slices, unless we encounter multiple slice/tiled clips, don't enter*/
873*c83a76b0SSuyog Pawar {
874*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
875*c83a76b0SSuyog Pawar {
876*c83a76b0SSuyog Pawar {
877*c83a76b0SSuyog Pawar /*Assuming that sao shift is uniform along x and y directions*/
878*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_luma) && (ps_sao_ctxt->i4_ctb_y > 1) && (ps_sao_ctxt->i4_ctb_x > 1))
879*c83a76b0SSuyog Pawar {
880*c83a76b0SSuyog Pawar ctby_tl_t = ps_sao_ctxt->i4_ctb_y - 2;
881*c83a76b0SSuyog Pawar ctbx_tl_l = ps_sao_ctxt->i4_ctb_x - 2;
882*c83a76b0SSuyog Pawar }
883*c83a76b0SSuyog Pawar else if(!(0 == (1 << log2_ctb_size) - sao_wd_luma))
884*c83a76b0SSuyog Pawar {
885*c83a76b0SSuyog Pawar ctby_tl_t = ps_sao_ctxt->i4_ctb_y - 1;
886*c83a76b0SSuyog Pawar ctbx_tl_l = ps_sao_ctxt->i4_ctb_x - 1;
887*c83a76b0SSuyog Pawar }
888*c83a76b0SSuyog Pawar ctbx_tl_t = ps_sao_ctxt->i4_ctb_x - 1;
889*c83a76b0SSuyog Pawar ctby_tl_l = ps_sao_ctxt->i4_ctb_y - 1;
890*c83a76b0SSuyog Pawar
891*c83a76b0SSuyog Pawar ctbx_tl_r = ps_sao_ctxt->i4_ctb_x;
892*c83a76b0SSuyog Pawar ctby_tl_r = ps_sao_ctxt->i4_ctb_y - 1;
893*c83a76b0SSuyog Pawar
894*c83a76b0SSuyog Pawar ctbx_tl_d = ps_sao_ctxt->i4_ctb_x - 1;
895*c83a76b0SSuyog Pawar ctby_tl_d = ps_sao_ctxt->i4_ctb_y;
896*c83a76b0SSuyog Pawar
897*c83a76b0SSuyog Pawar ctbx_tl = ps_sao_ctxt->i4_ctb_x - 1;
898*c83a76b0SSuyog Pawar ctby_tl = ps_sao_ctxt->i4_ctb_y - 1;
899*c83a76b0SSuyog Pawar }
900*c83a76b0SSuyog Pawar
901*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
902*c83a76b0SSuyog Pawar {
903*c83a76b0SSuyog Pawar /*Calculate slice indices for neighbor pixels*/
904*c83a76b0SSuyog Pawar idx_tl = pu1_slice_idx[ctbx_tl + (ctby_tl * ps_sps->i2_pic_wd_in_ctb)];
905*c83a76b0SSuyog Pawar au4_idx_tl[2] = au4_idx_tl[4] = *(pu1_slice_idx + ctbx_tl_t + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb));
906*c83a76b0SSuyog Pawar au4_idx_tl[0] = pu1_slice_idx[ctbx_tl_l + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
907*c83a76b0SSuyog Pawar au4_idx_tl[1] = au4_idx_tl[5] = pu1_slice_idx[ctbx_tl_r + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
908*c83a76b0SSuyog Pawar au4_idx_tl[3] = au4_idx_tl[6] = pu1_slice_idx[ctbx_tl_d + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
909*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_slice_idx[ctbx_tl_d + 1 + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
910*c83a76b0SSuyog Pawar
911*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_luma))
912*c83a76b0SSuyog Pawar {
913*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x == 1)
914*c83a76b0SSuyog Pawar {
915*c83a76b0SSuyog Pawar au4_idx_tl[6] = -1;
916*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
917*c83a76b0SSuyog Pawar }
918*c83a76b0SSuyog Pawar else
919*c83a76b0SSuyog Pawar {
920*c83a76b0SSuyog Pawar au4_idx_tl[6] = pu1_slice_idx[(ctbx_tl_d - 1) + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
921*c83a76b0SSuyog Pawar }
922*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_y == 1)
923*c83a76b0SSuyog Pawar {
924*c83a76b0SSuyog Pawar au4_idx_tl[5] = -1;
925*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
926*c83a76b0SSuyog Pawar }
927*c83a76b0SSuyog Pawar else
928*c83a76b0SSuyog Pawar {
929*c83a76b0SSuyog Pawar au4_idx_tl[5] = pu1_slice_idx[(ctbx_tl_l + 1) + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
930*c83a76b0SSuyog Pawar au4_idx_tl[4] = pu1_slice_idx[(ctbx_tl_t - 1) + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb)];
931*c83a76b0SSuyog Pawar }
932*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_slice_idx[(ctbx_tl_d + 1) + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
933*c83a76b0SSuyog Pawar }
934*c83a76b0SSuyog Pawar
935*c83a76b0SSuyog Pawar /* Verify that the neighbor ctbs dont cross pic boundary.
936*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
937*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags.
938*c83a76b0SSuyog Pawar * Hence, for top and left pixels, current ctb flag is checked. For right and down pixels,
939*c83a76b0SSuyog Pawar * the respective pixel's flags are checked
940*c83a76b0SSuyog Pawar */
941*c83a76b0SSuyog Pawar
942*c83a76b0SSuyog Pawar if((0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma))
943*c83a76b0SSuyog Pawar {
944*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
945*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
946*c83a76b0SSuyog Pawar }
947*c83a76b0SSuyog Pawar else
948*c83a76b0SSuyog Pawar {
949*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + au4_idx_tl[6])->i1_slice_loop_filter_across_slices_enabled_flag;
950*c83a76b0SSuyog Pawar }
951*c83a76b0SSuyog Pawar if((0 == (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - sao_ht_luma))
952*c83a76b0SSuyog Pawar {
953*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
954*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
955*c83a76b0SSuyog Pawar }
956*c83a76b0SSuyog Pawar else
957*c83a76b0SSuyog Pawar {
958*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
959*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
960*c83a76b0SSuyog Pawar }
961*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
962*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
963*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_tl[1])->i1_slice_loop_filter_across_slices_enabled_flag;
964*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_tl[3])->i1_slice_loop_filter_across_slices_enabled_flag;
965*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_tl[7])->i1_slice_loop_filter_across_slices_enabled_flag;
966*c83a76b0SSuyog Pawar
967*c83a76b0SSuyog Pawar if(au4_idx_tl[5] > idx_tl)
968*c83a76b0SSuyog Pawar {
969*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + au4_idx_tl[5])->i1_slice_loop_filter_across_slices_enabled_flag;
970*c83a76b0SSuyog Pawar }
971*c83a76b0SSuyog Pawar
972*c83a76b0SSuyog Pawar /*
973*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
974*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags.
975*c83a76b0SSuyog Pawar * Hence, for top and left pixels, current ctb flag is checked. For right and down pixels,
976*c83a76b0SSuyog Pawar * the respective pixel's flags are checked
977*c83a76b0SSuyog Pawar */
978*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
979*c83a76b0SSuyog Pawar {
980*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
981*c83a76b0SSuyog Pawar if(au4_idx_tl[i] != idx_tl)
982*c83a76b0SSuyog Pawar {
983*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
984*c83a76b0SSuyog Pawar }
985*c83a76b0SSuyog Pawar else
986*c83a76b0SSuyog Pawar {
987*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
988*c83a76b0SSuyog Pawar }
989*c83a76b0SSuyog Pawar }
990*c83a76b0SSuyog Pawar
991*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memset_mul_8_fptr((UWORD8 *)au4_idx_tl, 0, 8 * sizeof(WORD32));
992*c83a76b0SSuyog Pawar }
993*c83a76b0SSuyog Pawar
994*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
995*c83a76b0SSuyog Pawar {
996*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
997*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
998*c83a76b0SSuyog Pawar {
999*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
1000*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
1001*c83a76b0SSuyog Pawar {
1002*c83a76b0SSuyog Pawar /*Set the boundary arrays*/
1003*c83a76b0SSuyog Pawar /*Calculate tile indices for neighbor pixels*/
1004*c83a76b0SSuyog Pawar idx_tl = pu1_tile_idx[ctbx_tl + (ctby_tl * ps_sps->i2_pic_wd_in_ctb)];
1005*c83a76b0SSuyog Pawar au4_idx_tl[2] = au4_idx_tl[4] = *(pu1_tile_idx + ctbx_tl_t + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb));
1006*c83a76b0SSuyog Pawar au4_idx_tl[0] = pu1_tile_idx[ctbx_tl_l + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1007*c83a76b0SSuyog Pawar au4_idx_tl[1] = au4_idx_tl[5] = pu1_tile_idx[ctbx_tl_r + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1008*c83a76b0SSuyog Pawar au4_idx_tl[3] = au4_idx_tl[6] = pu1_tile_idx[ctbx_tl_d + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1009*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_tile_idx[ctbx_tl_d + 1 + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1010*c83a76b0SSuyog Pawar
1011*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_luma))
1012*c83a76b0SSuyog Pawar {
1013*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x == 1)
1014*c83a76b0SSuyog Pawar {
1015*c83a76b0SSuyog Pawar au4_idx_tl[6] = -1;
1016*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1017*c83a76b0SSuyog Pawar }
1018*c83a76b0SSuyog Pawar else
1019*c83a76b0SSuyog Pawar {
1020*c83a76b0SSuyog Pawar au4_idx_tl[6] = pu1_tile_idx[(ctbx_tl_d - 1) + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1021*c83a76b0SSuyog Pawar }
1022*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_y == 1)
1023*c83a76b0SSuyog Pawar {
1024*c83a76b0SSuyog Pawar au4_idx_tl[5] = -1;
1025*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1026*c83a76b0SSuyog Pawar }
1027*c83a76b0SSuyog Pawar else
1028*c83a76b0SSuyog Pawar {
1029*c83a76b0SSuyog Pawar au4_idx_tl[5] = pu1_tile_idx[(ctbx_tl_l + 1) + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1030*c83a76b0SSuyog Pawar au4_idx_tl[4] = pu1_tile_idx[(ctbx_tl_t - 1) + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb)];
1031*c83a76b0SSuyog Pawar }
1032*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_tile_idx[(ctbx_tl_d + 1) + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1033*c83a76b0SSuyog Pawar }
1034*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1035*c83a76b0SSuyog Pawar {
1036*c83a76b0SSuyog Pawar /*Sets the edges that lie on the tile boundary*/
1037*c83a76b0SSuyog Pawar if(au4_idx_tl[i] != idx_tl)
1038*c83a76b0SSuyog Pawar {
1039*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
1040*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag; //=0
1041*c83a76b0SSuyog Pawar }
1042*c83a76b0SSuyog Pawar }
1043*c83a76b0SSuyog Pawar }
1044*c83a76b0SSuyog Pawar }
1045*c83a76b0SSuyog Pawar }
1046*c83a76b0SSuyog Pawar
1047*c83a76b0SSuyog Pawar
1048*c83a76b0SSuyog Pawar /*Set availability flags based on tile and slice boundaries*/
1049*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1050*c83a76b0SSuyog Pawar {
1051*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1052*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
1053*c83a76b0SSuyog Pawar {
1054*c83a76b0SSuyog Pawar au1_avail_luma[i] = 0;
1055*c83a76b0SSuyog Pawar }
1056*c83a76b0SSuyog Pawar }
1057*c83a76b0SSuyog Pawar }
1058*c83a76b0SSuyog Pawar }
1059*c83a76b0SSuyog Pawar
1060*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma)
1061*c83a76b0SSuyog Pawar {
1062*c83a76b0SSuyog Pawar au1_avail_luma[0] = 0;
1063*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
1064*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
1065*c83a76b0SSuyog Pawar }
1066*c83a76b0SSuyog Pawar
1067*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_wd_in_ctb == ps_sao_ctxt->i4_ctb_x)
1068*c83a76b0SSuyog Pawar {
1069*c83a76b0SSuyog Pawar au1_avail_luma[1] = 0;
1070*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
1071*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
1072*c83a76b0SSuyog Pawar }
1073*c83a76b0SSuyog Pawar //y==1 case
1074*c83a76b0SSuyog Pawar if((0 == (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - sao_ht_luma))
1075*c83a76b0SSuyog Pawar {
1076*c83a76b0SSuyog Pawar au1_avail_luma[2] = 0;
1077*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
1078*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
1079*c83a76b0SSuyog Pawar }
1080*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_ht_in_ctb == ps_sao_ctxt->i4_ctb_y)
1081*c83a76b0SSuyog Pawar {
1082*c83a76b0SSuyog Pawar au1_avail_luma[3] = 0;
1083*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
1084*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
1085*c83a76b0SSuyog Pawar }
1086*c83a76b0SSuyog Pawar
1087*c83a76b0SSuyog Pawar {
1088*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_luma[sao_wd_luma];
1089*c83a76b0SSuyog Pawar u1_sao_src_top_left_luma_bot_left = pu1_src_left_luma[sao_ht_luma];
1090*c83a76b0SSuyog Pawar ps_codec->apf_sao_luma[ps_sao->b3_y_type_idx - 2](pu1_src_luma,
1091*c83a76b0SSuyog Pawar src_strd,
1092*c83a76b0SSuyog Pawar pu1_src_left_luma,
1093*c83a76b0SSuyog Pawar pu1_src_top_luma,
1094*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb,
1095*c83a76b0SSuyog Pawar au1_src_top_right,
1096*c83a76b0SSuyog Pawar &u1_sao_src_top_left_luma_bot_left,
1097*c83a76b0SSuyog Pawar au1_avail_luma,
1098*c83a76b0SSuyog Pawar ai1_offset_y,
1099*c83a76b0SSuyog Pawar sao_wd_luma,
1100*c83a76b0SSuyog Pawar sao_ht_luma);
1101*c83a76b0SSuyog Pawar }
1102*c83a76b0SSuyog Pawar }
1103*c83a76b0SSuyog Pawar
1104*c83a76b0SSuyog Pawar }
1105*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1106*c83a76b0SSuyog Pawar {
1107*c83a76b0SSuyog Pawar /* Update left, top and top-left */
1108*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
1109*c83a76b0SSuyog Pawar {
1110*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
1111*c83a76b0SSuyog Pawar }
1112*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
1113*c83a76b0SSuyog Pawar
1114*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
1115*c83a76b0SSuyog Pawar }
1116*c83a76b0SSuyog Pawar
1117*c83a76b0SSuyog Pawar if(ps_slice_hdr_top_left->i1_slice_sao_chroma_flag)
1118*c83a76b0SSuyog Pawar {
1119*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_cb_type_idx)
1120*c83a76b0SSuyog Pawar {
1121*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
1122*c83a76b0SSuyog Pawar {
1123*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
1124*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
1125*c83a76b0SSuyog Pawar }
1126*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
1127*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
1128*c83a76b0SSuyog Pawar
1129*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
1130*c83a76b0SSuyog Pawar
1131*c83a76b0SSuyog Pawar }
1132*c83a76b0SSuyog Pawar
1133*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_cb_type_idx)
1134*c83a76b0SSuyog Pawar {
1135*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
1136*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
1137*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
1138*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
1139*c83a76b0SSuyog Pawar
1140*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
1141*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
1142*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
1143*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
1144*c83a76b0SSuyog Pawar
1145*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
1146*c83a76b0SSuyog Pawar {
1147*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
1148*c83a76b0SSuyog Pawar src_strd,
1149*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1150*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1151*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1152*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
1153*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
1154*c83a76b0SSuyog Pawar ai1_offset_cr,
1155*c83a76b0SSuyog Pawar ai1_offset_cb,
1156*c83a76b0SSuyog Pawar sao_wd_chroma,
1157*c83a76b0SSuyog Pawar sao_ht_chroma
1158*c83a76b0SSuyog Pawar );
1159*c83a76b0SSuyog Pawar }
1160*c83a76b0SSuyog Pawar else
1161*c83a76b0SSuyog Pawar {
1162*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
1163*c83a76b0SSuyog Pawar src_strd,
1164*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1165*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1166*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1167*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
1168*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
1169*c83a76b0SSuyog Pawar ai1_offset_cb,
1170*c83a76b0SSuyog Pawar ai1_offset_cr,
1171*c83a76b0SSuyog Pawar sao_wd_chroma,
1172*c83a76b0SSuyog Pawar sao_ht_chroma
1173*c83a76b0SSuyog Pawar );
1174*c83a76b0SSuyog Pawar }
1175*c83a76b0SSuyog Pawar }
1176*c83a76b0SSuyog Pawar
1177*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_cb_type_idx)
1178*c83a76b0SSuyog Pawar {
1179*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
1180*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
1181*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
1182*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
1183*c83a76b0SSuyog Pawar
1184*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
1185*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
1186*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
1187*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
1188*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1189*c83a76b0SSuyog Pawar {
1190*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 255;
1191*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
1192*c83a76b0SSuyog Pawar au4_idx_tl[i] = 0;
1193*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1194*c83a76b0SSuyog Pawar }
1195*c83a76b0SSuyog Pawar /*In case of slices*/
1196*c83a76b0SSuyog Pawar {
1197*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_chroma) && (ps_sao_ctxt->i4_ctb_y > 1) && (ps_sao_ctxt->i4_ctb_x > 1))
1200*c83a76b0SSuyog Pawar {
1201*c83a76b0SSuyog Pawar ctby_tl_t = ps_sao_ctxt->i4_ctb_y - 2;
1202*c83a76b0SSuyog Pawar ctbx_tl_l = ps_sao_ctxt->i4_ctb_x - 2;
1203*c83a76b0SSuyog Pawar }
1204*c83a76b0SSuyog Pawar else if(!(0 == (1 << log2_ctb_size) - sao_wd_chroma))
1205*c83a76b0SSuyog Pawar {
1206*c83a76b0SSuyog Pawar ctby_tl_t = ps_sao_ctxt->i4_ctb_y - 1;
1207*c83a76b0SSuyog Pawar ctbx_tl_l = ps_sao_ctxt->i4_ctb_x - 1;
1208*c83a76b0SSuyog Pawar }
1209*c83a76b0SSuyog Pawar ctbx_tl_t = ps_sao_ctxt->i4_ctb_x - 1;
1210*c83a76b0SSuyog Pawar ctby_tl_l = ps_sao_ctxt->i4_ctb_y - 1;
1211*c83a76b0SSuyog Pawar
1212*c83a76b0SSuyog Pawar ctbx_tl_r = ps_sao_ctxt->i4_ctb_x;
1213*c83a76b0SSuyog Pawar ctby_tl_r = ps_sao_ctxt->i4_ctb_y - 1;
1214*c83a76b0SSuyog Pawar
1215*c83a76b0SSuyog Pawar ctbx_tl_d = ps_sao_ctxt->i4_ctb_x - 1;
1216*c83a76b0SSuyog Pawar ctby_tl_d = ps_sao_ctxt->i4_ctb_y;
1217*c83a76b0SSuyog Pawar
1218*c83a76b0SSuyog Pawar ctbx_tl = ps_sao_ctxt->i4_ctb_x - 1;
1219*c83a76b0SSuyog Pawar ctby_tl = ps_sao_ctxt->i4_ctb_y - 1;
1220*c83a76b0SSuyog Pawar
1221*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
1222*c83a76b0SSuyog Pawar {
1223*c83a76b0SSuyog Pawar
1224*c83a76b0SSuyog Pawar idx_tl = pu1_slice_idx[ctbx_tl + (ctby_tl * ps_sps->i2_pic_wd_in_ctb)];
1225*c83a76b0SSuyog Pawar au4_idx_tl[2] = au4_idx_tl[4] = *(pu1_slice_idx + ctbx_tl_t + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb));
1226*c83a76b0SSuyog Pawar au4_idx_tl[0] = pu1_slice_idx[ctbx_tl_l + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1227*c83a76b0SSuyog Pawar au4_idx_tl[1] = au4_idx_tl[5] = pu1_slice_idx[ctbx_tl_r + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1228*c83a76b0SSuyog Pawar au4_idx_tl[3] = au4_idx_tl[6] = pu1_slice_idx[ctbx_tl_d + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1229*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_slice_idx[ctbx_tl_d + 1 + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1230*c83a76b0SSuyog Pawar
1231*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_chroma))
1232*c83a76b0SSuyog Pawar {
1233*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x == 1)
1234*c83a76b0SSuyog Pawar {
1235*c83a76b0SSuyog Pawar au4_idx_tl[6] = -1;
1236*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1237*c83a76b0SSuyog Pawar }
1238*c83a76b0SSuyog Pawar else
1239*c83a76b0SSuyog Pawar {
1240*c83a76b0SSuyog Pawar au4_idx_tl[6] = pu1_slice_idx[(ctbx_tl_d - 1) + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1241*c83a76b0SSuyog Pawar }
1242*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_y == 1)
1243*c83a76b0SSuyog Pawar {
1244*c83a76b0SSuyog Pawar au4_idx_tl[5] = -1;
1245*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1246*c83a76b0SSuyog Pawar }
1247*c83a76b0SSuyog Pawar else
1248*c83a76b0SSuyog Pawar {
1249*c83a76b0SSuyog Pawar au4_idx_tl[5] = pu1_slice_idx[(ctbx_tl_l + 1) + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1250*c83a76b0SSuyog Pawar au4_idx_tl[4] = pu1_slice_idx[(ctbx_tl_t - 1) + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb)];
1251*c83a76b0SSuyog Pawar }
1252*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_slice_idx[(ctbx_tl_d + 1) + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1253*c83a76b0SSuyog Pawar }
1254*c83a76b0SSuyog Pawar
1255*c83a76b0SSuyog Pawar /* Verify that the neighbor ctbs don't cross pic boundary
1256*c83a76b0SSuyog Pawar * Also, the ILF flag belonging to the higher pixel address (between neighbor and current pixels) must be assigned*/
1257*c83a76b0SSuyog Pawar if((0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma))
1258*c83a76b0SSuyog Pawar {
1259*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
1260*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
1261*c83a76b0SSuyog Pawar }
1262*c83a76b0SSuyog Pawar else
1263*c83a76b0SSuyog Pawar {
1264*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + au4_idx_tl[6])->i1_slice_loop_filter_across_slices_enabled_flag;
1265*c83a76b0SSuyog Pawar }
1266*c83a76b0SSuyog Pawar if((0 == (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) - sao_ht_chroma))
1267*c83a76b0SSuyog Pawar {
1268*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
1269*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
1270*c83a76b0SSuyog Pawar }
1271*c83a76b0SSuyog Pawar else
1272*c83a76b0SSuyog Pawar {
1273*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
1274*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + au4_idx_tl[5])->i1_slice_loop_filter_across_slices_enabled_flag;
1275*c83a76b0SSuyog Pawar }
1276*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
1277*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = (ps_slice_hdr_base + idx_tl)->i1_slice_loop_filter_across_slices_enabled_flag;
1278*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_tl[1])->i1_slice_loop_filter_across_slices_enabled_flag;
1279*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_tl[3])->i1_slice_loop_filter_across_slices_enabled_flag;
1280*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_tl[7])->i1_slice_loop_filter_across_slices_enabled_flag;
1281*c83a76b0SSuyog Pawar /*
1282*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
1283*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
1284*c83a76b0SSuyog Pawar */
1285*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1286*c83a76b0SSuyog Pawar {
1287*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1288*c83a76b0SSuyog Pawar if(au4_idx_tl[i] != idx_tl)
1289*c83a76b0SSuyog Pawar {
1290*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
1291*c83a76b0SSuyog Pawar }
1292*c83a76b0SSuyog Pawar else
1293*c83a76b0SSuyog Pawar {
1294*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1295*c83a76b0SSuyog Pawar }
1296*c83a76b0SSuyog Pawar }
1297*c83a76b0SSuyog Pawar
1298*c83a76b0SSuyog Pawar /*Reset indices*/
1299*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1300*c83a76b0SSuyog Pawar {
1301*c83a76b0SSuyog Pawar au4_idx_tl[i] = 0;
1302*c83a76b0SSuyog Pawar }
1303*c83a76b0SSuyog Pawar }
1304*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
1305*c83a76b0SSuyog Pawar {
1306*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
1307*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
1308*c83a76b0SSuyog Pawar {
1309*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
1310*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
1311*c83a76b0SSuyog Pawar {
1312*c83a76b0SSuyog Pawar /*Set the boundary arrays*/
1313*c83a76b0SSuyog Pawar /*Calculate tile indices for neighbor pixels*/
1314*c83a76b0SSuyog Pawar idx_tl = pu1_tile_idx[ctbx_tl + (ctby_tl * ps_sps->i2_pic_wd_in_ctb)];
1315*c83a76b0SSuyog Pawar au4_idx_tl[2] = au4_idx_tl[4] = *(pu1_tile_idx + ctbx_tl_t + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb));
1316*c83a76b0SSuyog Pawar au4_idx_tl[0] = pu1_tile_idx[ctbx_tl_l + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1317*c83a76b0SSuyog Pawar au4_idx_tl[1] = au4_idx_tl[5] = pu1_tile_idx[ctbx_tl_r + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1318*c83a76b0SSuyog Pawar au4_idx_tl[3] = au4_idx_tl[6] = pu1_tile_idx[ctbx_tl_d + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1319*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_tile_idx[ctbx_tl_d + 1 + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1320*c83a76b0SSuyog Pawar
1321*c83a76b0SSuyog Pawar if((0 == (1 << log2_ctb_size) - sao_wd_luma))
1322*c83a76b0SSuyog Pawar {
1323*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x == 1)
1324*c83a76b0SSuyog Pawar {
1325*c83a76b0SSuyog Pawar au4_idx_tl[6] = -1;
1326*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1327*c83a76b0SSuyog Pawar }
1328*c83a76b0SSuyog Pawar else
1329*c83a76b0SSuyog Pawar {
1330*c83a76b0SSuyog Pawar au4_idx_tl[6] = pu1_tile_idx[(ctbx_tl_d - 1) + (ctby_tl_r * ps_sps->i2_pic_wd_in_ctb)];
1331*c83a76b0SSuyog Pawar }
1332*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_y == 1)
1333*c83a76b0SSuyog Pawar {
1334*c83a76b0SSuyog Pawar au4_idx_tl[5] = -1;
1335*c83a76b0SSuyog Pawar au4_idx_tl[4] = -1;
1336*c83a76b0SSuyog Pawar }
1337*c83a76b0SSuyog Pawar else
1338*c83a76b0SSuyog Pawar {
1339*c83a76b0SSuyog Pawar au4_idx_tl[5] = pu1_tile_idx[(ctbx_tl_l + 1) + (ctby_tl_l * ps_sps->i2_pic_wd_in_ctb)];
1340*c83a76b0SSuyog Pawar au4_idx_tl[4] = pu1_tile_idx[(ctbx_tl_t - 1) + (ctby_tl_t * ps_sps->i2_pic_wd_in_ctb)];
1341*c83a76b0SSuyog Pawar }
1342*c83a76b0SSuyog Pawar au4_idx_tl[7] = pu1_tile_idx[(ctbx_tl_d + 1) + (ctby_tl_d * ps_sps->i2_pic_wd_in_ctb)];
1343*c83a76b0SSuyog Pawar }
1344*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1345*c83a76b0SSuyog Pawar {
1346*c83a76b0SSuyog Pawar /*Sets the edges that lie on the tile boundary*/
1347*c83a76b0SSuyog Pawar if(au4_idx_tl[i] != idx_tl)
1348*c83a76b0SSuyog Pawar {
1349*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
1350*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag; //=0
1351*c83a76b0SSuyog Pawar }
1352*c83a76b0SSuyog Pawar }
1353*c83a76b0SSuyog Pawar }
1354*c83a76b0SSuyog Pawar }
1355*c83a76b0SSuyog Pawar }
1356*c83a76b0SSuyog Pawar
1357*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1358*c83a76b0SSuyog Pawar {
1359*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1360*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
1361*c83a76b0SSuyog Pawar {
1362*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 0;
1363*c83a76b0SSuyog Pawar }
1364*c83a76b0SSuyog Pawar }
1365*c83a76b0SSuyog Pawar }
1366*c83a76b0SSuyog Pawar }
1367*c83a76b0SSuyog Pawar
1368*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma)
1369*c83a76b0SSuyog Pawar {
1370*c83a76b0SSuyog Pawar au1_avail_chroma[0] = 0;
1371*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
1372*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
1373*c83a76b0SSuyog Pawar }
1374*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_wd_in_ctb == ps_sao_ctxt->i4_ctb_x)
1375*c83a76b0SSuyog Pawar {
1376*c83a76b0SSuyog Pawar au1_avail_chroma[1] = 0;
1377*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
1378*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
1379*c83a76b0SSuyog Pawar }
1380*c83a76b0SSuyog Pawar
1381*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) - sao_ht_chroma)
1382*c83a76b0SSuyog Pawar {
1383*c83a76b0SSuyog Pawar au1_avail_chroma[2] = 0;
1384*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
1385*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
1386*c83a76b0SSuyog Pawar }
1387*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_ht_in_ctb == ps_sao_ctxt->i4_ctb_y)
1388*c83a76b0SSuyog Pawar {
1389*c83a76b0SSuyog Pawar au1_avail_chroma[3] = 0;
1390*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
1391*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
1392*c83a76b0SSuyog Pawar }
1393*c83a76b0SSuyog Pawar
1394*c83a76b0SSuyog Pawar {
1395*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_chroma[sao_wd_chroma];
1396*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_src_top_chroma[sao_wd_chroma + 1];
1397*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[0] = pu1_src_left_chroma[2 * sao_ht_chroma];
1398*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[1] = pu1_src_left_chroma[2 * sao_ht_chroma + 1];
1399*c83a76b0SSuyog Pawar if((ctb_size == 16) && (ps_sao_ctxt->i4_ctb_y != ps_sps->i2_pic_ht_in_ctb - 1))
1400*c83a76b0SSuyog Pawar {
1401*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[0] = pu1_src_chroma[sao_ht_chroma * src_strd - 2];
1402*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[1] = pu1_src_chroma[sao_ht_chroma * src_strd - 1];
1403*c83a76b0SSuyog Pawar }
1404*c83a76b0SSuyog Pawar
1405*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
1406*c83a76b0SSuyog Pawar {
1407*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
1408*c83a76b0SSuyog Pawar src_strd,
1409*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1410*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1411*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1412*c83a76b0SSuyog Pawar au1_src_top_right,
1413*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
1414*c83a76b0SSuyog Pawar au1_avail_chroma,
1415*c83a76b0SSuyog Pawar ai1_offset_cr,
1416*c83a76b0SSuyog Pawar ai1_offset_cb,
1417*c83a76b0SSuyog Pawar sao_wd_chroma,
1418*c83a76b0SSuyog Pawar sao_ht_chroma);
1419*c83a76b0SSuyog Pawar }
1420*c83a76b0SSuyog Pawar else
1421*c83a76b0SSuyog Pawar {
1422*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
1423*c83a76b0SSuyog Pawar src_strd,
1424*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1425*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1426*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1427*c83a76b0SSuyog Pawar au1_src_top_right,
1428*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
1429*c83a76b0SSuyog Pawar au1_avail_chroma,
1430*c83a76b0SSuyog Pawar ai1_offset_cb,
1431*c83a76b0SSuyog Pawar ai1_offset_cr,
1432*c83a76b0SSuyog Pawar sao_wd_chroma,
1433*c83a76b0SSuyog Pawar sao_ht_chroma);
1434*c83a76b0SSuyog Pawar }
1435*c83a76b0SSuyog Pawar }
1436*c83a76b0SSuyog Pawar }
1437*c83a76b0SSuyog Pawar }
1438*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1439*c83a76b0SSuyog Pawar {
1440*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
1441*c83a76b0SSuyog Pawar {
1442*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
1443*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
1444*c83a76b0SSuyog Pawar }
1445*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
1446*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
1447*c83a76b0SSuyog Pawar
1448*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
1449*c83a76b0SSuyog Pawar }
1450*c83a76b0SSuyog Pawar
1451*c83a76b0SSuyog Pawar pu1_src_luma += sao_wd_luma + sao_ht_luma * src_strd;
1452*c83a76b0SSuyog Pawar pu1_src_chroma += sao_wd_chroma + sao_ht_chroma * src_strd;
1453*c83a76b0SSuyog Pawar ps_sao += (1 + ps_sps->i2_pic_wd_in_ctb);
1454*c83a76b0SSuyog Pawar }
1455*c83a76b0SSuyog Pawar
1456*c83a76b0SSuyog Pawar
1457*c83a76b0SSuyog Pawar /* Top CTB */
1458*c83a76b0SSuyog Pawar if((ps_sao_ctxt->i4_ctb_y > 0))
1459*c83a76b0SSuyog Pawar {
1460*c83a76b0SSuyog Pawar WORD32 sao_wd_luma = ctb_size - SAO_SHIFT_CTB;
1461*c83a76b0SSuyog Pawar WORD32 sao_wd_chroma = ctb_size - 2 * SAO_SHIFT_CTB;
1462*c83a76b0SSuyog Pawar WORD32 sao_ht_luma = SAO_SHIFT_CTB;
1463*c83a76b0SSuyog Pawar WORD32 sao_ht_chroma = SAO_SHIFT_CTB;
1464*c83a76b0SSuyog Pawar
1465*c83a76b0SSuyog Pawar WORD32 ctbx_t_t = 0, ctbx_t_l = 0, ctbx_t_r = 0, ctbx_t_d = 0, ctbx_t = 0;
1466*c83a76b0SSuyog Pawar WORD32 ctby_t_t = 0, ctby_t_l = 0, ctby_t_r = 0, ctby_t_d = 0, ctby_t = 0;
1467*c83a76b0SSuyog Pawar WORD32 au4_idx_t[8], idx_t;
1468*c83a76b0SSuyog Pawar
1469*c83a76b0SSuyog Pawar WORD32 remaining_cols;
1470*c83a76b0SSuyog Pawar
1471*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr_top;
1472*c83a76b0SSuyog Pawar {
1473*c83a76b0SSuyog Pawar WORD32 top_ctb_indx = (ps_sao_ctxt->i4_ctb_y - 1) * ps_sps->i2_pic_wd_in_ctb +
1474*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_x);
1475*c83a76b0SSuyog Pawar ps_slice_hdr_top = ps_slice_hdr_base + pu1_slice_idx[top_ctb_indx];
1476*c83a76b0SSuyog Pawar }
1477*c83a76b0SSuyog Pawar
1478*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + sao_wd_luma);
1479*c83a76b0SSuyog Pawar if(remaining_cols <= SAO_SHIFT_CTB)
1480*c83a76b0SSuyog Pawar {
1481*c83a76b0SSuyog Pawar sao_wd_luma += remaining_cols;
1482*c83a76b0SSuyog Pawar }
1483*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + sao_wd_chroma);
1484*c83a76b0SSuyog Pawar if(remaining_cols <= 2 * SAO_SHIFT_CTB)
1485*c83a76b0SSuyog Pawar {
1486*c83a76b0SSuyog Pawar sao_wd_chroma += remaining_cols;
1487*c83a76b0SSuyog Pawar }
1488*c83a76b0SSuyog Pawar
1489*c83a76b0SSuyog Pawar pu1_src_luma -= (sao_ht_luma * src_strd);
1490*c83a76b0SSuyog Pawar pu1_src_chroma -= (sao_ht_chroma * src_strd);
1491*c83a76b0SSuyog Pawar ps_sao -= (ps_sps->i2_pic_wd_in_ctb);
1492*c83a76b0SSuyog Pawar pu1_src_top_luma = ps_sao_ctxt->pu1_sao_src_top_luma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
1493*c83a76b0SSuyog Pawar pu1_src_top_chroma = ps_sao_ctxt->pu1_sao_src_top_chroma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
1494*c83a76b0SSuyog Pawar pu1_src_left_luma = ps_sao_ctxt->pu1_sao_src_left_luma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - sao_ht_chroma;
1495*c83a76b0SSuyog Pawar pu1_src_left_chroma = ps_sao_ctxt->pu1_sao_src_left_chroma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - (2 * sao_ht_chroma);
1496*c83a76b0SSuyog Pawar
1497*c83a76b0SSuyog Pawar if(0 != sao_wd_luma)
1498*c83a76b0SSuyog Pawar {
1499*c83a76b0SSuyog Pawar if(ps_slice_hdr_top->i1_slice_sao_luma_flag)
1500*c83a76b0SSuyog Pawar {
1501*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_y_type_idx)
1502*c83a76b0SSuyog Pawar {
1503*c83a76b0SSuyog Pawar /* Update left, top and top-left */
1504*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
1505*c83a76b0SSuyog Pawar {
1506*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
1507*c83a76b0SSuyog Pawar }
1508*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
1509*c83a76b0SSuyog Pawar
1510*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
1511*c83a76b0SSuyog Pawar
1512*c83a76b0SSuyog Pawar }
1513*c83a76b0SSuyog Pawar
1514*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_y_type_idx)
1515*c83a76b0SSuyog Pawar {
1516*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
1517*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
1518*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
1519*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
1520*c83a76b0SSuyog Pawar
1521*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_luma_fptr(pu1_src_luma,
1522*c83a76b0SSuyog Pawar src_strd,
1523*c83a76b0SSuyog Pawar pu1_src_left_luma,
1524*c83a76b0SSuyog Pawar pu1_src_top_luma,
1525*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb,
1526*c83a76b0SSuyog Pawar ps_sao->b5_y_band_pos,
1527*c83a76b0SSuyog Pawar ai1_offset_y,
1528*c83a76b0SSuyog Pawar sao_wd_luma,
1529*c83a76b0SSuyog Pawar sao_ht_luma
1530*c83a76b0SSuyog Pawar );
1531*c83a76b0SSuyog Pawar }
1532*c83a76b0SSuyog Pawar
1533*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_y_type_idx)
1534*c83a76b0SSuyog Pawar {
1535*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
1536*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
1537*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
1538*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
1539*c83a76b0SSuyog Pawar
1540*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memset_mul_8_fptr(au1_avail_luma, 255, 8);
1541*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memset_mul_8_fptr(au1_tile_slice_boundary, 0, 8);
1542*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memset_mul_8_fptr((UWORD8 *)au4_idx_t, 0, 8 * sizeof(WORD32));
1543*c83a76b0SSuyog Pawar
1544*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1545*c83a76b0SSuyog Pawar {
1546*c83a76b0SSuyog Pawar
1547*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1548*c83a76b0SSuyog Pawar }
1549*c83a76b0SSuyog Pawar /******************************************************************
1550*c83a76b0SSuyog Pawar * Derive the Top-left CTB's neighbor pixel's slice indices.
1551*c83a76b0SSuyog Pawar *
1552*c83a76b0SSuyog Pawar * T_T
1553*c83a76b0SSuyog Pawar * ____________
1554*c83a76b0SSuyog Pawar * | | |
1555*c83a76b0SSuyog Pawar * | T_L| T |T_R
1556*c83a76b0SSuyog Pawar * | | ______|____
1557*c83a76b0SSuyog Pawar * | | T_D | |
1558*c83a76b0SSuyog Pawar * | | | |
1559*c83a76b0SSuyog Pawar * |____|_______| |
1560*c83a76b0SSuyog Pawar * | |
1561*c83a76b0SSuyog Pawar * | |
1562*c83a76b0SSuyog Pawar * |____________|
1563*c83a76b0SSuyog Pawar *
1564*c83a76b0SSuyog Pawar *****************************************************************/
1565*c83a76b0SSuyog Pawar
1566*c83a76b0SSuyog Pawar /*In case of slices*/
1567*c83a76b0SSuyog Pawar {
1568*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1569*c83a76b0SSuyog Pawar {
1570*c83a76b0SSuyog Pawar
1571*c83a76b0SSuyog Pawar ctbx_t_t = ps_sao_ctxt->i4_ctb_x;
1572*c83a76b0SSuyog Pawar ctby_t_t = ps_sao_ctxt->i4_ctb_y - 1;
1573*c83a76b0SSuyog Pawar
1574*c83a76b0SSuyog Pawar ctbx_t_l = ps_sao_ctxt->i4_ctb_x - 1;
1575*c83a76b0SSuyog Pawar ctby_t_l = ps_sao_ctxt->i4_ctb_y - 1;
1576*c83a76b0SSuyog Pawar
1577*c83a76b0SSuyog Pawar ctbx_t_r = ps_sao_ctxt->i4_ctb_x;
1578*c83a76b0SSuyog Pawar ctby_t_r = ps_sao_ctxt->i4_ctb_y - 1;
1579*c83a76b0SSuyog Pawar
1580*c83a76b0SSuyog Pawar ctbx_t_d = ps_sao_ctxt->i4_ctb_x;
1581*c83a76b0SSuyog Pawar ctby_t_d = ps_sao_ctxt->i4_ctb_y;
1582*c83a76b0SSuyog Pawar
1583*c83a76b0SSuyog Pawar ctbx_t = ps_sao_ctxt->i4_ctb_x;
1584*c83a76b0SSuyog Pawar ctby_t = ps_sao_ctxt->i4_ctb_y - 1;
1585*c83a76b0SSuyog Pawar
1586*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
1587*c83a76b0SSuyog Pawar {
1588*c83a76b0SSuyog Pawar /*Calculate neighbor ctb slice indices*/
1589*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1590*c83a76b0SSuyog Pawar {
1591*c83a76b0SSuyog Pawar au4_idx_t[0] = -1;
1592*c83a76b0SSuyog Pawar au4_idx_t[6] = -1;
1593*c83a76b0SSuyog Pawar au4_idx_t[4] = -1;
1594*c83a76b0SSuyog Pawar }
1595*c83a76b0SSuyog Pawar else
1596*c83a76b0SSuyog Pawar {
1597*c83a76b0SSuyog Pawar au4_idx_t[0] = au4_idx_t[4] = pu1_slice_idx[ctbx_t_l + (ctby_t_l * ps_sps->i2_pic_wd_in_ctb)];
1598*c83a76b0SSuyog Pawar au4_idx_t[6] = pu1_slice_idx[ctbx_t_d - 1 + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1599*c83a76b0SSuyog Pawar }
1600*c83a76b0SSuyog Pawar idx_t = pu1_slice_idx[ctbx_t + (ctby_t * ps_sps->i2_pic_wd_in_ctb)];
1601*c83a76b0SSuyog Pawar au4_idx_t[2] = au4_idx_t[5] = pu1_slice_idx[ctbx_t_t + (ctby_t_t * ps_sps->i2_pic_wd_in_ctb)];
1602*c83a76b0SSuyog Pawar au4_idx_t[1] = pu1_slice_idx[ctbx_t_r + (ctby_t_r * ps_sps->i2_pic_wd_in_ctb)];
1603*c83a76b0SSuyog Pawar au4_idx_t[3] = au4_idx_t[7] = pu1_slice_idx[ctbx_t_d + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1604*c83a76b0SSuyog Pawar
1605*c83a76b0SSuyog Pawar /*Verify that the neighbor ctbs don't cross pic boundary.*/
1606*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1607*c83a76b0SSuyog Pawar {
1608*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
1609*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
1610*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = 0;
1611*c83a76b0SSuyog Pawar }
1612*c83a76b0SSuyog Pawar else
1613*c83a76b0SSuyog Pawar {
1614*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[0] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1615*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + au4_idx_t[6])->i1_slice_loop_filter_across_slices_enabled_flag;
1616*c83a76b0SSuyog Pawar }
1617*c83a76b0SSuyog Pawar
1618*c83a76b0SSuyog Pawar
1619*c83a76b0SSuyog Pawar
1620*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1621*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1622*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_t[1])->i1_slice_loop_filter_across_slices_enabled_flag;
1623*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_t[3])->i1_slice_loop_filter_across_slices_enabled_flag;
1624*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_t[7])->i1_slice_loop_filter_across_slices_enabled_flag;
1625*c83a76b0SSuyog Pawar
1626*c83a76b0SSuyog Pawar if(au4_idx_t[6] < idx_t)
1627*c83a76b0SSuyog Pawar {
1628*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1629*c83a76b0SSuyog Pawar }
1630*c83a76b0SSuyog Pawar
1631*c83a76b0SSuyog Pawar /*
1632*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
1633*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
1634*c83a76b0SSuyog Pawar */
1635*c83a76b0SSuyog Pawar
1636*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1637*c83a76b0SSuyog Pawar {
1638*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1639*c83a76b0SSuyog Pawar if(au4_idx_t[i] != idx_t)
1640*c83a76b0SSuyog Pawar {
1641*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
1642*c83a76b0SSuyog Pawar /*Check for slice flag at such boundaries*/
1643*c83a76b0SSuyog Pawar }
1644*c83a76b0SSuyog Pawar else
1645*c83a76b0SSuyog Pawar {
1646*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1647*c83a76b0SSuyog Pawar }
1648*c83a76b0SSuyog Pawar }
1649*c83a76b0SSuyog Pawar /*Reset indices*/
1650*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1651*c83a76b0SSuyog Pawar {
1652*c83a76b0SSuyog Pawar au4_idx_t[i] = 0;
1653*c83a76b0SSuyog Pawar }
1654*c83a76b0SSuyog Pawar }
1655*c83a76b0SSuyog Pawar
1656*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
1657*c83a76b0SSuyog Pawar {
1658*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
1659*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
1660*c83a76b0SSuyog Pawar {
1661*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
1662*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
1663*c83a76b0SSuyog Pawar {
1664*c83a76b0SSuyog Pawar /*Calculate neighbor ctb slice indices*/
1665*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1666*c83a76b0SSuyog Pawar {
1667*c83a76b0SSuyog Pawar au4_idx_t[0] = -1;
1668*c83a76b0SSuyog Pawar au4_idx_t[6] = -1;
1669*c83a76b0SSuyog Pawar au4_idx_t[4] = -1;
1670*c83a76b0SSuyog Pawar }
1671*c83a76b0SSuyog Pawar else
1672*c83a76b0SSuyog Pawar {
1673*c83a76b0SSuyog Pawar au4_idx_t[0] = au4_idx_t[4] = pu1_tile_idx[ctbx_t_l + (ctby_t_l * ps_sps->i2_pic_wd_in_ctb)];
1674*c83a76b0SSuyog Pawar au4_idx_t[6] = pu1_tile_idx[ctbx_t_d - 1 + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1675*c83a76b0SSuyog Pawar }
1676*c83a76b0SSuyog Pawar idx_t = pu1_tile_idx[ctbx_t + (ctby_t * ps_sps->i2_pic_wd_in_ctb)];
1677*c83a76b0SSuyog Pawar au4_idx_t[2] = au4_idx_t[5] = pu1_tile_idx[ctbx_t_t + (ctby_t_t * ps_sps->i2_pic_wd_in_ctb)];
1678*c83a76b0SSuyog Pawar au4_idx_t[1] = pu1_tile_idx[ctbx_t_r + (ctby_t_r * ps_sps->i2_pic_wd_in_ctb)];
1679*c83a76b0SSuyog Pawar au4_idx_t[3] = au4_idx_t[7] = pu1_tile_idx[ctbx_t_d + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1680*c83a76b0SSuyog Pawar
1681*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1682*c83a76b0SSuyog Pawar {
1683*c83a76b0SSuyog Pawar /*Sets the edges that lie on the tile boundary*/
1684*c83a76b0SSuyog Pawar if(au4_idx_t[i] != idx_t)
1685*c83a76b0SSuyog Pawar {
1686*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
1687*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag;
1688*c83a76b0SSuyog Pawar }
1689*c83a76b0SSuyog Pawar }
1690*c83a76b0SSuyog Pawar }
1691*c83a76b0SSuyog Pawar }
1692*c83a76b0SSuyog Pawar }
1693*c83a76b0SSuyog Pawar
1694*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1695*c83a76b0SSuyog Pawar {
1696*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1697*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
1698*c83a76b0SSuyog Pawar {
1699*c83a76b0SSuyog Pawar au1_avail_luma[i] = 0;
1700*c83a76b0SSuyog Pawar }
1701*c83a76b0SSuyog Pawar }
1702*c83a76b0SSuyog Pawar }
1703*c83a76b0SSuyog Pawar }
1704*c83a76b0SSuyog Pawar
1705*c83a76b0SSuyog Pawar
1706*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1707*c83a76b0SSuyog Pawar {
1708*c83a76b0SSuyog Pawar au1_avail_luma[0] = 0;
1709*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
1710*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
1711*c83a76b0SSuyog Pawar }
1712*c83a76b0SSuyog Pawar
1713*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_width_in_luma_samples - (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) <= sao_wd_luma)
1714*c83a76b0SSuyog Pawar {
1715*c83a76b0SSuyog Pawar au1_avail_luma[1] = 0;
1716*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
1717*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
1718*c83a76b0SSuyog Pawar }
1719*c83a76b0SSuyog Pawar
1720*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) - sao_ht_luma)
1721*c83a76b0SSuyog Pawar {
1722*c83a76b0SSuyog Pawar au1_avail_luma[2] = 0;
1723*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
1724*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
1725*c83a76b0SSuyog Pawar }
1726*c83a76b0SSuyog Pawar
1727*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_ht_in_ctb == ps_sao_ctxt->i4_ctb_y)
1728*c83a76b0SSuyog Pawar {
1729*c83a76b0SSuyog Pawar au1_avail_luma[3] = 0;
1730*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
1731*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
1732*c83a76b0SSuyog Pawar }
1733*c83a76b0SSuyog Pawar
1734*c83a76b0SSuyog Pawar {
1735*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_sao_src_top_left_luma_top_right[0];
1736*c83a76b0SSuyog Pawar u1_sao_src_top_left_luma_bot_left = pu1_src_luma[sao_ht_luma * src_strd - 1];
1737*c83a76b0SSuyog Pawar ps_codec->apf_sao_luma[ps_sao->b3_y_type_idx - 2](pu1_src_luma,
1738*c83a76b0SSuyog Pawar src_strd,
1739*c83a76b0SSuyog Pawar pu1_src_left_luma,
1740*c83a76b0SSuyog Pawar pu1_src_top_luma,
1741*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb,
1742*c83a76b0SSuyog Pawar au1_src_top_right,
1743*c83a76b0SSuyog Pawar &u1_sao_src_top_left_luma_bot_left,
1744*c83a76b0SSuyog Pawar au1_avail_luma,
1745*c83a76b0SSuyog Pawar ai1_offset_y,
1746*c83a76b0SSuyog Pawar sao_wd_luma,
1747*c83a76b0SSuyog Pawar sao_ht_luma);
1748*c83a76b0SSuyog Pawar }
1749*c83a76b0SSuyog Pawar }
1750*c83a76b0SSuyog Pawar }
1751*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1752*c83a76b0SSuyog Pawar {
1753*c83a76b0SSuyog Pawar /* Update left, top and top-left */
1754*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
1755*c83a76b0SSuyog Pawar {
1756*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
1757*c83a76b0SSuyog Pawar }
1758*c83a76b0SSuyog Pawar pu1_sao_src_luma_top_left_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
1759*c83a76b0SSuyog Pawar
1760*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
1761*c83a76b0SSuyog Pawar }
1762*c83a76b0SSuyog Pawar }
1763*c83a76b0SSuyog Pawar
1764*c83a76b0SSuyog Pawar if(0 != sao_wd_chroma)
1765*c83a76b0SSuyog Pawar {
1766*c83a76b0SSuyog Pawar if(ps_slice_hdr_top->i1_slice_sao_chroma_flag)
1767*c83a76b0SSuyog Pawar {
1768*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_cb_type_idx)
1769*c83a76b0SSuyog Pawar {
1770*c83a76b0SSuyog Pawar
1771*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
1772*c83a76b0SSuyog Pawar {
1773*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
1774*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
1775*c83a76b0SSuyog Pawar }
1776*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
1777*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
1778*c83a76b0SSuyog Pawar
1779*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
1780*c83a76b0SSuyog Pawar
1781*c83a76b0SSuyog Pawar }
1782*c83a76b0SSuyog Pawar
1783*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_cb_type_idx)
1784*c83a76b0SSuyog Pawar {
1785*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
1786*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
1787*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
1788*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
1789*c83a76b0SSuyog Pawar
1790*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
1791*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
1792*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
1793*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
1794*c83a76b0SSuyog Pawar
1795*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
1796*c83a76b0SSuyog Pawar {
1797*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
1798*c83a76b0SSuyog Pawar src_strd,
1799*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1800*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1801*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1802*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
1803*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
1804*c83a76b0SSuyog Pawar ai1_offset_cr,
1805*c83a76b0SSuyog Pawar ai1_offset_cb,
1806*c83a76b0SSuyog Pawar sao_wd_chroma,
1807*c83a76b0SSuyog Pawar sao_ht_chroma
1808*c83a76b0SSuyog Pawar );
1809*c83a76b0SSuyog Pawar }
1810*c83a76b0SSuyog Pawar else
1811*c83a76b0SSuyog Pawar {
1812*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
1813*c83a76b0SSuyog Pawar src_strd,
1814*c83a76b0SSuyog Pawar pu1_src_left_chroma,
1815*c83a76b0SSuyog Pawar pu1_src_top_chroma,
1816*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
1817*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
1818*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
1819*c83a76b0SSuyog Pawar ai1_offset_cb,
1820*c83a76b0SSuyog Pawar ai1_offset_cr,
1821*c83a76b0SSuyog Pawar sao_wd_chroma,
1822*c83a76b0SSuyog Pawar sao_ht_chroma
1823*c83a76b0SSuyog Pawar );
1824*c83a76b0SSuyog Pawar }
1825*c83a76b0SSuyog Pawar }
1826*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_cb_type_idx)
1827*c83a76b0SSuyog Pawar {
1828*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
1829*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
1830*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
1831*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
1832*c83a76b0SSuyog Pawar
1833*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
1834*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
1835*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
1836*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
1837*c83a76b0SSuyog Pawar
1838*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1839*c83a76b0SSuyog Pawar {
1840*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 255;
1841*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
1842*c83a76b0SSuyog Pawar au4_idx_t[i] = 0;
1843*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1844*c83a76b0SSuyog Pawar }
1845*c83a76b0SSuyog Pawar
1846*c83a76b0SSuyog Pawar {
1847*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
1848*c83a76b0SSuyog Pawar {
1849*c83a76b0SSuyog Pawar ctbx_t_t = ps_sao_ctxt->i4_ctb_x;
1850*c83a76b0SSuyog Pawar ctby_t_t = ps_sao_ctxt->i4_ctb_y - 1;
1851*c83a76b0SSuyog Pawar
1852*c83a76b0SSuyog Pawar ctbx_t_l = ps_sao_ctxt->i4_ctb_x - 1;
1853*c83a76b0SSuyog Pawar ctby_t_l = ps_sao_ctxt->i4_ctb_y - 1;
1854*c83a76b0SSuyog Pawar
1855*c83a76b0SSuyog Pawar ctbx_t_r = ps_sao_ctxt->i4_ctb_x;
1856*c83a76b0SSuyog Pawar ctby_t_r = ps_sao_ctxt->i4_ctb_y - 1;
1857*c83a76b0SSuyog Pawar
1858*c83a76b0SSuyog Pawar ctbx_t_d = ps_sao_ctxt->i4_ctb_x;
1859*c83a76b0SSuyog Pawar ctby_t_d = ps_sao_ctxt->i4_ctb_y;
1860*c83a76b0SSuyog Pawar
1861*c83a76b0SSuyog Pawar ctbx_t = ps_sao_ctxt->i4_ctb_x;
1862*c83a76b0SSuyog Pawar ctby_t = ps_sao_ctxt->i4_ctb_y - 1;
1863*c83a76b0SSuyog Pawar
1864*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
1865*c83a76b0SSuyog Pawar {
1866*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1867*c83a76b0SSuyog Pawar {
1868*c83a76b0SSuyog Pawar au4_idx_t[0] = -1;
1869*c83a76b0SSuyog Pawar au4_idx_t[6] = -1;
1870*c83a76b0SSuyog Pawar au4_idx_t[4] = -1;
1871*c83a76b0SSuyog Pawar }
1872*c83a76b0SSuyog Pawar else
1873*c83a76b0SSuyog Pawar {
1874*c83a76b0SSuyog Pawar au4_idx_t[0] = au4_idx_t[4] = pu1_slice_idx[ctbx_t_l + (ctby_t_l * ps_sps->i2_pic_wd_in_ctb)];
1875*c83a76b0SSuyog Pawar au4_idx_t[6] = pu1_slice_idx[ctbx_t_d - 1 + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1876*c83a76b0SSuyog Pawar }
1877*c83a76b0SSuyog Pawar idx_t = pu1_slice_idx[ctbx_t + (ctby_t * ps_sps->i2_pic_wd_in_ctb)];
1878*c83a76b0SSuyog Pawar au4_idx_t[2] = au4_idx_t[5] = pu1_slice_idx[ctbx_t_t + (ctby_t_t * ps_sps->i2_pic_wd_in_ctb)];
1879*c83a76b0SSuyog Pawar au4_idx_t[1] = pu1_slice_idx[ctbx_t_r + (ctby_t_r * ps_sps->i2_pic_wd_in_ctb)];
1880*c83a76b0SSuyog Pawar au4_idx_t[3] = au4_idx_t[7] = pu1_slice_idx[ctbx_t_d + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1881*c83a76b0SSuyog Pawar
1882*c83a76b0SSuyog Pawar /*Verify that the neighbor ctbs don't cross pic boundary.*/
1883*c83a76b0SSuyog Pawar
1884*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1885*c83a76b0SSuyog Pawar {
1886*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
1887*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
1888*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = 0;
1889*c83a76b0SSuyog Pawar }
1890*c83a76b0SSuyog Pawar else
1891*c83a76b0SSuyog Pawar {
1892*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[0] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1893*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + au4_idx_t[6])->i1_slice_loop_filter_across_slices_enabled_flag;
1894*c83a76b0SSuyog Pawar }
1895*c83a76b0SSuyog Pawar
1896*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + au4_idx_t[5])->i1_slice_loop_filter_across_slices_enabled_flag;
1897*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1898*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_t[1])->i1_slice_loop_filter_across_slices_enabled_flag;
1899*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_t[3])->i1_slice_loop_filter_across_slices_enabled_flag;
1900*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_t[7])->i1_slice_loop_filter_across_slices_enabled_flag;
1901*c83a76b0SSuyog Pawar
1902*c83a76b0SSuyog Pawar if(idx_t > au4_idx_t[6])
1903*c83a76b0SSuyog Pawar {
1904*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + idx_t)->i1_slice_loop_filter_across_slices_enabled_flag;
1905*c83a76b0SSuyog Pawar }
1906*c83a76b0SSuyog Pawar
1907*c83a76b0SSuyog Pawar /*
1908*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
1909*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
1910*c83a76b0SSuyog Pawar */
1911*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1912*c83a76b0SSuyog Pawar {
1913*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1914*c83a76b0SSuyog Pawar if(au4_idx_t[i] != idx_t)
1915*c83a76b0SSuyog Pawar {
1916*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
1917*c83a76b0SSuyog Pawar }
1918*c83a76b0SSuyog Pawar else
1919*c83a76b0SSuyog Pawar {
1920*c83a76b0SSuyog Pawar /*Indicates that the neighbour belongs to same/dependent slice*/
1921*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
1922*c83a76b0SSuyog Pawar }
1923*c83a76b0SSuyog Pawar }
1924*c83a76b0SSuyog Pawar /*Reset indices*/
1925*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1926*c83a76b0SSuyog Pawar {
1927*c83a76b0SSuyog Pawar au4_idx_t[i] = 0;
1928*c83a76b0SSuyog Pawar }
1929*c83a76b0SSuyog Pawar }
1930*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
1931*c83a76b0SSuyog Pawar {
1932*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
1933*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
1934*c83a76b0SSuyog Pawar {
1935*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
1936*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
1937*c83a76b0SSuyog Pawar {
1938*c83a76b0SSuyog Pawar /*Calculate neighbor ctb slice indices*/
1939*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1940*c83a76b0SSuyog Pawar {
1941*c83a76b0SSuyog Pawar au4_idx_t[0] = -1;
1942*c83a76b0SSuyog Pawar au4_idx_t[6] = -1;
1943*c83a76b0SSuyog Pawar au4_idx_t[4] = -1;
1944*c83a76b0SSuyog Pawar }
1945*c83a76b0SSuyog Pawar else
1946*c83a76b0SSuyog Pawar {
1947*c83a76b0SSuyog Pawar au4_idx_t[0] = au4_idx_t[4] = pu1_tile_idx[ctbx_t_l + (ctby_t_l * ps_sps->i2_pic_wd_in_ctb)];
1948*c83a76b0SSuyog Pawar au4_idx_t[6] = pu1_tile_idx[ctbx_t_d - 1 + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1949*c83a76b0SSuyog Pawar }
1950*c83a76b0SSuyog Pawar idx_t = pu1_tile_idx[ctbx_t + (ctby_t * ps_sps->i2_pic_wd_in_ctb)];
1951*c83a76b0SSuyog Pawar au4_idx_t[2] = au4_idx_t[5] = pu1_tile_idx[ctbx_t_t + (ctby_t_t * ps_sps->i2_pic_wd_in_ctb)];
1952*c83a76b0SSuyog Pawar au4_idx_t[1] = pu1_tile_idx[ctbx_t_r + (ctby_t_r * ps_sps->i2_pic_wd_in_ctb)];
1953*c83a76b0SSuyog Pawar au4_idx_t[3] = au4_idx_t[7] = pu1_tile_idx[ctbx_t_d + (ctby_t_d * ps_sps->i2_pic_wd_in_ctb)];
1954*c83a76b0SSuyog Pawar
1955*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1956*c83a76b0SSuyog Pawar {
1957*c83a76b0SSuyog Pawar /*Sets the edges that lie on the tile boundary*/
1958*c83a76b0SSuyog Pawar if(au4_idx_t[i] != idx_t)
1959*c83a76b0SSuyog Pawar {
1960*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
1961*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag;
1962*c83a76b0SSuyog Pawar }
1963*c83a76b0SSuyog Pawar }
1964*c83a76b0SSuyog Pawar }
1965*c83a76b0SSuyog Pawar }
1966*c83a76b0SSuyog Pawar }
1967*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
1968*c83a76b0SSuyog Pawar {
1969*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
1970*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
1971*c83a76b0SSuyog Pawar {
1972*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 0;
1973*c83a76b0SSuyog Pawar }
1974*c83a76b0SSuyog Pawar }
1975*c83a76b0SSuyog Pawar
1976*c83a76b0SSuyog Pawar }
1977*c83a76b0SSuyog Pawar }
1978*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
1979*c83a76b0SSuyog Pawar {
1980*c83a76b0SSuyog Pawar au1_avail_chroma[0] = 0;
1981*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
1982*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
1983*c83a76b0SSuyog Pawar }
1984*c83a76b0SSuyog Pawar
1985*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_width_in_luma_samples - (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) <= sao_wd_chroma)
1986*c83a76b0SSuyog Pawar {
1987*c83a76b0SSuyog Pawar au1_avail_chroma[1] = 0;
1988*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
1989*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
1990*c83a76b0SSuyog Pawar }
1991*c83a76b0SSuyog Pawar
1992*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) - sao_ht_chroma)
1993*c83a76b0SSuyog Pawar {
1994*c83a76b0SSuyog Pawar au1_avail_chroma[2] = 0;
1995*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
1996*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
1997*c83a76b0SSuyog Pawar }
1998*c83a76b0SSuyog Pawar
1999*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_ht_in_ctb == ps_sao_ctxt->i4_ctb_y)
2000*c83a76b0SSuyog Pawar {
2001*c83a76b0SSuyog Pawar au1_avail_chroma[3] = 0;
2002*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
2003*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
2004*c83a76b0SSuyog Pawar }
2005*c83a76b0SSuyog Pawar
2006*c83a76b0SSuyog Pawar {
2007*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_sao_src_top_left_chroma_top_right[0];
2008*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_sao_src_top_left_chroma_top_right[1];
2009*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[0] = pu1_src_chroma[sao_ht_chroma * src_strd - 2];
2010*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[1] = pu1_src_chroma[sao_ht_chroma * src_strd - 1];
2011*c83a76b0SSuyog Pawar
2012*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
2013*c83a76b0SSuyog Pawar {
2014*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
2015*c83a76b0SSuyog Pawar src_strd,
2016*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2017*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2018*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
2019*c83a76b0SSuyog Pawar au1_src_top_right,
2020*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
2021*c83a76b0SSuyog Pawar au1_avail_chroma,
2022*c83a76b0SSuyog Pawar ai1_offset_cr,
2023*c83a76b0SSuyog Pawar ai1_offset_cb,
2024*c83a76b0SSuyog Pawar sao_wd_chroma,
2025*c83a76b0SSuyog Pawar sao_ht_chroma);
2026*c83a76b0SSuyog Pawar }
2027*c83a76b0SSuyog Pawar else
2028*c83a76b0SSuyog Pawar {
2029*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
2030*c83a76b0SSuyog Pawar src_strd,
2031*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2032*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2033*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb,
2034*c83a76b0SSuyog Pawar au1_src_top_right,
2035*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
2036*c83a76b0SSuyog Pawar au1_avail_chroma,
2037*c83a76b0SSuyog Pawar ai1_offset_cb,
2038*c83a76b0SSuyog Pawar ai1_offset_cr,
2039*c83a76b0SSuyog Pawar sao_wd_chroma,
2040*c83a76b0SSuyog Pawar sao_ht_chroma);
2041*c83a76b0SSuyog Pawar }
2042*c83a76b0SSuyog Pawar }
2043*c83a76b0SSuyog Pawar
2044*c83a76b0SSuyog Pawar }
2045*c83a76b0SSuyog Pawar }
2046*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2047*c83a76b0SSuyog Pawar {
2048*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
2049*c83a76b0SSuyog Pawar {
2050*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
2051*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
2052*c83a76b0SSuyog Pawar }
2053*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
2054*c83a76b0SSuyog Pawar pu1_sao_src_chroma_top_left_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
2055*c83a76b0SSuyog Pawar
2056*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
2057*c83a76b0SSuyog Pawar }
2058*c83a76b0SSuyog Pawar }
2059*c83a76b0SSuyog Pawar
2060*c83a76b0SSuyog Pawar pu1_src_luma += sao_ht_luma * src_strd;
2061*c83a76b0SSuyog Pawar pu1_src_chroma += sao_ht_chroma * src_strd;
2062*c83a76b0SSuyog Pawar ps_sao += (ps_sps->i2_pic_wd_in_ctb);
2063*c83a76b0SSuyog Pawar }
2064*c83a76b0SSuyog Pawar
2065*c83a76b0SSuyog Pawar /* Left CTB */
2066*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0)
2067*c83a76b0SSuyog Pawar {
2068*c83a76b0SSuyog Pawar WORD32 sao_wd_luma = SAO_SHIFT_CTB;
2069*c83a76b0SSuyog Pawar WORD32 sao_wd_chroma = 2 * SAO_SHIFT_CTB;
2070*c83a76b0SSuyog Pawar WORD32 sao_ht_luma = ctb_size - SAO_SHIFT_CTB;
2071*c83a76b0SSuyog Pawar WORD32 sao_ht_chroma = ctb_size / 2 - SAO_SHIFT_CTB;
2072*c83a76b0SSuyog Pawar
2073*c83a76b0SSuyog Pawar WORD32 ctbx_l_t = 0, ctbx_l_l = 0, ctbx_l_r = 0, ctbx_l_d = 0, ctbx_l = 0;
2074*c83a76b0SSuyog Pawar WORD32 ctby_l_t = 0, ctby_l_l = 0, ctby_l_r = 0, ctby_l_d = 0, ctby_l = 0;
2075*c83a76b0SSuyog Pawar WORD32 au4_idx_l[8], idx_l;
2076*c83a76b0SSuyog Pawar
2077*c83a76b0SSuyog Pawar WORD32 remaining_rows;
2078*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr_left;
2079*c83a76b0SSuyog Pawar {
2080*c83a76b0SSuyog Pawar WORD32 left_ctb_indx = (ps_sao_ctxt->i4_ctb_y) * ps_sps->i2_pic_wd_in_ctb +
2081*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_x - 1);
2082*c83a76b0SSuyog Pawar ps_slice_hdr_left = ps_slice_hdr_base + pu1_slice_idx[left_ctb_indx];
2083*c83a76b0SSuyog Pawar }
2084*c83a76b0SSuyog Pawar
2085*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + sao_ht_luma);
2086*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
2087*c83a76b0SSuyog Pawar {
2088*c83a76b0SSuyog Pawar sao_ht_luma += remaining_rows;
2089*c83a76b0SSuyog Pawar }
2090*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples / 2 - ((ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) + sao_ht_chroma);
2091*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
2092*c83a76b0SSuyog Pawar {
2093*c83a76b0SSuyog Pawar sao_ht_chroma += remaining_rows;
2094*c83a76b0SSuyog Pawar }
2095*c83a76b0SSuyog Pawar
2096*c83a76b0SSuyog Pawar pu1_src_luma -= sao_wd_luma;
2097*c83a76b0SSuyog Pawar pu1_src_chroma -= sao_wd_chroma;
2098*c83a76b0SSuyog Pawar ps_sao -= 1;
2099*c83a76b0SSuyog Pawar pu1_src_top_luma = ps_sao_ctxt->pu1_sao_src_top_luma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma;
2100*c83a76b0SSuyog Pawar pu1_src_top_chroma = ps_sao_ctxt->pu1_sao_src_top_chroma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma;
2101*c83a76b0SSuyog Pawar pu1_src_left_luma = ps_sao_ctxt->pu1_sao_src_left_luma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
2102*c83a76b0SSuyog Pawar pu1_src_left_chroma = ps_sao_ctxt->pu1_sao_src_left_chroma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
2103*c83a76b0SSuyog Pawar
2104*c83a76b0SSuyog Pawar
2105*c83a76b0SSuyog Pawar if(0 != sao_ht_luma)
2106*c83a76b0SSuyog Pawar {
2107*c83a76b0SSuyog Pawar if(ps_slice_hdr_left->i1_slice_sao_luma_flag)
2108*c83a76b0SSuyog Pawar {
2109*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_y_type_idx)
2110*c83a76b0SSuyog Pawar {
2111*c83a76b0SSuyog Pawar /* Update left, top and top-left */
2112*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
2113*c83a76b0SSuyog Pawar {
2114*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
2115*c83a76b0SSuyog Pawar }
2116*c83a76b0SSuyog Pawar /*Update in next location*/
2117*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
2118*c83a76b0SSuyog Pawar
2119*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
2120*c83a76b0SSuyog Pawar
2121*c83a76b0SSuyog Pawar }
2122*c83a76b0SSuyog Pawar
2123*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_y_type_idx)
2124*c83a76b0SSuyog Pawar {
2125*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
2126*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
2127*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
2128*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
2129*c83a76b0SSuyog Pawar
2130*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_luma_fptr(pu1_src_luma,
2131*c83a76b0SSuyog Pawar src_strd,
2132*c83a76b0SSuyog Pawar pu1_src_left_luma,
2133*c83a76b0SSuyog Pawar pu1_src_top_luma,
2134*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb,
2135*c83a76b0SSuyog Pawar ps_sao->b5_y_band_pos,
2136*c83a76b0SSuyog Pawar ai1_offset_y,
2137*c83a76b0SSuyog Pawar sao_wd_luma,
2138*c83a76b0SSuyog Pawar sao_ht_luma
2139*c83a76b0SSuyog Pawar );
2140*c83a76b0SSuyog Pawar }
2141*c83a76b0SSuyog Pawar
2142*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_y_type_idx)
2143*c83a76b0SSuyog Pawar {
2144*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
2145*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
2146*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
2147*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
2148*c83a76b0SSuyog Pawar
2149*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2150*c83a76b0SSuyog Pawar {
2151*c83a76b0SSuyog Pawar au1_avail_luma[i] = 255;
2152*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
2153*c83a76b0SSuyog Pawar au4_idx_l[i] = 0;
2154*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2155*c83a76b0SSuyog Pawar }
2156*c83a76b0SSuyog Pawar /******************************************************************
2157*c83a76b0SSuyog Pawar * Derive the Top-left CTB's neighbour pixel's slice indices.
2158*c83a76b0SSuyog Pawar *
2159*c83a76b0SSuyog Pawar *
2160*c83a76b0SSuyog Pawar * ____________
2161*c83a76b0SSuyog Pawar * | | |
2162*c83a76b0SSuyog Pawar * | L_T| |
2163*c83a76b0SSuyog Pawar * |____|_______|____
2164*c83a76b0SSuyog Pawar * | | | |
2165*c83a76b0SSuyog Pawar * L_L | L | L_R | |
2166*c83a76b0SSuyog Pawar * |____|_______| |
2167*c83a76b0SSuyog Pawar * | |
2168*c83a76b0SSuyog Pawar * L_D | |
2169*c83a76b0SSuyog Pawar * |____________|
2170*c83a76b0SSuyog Pawar *
2171*c83a76b0SSuyog Pawar *****************************************************************/
2172*c83a76b0SSuyog Pawar
2173*c83a76b0SSuyog Pawar /*In case of slices or tiles*/
2174*c83a76b0SSuyog Pawar {
2175*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2176*c83a76b0SSuyog Pawar {
2177*c83a76b0SSuyog Pawar ctbx_l_t = ps_sao_ctxt->i4_ctb_x - 1;
2178*c83a76b0SSuyog Pawar ctby_l_t = ps_sao_ctxt->i4_ctb_y - 1;
2179*c83a76b0SSuyog Pawar
2180*c83a76b0SSuyog Pawar ctbx_l_l = ps_sao_ctxt->i4_ctb_x - 1;
2181*c83a76b0SSuyog Pawar ctby_l_l = ps_sao_ctxt->i4_ctb_y;
2182*c83a76b0SSuyog Pawar
2183*c83a76b0SSuyog Pawar ctbx_l_r = ps_sao_ctxt->i4_ctb_x;
2184*c83a76b0SSuyog Pawar ctby_l_r = ps_sao_ctxt->i4_ctb_y;
2185*c83a76b0SSuyog Pawar
2186*c83a76b0SSuyog Pawar ctbx_l_d = ps_sao_ctxt->i4_ctb_x - 1;
2187*c83a76b0SSuyog Pawar ctby_l_d = ps_sao_ctxt->i4_ctb_y;
2188*c83a76b0SSuyog Pawar
2189*c83a76b0SSuyog Pawar ctbx_l = ps_sao_ctxt->i4_ctb_x - 1;
2190*c83a76b0SSuyog Pawar ctby_l = ps_sao_ctxt->i4_ctb_y;
2191*c83a76b0SSuyog Pawar
2192*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
2193*c83a76b0SSuyog Pawar {
2194*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2195*c83a76b0SSuyog Pawar {
2196*c83a76b0SSuyog Pawar au4_idx_l[2] = -1;
2197*c83a76b0SSuyog Pawar au4_idx_l[4] = -1;
2198*c83a76b0SSuyog Pawar au4_idx_l[5] = -1;
2199*c83a76b0SSuyog Pawar }
2200*c83a76b0SSuyog Pawar else
2201*c83a76b0SSuyog Pawar {
2202*c83a76b0SSuyog Pawar au4_idx_l[2] = au4_idx_l[4] = pu1_slice_idx[ctbx_l_t + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2203*c83a76b0SSuyog Pawar au4_idx_l[5] = pu1_slice_idx[ctbx_l_t + 1 + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2204*c83a76b0SSuyog Pawar }
2205*c83a76b0SSuyog Pawar idx_l = au4_idx_l[6] = pu1_slice_idx[ctbx_l + (ctby_l * ps_sps->i2_pic_wd_in_ctb)];
2206*c83a76b0SSuyog Pawar au4_idx_l[0] = pu1_slice_idx[ctbx_l_l + (ctby_l_l * ps_sps->i2_pic_wd_in_ctb)];
2207*c83a76b0SSuyog Pawar au4_idx_l[1] = au4_idx_l[7] = pu1_slice_idx[ctbx_l_r + (ctby_l_r * ps_sps->i2_pic_wd_in_ctb)];
2208*c83a76b0SSuyog Pawar au4_idx_l[3] = pu1_slice_idx[ctbx_l_d + (ctby_l_d * ps_sps->i2_pic_wd_in_ctb)];
2209*c83a76b0SSuyog Pawar
2210*c83a76b0SSuyog Pawar /*Verify that the neighbor ctbs don't cross pic boundary.*/
2211*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2212*c83a76b0SSuyog Pawar {
2213*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = 0;
2214*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
2215*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
2216*c83a76b0SSuyog Pawar }
2217*c83a76b0SSuyog Pawar else
2218*c83a76b0SSuyog Pawar {
2219*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_l)->i1_slice_loop_filter_across_slices_enabled_flag;
2220*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[2];
2221*c83a76b0SSuyog Pawar
2222*c83a76b0SSuyog Pawar }
2223*c83a76b0SSuyog Pawar //TODO: ILF flag checks for [0] and [6] is missing.
2224*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_l[1])->i1_slice_loop_filter_across_slices_enabled_flag;
2225*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_l[3])->i1_slice_loop_filter_across_slices_enabled_flag;
2226*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_l[7])->i1_slice_loop_filter_across_slices_enabled_flag;
2227*c83a76b0SSuyog Pawar
2228*c83a76b0SSuyog Pawar if(idx_l < au4_idx_l[5])
2229*c83a76b0SSuyog Pawar {
2230*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + au4_idx_l[5])->i1_slice_loop_filter_across_slices_enabled_flag;
2231*c83a76b0SSuyog Pawar }
2232*c83a76b0SSuyog Pawar
2233*c83a76b0SSuyog Pawar /*
2234*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
2235*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
2236*c83a76b0SSuyog Pawar */
2237*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2238*c83a76b0SSuyog Pawar {
2239*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2240*c83a76b0SSuyog Pawar if(au4_idx_l[i] != idx_l)
2241*c83a76b0SSuyog Pawar {
2242*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
2243*c83a76b0SSuyog Pawar }
2244*c83a76b0SSuyog Pawar else
2245*c83a76b0SSuyog Pawar {
2246*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2247*c83a76b0SSuyog Pawar }
2248*c83a76b0SSuyog Pawar }
2249*c83a76b0SSuyog Pawar /*Reset indices*/
2250*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2251*c83a76b0SSuyog Pawar {
2252*c83a76b0SSuyog Pawar au4_idx_l[i] = 0;
2253*c83a76b0SSuyog Pawar }
2254*c83a76b0SSuyog Pawar }
2255*c83a76b0SSuyog Pawar
2256*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
2257*c83a76b0SSuyog Pawar {
2258*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
2259*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
2260*c83a76b0SSuyog Pawar {
2261*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
2262*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
2263*c83a76b0SSuyog Pawar {
2264*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2265*c83a76b0SSuyog Pawar {
2266*c83a76b0SSuyog Pawar au4_idx_l[2] = -1;
2267*c83a76b0SSuyog Pawar au4_idx_l[4] = -1;
2268*c83a76b0SSuyog Pawar au4_idx_l[5] = -1;
2269*c83a76b0SSuyog Pawar }
2270*c83a76b0SSuyog Pawar else
2271*c83a76b0SSuyog Pawar {
2272*c83a76b0SSuyog Pawar au4_idx_l[2] = au4_idx_l[4] = pu1_tile_idx[ctbx_l_t + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2273*c83a76b0SSuyog Pawar au4_idx_l[5] = pu1_tile_idx[ctbx_l_t + 1 + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2274*c83a76b0SSuyog Pawar }
2275*c83a76b0SSuyog Pawar
2276*c83a76b0SSuyog Pawar idx_l = au4_idx_l[6] = pu1_tile_idx[ctbx_l + (ctby_l * ps_sps->i2_pic_wd_in_ctb)];
2277*c83a76b0SSuyog Pawar au4_idx_l[0] = pu1_tile_idx[ctbx_l_l + (ctby_l_l * ps_sps->i2_pic_wd_in_ctb)];
2278*c83a76b0SSuyog Pawar au4_idx_l[1] = au4_idx_l[7] = pu1_tile_idx[ctbx_l_r + (ctby_l_r * ps_sps->i2_pic_wd_in_ctb)];
2279*c83a76b0SSuyog Pawar au4_idx_l[3] = pu1_tile_idx[ctbx_l_d + (ctby_l_d * ps_sps->i2_pic_wd_in_ctb)];
2280*c83a76b0SSuyog Pawar
2281*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2282*c83a76b0SSuyog Pawar {
2283*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2284*c83a76b0SSuyog Pawar if(au4_idx_l[i] != idx_l)
2285*c83a76b0SSuyog Pawar {
2286*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
2287*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag;
2288*c83a76b0SSuyog Pawar }
2289*c83a76b0SSuyog Pawar }
2290*c83a76b0SSuyog Pawar }
2291*c83a76b0SSuyog Pawar }
2292*c83a76b0SSuyog Pawar }
2293*c83a76b0SSuyog Pawar
2294*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2295*c83a76b0SSuyog Pawar {
2296*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2297*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
2298*c83a76b0SSuyog Pawar {
2299*c83a76b0SSuyog Pawar au1_avail_luma[i] = 0;
2300*c83a76b0SSuyog Pawar }
2301*c83a76b0SSuyog Pawar }
2302*c83a76b0SSuyog Pawar }
2303*c83a76b0SSuyog Pawar }
2304*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_luma)
2305*c83a76b0SSuyog Pawar {
2306*c83a76b0SSuyog Pawar au1_avail_luma[0] = 0;
2307*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
2308*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
2309*c83a76b0SSuyog Pawar }
2310*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_wd_in_ctb == ps_sao_ctxt->i4_ctb_x)
2311*c83a76b0SSuyog Pawar {
2312*c83a76b0SSuyog Pawar au1_avail_luma[1] = 0;
2313*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
2314*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
2315*c83a76b0SSuyog Pawar }
2316*c83a76b0SSuyog Pawar
2317*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2318*c83a76b0SSuyog Pawar {
2319*c83a76b0SSuyog Pawar au1_avail_luma[2] = 0;
2320*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
2321*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
2322*c83a76b0SSuyog Pawar }
2323*c83a76b0SSuyog Pawar
2324*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_height_in_luma_samples - (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) <= sao_ht_luma)
2325*c83a76b0SSuyog Pawar {
2326*c83a76b0SSuyog Pawar au1_avail_luma[3] = 0;
2327*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
2328*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
2329*c83a76b0SSuyog Pawar }
2330*c83a76b0SSuyog Pawar
2331*c83a76b0SSuyog Pawar {
2332*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_luma[sao_wd_luma];
2333*c83a76b0SSuyog Pawar u1_sao_src_top_left_luma_bot_left = pu1_sao_src_top_left_luma_bot_left[0];
2334*c83a76b0SSuyog Pawar ps_codec->apf_sao_luma[ps_sao->b3_y_type_idx - 2](pu1_src_luma,
2335*c83a76b0SSuyog Pawar src_strd,
2336*c83a76b0SSuyog Pawar pu1_src_left_luma,
2337*c83a76b0SSuyog Pawar pu1_src_top_luma,
2338*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb,
2339*c83a76b0SSuyog Pawar au1_src_top_right,
2340*c83a76b0SSuyog Pawar &u1_sao_src_top_left_luma_bot_left,
2341*c83a76b0SSuyog Pawar au1_avail_luma,
2342*c83a76b0SSuyog Pawar ai1_offset_y,
2343*c83a76b0SSuyog Pawar sao_wd_luma,
2344*c83a76b0SSuyog Pawar sao_ht_luma);
2345*c83a76b0SSuyog Pawar }
2346*c83a76b0SSuyog Pawar
2347*c83a76b0SSuyog Pawar }
2348*c83a76b0SSuyog Pawar }
2349*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2350*c83a76b0SSuyog Pawar {
2351*c83a76b0SSuyog Pawar /* Update left, top and top-left */
2352*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
2353*c83a76b0SSuyog Pawar {
2354*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
2355*c83a76b0SSuyog Pawar }
2356*c83a76b0SSuyog Pawar /*Update in next location*/
2357*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
2358*c83a76b0SSuyog Pawar
2359*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
2360*c83a76b0SSuyog Pawar }
2361*c83a76b0SSuyog Pawar }
2362*c83a76b0SSuyog Pawar
2363*c83a76b0SSuyog Pawar if(0 != sao_ht_chroma)
2364*c83a76b0SSuyog Pawar {
2365*c83a76b0SSuyog Pawar if(ps_slice_hdr_left->i1_slice_sao_chroma_flag)
2366*c83a76b0SSuyog Pawar {
2367*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_cb_type_idx)
2368*c83a76b0SSuyog Pawar {
2369*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
2370*c83a76b0SSuyog Pawar {
2371*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
2372*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
2373*c83a76b0SSuyog Pawar }
2374*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
2375*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
2376*c83a76b0SSuyog Pawar
2377*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
2378*c83a76b0SSuyog Pawar }
2379*c83a76b0SSuyog Pawar
2380*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_cb_type_idx)
2381*c83a76b0SSuyog Pawar {
2382*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
2383*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
2384*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
2385*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
2386*c83a76b0SSuyog Pawar
2387*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
2388*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
2389*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
2390*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
2391*c83a76b0SSuyog Pawar
2392*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
2393*c83a76b0SSuyog Pawar {
2394*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
2395*c83a76b0SSuyog Pawar src_strd,
2396*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2397*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2398*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
2399*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
2400*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
2401*c83a76b0SSuyog Pawar ai1_offset_cr,
2402*c83a76b0SSuyog Pawar ai1_offset_cb,
2403*c83a76b0SSuyog Pawar sao_wd_chroma,
2404*c83a76b0SSuyog Pawar sao_ht_chroma
2405*c83a76b0SSuyog Pawar );
2406*c83a76b0SSuyog Pawar }
2407*c83a76b0SSuyog Pawar else
2408*c83a76b0SSuyog Pawar {
2409*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
2410*c83a76b0SSuyog Pawar src_strd,
2411*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2412*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2413*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
2414*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
2415*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
2416*c83a76b0SSuyog Pawar ai1_offset_cb,
2417*c83a76b0SSuyog Pawar ai1_offset_cr,
2418*c83a76b0SSuyog Pawar sao_wd_chroma,
2419*c83a76b0SSuyog Pawar sao_ht_chroma
2420*c83a76b0SSuyog Pawar );
2421*c83a76b0SSuyog Pawar }
2422*c83a76b0SSuyog Pawar }
2423*c83a76b0SSuyog Pawar
2424*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_cb_type_idx)
2425*c83a76b0SSuyog Pawar {
2426*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
2427*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
2428*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
2429*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
2430*c83a76b0SSuyog Pawar
2431*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
2432*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
2433*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
2434*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
2435*c83a76b0SSuyog Pawar
2436*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2437*c83a76b0SSuyog Pawar {
2438*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 255;
2439*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
2440*c83a76b0SSuyog Pawar au4_idx_l[i] = 0;
2441*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2442*c83a76b0SSuyog Pawar }
2443*c83a76b0SSuyog Pawar /*In case of slices*/
2444*c83a76b0SSuyog Pawar {
2445*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2446*c83a76b0SSuyog Pawar {
2447*c83a76b0SSuyog Pawar ctbx_l_t = ps_sao_ctxt->i4_ctb_x - 1;
2448*c83a76b0SSuyog Pawar ctby_l_t = ps_sao_ctxt->i4_ctb_y - 1;
2449*c83a76b0SSuyog Pawar
2450*c83a76b0SSuyog Pawar ctbx_l_l = ps_sao_ctxt->i4_ctb_x - 1;
2451*c83a76b0SSuyog Pawar ctby_l_l = ps_sao_ctxt->i4_ctb_y;
2452*c83a76b0SSuyog Pawar
2453*c83a76b0SSuyog Pawar ctbx_l_r = ps_sao_ctxt->i4_ctb_x;
2454*c83a76b0SSuyog Pawar ctby_l_r = ps_sao_ctxt->i4_ctb_y;
2455*c83a76b0SSuyog Pawar
2456*c83a76b0SSuyog Pawar ctbx_l_d = ps_sao_ctxt->i4_ctb_x - 1;
2457*c83a76b0SSuyog Pawar ctby_l_d = ps_sao_ctxt->i4_ctb_y;
2458*c83a76b0SSuyog Pawar
2459*c83a76b0SSuyog Pawar ctbx_l = ps_sao_ctxt->i4_ctb_x - 1;
2460*c83a76b0SSuyog Pawar ctby_l = ps_sao_ctxt->i4_ctb_y;
2461*c83a76b0SSuyog Pawar
2462*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
2463*c83a76b0SSuyog Pawar {
2464*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2465*c83a76b0SSuyog Pawar {
2466*c83a76b0SSuyog Pawar au4_idx_l[2] = -1;
2467*c83a76b0SSuyog Pawar au4_idx_l[4] = -1;
2468*c83a76b0SSuyog Pawar au4_idx_l[5] = -1;
2469*c83a76b0SSuyog Pawar }
2470*c83a76b0SSuyog Pawar else
2471*c83a76b0SSuyog Pawar {
2472*c83a76b0SSuyog Pawar au4_idx_l[2] = au4_idx_l[4] = pu1_slice_idx[ctbx_l_t + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2473*c83a76b0SSuyog Pawar au4_idx_l[5] = pu1_slice_idx[ctbx_l_t + 1 + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2474*c83a76b0SSuyog Pawar }
2475*c83a76b0SSuyog Pawar idx_l = au4_idx_l[6] = pu1_slice_idx[ctbx_l + (ctby_l * ps_sps->i2_pic_wd_in_ctb)];
2476*c83a76b0SSuyog Pawar au4_idx_l[0] = pu1_slice_idx[ctbx_l_l + (ctby_l_l * ps_sps->i2_pic_wd_in_ctb)];
2477*c83a76b0SSuyog Pawar au4_idx_l[1] = au4_idx_l[7] = pu1_slice_idx[ctbx_l_r + (ctby_l_r * ps_sps->i2_pic_wd_in_ctb)];
2478*c83a76b0SSuyog Pawar au4_idx_l[3] = pu1_slice_idx[ctbx_l_d + (ctby_l_d * ps_sps->i2_pic_wd_in_ctb)];
2479*c83a76b0SSuyog Pawar
2480*c83a76b0SSuyog Pawar /*Verify that the neighbour ctbs dont cross pic boundary.*/
2481*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2482*c83a76b0SSuyog Pawar {
2483*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = 0;
2484*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
2485*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
2486*c83a76b0SSuyog Pawar }
2487*c83a76b0SSuyog Pawar else
2488*c83a76b0SSuyog Pawar {
2489*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_l)->i1_slice_loop_filter_across_slices_enabled_flag;
2490*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[2];
2491*c83a76b0SSuyog Pawar }
2492*c83a76b0SSuyog Pawar
2493*c83a76b0SSuyog Pawar if(au4_idx_l[5] > idx_l)
2494*c83a76b0SSuyog Pawar {
2495*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = (ps_slice_hdr_base + au4_idx_l[5])->i1_slice_loop_filter_across_slices_enabled_flag;
2496*c83a76b0SSuyog Pawar }
2497*c83a76b0SSuyog Pawar
2498*c83a76b0SSuyog Pawar // au4_ilf_across_tile_slice_enable[5] = au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_l)->i1_slice_loop_filter_across_slices_enabled_flag;
2499*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_l[1])->i1_slice_loop_filter_across_slices_enabled_flag;
2500*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_l[3])->i1_slice_loop_filter_across_slices_enabled_flag;
2501*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_l[7])->i1_slice_loop_filter_across_slices_enabled_flag;
2502*c83a76b0SSuyog Pawar /*
2503*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
2504*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
2505*c83a76b0SSuyog Pawar */
2506*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2507*c83a76b0SSuyog Pawar {
2508*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2509*c83a76b0SSuyog Pawar if(au4_idx_l[i] != idx_l)
2510*c83a76b0SSuyog Pawar {
2511*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
2512*c83a76b0SSuyog Pawar }
2513*c83a76b0SSuyog Pawar else
2514*c83a76b0SSuyog Pawar {
2515*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2516*c83a76b0SSuyog Pawar }
2517*c83a76b0SSuyog Pawar }
2518*c83a76b0SSuyog Pawar /*Reset indices*/
2519*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2520*c83a76b0SSuyog Pawar {
2521*c83a76b0SSuyog Pawar au4_idx_l[i] = 0;
2522*c83a76b0SSuyog Pawar }
2523*c83a76b0SSuyog Pawar }
2524*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
2525*c83a76b0SSuyog Pawar {
2526*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
2527*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
2528*c83a76b0SSuyog Pawar {
2529*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
2530*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
2531*c83a76b0SSuyog Pawar {
2532*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2533*c83a76b0SSuyog Pawar {
2534*c83a76b0SSuyog Pawar au4_idx_l[2] = -1;
2535*c83a76b0SSuyog Pawar au4_idx_l[4] = -1;
2536*c83a76b0SSuyog Pawar au4_idx_l[5] = -1;
2537*c83a76b0SSuyog Pawar }
2538*c83a76b0SSuyog Pawar else
2539*c83a76b0SSuyog Pawar {
2540*c83a76b0SSuyog Pawar au4_idx_l[2] = au4_idx_l[4] = pu1_tile_idx[ctbx_l_t + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2541*c83a76b0SSuyog Pawar au4_idx_l[5] = pu1_tile_idx[ctbx_l_t + 1 + (ctby_l_t * ps_sps->i2_pic_wd_in_ctb)];
2542*c83a76b0SSuyog Pawar }
2543*c83a76b0SSuyog Pawar
2544*c83a76b0SSuyog Pawar idx_l = au4_idx_l[6] = pu1_tile_idx[ctbx_l + (ctby_l * ps_sps->i2_pic_wd_in_ctb)];
2545*c83a76b0SSuyog Pawar au4_idx_l[0] = pu1_tile_idx[ctbx_l_l + (ctby_l_l * ps_sps->i2_pic_wd_in_ctb)];
2546*c83a76b0SSuyog Pawar au4_idx_l[1] = au4_idx_l[7] = pu1_tile_idx[ctbx_l_r + (ctby_l_r * ps_sps->i2_pic_wd_in_ctb)];
2547*c83a76b0SSuyog Pawar au4_idx_l[3] = pu1_tile_idx[ctbx_l_d + (ctby_l_d * ps_sps->i2_pic_wd_in_ctb)];
2548*c83a76b0SSuyog Pawar
2549*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2550*c83a76b0SSuyog Pawar {
2551*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2552*c83a76b0SSuyog Pawar if(au4_idx_l[i] != idx_l)
2553*c83a76b0SSuyog Pawar {
2554*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
2555*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag; //=0
2556*c83a76b0SSuyog Pawar }
2557*c83a76b0SSuyog Pawar }
2558*c83a76b0SSuyog Pawar }
2559*c83a76b0SSuyog Pawar }
2560*c83a76b0SSuyog Pawar }
2561*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2562*c83a76b0SSuyog Pawar {
2563*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2564*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
2565*c83a76b0SSuyog Pawar {
2566*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 0;
2567*c83a76b0SSuyog Pawar }
2568*c83a76b0SSuyog Pawar }
2569*c83a76b0SSuyog Pawar }
2570*c83a76b0SSuyog Pawar }
2571*c83a76b0SSuyog Pawar if(0 == (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) - sao_wd_chroma)
2572*c83a76b0SSuyog Pawar {
2573*c83a76b0SSuyog Pawar au1_avail_chroma[0] = 0;
2574*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
2575*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
2576*c83a76b0SSuyog Pawar }
2577*c83a76b0SSuyog Pawar
2578*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_wd_in_ctb == ps_sao_ctxt->i4_ctb_x)
2579*c83a76b0SSuyog Pawar {
2580*c83a76b0SSuyog Pawar au1_avail_chroma[1] = 0;
2581*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
2582*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
2583*c83a76b0SSuyog Pawar }
2584*c83a76b0SSuyog Pawar
2585*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2586*c83a76b0SSuyog Pawar {
2587*c83a76b0SSuyog Pawar au1_avail_chroma[2] = 0;
2588*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
2589*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
2590*c83a76b0SSuyog Pawar }
2591*c83a76b0SSuyog Pawar
2592*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_height_in_luma_samples / 2 - (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) <= sao_ht_chroma)
2593*c83a76b0SSuyog Pawar {
2594*c83a76b0SSuyog Pawar au1_avail_chroma[3] = 0;
2595*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
2596*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
2597*c83a76b0SSuyog Pawar }
2598*c83a76b0SSuyog Pawar
2599*c83a76b0SSuyog Pawar {
2600*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_top_chroma[sao_wd_chroma];
2601*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_src_top_chroma[sao_wd_chroma + 1];
2602*c83a76b0SSuyog Pawar au1_src_bot_left[0] = pu1_sao_src_top_left_chroma_bot_left[0];
2603*c83a76b0SSuyog Pawar au1_src_bot_left[1] = pu1_sao_src_top_left_chroma_bot_left[1];
2604*c83a76b0SSuyog Pawar //au1_src_bot_left[0] = pu1_src_chroma[sao_ht_chroma * src_strd - 2];
2605*c83a76b0SSuyog Pawar //au1_src_bot_left[1] = pu1_src_chroma[sao_ht_chroma * src_strd - 1];
2606*c83a76b0SSuyog Pawar if((ctb_size == 16) && (ps_sao_ctxt->i4_ctb_x != ps_sps->i2_pic_wd_in_ctb - 1))
2607*c83a76b0SSuyog Pawar {
2608*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_chroma[sao_wd_chroma - src_strd];
2609*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_src_chroma[sao_wd_chroma - src_strd + 1];
2610*c83a76b0SSuyog Pawar }
2611*c83a76b0SSuyog Pawar
2612*c83a76b0SSuyog Pawar
2613*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
2614*c83a76b0SSuyog Pawar {
2615*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
2616*c83a76b0SSuyog Pawar src_strd,
2617*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2618*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2619*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
2620*c83a76b0SSuyog Pawar au1_src_top_right,
2621*c83a76b0SSuyog Pawar au1_src_bot_left,
2622*c83a76b0SSuyog Pawar au1_avail_chroma,
2623*c83a76b0SSuyog Pawar ai1_offset_cr,
2624*c83a76b0SSuyog Pawar ai1_offset_cb,
2625*c83a76b0SSuyog Pawar sao_wd_chroma,
2626*c83a76b0SSuyog Pawar sao_ht_chroma);
2627*c83a76b0SSuyog Pawar }
2628*c83a76b0SSuyog Pawar else
2629*c83a76b0SSuyog Pawar {
2630*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
2631*c83a76b0SSuyog Pawar src_strd,
2632*c83a76b0SSuyog Pawar pu1_src_left_chroma,
2633*c83a76b0SSuyog Pawar pu1_src_top_chroma,
2634*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
2635*c83a76b0SSuyog Pawar au1_src_top_right,
2636*c83a76b0SSuyog Pawar au1_src_bot_left,
2637*c83a76b0SSuyog Pawar au1_avail_chroma,
2638*c83a76b0SSuyog Pawar ai1_offset_cb,
2639*c83a76b0SSuyog Pawar ai1_offset_cr,
2640*c83a76b0SSuyog Pawar sao_wd_chroma,
2641*c83a76b0SSuyog Pawar sao_ht_chroma);
2642*c83a76b0SSuyog Pawar }
2643*c83a76b0SSuyog Pawar }
2644*c83a76b0SSuyog Pawar
2645*c83a76b0SSuyog Pawar }
2646*c83a76b0SSuyog Pawar }
2647*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2648*c83a76b0SSuyog Pawar {
2649*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
2650*c83a76b0SSuyog Pawar {
2651*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
2652*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
2653*c83a76b0SSuyog Pawar }
2654*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
2655*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
2656*c83a76b0SSuyog Pawar
2657*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
2658*c83a76b0SSuyog Pawar }
2659*c83a76b0SSuyog Pawar
2660*c83a76b0SSuyog Pawar }
2661*c83a76b0SSuyog Pawar pu1_src_luma += sao_wd_luma;
2662*c83a76b0SSuyog Pawar pu1_src_chroma += sao_wd_chroma;
2663*c83a76b0SSuyog Pawar ps_sao += 1;
2664*c83a76b0SSuyog Pawar }
2665*c83a76b0SSuyog Pawar
2666*c83a76b0SSuyog Pawar
2667*c83a76b0SSuyog Pawar /* Current CTB */
2668*c83a76b0SSuyog Pawar {
2669*c83a76b0SSuyog Pawar WORD32 sao_wd_luma = ctb_size - SAO_SHIFT_CTB;
2670*c83a76b0SSuyog Pawar WORD32 sao_wd_chroma = ctb_size - SAO_SHIFT_CTB * 2;
2671*c83a76b0SSuyog Pawar WORD32 sao_ht_luma = ctb_size - SAO_SHIFT_CTB;
2672*c83a76b0SSuyog Pawar WORD32 sao_ht_chroma = ctb_size / 2 - SAO_SHIFT_CTB;
2673*c83a76b0SSuyog Pawar WORD32 ctbx_c_t = 0, ctbx_c_l = 0, ctbx_c_r = 0, ctbx_c_d = 0, ctbx_c = 0;
2674*c83a76b0SSuyog Pawar WORD32 ctby_c_t = 0, ctby_c_l = 0, ctby_c_r = 0, ctby_c_d = 0, ctby_c = 0;
2675*c83a76b0SSuyog Pawar WORD32 au4_idx_c[8], idx_c;
2676*c83a76b0SSuyog Pawar
2677*c83a76b0SSuyog Pawar WORD32 remaining_rows;
2678*c83a76b0SSuyog Pawar WORD32 remaining_cols;
2679*c83a76b0SSuyog Pawar
2680*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + sao_wd_luma);
2681*c83a76b0SSuyog Pawar if(remaining_cols <= SAO_SHIFT_CTB)
2682*c83a76b0SSuyog Pawar {
2683*c83a76b0SSuyog Pawar sao_wd_luma += remaining_cols;
2684*c83a76b0SSuyog Pawar }
2685*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + sao_wd_chroma);
2686*c83a76b0SSuyog Pawar if(remaining_cols <= 2 * SAO_SHIFT_CTB)
2687*c83a76b0SSuyog Pawar {
2688*c83a76b0SSuyog Pawar sao_wd_chroma += remaining_cols;
2689*c83a76b0SSuyog Pawar }
2690*c83a76b0SSuyog Pawar
2691*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + sao_ht_luma);
2692*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
2693*c83a76b0SSuyog Pawar {
2694*c83a76b0SSuyog Pawar sao_ht_luma += remaining_rows;
2695*c83a76b0SSuyog Pawar }
2696*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples / 2 - ((ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) + sao_ht_chroma);
2697*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
2698*c83a76b0SSuyog Pawar {
2699*c83a76b0SSuyog Pawar sao_ht_chroma += remaining_rows;
2700*c83a76b0SSuyog Pawar }
2701*c83a76b0SSuyog Pawar
2702*c83a76b0SSuyog Pawar pu1_src_top_luma = ps_sao_ctxt->pu1_sao_src_top_luma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
2703*c83a76b0SSuyog Pawar pu1_src_top_chroma = ps_sao_ctxt->pu1_sao_src_top_chroma + (ps_sao_ctxt->i4_ctb_x << log2_ctb_size);
2704*c83a76b0SSuyog Pawar pu1_src_left_luma = ps_sao_ctxt->pu1_sao_src_left_luma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
2705*c83a76b0SSuyog Pawar pu1_src_left_chroma = ps_sao_ctxt->pu1_sao_src_left_chroma + (ps_sao_ctxt->i4_ctb_y << log2_ctb_size);
2706*c83a76b0SSuyog Pawar
2707*c83a76b0SSuyog Pawar if((0 != sao_wd_luma) && (0 != sao_ht_luma))
2708*c83a76b0SSuyog Pawar {
2709*c83a76b0SSuyog Pawar if(ps_sao_ctxt->ps_slice_hdr->i1_slice_sao_luma_flag)
2710*c83a76b0SSuyog Pawar {
2711*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_y_type_idx)
2712*c83a76b0SSuyog Pawar {
2713*c83a76b0SSuyog Pawar /* Update left, top and top-left */
2714*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
2715*c83a76b0SSuyog Pawar {
2716*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
2717*c83a76b0SSuyog Pawar }
2718*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
2719*c83a76b0SSuyog Pawar
2720*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
2721*c83a76b0SSuyog Pawar
2722*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_top_right[0] = pu1_src_luma[(sao_ht_luma - 1) * src_strd + sao_wd_luma];
2723*c83a76b0SSuyog Pawar
2724*c83a76b0SSuyog Pawar }
2725*c83a76b0SSuyog Pawar
2726*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_y_type_idx)
2727*c83a76b0SSuyog Pawar {
2728*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
2729*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
2730*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
2731*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
2732*c83a76b0SSuyog Pawar
2733*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_luma_fptr(pu1_src_luma,
2734*c83a76b0SSuyog Pawar src_strd,
2735*c83a76b0SSuyog Pawar pu1_src_left_luma,
2736*c83a76b0SSuyog Pawar pu1_src_top_luma,
2737*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb,
2738*c83a76b0SSuyog Pawar ps_sao->b5_y_band_pos,
2739*c83a76b0SSuyog Pawar ai1_offset_y,
2740*c83a76b0SSuyog Pawar sao_wd_luma,
2741*c83a76b0SSuyog Pawar sao_ht_luma
2742*c83a76b0SSuyog Pawar );
2743*c83a76b0SSuyog Pawar }
2744*c83a76b0SSuyog Pawar
2745*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_y_type_idx)
2746*c83a76b0SSuyog Pawar {
2747*c83a76b0SSuyog Pawar ai1_offset_y[1] = ps_sao->b4_y_offset_1;
2748*c83a76b0SSuyog Pawar ai1_offset_y[2] = ps_sao->b4_y_offset_2;
2749*c83a76b0SSuyog Pawar ai1_offset_y[3] = ps_sao->b4_y_offset_3;
2750*c83a76b0SSuyog Pawar ai1_offset_y[4] = ps_sao->b4_y_offset_4;
2751*c83a76b0SSuyog Pawar
2752*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2753*c83a76b0SSuyog Pawar {
2754*c83a76b0SSuyog Pawar au1_avail_luma[i] = 255;
2755*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
2756*c83a76b0SSuyog Pawar au4_idx_c[i] = 0;
2757*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2758*c83a76b0SSuyog Pawar }
2759*c83a76b0SSuyog Pawar /******************************************************************
2760*c83a76b0SSuyog Pawar * Derive the Top-left CTB's neighbour pixel's slice indices.
2761*c83a76b0SSuyog Pawar *
2762*c83a76b0SSuyog Pawar *
2763*c83a76b0SSuyog Pawar * ____________
2764*c83a76b0SSuyog Pawar * | | |
2765*c83a76b0SSuyog Pawar * | | C_T |
2766*c83a76b0SSuyog Pawar * |____|_______|____
2767*c83a76b0SSuyog Pawar * | | | |
2768*c83a76b0SSuyog Pawar * | C_L| C | C_R|
2769*c83a76b0SSuyog Pawar * |____|_______| |
2770*c83a76b0SSuyog Pawar * | C_D |
2771*c83a76b0SSuyog Pawar * | |
2772*c83a76b0SSuyog Pawar * |____________|
2773*c83a76b0SSuyog Pawar *
2774*c83a76b0SSuyog Pawar *****************************************************************/
2775*c83a76b0SSuyog Pawar
2776*c83a76b0SSuyog Pawar /*In case of slices*/
2777*c83a76b0SSuyog Pawar {
2778*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2779*c83a76b0SSuyog Pawar {
2780*c83a76b0SSuyog Pawar ctbx_c_t = ps_sao_ctxt->i4_ctb_x;
2781*c83a76b0SSuyog Pawar ctby_c_t = ps_sao_ctxt->i4_ctb_y - 1;
2782*c83a76b0SSuyog Pawar
2783*c83a76b0SSuyog Pawar ctbx_c_l = ps_sao_ctxt->i4_ctb_x - 1;
2784*c83a76b0SSuyog Pawar ctby_c_l = ps_sao_ctxt->i4_ctb_y;
2785*c83a76b0SSuyog Pawar
2786*c83a76b0SSuyog Pawar ctbx_c_r = ps_sao_ctxt->i4_ctb_x;
2787*c83a76b0SSuyog Pawar ctby_c_r = ps_sao_ctxt->i4_ctb_y;
2788*c83a76b0SSuyog Pawar
2789*c83a76b0SSuyog Pawar ctbx_c_d = ps_sao_ctxt->i4_ctb_x;
2790*c83a76b0SSuyog Pawar ctby_c_d = ps_sao_ctxt->i4_ctb_y;
2791*c83a76b0SSuyog Pawar
2792*c83a76b0SSuyog Pawar ctbx_c = ps_sao_ctxt->i4_ctb_x;
2793*c83a76b0SSuyog Pawar ctby_c = ps_sao_ctxt->i4_ctb_y;
2794*c83a76b0SSuyog Pawar
2795*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
2796*c83a76b0SSuyog Pawar {
2797*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
2798*c83a76b0SSuyog Pawar {
2799*c83a76b0SSuyog Pawar au4_idx_c[6] = -1;
2800*c83a76b0SSuyog Pawar au4_idx_c[0] = -1;
2801*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
2802*c83a76b0SSuyog Pawar }
2803*c83a76b0SSuyog Pawar else
2804*c83a76b0SSuyog Pawar {
2805*c83a76b0SSuyog Pawar au4_idx_c[0] = au4_idx_c[6] = pu1_slice_idx[ctbx_c_l + (ctby_c_l * ps_sps->i2_pic_wd_in_ctb)];
2806*c83a76b0SSuyog Pawar }
2807*c83a76b0SSuyog Pawar
2808*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2809*c83a76b0SSuyog Pawar {
2810*c83a76b0SSuyog Pawar au4_idx_c[2] = -1;
2811*c83a76b0SSuyog Pawar au4_idx_c[5] = -1;
2812*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
2813*c83a76b0SSuyog Pawar }
2814*c83a76b0SSuyog Pawar else
2815*c83a76b0SSuyog Pawar {
2816*c83a76b0SSuyog Pawar au4_idx_c[4] = pu1_slice_idx[ctbx_c_t - 1 + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
2817*c83a76b0SSuyog Pawar au4_idx_c[2] = au4_idx_c[5] = pu1_slice_idx[ctbx_c_t + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
2818*c83a76b0SSuyog Pawar }
2819*c83a76b0SSuyog Pawar idx_c = pu1_slice_idx[ctbx_c + (ctby_c * ps_sps->i2_pic_wd_in_ctb)];
2820*c83a76b0SSuyog Pawar au4_idx_c[1] = au4_idx_c[7] = pu1_slice_idx[ctbx_c_r + (ctby_c_r * ps_sps->i2_pic_wd_in_ctb)];
2821*c83a76b0SSuyog Pawar au4_idx_c[3] = pu1_slice_idx[ctbx_c_d + (ctby_c_d * ps_sps->i2_pic_wd_in_ctb)];
2822*c83a76b0SSuyog Pawar
2823*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
2824*c83a76b0SSuyog Pawar {
2825*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
2826*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = 0;
2827*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
2828*c83a76b0SSuyog Pawar }
2829*c83a76b0SSuyog Pawar else
2830*c83a76b0SSuyog Pawar {
2831*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + au4_idx_c[6])->i1_slice_loop_filter_across_slices_enabled_flag;
2832*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;;
2833*c83a76b0SSuyog Pawar }
2834*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2835*c83a76b0SSuyog Pawar {
2836*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = 0;
2837*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
2838*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
2839*c83a76b0SSuyog Pawar }
2840*c83a76b0SSuyog Pawar else
2841*c83a76b0SSuyog Pawar {
2842*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;
2843*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[2];
2844*c83a76b0SSuyog Pawar }
2845*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] = (ps_slice_hdr_base + au4_idx_c[1])->i1_slice_loop_filter_across_slices_enabled_flag;
2846*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] = (ps_slice_hdr_base + au4_idx_c[3])->i1_slice_loop_filter_across_slices_enabled_flag;
2847*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] = (ps_slice_hdr_base + au4_idx_c[7])->i1_slice_loop_filter_across_slices_enabled_flag;
2848*c83a76b0SSuyog Pawar
2849*c83a76b0SSuyog Pawar if(au4_idx_c[6] < idx_c)
2850*c83a76b0SSuyog Pawar {
2851*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;
2852*c83a76b0SSuyog Pawar }
2853*c83a76b0SSuyog Pawar
2854*c83a76b0SSuyog Pawar /*
2855*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
2856*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
2857*c83a76b0SSuyog Pawar */
2858*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2859*c83a76b0SSuyog Pawar {
2860*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2861*c83a76b0SSuyog Pawar if(au4_idx_c[i] != idx_c)
2862*c83a76b0SSuyog Pawar {
2863*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
2864*c83a76b0SSuyog Pawar }
2865*c83a76b0SSuyog Pawar else
2866*c83a76b0SSuyog Pawar {
2867*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
2868*c83a76b0SSuyog Pawar }
2869*c83a76b0SSuyog Pawar }
2870*c83a76b0SSuyog Pawar /*Reset indices*/
2871*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2872*c83a76b0SSuyog Pawar {
2873*c83a76b0SSuyog Pawar au4_idx_c[i] = 0;
2874*c83a76b0SSuyog Pawar }
2875*c83a76b0SSuyog Pawar }
2876*c83a76b0SSuyog Pawar
2877*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
2878*c83a76b0SSuyog Pawar {
2879*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
2880*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
2881*c83a76b0SSuyog Pawar {
2882*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
2883*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
2884*c83a76b0SSuyog Pawar {
2885*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
2886*c83a76b0SSuyog Pawar {
2887*c83a76b0SSuyog Pawar au4_idx_c[6] = -1;
2888*c83a76b0SSuyog Pawar au4_idx_c[0] = -1;
2889*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
2890*c83a76b0SSuyog Pawar }
2891*c83a76b0SSuyog Pawar else
2892*c83a76b0SSuyog Pawar {
2893*c83a76b0SSuyog Pawar au4_idx_c[0] = au4_idx_c[6] = pu1_tile_idx[ctbx_c_l + (ctby_c_l * ps_sps->i2_pic_wd_in_ctb)];
2894*c83a76b0SSuyog Pawar }
2895*c83a76b0SSuyog Pawar
2896*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2897*c83a76b0SSuyog Pawar {
2898*c83a76b0SSuyog Pawar au4_idx_c[2] = -1;
2899*c83a76b0SSuyog Pawar au4_idx_c[5] = -1;
2900*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
2901*c83a76b0SSuyog Pawar }
2902*c83a76b0SSuyog Pawar else
2903*c83a76b0SSuyog Pawar {
2904*c83a76b0SSuyog Pawar au4_idx_c[4] = pu1_tile_idx[ctbx_c_t - 1 + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
2905*c83a76b0SSuyog Pawar au4_idx_c[2] = au4_idx_c[5] = pu1_tile_idx[ctbx_c_t + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
2906*c83a76b0SSuyog Pawar }
2907*c83a76b0SSuyog Pawar idx_c = pu1_tile_idx[ctbx_c + (ctby_c * ps_sps->i2_pic_wd_in_ctb)];
2908*c83a76b0SSuyog Pawar au4_idx_c[1] = au4_idx_c[7] = pu1_tile_idx[ctbx_c_r + (ctby_c_r * ps_sps->i2_pic_wd_in_ctb)];
2909*c83a76b0SSuyog Pawar au4_idx_c[3] = pu1_tile_idx[ctbx_c_d + (ctby_c_d * ps_sps->i2_pic_wd_in_ctb)];
2910*c83a76b0SSuyog Pawar
2911*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2912*c83a76b0SSuyog Pawar {
2913*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2914*c83a76b0SSuyog Pawar if(au4_idx_c[i] != idx_c)
2915*c83a76b0SSuyog Pawar {
2916*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
2917*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag; //=0
2918*c83a76b0SSuyog Pawar }
2919*c83a76b0SSuyog Pawar }
2920*c83a76b0SSuyog Pawar }
2921*c83a76b0SSuyog Pawar }
2922*c83a76b0SSuyog Pawar }
2923*c83a76b0SSuyog Pawar
2924*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
2925*c83a76b0SSuyog Pawar {
2926*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
2927*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
2928*c83a76b0SSuyog Pawar {
2929*c83a76b0SSuyog Pawar au1_avail_luma[i] = 0;
2930*c83a76b0SSuyog Pawar }
2931*c83a76b0SSuyog Pawar }
2932*c83a76b0SSuyog Pawar
2933*c83a76b0SSuyog Pawar }
2934*c83a76b0SSuyog Pawar }
2935*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
2936*c83a76b0SSuyog Pawar {
2937*c83a76b0SSuyog Pawar au1_avail_luma[0] = 0;
2938*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
2939*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
2940*c83a76b0SSuyog Pawar }
2941*c83a76b0SSuyog Pawar
2942*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_width_in_luma_samples - (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) <= sao_wd_luma)
2943*c83a76b0SSuyog Pawar {
2944*c83a76b0SSuyog Pawar au1_avail_luma[1] = 0;
2945*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
2946*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
2947*c83a76b0SSuyog Pawar }
2948*c83a76b0SSuyog Pawar
2949*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
2950*c83a76b0SSuyog Pawar {
2951*c83a76b0SSuyog Pawar au1_avail_luma[2] = 0;
2952*c83a76b0SSuyog Pawar au1_avail_luma[4] = 0;
2953*c83a76b0SSuyog Pawar au1_avail_luma[5] = 0;
2954*c83a76b0SSuyog Pawar }
2955*c83a76b0SSuyog Pawar
2956*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_height_in_luma_samples - (ps_sao_ctxt->i4_ctb_y << log2_ctb_size) <= sao_ht_luma)
2957*c83a76b0SSuyog Pawar {
2958*c83a76b0SSuyog Pawar au1_avail_luma[3] = 0;
2959*c83a76b0SSuyog Pawar au1_avail_luma[6] = 0;
2960*c83a76b0SSuyog Pawar au1_avail_luma[7] = 0;
2961*c83a76b0SSuyog Pawar }
2962*c83a76b0SSuyog Pawar
2963*c83a76b0SSuyog Pawar {
2964*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_luma[sao_wd_luma - src_strd];
2965*c83a76b0SSuyog Pawar u1_sao_src_top_left_luma_bot_left = pu1_src_luma[sao_ht_luma * src_strd - 1];
2966*c83a76b0SSuyog Pawar
2967*c83a76b0SSuyog Pawar ps_codec->apf_sao_luma[ps_sao->b3_y_type_idx - 2](pu1_src_luma,
2968*c83a76b0SSuyog Pawar src_strd,
2969*c83a76b0SSuyog Pawar pu1_src_left_luma,
2970*c83a76b0SSuyog Pawar pu1_src_top_luma,
2971*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb,
2972*c83a76b0SSuyog Pawar au1_src_top_right,
2973*c83a76b0SSuyog Pawar &u1_sao_src_top_left_luma_bot_left,
2974*c83a76b0SSuyog Pawar au1_avail_luma,
2975*c83a76b0SSuyog Pawar ai1_offset_y,
2976*c83a76b0SSuyog Pawar sao_wd_luma,
2977*c83a76b0SSuyog Pawar sao_ht_luma);
2978*c83a76b0SSuyog Pawar }
2979*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_top_right[0] = pu1_src_luma[(sao_ht_luma - 1) * src_strd + sao_wd_luma];
2980*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_bot_left[0] = pu1_src_luma[(sao_ht_luma)*src_strd + sao_wd_luma - 1];
2981*c83a76b0SSuyog Pawar }
2982*c83a76b0SSuyog Pawar }
2983*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
2984*c83a76b0SSuyog Pawar {
2985*c83a76b0SSuyog Pawar /* Update left, top and top-left */
2986*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_luma; row++)
2987*c83a76b0SSuyog Pawar {
2988*c83a76b0SSuyog Pawar pu1_src_left_luma[row] = pu1_src_luma[row * src_strd + (sao_wd_luma - 1)];
2989*c83a76b0SSuyog Pawar }
2990*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_curr_ctb[0] = pu1_src_top_luma[sao_wd_luma - 1];
2991*c83a76b0SSuyog Pawar
2992*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_luma, &pu1_src_luma[(sao_ht_luma - 1) * src_strd], sao_wd_luma);
2993*c83a76b0SSuyog Pawar
2994*c83a76b0SSuyog Pawar pu1_sao_src_top_left_luma_top_right[0] = pu1_src_luma[(sao_ht_luma - 1) * src_strd + sao_wd_luma];
2995*c83a76b0SSuyog Pawar }
2996*c83a76b0SSuyog Pawar }
2997*c83a76b0SSuyog Pawar
2998*c83a76b0SSuyog Pawar if((0 != sao_wd_chroma) && (0 != sao_ht_chroma))
2999*c83a76b0SSuyog Pawar {
3000*c83a76b0SSuyog Pawar if(ps_sao_ctxt->ps_slice_hdr->i1_slice_sao_chroma_flag)
3001*c83a76b0SSuyog Pawar {
3002*c83a76b0SSuyog Pawar if(0 == ps_sao->b3_cb_type_idx)
3003*c83a76b0SSuyog Pawar {
3004*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
3005*c83a76b0SSuyog Pawar {
3006*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
3007*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
3008*c83a76b0SSuyog Pawar }
3009*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
3010*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
3011*c83a76b0SSuyog Pawar
3012*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
3013*c83a76b0SSuyog Pawar
3014*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[0] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma];
3015*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[1] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma + 1];
3016*c83a76b0SSuyog Pawar }
3017*c83a76b0SSuyog Pawar
3018*c83a76b0SSuyog Pawar else if(1 == ps_sao->b3_cb_type_idx)
3019*c83a76b0SSuyog Pawar {
3020*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
3021*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
3022*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
3023*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
3024*c83a76b0SSuyog Pawar
3025*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
3026*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
3027*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
3028*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
3029*c83a76b0SSuyog Pawar
3030*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
3031*c83a76b0SSuyog Pawar {
3032*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
3033*c83a76b0SSuyog Pawar src_strd,
3034*c83a76b0SSuyog Pawar pu1_src_left_chroma,
3035*c83a76b0SSuyog Pawar pu1_src_top_chroma,
3036*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
3037*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
3038*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
3039*c83a76b0SSuyog Pawar ai1_offset_cr,
3040*c83a76b0SSuyog Pawar ai1_offset_cb,
3041*c83a76b0SSuyog Pawar sao_wd_chroma,
3042*c83a76b0SSuyog Pawar sao_ht_chroma
3043*c83a76b0SSuyog Pawar );
3044*c83a76b0SSuyog Pawar }
3045*c83a76b0SSuyog Pawar else
3046*c83a76b0SSuyog Pawar {
3047*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_sao_band_offset_chroma_fptr(pu1_src_chroma,
3048*c83a76b0SSuyog Pawar src_strd,
3049*c83a76b0SSuyog Pawar pu1_src_left_chroma,
3050*c83a76b0SSuyog Pawar pu1_src_top_chroma,
3051*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
3052*c83a76b0SSuyog Pawar ps_sao->b5_cb_band_pos,
3053*c83a76b0SSuyog Pawar ps_sao->b5_cr_band_pos,
3054*c83a76b0SSuyog Pawar ai1_offset_cb,
3055*c83a76b0SSuyog Pawar ai1_offset_cr,
3056*c83a76b0SSuyog Pawar sao_wd_chroma,
3057*c83a76b0SSuyog Pawar sao_ht_chroma
3058*c83a76b0SSuyog Pawar );
3059*c83a76b0SSuyog Pawar }
3060*c83a76b0SSuyog Pawar }
3061*c83a76b0SSuyog Pawar
3062*c83a76b0SSuyog Pawar else // if(2 <= ps_sao->b3_cb_type_idx)
3063*c83a76b0SSuyog Pawar {
3064*c83a76b0SSuyog Pawar ai1_offset_cb[1] = ps_sao->b4_cb_offset_1;
3065*c83a76b0SSuyog Pawar ai1_offset_cb[2] = ps_sao->b4_cb_offset_2;
3066*c83a76b0SSuyog Pawar ai1_offset_cb[3] = ps_sao->b4_cb_offset_3;
3067*c83a76b0SSuyog Pawar ai1_offset_cb[4] = ps_sao->b4_cb_offset_4;
3068*c83a76b0SSuyog Pawar
3069*c83a76b0SSuyog Pawar ai1_offset_cr[1] = ps_sao->b4_cr_offset_1;
3070*c83a76b0SSuyog Pawar ai1_offset_cr[2] = ps_sao->b4_cr_offset_2;
3071*c83a76b0SSuyog Pawar ai1_offset_cr[3] = ps_sao->b4_cr_offset_3;
3072*c83a76b0SSuyog Pawar ai1_offset_cr[4] = ps_sao->b4_cr_offset_4;
3073*c83a76b0SSuyog Pawar
3074*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
3075*c83a76b0SSuyog Pawar {
3076*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 255;
3077*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 0;
3078*c83a76b0SSuyog Pawar au4_idx_c[i] = 0;
3079*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
3080*c83a76b0SSuyog Pawar }
3081*c83a76b0SSuyog Pawar {
3082*c83a76b0SSuyog Pawar if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
3083*c83a76b0SSuyog Pawar {
3084*c83a76b0SSuyog Pawar ctbx_c_t = ps_sao_ctxt->i4_ctb_x;
3085*c83a76b0SSuyog Pawar ctby_c_t = ps_sao_ctxt->i4_ctb_y - 1;
3086*c83a76b0SSuyog Pawar
3087*c83a76b0SSuyog Pawar ctbx_c_l = ps_sao_ctxt->i4_ctb_x - 1;
3088*c83a76b0SSuyog Pawar ctby_c_l = ps_sao_ctxt->i4_ctb_y;
3089*c83a76b0SSuyog Pawar
3090*c83a76b0SSuyog Pawar ctbx_c_r = ps_sao_ctxt->i4_ctb_x;
3091*c83a76b0SSuyog Pawar ctby_c_r = ps_sao_ctxt->i4_ctb_y;
3092*c83a76b0SSuyog Pawar
3093*c83a76b0SSuyog Pawar ctbx_c_d = ps_sao_ctxt->i4_ctb_x;
3094*c83a76b0SSuyog Pawar ctby_c_d = ps_sao_ctxt->i4_ctb_y;
3095*c83a76b0SSuyog Pawar
3096*c83a76b0SSuyog Pawar ctbx_c = ps_sao_ctxt->i4_ctb_x;
3097*c83a76b0SSuyog Pawar ctby_c = ps_sao_ctxt->i4_ctb_y;
3098*c83a76b0SSuyog Pawar
3099*c83a76b0SSuyog Pawar if(!ps_slice_hdr->i1_first_slice_in_pic_flag)
3100*c83a76b0SSuyog Pawar {
3101*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
3102*c83a76b0SSuyog Pawar {
3103*c83a76b0SSuyog Pawar au4_idx_c[0] = -1;
3104*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
3105*c83a76b0SSuyog Pawar au4_idx_c[6] = -1;
3106*c83a76b0SSuyog Pawar }
3107*c83a76b0SSuyog Pawar else
3108*c83a76b0SSuyog Pawar {
3109*c83a76b0SSuyog Pawar au4_idx_c[0] = au4_idx_c[6] = pu1_slice_idx[ctbx_c_l + (ctby_c_l * ps_sps->i2_pic_wd_in_ctb)];
3110*c83a76b0SSuyog Pawar }
3111*c83a76b0SSuyog Pawar
3112*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
3113*c83a76b0SSuyog Pawar {
3114*c83a76b0SSuyog Pawar au4_idx_c[2] = -1;
3115*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
3116*c83a76b0SSuyog Pawar au4_idx_c[5] = -1;
3117*c83a76b0SSuyog Pawar }
3118*c83a76b0SSuyog Pawar else
3119*c83a76b0SSuyog Pawar {
3120*c83a76b0SSuyog Pawar au4_idx_c[2] = au4_idx_c[5] = pu1_slice_idx[ctbx_c_t + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
3121*c83a76b0SSuyog Pawar au4_idx_c[4] = pu1_slice_idx[ctbx_c_t - 1 + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
3122*c83a76b0SSuyog Pawar }
3123*c83a76b0SSuyog Pawar idx_c = pu1_slice_idx[ctbx_c + (ctby_c * ps_sps->i2_pic_wd_in_ctb)];
3124*c83a76b0SSuyog Pawar au4_idx_c[1] = au4_idx_c[7] = pu1_slice_idx[ctbx_c_r + (ctby_c_r * ps_sps->i2_pic_wd_in_ctb)];
3125*c83a76b0SSuyog Pawar au4_idx_c[3] = pu1_slice_idx[ctbx_c_d + (ctby_c_d * ps_sps->i2_pic_wd_in_ctb)];
3126*c83a76b0SSuyog Pawar
3127*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
3128*c83a76b0SSuyog Pawar {
3129*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] = 0;
3130*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
3131*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = 0;
3132*c83a76b0SSuyog Pawar }
3133*c83a76b0SSuyog Pawar else
3134*c83a76b0SSuyog Pawar {
3135*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] &= (ps_slice_hdr_base + au4_idx_c[6])->i1_slice_loop_filter_across_slices_enabled_flag;
3136*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[0] &= (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;
3137*c83a76b0SSuyog Pawar }
3138*c83a76b0SSuyog Pawar
3139*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
3140*c83a76b0SSuyog Pawar {
3141*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] = 0;
3142*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[4] = 0;
3143*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = 0;
3144*c83a76b0SSuyog Pawar }
3145*c83a76b0SSuyog Pawar else
3146*c83a76b0SSuyog Pawar {
3147*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[2] &= (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;
3148*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[5] = au4_ilf_across_tile_slice_enable[4] = au4_ilf_across_tile_slice_enable[2];
3149*c83a76b0SSuyog Pawar }
3150*c83a76b0SSuyog Pawar
3151*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[1] &= (ps_slice_hdr_base + au4_idx_c[1])->i1_slice_loop_filter_across_slices_enabled_flag;
3152*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[3] &= (ps_slice_hdr_base + au4_idx_c[3])->i1_slice_loop_filter_across_slices_enabled_flag;
3153*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[7] &= (ps_slice_hdr_base + au4_idx_c[7])->i1_slice_loop_filter_across_slices_enabled_flag;
3154*c83a76b0SSuyog Pawar
3155*c83a76b0SSuyog Pawar if(idx_c > au4_idx_c[6])
3156*c83a76b0SSuyog Pawar {
3157*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[6] = (ps_slice_hdr_base + idx_c)->i1_slice_loop_filter_across_slices_enabled_flag;
3158*c83a76b0SSuyog Pawar }
3159*c83a76b0SSuyog Pawar
3160*c83a76b0SSuyog Pawar /*
3161*c83a76b0SSuyog Pawar * Between each neighbor and the current CTB, the i1_slice_loop_filter_across_slices_enabled_flag
3162*c83a76b0SSuyog Pawar * of the pixel having a greater address is checked. Accordingly, set the availability flags
3163*c83a76b0SSuyog Pawar */
3164*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
3165*c83a76b0SSuyog Pawar {
3166*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
3167*c83a76b0SSuyog Pawar if(au4_idx_c[i] != idx_c)
3168*c83a76b0SSuyog Pawar {
3169*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] = 1;
3170*c83a76b0SSuyog Pawar }
3171*c83a76b0SSuyog Pawar else
3172*c83a76b0SSuyog Pawar {
3173*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] = 1;
3174*c83a76b0SSuyog Pawar }
3175*c83a76b0SSuyog Pawar }
3176*c83a76b0SSuyog Pawar /*Reset indices*/
3177*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
3178*c83a76b0SSuyog Pawar {
3179*c83a76b0SSuyog Pawar au4_idx_c[i] = 0;
3180*c83a76b0SSuyog Pawar }
3181*c83a76b0SSuyog Pawar }
3182*c83a76b0SSuyog Pawar
3183*c83a76b0SSuyog Pawar if(ps_pps->i1_tiles_enabled_flag)
3184*c83a76b0SSuyog Pawar {
3185*c83a76b0SSuyog Pawar /* Calculate availability flags at slice boundary */
3186*c83a76b0SSuyog Pawar if(((ps_tile->u1_pos_x == ps_sao_ctxt->i4_ctb_x) || (ps_tile->u1_pos_y == ps_sao_ctxt->i4_ctb_y)) && (!((0 == ps_tile->u1_pos_x) && (0 == ps_tile->u1_pos_y))))
3187*c83a76b0SSuyog Pawar {
3188*c83a76b0SSuyog Pawar /*If ilf across tiles is enabled, boundary availability for tiles is not checked. */
3189*c83a76b0SSuyog Pawar if(!ps_pps->i1_loop_filter_across_tiles_enabled_flag)
3190*c83a76b0SSuyog Pawar {
3191*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
3192*c83a76b0SSuyog Pawar {
3193*c83a76b0SSuyog Pawar au4_idx_c[6] = -1;
3194*c83a76b0SSuyog Pawar au4_idx_c[0] = -1;
3195*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
3196*c83a76b0SSuyog Pawar }
3197*c83a76b0SSuyog Pawar else
3198*c83a76b0SSuyog Pawar {
3199*c83a76b0SSuyog Pawar au4_idx_c[0] = au4_idx_c[6] = pu1_tile_idx[ctbx_c_l + (ctby_c_l * ps_sps->i2_pic_wd_in_ctb)];
3200*c83a76b0SSuyog Pawar }
3201*c83a76b0SSuyog Pawar
3202*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
3203*c83a76b0SSuyog Pawar {
3204*c83a76b0SSuyog Pawar au4_idx_c[2] = -1;
3205*c83a76b0SSuyog Pawar au4_idx_c[5] = -1;
3206*c83a76b0SSuyog Pawar au4_idx_c[4] = -1;
3207*c83a76b0SSuyog Pawar }
3208*c83a76b0SSuyog Pawar else
3209*c83a76b0SSuyog Pawar {
3210*c83a76b0SSuyog Pawar au4_idx_c[4] = pu1_tile_idx[ctbx_c_t - 1 + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
3211*c83a76b0SSuyog Pawar au4_idx_c[2] = au4_idx_c[5] = pu1_tile_idx[ctbx_c_t + (ctby_c_t * ps_sps->i2_pic_wd_in_ctb)];
3212*c83a76b0SSuyog Pawar }
3213*c83a76b0SSuyog Pawar idx_c = pu1_tile_idx[ctbx_c + (ctby_c * ps_sps->i2_pic_wd_in_ctb)];
3214*c83a76b0SSuyog Pawar au4_idx_c[1] = au4_idx_c[7] = pu1_tile_idx[ctbx_c_r + (ctby_c_r * ps_sps->i2_pic_wd_in_ctb)];
3215*c83a76b0SSuyog Pawar au4_idx_c[3] = pu1_tile_idx[ctbx_c_d + (ctby_c_d * ps_sps->i2_pic_wd_in_ctb)];
3216*c83a76b0SSuyog Pawar
3217*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
3218*c83a76b0SSuyog Pawar {
3219*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
3220*c83a76b0SSuyog Pawar if(au4_idx_c[i] != idx_c)
3221*c83a76b0SSuyog Pawar {
3222*c83a76b0SSuyog Pawar au1_tile_slice_boundary[i] |= 1;
3223*c83a76b0SSuyog Pawar au4_ilf_across_tile_slice_enable[i] &= ps_pps->i1_loop_filter_across_tiles_enabled_flag; //=0
3224*c83a76b0SSuyog Pawar }
3225*c83a76b0SSuyog Pawar }
3226*c83a76b0SSuyog Pawar }
3227*c83a76b0SSuyog Pawar }
3228*c83a76b0SSuyog Pawar }
3229*c83a76b0SSuyog Pawar
3230*c83a76b0SSuyog Pawar for(i = 0; i < 8; i++)
3231*c83a76b0SSuyog Pawar {
3232*c83a76b0SSuyog Pawar /*Sets the edges that lie on the slice/tile boundary*/
3233*c83a76b0SSuyog Pawar if((au1_tile_slice_boundary[i]) && !(au4_ilf_across_tile_slice_enable[i]))
3234*c83a76b0SSuyog Pawar {
3235*c83a76b0SSuyog Pawar au1_avail_chroma[i] = 0;
3236*c83a76b0SSuyog Pawar }
3237*c83a76b0SSuyog Pawar }
3238*c83a76b0SSuyog Pawar }
3239*c83a76b0SSuyog Pawar }
3240*c83a76b0SSuyog Pawar
3241*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_x)
3242*c83a76b0SSuyog Pawar {
3243*c83a76b0SSuyog Pawar au1_avail_chroma[0] = 0;
3244*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
3245*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
3246*c83a76b0SSuyog Pawar }
3247*c83a76b0SSuyog Pawar
3248*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_width_in_luma_samples - (ps_sao_ctxt->i4_ctb_x << log2_ctb_size) <= sao_wd_chroma)
3249*c83a76b0SSuyog Pawar {
3250*c83a76b0SSuyog Pawar au1_avail_chroma[1] = 0;
3251*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
3252*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
3253*c83a76b0SSuyog Pawar }
3254*c83a76b0SSuyog Pawar
3255*c83a76b0SSuyog Pawar if(0 == ps_sao_ctxt->i4_ctb_y)
3256*c83a76b0SSuyog Pawar {
3257*c83a76b0SSuyog Pawar au1_avail_chroma[2] = 0;
3258*c83a76b0SSuyog Pawar au1_avail_chroma[4] = 0;
3259*c83a76b0SSuyog Pawar au1_avail_chroma[5] = 0;
3260*c83a76b0SSuyog Pawar }
3261*c83a76b0SSuyog Pawar
3262*c83a76b0SSuyog Pawar if(ps_sps->i2_pic_height_in_luma_samples / 2 - (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 1)) <= sao_ht_chroma)
3263*c83a76b0SSuyog Pawar {
3264*c83a76b0SSuyog Pawar au1_avail_chroma[3] = 0;
3265*c83a76b0SSuyog Pawar au1_avail_chroma[6] = 0;
3266*c83a76b0SSuyog Pawar au1_avail_chroma[7] = 0;
3267*c83a76b0SSuyog Pawar }
3268*c83a76b0SSuyog Pawar
3269*c83a76b0SSuyog Pawar {
3270*c83a76b0SSuyog Pawar au1_src_top_right[0] = pu1_src_chroma[sao_wd_chroma - src_strd];
3271*c83a76b0SSuyog Pawar au1_src_top_right[1] = pu1_src_chroma[sao_wd_chroma - src_strd + 1];
3272*c83a76b0SSuyog Pawar
3273*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[0] = pu1_src_chroma[sao_ht_chroma * src_strd - 2];
3274*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left[1] = pu1_src_chroma[sao_ht_chroma * src_strd - 1];
3275*c83a76b0SSuyog Pawar
3276*c83a76b0SSuyog Pawar if(chroma_yuv420sp_vu)
3277*c83a76b0SSuyog Pawar {
3278*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
3279*c83a76b0SSuyog Pawar src_strd,
3280*c83a76b0SSuyog Pawar pu1_src_left_chroma,
3281*c83a76b0SSuyog Pawar pu1_src_top_chroma,
3282*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
3283*c83a76b0SSuyog Pawar au1_src_top_right,
3284*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
3285*c83a76b0SSuyog Pawar au1_avail_chroma,
3286*c83a76b0SSuyog Pawar ai1_offset_cr,
3287*c83a76b0SSuyog Pawar ai1_offset_cb,
3288*c83a76b0SSuyog Pawar sao_wd_chroma,
3289*c83a76b0SSuyog Pawar sao_ht_chroma);
3290*c83a76b0SSuyog Pawar }
3291*c83a76b0SSuyog Pawar else
3292*c83a76b0SSuyog Pawar {
3293*c83a76b0SSuyog Pawar ps_codec->apf_sao_chroma[ps_sao->b3_cb_type_idx - 2](pu1_src_chroma,
3294*c83a76b0SSuyog Pawar src_strd,
3295*c83a76b0SSuyog Pawar pu1_src_left_chroma,
3296*c83a76b0SSuyog Pawar pu1_src_top_chroma,
3297*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb,
3298*c83a76b0SSuyog Pawar au1_src_top_right,
3299*c83a76b0SSuyog Pawar au1_sao_src_top_left_chroma_bot_left,
3300*c83a76b0SSuyog Pawar au1_avail_chroma,
3301*c83a76b0SSuyog Pawar ai1_offset_cb,
3302*c83a76b0SSuyog Pawar ai1_offset_cr,
3303*c83a76b0SSuyog Pawar sao_wd_chroma,
3304*c83a76b0SSuyog Pawar sao_ht_chroma);
3305*c83a76b0SSuyog Pawar }
3306*c83a76b0SSuyog Pawar }
3307*c83a76b0SSuyog Pawar
3308*c83a76b0SSuyog Pawar }
3309*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[0] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma];
3310*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[1] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma + 1];
3311*c83a76b0SSuyog Pawar
3312*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_bot_left[0] = pu1_src_chroma[(sao_ht_chroma)*src_strd + sao_wd_chroma - 2];
3313*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_bot_left[1] = pu1_src_chroma[(sao_ht_chroma)*src_strd + sao_wd_chroma - 1];
3314*c83a76b0SSuyog Pawar }
3315*c83a76b0SSuyog Pawar else if((!ps_slice_hdr->i1_first_slice_in_pic_flag) || (ps_pps->i1_tiles_enabled_flag))
3316*c83a76b0SSuyog Pawar {
3317*c83a76b0SSuyog Pawar for(row = 0; row < sao_ht_chroma; row++)
3318*c83a76b0SSuyog Pawar {
3319*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 2)];
3320*c83a76b0SSuyog Pawar pu1_src_left_chroma[2 * row + 1] = pu1_src_chroma[row * src_strd + (sao_wd_chroma - 1)];
3321*c83a76b0SSuyog Pawar }
3322*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[0] = pu1_src_top_chroma[sao_wd_chroma - 2];
3323*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_curr_ctb[1] = pu1_src_top_chroma[sao_wd_chroma - 1];
3324*c83a76b0SSuyog Pawar
3325*c83a76b0SSuyog Pawar ps_codec->s_func_selector.ihevc_memcpy_fptr(pu1_src_top_chroma, &pu1_src_chroma[(sao_ht_chroma - 1) * src_strd], sao_wd_chroma);
3326*c83a76b0SSuyog Pawar
3327*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[0] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma];
3328*c83a76b0SSuyog Pawar pu1_sao_src_top_left_chroma_top_right[1] = pu1_src_chroma[(sao_ht_chroma - 1) * src_strd + sao_wd_chroma + 1];
3329*c83a76b0SSuyog Pawar }
3330*c83a76b0SSuyog Pawar
3331*c83a76b0SSuyog Pawar }
3332*c83a76b0SSuyog Pawar }
3333*c83a76b0SSuyog Pawar
3334*c83a76b0SSuyog Pawar
3335*c83a76b0SSuyog Pawar
3336*c83a76b0SSuyog Pawar
3337*c83a76b0SSuyog Pawar /* If no loop filter is enabled copy the backed up values */
3338*c83a76b0SSuyog Pawar {
3339*c83a76b0SSuyog Pawar /* Luma */
3340*c83a76b0SSuyog Pawar if(no_loop_filter_enabled_luma)
3341*c83a76b0SSuyog Pawar {
3342*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
3343*c83a76b0SSuyog Pawar WORD32 loop_filter_bit_pos;
3344*c83a76b0SSuyog Pawar WORD32 log2_min_cu = 3;
3345*c83a76b0SSuyog Pawar WORD32 min_cu = (1 << log2_min_cu);
3346*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp_luma = pu1_src_luma;
3347*c83a76b0SSuyog Pawar WORD32 sao_blk_ht = ctb_size - SAO_SHIFT_CTB;
3348*c83a76b0SSuyog Pawar WORD32 sao_blk_wd = ctb_size;
3349*c83a76b0SSuyog Pawar WORD32 remaining_rows;
3350*c83a76b0SSuyog Pawar WORD32 remaining_cols;
3351*c83a76b0SSuyog Pawar
3352*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + ctb_size - SAO_SHIFT_CTB);
3353*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + ctb_size - SAO_SHIFT_CTB);
3354*c83a76b0SSuyog Pawar if(remaining_rows <= SAO_SHIFT_CTB)
3355*c83a76b0SSuyog Pawar sao_blk_ht += remaining_rows;
3356*c83a76b0SSuyog Pawar if(remaining_cols <= SAO_SHIFT_CTB)
3357*c83a76b0SSuyog Pawar sao_blk_wd += remaining_cols;
3358*c83a76b0SSuyog Pawar
3359*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= ps_sao_ctxt->i4_ctb_x ? SAO_SHIFT_CTB : 0;
3360*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB * src_strd : 0;
3361*c83a76b0SSuyog Pawar
3362*c83a76b0SSuyog Pawar pu1_src_backup_luma = ps_sao_ctxt->pu1_tmp_buf_luma;
3363*c83a76b0SSuyog Pawar
3364*c83a76b0SSuyog Pawar loop_filter_bit_pos = (ps_sao_ctxt->i4_ctb_x << (log2_ctb_size - 3)) +
3365*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 3)) * (loop_filter_strd << 3);
3366*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0)
3367*c83a76b0SSuyog Pawar loop_filter_bit_pos -= 1;
3368*c83a76b0SSuyog Pawar
3369*c83a76b0SSuyog Pawar pu1_no_loop_filter_flag = ps_sao_ctxt->pu1_pic_no_loop_filter_flag +
3370*c83a76b0SSuyog Pawar (loop_filter_bit_pos >> 3);
3371*c83a76b0SSuyog Pawar
3372*c83a76b0SSuyog Pawar for(i = -(ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB : 0) >> log2_min_cu;
3373*c83a76b0SSuyog Pawar i < (sao_blk_ht + (min_cu - 1)) >> log2_min_cu; i++)
3374*c83a76b0SSuyog Pawar {
3375*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_blk_wd;
3376*c83a76b0SSuyog Pawar
3377*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >>
3378*c83a76b0SSuyog Pawar (loop_filter_bit_pos & 7);
3379*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((tmp_wd + (min_cu - 1)) >> log2_min_cu)) - 1;
3380*c83a76b0SSuyog Pawar
3381*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
3382*c83a76b0SSuyog Pawar {
3383*c83a76b0SSuyog Pawar while(tmp_wd > 0)
3384*c83a76b0SSuyog Pawar {
3385*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
3386*c83a76b0SSuyog Pawar {
3387*c83a76b0SSuyog Pawar pu1_src_tmp_luma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3388*c83a76b0SSuyog Pawar pu1_src_backup_luma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3389*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu);
3390*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
3391*c83a76b0SSuyog Pawar }
3392*c83a76b0SSuyog Pawar else
3393*c83a76b0SSuyog Pawar {
3394*c83a76b0SSuyog Pawar for(row = 0; row < min_cu; row++)
3395*c83a76b0SSuyog Pawar {
3396*c83a76b0SSuyog Pawar for(col = 0; col < MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); col++)
3397*c83a76b0SSuyog Pawar {
3398*c83a76b0SSuyog Pawar pu1_src_tmp_luma[row * src_strd + col] = pu1_src_backup_luma[row * backup_strd + col];
3399*c83a76b0SSuyog Pawar }
3400*c83a76b0SSuyog Pawar }
3401*c83a76b0SSuyog Pawar pu1_src_tmp_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3402*c83a76b0SSuyog Pawar pu1_src_backup_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3403*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu);
3404*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
3405*c83a76b0SSuyog Pawar }
3406*c83a76b0SSuyog Pawar }
3407*c83a76b0SSuyog Pawar
3408*c83a76b0SSuyog Pawar pu1_src_tmp_luma -= sao_blk_wd;
3409*c83a76b0SSuyog Pawar pu1_src_backup_luma -= sao_blk_wd;
3410*c83a76b0SSuyog Pawar }
3411*c83a76b0SSuyog Pawar
3412*c83a76b0SSuyog Pawar pu1_src_tmp_luma += (src_strd << log2_min_cu);
3413*c83a76b0SSuyog Pawar pu1_src_backup_luma += (backup_strd << log2_min_cu);
3414*c83a76b0SSuyog Pawar }
3415*c83a76b0SSuyog Pawar }
3416*c83a76b0SSuyog Pawar
3417*c83a76b0SSuyog Pawar /* Chroma */
3418*c83a76b0SSuyog Pawar if(no_loop_filter_enabled_chroma)
3419*c83a76b0SSuyog Pawar {
3420*c83a76b0SSuyog Pawar UWORD32 u4_no_loop_filter_flag;
3421*c83a76b0SSuyog Pawar WORD32 loop_filter_bit_pos;
3422*c83a76b0SSuyog Pawar WORD32 log2_min_cu = 3;
3423*c83a76b0SSuyog Pawar WORD32 min_cu = (1 << log2_min_cu);
3424*c83a76b0SSuyog Pawar UWORD8 *pu1_src_tmp_chroma = pu1_src_chroma;
3425*c83a76b0SSuyog Pawar WORD32 sao_blk_ht = ctb_size - 2 * SAO_SHIFT_CTB;
3426*c83a76b0SSuyog Pawar WORD32 sao_blk_wd = ctb_size;
3427*c83a76b0SSuyog Pawar WORD32 remaining_rows;
3428*c83a76b0SSuyog Pawar WORD32 remaining_cols;
3429*c83a76b0SSuyog Pawar
3430*c83a76b0SSuyog Pawar remaining_rows = ps_sps->i2_pic_height_in_luma_samples - ((ps_sao_ctxt->i4_ctb_y << log2_ctb_size) + ctb_size - 2 * SAO_SHIFT_CTB);
3431*c83a76b0SSuyog Pawar remaining_cols = ps_sps->i2_pic_width_in_luma_samples - ((ps_sao_ctxt->i4_ctb_x << log2_ctb_size) + ctb_size - 2 * SAO_SHIFT_CTB);
3432*c83a76b0SSuyog Pawar if(remaining_rows <= 2 * SAO_SHIFT_CTB)
3433*c83a76b0SSuyog Pawar sao_blk_ht += remaining_rows;
3434*c83a76b0SSuyog Pawar if(remaining_cols <= 2 * SAO_SHIFT_CTB)
3435*c83a76b0SSuyog Pawar sao_blk_wd += remaining_cols;
3436*c83a76b0SSuyog Pawar
3437*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= ps_sao_ctxt->i4_ctb_x ? SAO_SHIFT_CTB * 2 : 0;
3438*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= ps_sao_ctxt->i4_ctb_y ? SAO_SHIFT_CTB * src_strd : 0;
3439*c83a76b0SSuyog Pawar
3440*c83a76b0SSuyog Pawar pu1_src_backup_chroma = ps_sao_ctxt->pu1_tmp_buf_chroma;
3441*c83a76b0SSuyog Pawar
3442*c83a76b0SSuyog Pawar loop_filter_bit_pos = (ps_sao_ctxt->i4_ctb_x << (log2_ctb_size - 3)) +
3443*c83a76b0SSuyog Pawar (ps_sao_ctxt->i4_ctb_y << (log2_ctb_size - 3)) * (loop_filter_strd << 3);
3444*c83a76b0SSuyog Pawar if(ps_sao_ctxt->i4_ctb_x > 0)
3445*c83a76b0SSuyog Pawar loop_filter_bit_pos -= 2;
3446*c83a76b0SSuyog Pawar
3447*c83a76b0SSuyog Pawar pu1_no_loop_filter_flag = ps_sao_ctxt->pu1_pic_no_loop_filter_flag +
3448*c83a76b0SSuyog Pawar (loop_filter_bit_pos >> 3);
3449*c83a76b0SSuyog Pawar
3450*c83a76b0SSuyog Pawar for(i = -(ps_sao_ctxt->i4_ctb_y ? 2 * SAO_SHIFT_CTB : 0) >> log2_min_cu;
3451*c83a76b0SSuyog Pawar i < (sao_blk_ht + (min_cu - 1)) >> log2_min_cu; i++)
3452*c83a76b0SSuyog Pawar {
3453*c83a76b0SSuyog Pawar WORD32 tmp_wd = sao_blk_wd;
3454*c83a76b0SSuyog Pawar
3455*c83a76b0SSuyog Pawar u4_no_loop_filter_flag = (*(UWORD32 *)(pu1_no_loop_filter_flag + i * loop_filter_strd)) >>
3456*c83a76b0SSuyog Pawar (loop_filter_bit_pos & 7);
3457*c83a76b0SSuyog Pawar u4_no_loop_filter_flag &= (1 << ((tmp_wd + (min_cu - 1)) >> log2_min_cu)) - 1;
3458*c83a76b0SSuyog Pawar
3459*c83a76b0SSuyog Pawar if(u4_no_loop_filter_flag)
3460*c83a76b0SSuyog Pawar {
3461*c83a76b0SSuyog Pawar while(tmp_wd > 0)
3462*c83a76b0SSuyog Pawar {
3463*c83a76b0SSuyog Pawar if(CTZ(u4_no_loop_filter_flag))
3464*c83a76b0SSuyog Pawar {
3465*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3466*c83a76b0SSuyog Pawar pu1_src_backup_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3467*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu);
3468*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag));
3469*c83a76b0SSuyog Pawar }
3470*c83a76b0SSuyog Pawar else
3471*c83a76b0SSuyog Pawar {
3472*c83a76b0SSuyog Pawar for(row = 0; row < min_cu / 2; row++)
3473*c83a76b0SSuyog Pawar {
3474*c83a76b0SSuyog Pawar for(col = 0; col < MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); col++)
3475*c83a76b0SSuyog Pawar {
3476*c83a76b0SSuyog Pawar pu1_src_tmp_chroma[row * src_strd + col] = pu1_src_backup_chroma[row * backup_strd + col];
3477*c83a76b0SSuyog Pawar }
3478*c83a76b0SSuyog Pawar }
3479*c83a76b0SSuyog Pawar
3480*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3481*c83a76b0SSuyog Pawar pu1_src_backup_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd);
3482*c83a76b0SSuyog Pawar tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu);
3483*c83a76b0SSuyog Pawar u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag));
3484*c83a76b0SSuyog Pawar }
3485*c83a76b0SSuyog Pawar }
3486*c83a76b0SSuyog Pawar
3487*c83a76b0SSuyog Pawar pu1_src_tmp_chroma -= sao_blk_wd;
3488*c83a76b0SSuyog Pawar pu1_src_backup_chroma -= sao_blk_wd;
3489*c83a76b0SSuyog Pawar }
3490*c83a76b0SSuyog Pawar
3491*c83a76b0SSuyog Pawar pu1_src_tmp_chroma += ((src_strd / 2) << log2_min_cu);
3492*c83a76b0SSuyog Pawar pu1_src_backup_chroma += ((backup_strd / 2) << log2_min_cu);
3493*c83a76b0SSuyog Pawar }
3494*c83a76b0SSuyog Pawar }
3495*c83a76b0SSuyog Pawar }
3496*c83a76b0SSuyog Pawar
3497*c83a76b0SSuyog Pawar }
3498*c83a76b0SSuyog Pawar
3499