Coverage Report

Created: 2026-10-17 06:46

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