blob: db176ac70bbd9f6bc4c7fd3b06d5860278db9f3f [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
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 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/**
22 *******************************************************************************
23 * @file
24 * ih264e_deblk.c
25 *
26 * @brief
27 * This file contains functions that are associated with deblocking
28 *
29 * @author
30 * ittiam
31 *
32 * @par List of Functions:
33 * - ih264e_fill_bs_1mv_1ref_non_mbaff
34 * - ih264e_calculate_csbp
35 * - ih264e_compute_bs
36 * - ih264e_filter_top_edge
37 * - ih264e_filter_left_edge
38 * - ih264e_deblock_mb
39 *
40 * @remarks
41 * None
42 *
43 *******************************************************************************
44 */
45
46/*****************************************************************************/
47/* File Includes */
48/*****************************************************************************/
49
50/* System include files */
51#include <stdio.h>
52#include <string.h>
53#include <assert.h>
54
55/* User include files */
56#include "ih264e_config.h"
57#include "ih264_typedefs.h"
58#include "iv2.h"
59#include "ive2.h"
60#include "ih264_macros.h"
61#include "ih264_defs.h"
62#include "ih264e_defs.h"
63#include "ih264e_error.h"
64#include "ih264e_bitstream.h"
65#include "ime_distortion_metrics.h"
Harinarayanan K K134291e2015-06-18 16:03:38 +053066#include "ime_defs.h"
Hamsalekha S8d3d3032015-03-13 21:24:58 +053067#include "ime_structs.h"
68#include "ih264_structs.h"
69#include "ih264_trans_quant_itrans_iquant.h"
70#include "ih264_inter_pred_filters.h"
71#include "ih264_mem_fns.h"
72#include "ih264_padding.h"
73#include "ih264_intra_pred_filters.h"
74#include "ih264_deblk_edge_filters.h"
Harinarayanan K K134291e2015-06-18 16:03:38 +053075#include "ih264_cabac_tables.h"
Hamsalekha S8d3d3032015-03-13 21:24:58 +053076#include "irc_cntrl_param.h"
77#include "irc_frame_info_collector.h"
78#include "ih264e_rate_control.h"
Harinarayanan K K134291e2015-06-18 16:03:38 +053079#include "ih264e_cabac_structs.h"
Hamsalekha S8d3d3032015-03-13 21:24:58 +053080#include "ih264e_structs.h"
81#include "ih264_trans_data.h"
Hamsalekha S8d3d3032015-03-13 21:24:58 +053082#include "ih264_deblk_tables.h"
83#include "ih264e_deblk.h"
84
85
86/*****************************************************************************/
87/* Extern global definitions */
88/*****************************************************************************/
89
90/**
91******************************************************************************
92* @brief BS Table Lookup
93* input :
94* output :
95* @remarks none
96******************************************************************************
97*/
98static const UWORD32 gu4_bs_table[][16] =
99{
100 {
101 0x00000000, 0x02000000, 0x00020000, 0x02020000,
102 0x00000200, 0x02000200, 0x00020200, 0x02020200,
103 0x00000002, 0x02000002, 0x00020002, 0x02020002,
104 0x00000202, 0x02000202, 0x00020202, 0x02020202
105 },
106 {
107 0x01010101, 0x02010101, 0x01020101, 0x02020101,
108 0x01010201, 0x02010201, 0x01020201, 0x02020201,
109 0x01010102, 0x02010102, 0x01020102, 0x02020102,
110 0x01010202, 0x02010202, 0x01020202, 0x02020202
111 }
112};
113
114/**
115******************************************************************************
116* @brief Transpose Matrix used in BS
117* input :
118* output :
119* @remarks none
120******************************************************************************
121*/
122static const UWORD16 ih264e_gu2_4x4_v2h_reorder[16] =
123{
124 0x0000, 0x0001, 0x0010, 0x0011,
125 0x0100, 0x0101, 0x0110, 0x0111,
126 0x1000, 0x1001, 0x1010, 0x1011,
127 0x1100, 0x1101, 0x1110, 0x1111
128};
129
130
131/*****************************************************************************/
132/* Function Definitions */
133/*****************************************************************************/
134
135/**
136*******************************************************************************
137*
138* @brief Fill BS value for all the edges of an mb
139*
140* @par Description:
141* Fill BS value for all the edges of an mb
142*
143* @param[in] pu4_horz_bs
144* Base pointer of horizontal BS table
145*
146* @param[in] pu4_vert_bs
147* Base pointer of vertical BS table
148*
149* @param[in] u4_left_mb_csbp
150* coded sub block pattern of left mb
151*
152* @param[in] u4_left_mb_csbp
153* coded sub block pattern of top mb
154*
Harinarayanan K K134291e2015-06-18 16:03:38 +0530155* @param[in] ps_left_pu
156* PU for left MB
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530157*
Harinarayanan K K134291e2015-06-18 16:03:38 +0530158* @param[in] ps_top_pu
159* PU for top MB
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530160*
Harinarayanan K K134291e2015-06-18 16:03:38 +0530161* @param[in] ps_curr_pu
162* PU for current MB
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530163*
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530164*
165* @returns none
166*
167* @remarks none
168*
169*******************************************************************************
170*/
171static void ih264e_fill_bs_1mv_1ref_non_mbaff(UWORD32 *pu4_horz_bs,
172 UWORD32 *pu4_vert_bs,
173 UWORD32 u4_left_mb_csbp,
174 UWORD32 u4_top_mb_csbp,
175 UWORD32 u4_cur_mb_csbp,
Harinarayanan K K134291e2015-06-18 16:03:38 +0530176 enc_pu_t *ps_left_pu,
177 enc_pu_t *ps_top_pu,
178 enc_pu_t *ps_curr_pu)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530179{
180 /* motion vectors of blks p & q */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530181 WORD16 i16_qMvl0_x, i16_qMvl0_y, i16_pMvl0_x, i16_pMvl0_y;
182 WORD16 i16_qMvl1_x, i16_qMvl1_y, i16_pMvl1_x, i16_pMvl1_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530183
184 /* temp var */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530185 UWORD32 u4_left_flag, u4_top_flag;
186 const UWORD32 *bs_map;
187 UWORD32 u4_reordered_vert_bs_enc, u4_temp;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530188
189 /* Coded Pattern for Horizontal Edge */
190 /*-----------------------------------------------------------------------*/
191 /*u4_nbr_horz_csbp=11C|10C|9C|8C|7C|6C|5C|4C|3C|2C|1C|0C|15T|14T|13T|12T */
192 /*-----------------------------------------------------------------------*/
Harinarayanan K K134291e2015-06-18 16:03:38 +0530193 UWORD32 u4_nbr_horz_csbp = (u4_cur_mb_csbp << 4) | (u4_top_mb_csbp >> 12);
194 UWORD32 u4_horz_bs_enc = u4_cur_mb_csbp | u4_nbr_horz_csbp;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530195
196 /* Coded Pattern for Vertical Edge */
197 /*-----------------------------------------------------------------------*/
198 /*u4_left_mb_masked_csbp = 15L|0|0|0|11L|0|0|0|7L|0|0|0|3L|0|0|0 */
199 /*-----------------------------------------------------------------------*/
Harinarayanan K K134291e2015-06-18 16:03:38 +0530200 UWORD32 u4_left_mb_masked_csbp = u4_left_mb_csbp & CSBP_RIGHT_BLOCK_MASK;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530201
202 /*-----------------------------------------------------------------------*/
203 /*u4_cur_mb_masked_csbp =14C|13C|12C|x|10C|9C|8C|x|6C|5C|4C|x|2C|1C|0C|x */
204 /*-----------------------------------------------------------------------*/
Harinarayanan K K134291e2015-06-18 16:03:38 +0530205 UWORD32 u4_cur_mb_masked_csbp = (u4_cur_mb_csbp << 1)
206 & (~CSBP_LEFT_BLOCK_MASK);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530207
208 /*-----------------------------------------------------------------------*/
209 /*u4_nbr_vert_csbp=14C|13C|12C|15L|10C|9C|8C|11L|6C|5C|4C|7L|2C|1C|0C|3L */
210 /*-----------------------------------------------------------------------*/
Harinarayanan K K134291e2015-06-18 16:03:38 +0530211 UWORD32 u4_nbr_vert_csbp = (u4_cur_mb_masked_csbp)
212 | (u4_left_mb_masked_csbp >> 3);
213 UWORD32 u4_vert_bs_enc = u4_cur_mb_csbp | u4_nbr_vert_csbp;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530214
215 /* BS Calculation for MB Boundary Edges */
216
217 /* BS calculation for 1 2 3 horizontal boundary */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530218 bs_map = gu4_bs_table[0];
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530219 pu4_horz_bs[1] = bs_map[(u4_horz_bs_enc >> 4) & 0xF];
220 pu4_horz_bs[2] = bs_map[(u4_horz_bs_enc >> 8) & 0xF];
221 pu4_horz_bs[3] = bs_map[(u4_horz_bs_enc >> 12) & 0xF];
222
223 /* BS calculation for 5 6 7 vertical boundary */
224 /* Do 4x4 tranpose of u4_vert_bs_enc by using look up table for reorder */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530225 u4_reordered_vert_bs_enc = ih264e_gu2_4x4_v2h_reorder[u4_vert_bs_enc & 0xF];
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530226
Harinarayanan K K134291e2015-06-18 16:03:38 +0530227 u4_temp = ih264e_gu2_4x4_v2h_reorder[(u4_vert_bs_enc >> 4) & 0xF];
228 u4_reordered_vert_bs_enc |= (u4_temp << 1);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530229
Harinarayanan K K134291e2015-06-18 16:03:38 +0530230 u4_temp = ih264e_gu2_4x4_v2h_reorder[(u4_vert_bs_enc >> 8) & 0xF];
231 u4_reordered_vert_bs_enc |= (u4_temp << 2);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530232
Harinarayanan K K134291e2015-06-18 16:03:38 +0530233 u4_temp = ih264e_gu2_4x4_v2h_reorder[(u4_vert_bs_enc >> 12) & 0xF];
234 u4_reordered_vert_bs_enc |= (u4_temp << 3);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530235
236 pu4_vert_bs[1] = bs_map[(u4_reordered_vert_bs_enc >> 4) & 0xF];
237 pu4_vert_bs[2] = bs_map[(u4_reordered_vert_bs_enc >> 8) & 0xF];
238 pu4_vert_bs[3] = bs_map[(u4_reordered_vert_bs_enc >> 12) & 0xF];
239
240
241 /* BS Calculation for MB Boundary Edges */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530242 if (ps_top_pu->b1_intra_flag)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530243 {
244 pu4_horz_bs[0] = 0x04040404;
245 }
246 else
247 {
Harinarayanan K K134291e2015-06-18 16:03:38 +0530248 if (ps_curr_pu->b2_pred_mode != ps_top_pu->b2_pred_mode)
249 {
250 u4_top_flag = 1;
251 }
252 else if(ps_curr_pu->b2_pred_mode != 2)
253 {
254 i16_pMvl0_x = ps_top_pu->s_me_info[ps_top_pu->b2_pred_mode].s_mv.i2_mvx;
255 i16_pMvl0_y = ps_top_pu->s_me_info[ps_top_pu->b2_pred_mode].s_mv.i2_mvy;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530256
Harinarayanan K K134291e2015-06-18 16:03:38 +0530257 i16_qMvl0_x = ps_curr_pu->s_me_info[ps_curr_pu->b2_pred_mode].s_mv.i2_mvx;
258 i16_qMvl0_y = ps_curr_pu->s_me_info[ps_curr_pu->b2_pred_mode].s_mv.i2_mvy;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530259
Harinarayanan K K134291e2015-06-18 16:03:38 +0530260
261 u4_top_flag = (ABS((i16_pMvl0_x - i16_qMvl0_x)) >= 4)
262 | (ABS((i16_pMvl0_y - i16_qMvl0_y)) >= 4);
263 }
264 else
265 {
266
267 i16_pMvl0_x = ps_top_pu->s_me_info[PRED_L0].s_mv.i2_mvx;
268 i16_pMvl0_y = ps_top_pu->s_me_info[PRED_L0].s_mv.i2_mvy;
269 i16_pMvl1_x = ps_top_pu->s_me_info[PRED_L1].s_mv.i2_mvx;
270 i16_pMvl1_y = ps_top_pu->s_me_info[PRED_L1].s_mv.i2_mvy;
271
272 i16_qMvl0_x = ps_curr_pu->s_me_info[PRED_L0].s_mv.i2_mvx;
273 i16_qMvl0_y = ps_curr_pu->s_me_info[PRED_L0].s_mv.i2_mvy;
274 i16_qMvl1_x = ps_curr_pu->s_me_info[PRED_L1].s_mv.i2_mvx;
275 i16_qMvl1_y = ps_curr_pu->s_me_info[PRED_L1].s_mv.i2_mvy;
276
277
278 u4_top_flag = (ABS((i16_pMvl0_x - i16_qMvl0_x)) >= 4)
279 | (ABS((i16_pMvl0_y - i16_qMvl0_y)) >= 4)
280 | (ABS((i16_pMvl1_x - i16_qMvl1_x)) >= 4)
281 | (ABS((i16_pMvl1_y - i16_qMvl1_y)) >= 4);
282 }
283
284 bs_map = gu4_bs_table[!!u4_top_flag];
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530285 pu4_horz_bs[0] = bs_map[u4_horz_bs_enc & 0xF];
286 }
287
Harinarayanan K K134291e2015-06-18 16:03:38 +0530288
289 if (ps_left_pu->b1_intra_flag)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530290 {
291 pu4_vert_bs[0] = 0x04040404;
292 }
293 else
294 {
Harinarayanan K K134291e2015-06-18 16:03:38 +0530295 if (ps_curr_pu->b2_pred_mode != ps_left_pu->b2_pred_mode)
296 {
297 u4_left_flag = 1;
298 }
299 else if(ps_curr_pu->b2_pred_mode != 2)/* Not bipred */
300 {
301 i16_pMvl0_x = ps_left_pu->s_me_info[ps_left_pu->b2_pred_mode].s_mv.i2_mvx;
302 i16_pMvl0_y = ps_left_pu->s_me_info[ps_left_pu->b2_pred_mode].s_mv.i2_mvy;
303
304 i16_qMvl0_x = ps_curr_pu->s_me_info[ps_curr_pu->b2_pred_mode].s_mv.i2_mvx;
305 i16_qMvl0_y = ps_curr_pu->s_me_info[ps_curr_pu->b2_pred_mode].s_mv.i2_mvy;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530306
307
Harinarayanan K K134291e2015-06-18 16:03:38 +0530308 u4_left_flag = (ABS((i16_pMvl0_x - i16_qMvl0_x)) >= 4)
309 | (ABS((i16_pMvl0_y - i16_qMvl0_y)) >= 4);
310 }
311 else
312 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530313
Harinarayanan K K134291e2015-06-18 16:03:38 +0530314 i16_pMvl0_x = ps_left_pu->s_me_info[PRED_L0].s_mv.i2_mvx;
315 i16_pMvl0_y = ps_left_pu->s_me_info[PRED_L0].s_mv.i2_mvy;
316 i16_pMvl1_x = ps_left_pu->s_me_info[PRED_L1].s_mv.i2_mvx;
317 i16_pMvl1_y = ps_left_pu->s_me_info[PRED_L1].s_mv.i2_mvy;
318
319 i16_qMvl0_x = ps_curr_pu->s_me_info[PRED_L0].s_mv.i2_mvx;
320 i16_qMvl0_y = ps_curr_pu->s_me_info[PRED_L0].s_mv.i2_mvy;
321 i16_qMvl1_x = ps_curr_pu->s_me_info[PRED_L1].s_mv.i2_mvx;
322 i16_qMvl1_y = ps_curr_pu->s_me_info[PRED_L1].s_mv.i2_mvy;
323
324
325 u4_left_flag = (ABS((i16_pMvl0_x - i16_qMvl0_x)) >= 4)
326 | (ABS((i16_pMvl0_y - i16_qMvl0_y)) >= 4)
327 | (ABS((i16_pMvl1_x - i16_qMvl1_x)) >= 4)
328 | (ABS((i16_pMvl1_y - i16_qMvl1_y)) >= 4);
329 }
330
331 bs_map = gu4_bs_table[!!u4_left_flag];
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530332 pu4_vert_bs[0] = bs_map[u4_reordered_vert_bs_enc & 0xF];
333 }
334}
335
336/**
337*******************************************************************************
338*
339* @brief calculate coded subblock pattern from nnz
340*
341* @par Description:
342* calculate coded subblock pattern from nnz
343*
344* @param[in] ps_proc
345* process context
346*
347* @returns csbp
348*
349* @remarks none
350*
351*******************************************************************************
352*/
353static UWORD32 ih264e_calculate_csbp(process_ctxt_t *ps_proc)
354{
355 /* number of non zeros for each tx blk */
356 UWORD8 *pu1_curr_nnz = (UWORD8 *)ps_proc->au4_nnz;
357
358 /* csbp */
359 UWORD32 u4_csbp = 0;
360
361 /* temp var */
362 WORD32 i4_i;
363
364 pu1_curr_nnz += 1;
365
366 /* Creating Subblock pattern for current MB */
367 /* 15C|14C|13C|12C|11C|10C|9C|8C|7C|6C|5C|4C|3C|2C|1C|0C */
368 for (i4_i = 0; i4_i < 16; i4_i++ )
369 {
370 u4_csbp |= ((!!*(pu1_curr_nnz + i4_i))<< i4_i);
371 }
372
373 return u4_csbp;
374}
375
376/**
377*******************************************************************************
378*
379* @brief This function computes blocking strength for an mb
380*
381* @par Description:
382* This function computes blocking strength for an mb
383*
384* @param[in] ps_proc
385* process context
386*
387* @returns none
388*
Harinarayanan K K134291e2015-06-18 16:03:38 +0530389* @remarks
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530390*
391*******************************************************************************
392*/
393void ih264e_compute_bs(process_ctxt_t * ps_proc)
394{
395 /* deblk bs context */
396 bs_ctxt_t *ps_bs = &(ps_proc->s_deblk_ctxt.s_bs_ctxt);
397
398 /* vertical blocking strength */
399 UWORD32 *pu4_pic_vert_bs;
400
401 /* horizontal blocking strength */
402 UWORD32 *pu4_pic_horz_bs;
403
404 /* mb indices */
405 WORD32 i4_mb_x, i4_mb_y;
406
407 /* is intra */
408 WORD32 i4_intra;
409
410 /* temp var */
411 WORD32 i4_wd_mbs = ps_proc->i4_wd_mbs;
412
413 /* init indices */
414 i4_mb_x = ps_bs->i4_mb_x;
415 i4_mb_y = ps_bs->i4_mb_y;
416
417 /* init pointers */
418 pu4_pic_vert_bs = ps_bs->pu4_pic_vert_bs + ((i4_mb_y * i4_wd_mbs) + i4_mb_x) * 4;
419 pu4_pic_horz_bs = ps_bs->pu4_pic_horz_bs + ((i4_mb_y * i4_wd_mbs) + i4_mb_x) * 4;
420
421 /* is intra? */
422 i4_intra = ps_proc->u4_is_intra;
423
424 /* compute blocking strength */
425 if (i4_intra)
426 {
427 pu4_pic_vert_bs[0] = 0x04040404;
428 pu4_pic_vert_bs[1] = pu4_pic_vert_bs[2] = pu4_pic_vert_bs[3] = 0x03030303;
429
430 pu4_pic_horz_bs[0] = 0x04040404;
431 pu4_pic_horz_bs[1] = pu4_pic_horz_bs[2] = pu4_pic_horz_bs[3] = 0x03030303;
432 }
433 else
434 {
435 /* left mb syntax info */
436 mb_info_t *ps_left_mb_syntax_ele = &ps_proc->s_left_mb_syntax_ele;
437
438 /* top mb syntax info */
439 mb_info_t *ps_top_mb_syntax_ele = ps_proc->ps_top_row_mb_syntax_ele + i4_mb_x;
440
441 /* top row motion vector info */
442 enc_pu_t *ps_top_row_pu = ps_proc->ps_top_row_pu + i4_mb_x;
443
444 /* csbp for curr mb */
445 ps_proc->u4_csbp = ih264e_calculate_csbp(ps_proc);
446
447 /* csbp for ngbrs */
448 if (i4_mb_x == 0)
449 {
450 ps_left_mb_syntax_ele->u4_csbp = 0;
Harinarayanan K K134291e2015-06-18 16:03:38 +0530451 ps_proc->s_left_mb_pu.b1_intra_flag = 0;
452 ps_proc->s_left_mb_pu.b2_pred_mode = ps_proc->ps_pu->b2_pred_mode;
453 ps_proc->s_left_mb_pu.s_me_info[0].s_mv = ps_proc->ps_pu->s_me_info[0].s_mv;
454 ps_proc->s_left_mb_pu.s_me_info[1].s_mv = ps_proc->ps_pu->s_me_info[1].s_mv;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530455 }
456 if (i4_mb_y == 0)
457 {
458 ps_top_mb_syntax_ele->u4_csbp = 0;
Harinarayanan K K134291e2015-06-18 16:03:38 +0530459 ps_top_row_pu->b1_intra_flag = 0;
460 ps_top_row_pu->b2_pred_mode = ps_proc->ps_pu->b2_pred_mode;
461 ps_top_row_pu->s_me_info[0].s_mv = ps_proc->ps_pu->s_me_info[0].s_mv;
462 ps_top_row_pu->s_me_info[1].s_mv = ps_proc->ps_pu->s_me_info[1].s_mv;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530463 }
464
465 ih264e_fill_bs_1mv_1ref_non_mbaff(pu4_pic_horz_bs,
466 pu4_pic_vert_bs,
467 ps_left_mb_syntax_ele->u4_csbp,
468 ps_top_mb_syntax_ele->u4_csbp,
469 ps_proc->u4_csbp,
Harinarayanan K K134291e2015-06-18 16:03:38 +0530470 &ps_proc->s_left_mb_pu,
471 ps_top_row_pu,
472 ps_proc->ps_pu);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530473 }
474
475 return ;
476}
477
478/**
479*******************************************************************************
480*
481* @brief This function performs deblocking of top horizontal edge
482*
483* @par Description:
484* This function performs deblocking of top horizontal edge
485*
486* @param[in] ps_codec
487* pointer to codec context
488*
489* @param[in] ps_proc
490* pointer to proc context
491*
492* @param[in] pu1_mb_qp
493* pointer to mb quantization param
494*
495* @param[in] pu1_cur_pic_luma
496* pointer to recon buffer luma
497*
498* @param[in] pu1_cur_pic_chroma
499* pointer to recon buffer chroma
500*
501* @param[in] pu4_pic_horz_bs
502* pointer to horizontal blocking strength
503*
504* @returns none
505*
506* @remarks none
507*
508*******************************************************************************
509*/
510static void ih264e_filter_top_edge(codec_t *ps_codec,
511 process_ctxt_t *ps_proc,
512 UWORD8 *pu1_mb_qp,
513 UWORD8 *pu1_cur_pic_luma,
514 UWORD8 *pu1_cur_pic_chroma,
515 UWORD32 *pu4_pic_horz_bs)
516{
517 /* strd */
518 WORD32 i4_rec_strd = ps_proc->i4_rec_strd;
519
520 /* deblk params */
521 UWORD32 u4_alpha_luma, u4_beta_luma, u4_qp_luma, u4_idx_A_luma, u4_idx_B_luma, u4_qp_p, u4_qp_q;
522 UWORD32 u4_alpha_chroma, u4_beta_chroma, u4_qp_chroma, u4_idx_A_chroma, u4_idx_B_chroma;
523
524 /* collect qp of left & top mb */
525 u4_qp_p = pu1_mb_qp[-ps_proc->i4_wd_mbs];
526 u4_qp_q = pu1_mb_qp[0];
527
528 /********/
529 /* luma */
530 /********/
531 u4_qp_luma = (u4_qp_p + u4_qp_q + 1) >> 1;
532
533 /* filter offset A and filter offset B have to be received from slice header */
534 /* TODO : for now lets set these offsets as zero */
535
536
537 u4_idx_A_luma = MIN(51, u4_qp_luma + 0);
538 u4_idx_B_luma = MIN(51, u4_qp_luma + 0);
539
540 /* alpha, beta computation */
541 u4_alpha_luma = gu1_ih264_alpha_table[u4_idx_A_luma];
542 u4_beta_luma = gu1_ih264_beta_table[u4_idx_B_luma];
543
544 /**********/
545 /* chroma */
546 /**********/
547 u4_qp_chroma = (gu1_qpc_fqpi[u4_qp_p] + gu1_qpc_fqpi[u4_qp_q] + 1) >> 1;
548
549 /* filter offset A and filter offset B have to be received from slice header */
550 /* TODO : for now lets set these offsets as zero */
551
552
553 u4_idx_A_chroma = MIN(51, u4_qp_chroma + 0);
554 u4_idx_B_chroma = MIN(51, u4_qp_chroma + 0);
555
556 /* alpha, beta computation */
557 u4_alpha_chroma = gu1_ih264_alpha_table[u4_idx_A_chroma];
558 u4_beta_chroma = gu1_ih264_beta_table[u4_idx_B_chroma];
559
560 /* deblk edge */
561 /* top Horizontal edge - allowed to be deblocked ? */
562 if (pu4_pic_horz_bs[0] == 0x04040404)
563 {
564 /* strong filter */
565 ps_codec->pf_deblk_luma_horz_bs4(pu1_cur_pic_luma, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
566 ps_codec->pf_deblk_chroma_horz_bs4(pu1_cur_pic_chroma, i4_rec_strd, u4_alpha_chroma, u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma);
567 }
568 else
569 {
570 /* normal filter */
571 ps_codec->pf_deblk_luma_horz_bslt4(pu1_cur_pic_luma, i4_rec_strd, u4_alpha_luma,
572 u4_beta_luma, pu4_pic_horz_bs[0],
573 gu1_ih264_clip_table[u4_idx_A_luma]);
574
575 ps_codec->pf_deblk_chroma_horz_bslt4(pu1_cur_pic_chroma, i4_rec_strd, u4_alpha_chroma,
576 u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma, pu4_pic_horz_bs[0],
577 gu1_ih264_clip_table[u4_idx_A_chroma], gu1_ih264_clip_table[u4_idx_A_chroma]);
578 }
579}
580
581/**
582*******************************************************************************
583*
584* @brief This function performs deblocking of left vertical edge
585*
586* @par Description:
587* This function performs deblocking of top horizontal edge
588*
589* @param[in] ps_codec
590* pointer to codec context
591*
592* @param[in] ps_proc
593* pointer to proc context
594*
595* @param[in] pu1_mb_qp
596* pointer to mb quantization param
597*
598* @param[in] pu1_cur_pic_luma
599* pointer to recon buffer luma
600*
601* @param[in] pu1_cur_pic_chroma
602* pointer to recon buffer chroma
603*
604* @param[in] pu4_pic_vert_bs
605* pointer to vertical blocking strength
606*
607* @returns none
608*
609* @remarks none
610*
611*******************************************************************************
612*/
613static void ih264e_filter_left_edge(codec_t *ps_codec,
614 process_ctxt_t *ps_proc,
615 UWORD8 *pu1_mb_qp,
616 UWORD8 *pu1_cur_pic_luma,
617 UWORD8 *pu1_cur_pic_chroma,
618 UWORD32 *pu4_pic_vert_bs)
619{
620 /* strd */
621 WORD32 i4_rec_strd = ps_proc->i4_rec_strd;
622
623 /* deblk params */
624 UWORD32 u4_alpha_luma, u4_beta_luma, u4_qp_luma, u4_idx_A_luma, u4_idx_B_luma, u4_qp_p, u4_qp_q;
625 UWORD32 u4_alpha_chroma, u4_beta_chroma, u4_qp_chroma, u4_idx_A_chroma, u4_idx_B_chroma;
626
627 /* collect qp of left & curr mb */
628 u4_qp_p = pu1_mb_qp[-1];
629 u4_qp_q = pu1_mb_qp[0];
630
631 /********/
632 /* luma */
633 /********/
634 u4_qp_luma = (u4_qp_p + u4_qp_q + 1) >> 1;
635
636 /* filter offset A and filter offset B have to be received from slice header */
637 /* TODO : for now lets set these offsets as zero */
638
639
640 u4_idx_A_luma = MIN(51, u4_qp_luma + 0);
641 u4_idx_B_luma = MIN(51, u4_qp_luma + 0);
642
643 /* alpha, beta computation */
644 u4_alpha_luma = gu1_ih264_alpha_table[u4_idx_A_luma];
645 u4_beta_luma = gu1_ih264_beta_table[u4_idx_B_luma];
646
647 /**********/
648 /* chroma */
649 /**********/
650 u4_qp_chroma = (gu1_qpc_fqpi[u4_qp_p] + gu1_qpc_fqpi[u4_qp_q] + 1) >> 1;
651
652 /* filter offset A and filter offset B have to be received from slice header */
653 /* TODO : for now lets set these offsets as zero */
654
655
656 u4_idx_A_chroma = MIN(51, u4_qp_chroma + 0);
657 u4_idx_B_chroma = MIN(51, u4_qp_chroma + 0);
658
659 /* alpha, beta computation */
660 u4_alpha_chroma = gu1_ih264_alpha_table[u4_idx_A_chroma];
661 u4_beta_chroma = gu1_ih264_beta_table[u4_idx_B_chroma];
662
663 /* deblk edge */
664 if (pu4_pic_vert_bs[0] == 0x04040404)
665 {
666 /* strong filter */
667 ps_codec->pf_deblk_luma_vert_bs4(pu1_cur_pic_luma, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
668 ps_codec->pf_deblk_chroma_vert_bs4(pu1_cur_pic_chroma, i4_rec_strd, u4_alpha_chroma, u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma);
669 }
670 else
671 {
672 /* normal filter */
673 ps_codec->pf_deblk_luma_vert_bslt4(pu1_cur_pic_luma, i4_rec_strd,
674 u4_alpha_luma, u4_beta_luma,
675 pu4_pic_vert_bs[0],
676 gu1_ih264_clip_table[u4_idx_A_luma]);
677
678 ps_codec->pf_deblk_chroma_vert_bslt4(pu1_cur_pic_chroma, i4_rec_strd, u4_alpha_chroma,
679 u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma, pu4_pic_vert_bs[0],
680 gu1_ih264_clip_table[u4_idx_A_chroma], gu1_ih264_clip_table[u4_idx_A_chroma]);
681 }
682}
683
684/**
685*******************************************************************************
686*
687* @brief This function performs deblocking on an mb
688*
689* @par Description:
690* This function performs deblocking on an mb
691*
692* @param[in] ps_proc
693* process context corresponding to the job
694*
695* @param[in] ps_deblk
696* pointer to deblock context
697*
698* @returns none
699*
700* @remarks none
701*
702*******************************************************************************
703*/
704void ih264e_deblock_mb(process_ctxt_t *ps_proc, deblk_ctxt_t * ps_deblk)
705{
706 /* codec ctxt */
707 codec_t *ps_codec = ps_proc->ps_codec;
708
709 /* ngbr availability */
710 UWORD8 u1_mb_a, u1_mb_b;
711
712 /* mb indices */
713 WORD32 i4_mb_x = ps_deblk->i4_mb_x, i4_mb_y = ps_deblk->i4_mb_y;
714
715 /* pic qp ptr */
716 UWORD8 *pu1_pic_qp = ps_deblk->s_bs_ctxt.pu1_pic_qp;
717
718 /* vertical blocking strength */
719 UWORD32 *pu4_pic_vert_bs = ps_deblk->s_bs_ctxt.pu4_pic_vert_bs;
720
721 /* horizontal blocking strength */
722 UWORD32 *pu4_pic_horz_bs = ps_deblk->s_bs_ctxt.pu4_pic_horz_bs;
723
724 /* src buffers luma */
725 UWORD8 *pu1_cur_pic_luma = ps_deblk->pu1_cur_pic_luma;
726
727 /* src buffers chroma */
728 UWORD8 *pu1_cur_pic_chroma = ps_deblk->pu1_cur_pic_chroma;
729
730 /* strd */
731 WORD32 i4_rec_strd = ps_proc->i4_rec_strd;
732
733 /* deblk params */
734 UWORD32 u4_alpha_luma, u4_beta_luma, u4_qp_luma, u4_idx_A_luma, u4_idx_B_luma;
735 UWORD32 u4_alpha_chroma, u4_beta_chroma, u4_qp_chroma, u4_idx_A_chroma, u4_idx_B_chroma;
736
737 /* temp var */
738 UWORD32 push_ptr = (i4_mb_y * ps_proc->i4_wd_mbs) + i4_mb_x;
739
740 /* derive neighbor availability */
741 /* In slice mode the edges of mbs that lie on the slice boundary are not deblocked */
742 /* deblocking filter idc '2' */
743 if (ps_codec->s_cfg.e_slice_mode != IVE_SLICE_MODE_NONE)
744 {
745 /* slice index */
746 UWORD8 *pu1_slice_idx = ps_deblk->pu1_slice_idx;
747
748 pu1_slice_idx += (i4_mb_y * ps_proc->i4_wd_mbs);
749 /* left macroblock availability */
750 u1_mb_a = (i4_mb_x == 0 ||
751 (pu1_slice_idx[i4_mb_x - 1 ] != pu1_slice_idx[i4_mb_x]))? 0 : 1;
752 /* top macroblock availability */
753 u1_mb_b = (i4_mb_y == 0 ||
754 (pu1_slice_idx[i4_mb_x-ps_proc->i4_wd_mbs] != pu1_slice_idx[i4_mb_x]))? 0 : 1;
755 }
756 else
757 {
758 /* left macroblock availability */
759 u1_mb_a = (i4_mb_x == 0)? 0 : 1;
760 /* top macroblock availability */
761 u1_mb_b = (i4_mb_y == 0)? 0 : 1;
762 }
763
764 pu1_pic_qp += push_ptr;
765 pu4_pic_vert_bs += push_ptr * 4;
766 pu4_pic_horz_bs += push_ptr * 4;
767
768 /********/
769 /* luma */
770 /********/
771 u4_qp_luma = pu1_pic_qp[0];
772
773 /* filter offset A and filter offset B have to be received from slice header */
774 /* TODO : for now lets set these offsets as zero */
775
776
777 u4_idx_A_luma = MIN(51, u4_qp_luma + 0);
778 u4_idx_B_luma = MIN(51, u4_qp_luma + 0);
779
780 /* alpha, beta computation */
781 u4_alpha_luma = gu1_ih264_alpha_table[u4_idx_A_luma];
782 u4_beta_luma = gu1_ih264_beta_table[u4_idx_B_luma];
783
784 /**********/
785 /* chroma */
786 /**********/
787 u4_qp_chroma = gu1_qpc_fqpi[u4_qp_luma];
788
789 /* filter offset A and filter offset B have to be received from slice header */
790 /* TODO : for now lets set these offsets as zero */
791
792
793 u4_idx_A_chroma = MIN(51, u4_qp_chroma + 0);
794 u4_idx_B_chroma = MIN(51, u4_qp_chroma + 0);
795
796 /* alpha, beta computation */
797 u4_alpha_chroma = gu1_ih264_alpha_table[u4_idx_A_chroma];
798 u4_beta_chroma = gu1_ih264_beta_table[u4_idx_B_chroma];
799
800 /* Deblock vertical edges */
801 /* left vertical edge 0 - allowed to be deblocked ? */
802 if (u1_mb_a)
803 {
804 ih264e_filter_left_edge(ps_codec, ps_proc, pu1_pic_qp, pu1_cur_pic_luma, pu1_cur_pic_chroma, pu4_pic_vert_bs);
805 }
806
807 /* vertical edge 1 */
808 if (pu4_pic_vert_bs[1] == 0x04040404)
809 {
810 /* strong filter */
811 ps_codec->pf_deblk_luma_vert_bs4(pu1_cur_pic_luma + 4, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
812 }
813 else
814 {
815 /* normal filter */
816 ps_codec->pf_deblk_luma_vert_bslt4(pu1_cur_pic_luma + 4, i4_rec_strd,
817 u4_alpha_luma, u4_beta_luma,
818 pu4_pic_vert_bs[1],
819 gu1_ih264_clip_table[u4_idx_A_luma]);
820 }
821
822 /* vertical edge 2 */
823 if (pu4_pic_vert_bs[2] == 0x04040404)
824 {
825 /* strong filter */
826 ps_codec->pf_deblk_luma_vert_bs4(pu1_cur_pic_luma + 8, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
827 ps_codec->pf_deblk_chroma_vert_bs4(pu1_cur_pic_chroma + 8, i4_rec_strd, u4_alpha_chroma, u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma);
828 }
829 else
830 {
831 /* normal filter */
832 ps_codec->pf_deblk_luma_vert_bslt4(pu1_cur_pic_luma + 8, i4_rec_strd, u4_alpha_luma,
833 u4_beta_luma, pu4_pic_vert_bs[2],
834 gu1_ih264_clip_table[u4_idx_A_luma]);
835
836 ps_codec->pf_deblk_chroma_vert_bslt4(pu1_cur_pic_chroma + 8, i4_rec_strd, u4_alpha_chroma,
837 u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma, pu4_pic_vert_bs[2],
838 gu1_ih264_clip_table[u4_idx_A_chroma], gu1_ih264_clip_table[u4_idx_A_chroma]);
839 }
840
841 /* vertical edge 3 */
842 if (pu4_pic_vert_bs[3] == 0x04040404)
843 {
844 /* strong filter */
845 ps_codec->pf_deblk_luma_vert_bs4(pu1_cur_pic_luma + 12, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
846 }
847 else
848 {
849 /* normal filter */
850 ps_codec->pf_deblk_luma_vert_bslt4(pu1_cur_pic_luma + 12, i4_rec_strd, u4_alpha_luma,
851 u4_beta_luma, pu4_pic_vert_bs[3],
852 gu1_ih264_clip_table[u4_idx_A_luma]);
853 }
854
855 /* Deblock Horizontal edges */
856 /* Horizontal edge 0 */
857 if (u1_mb_b)
858 {
859 ih264e_filter_top_edge(ps_codec, ps_proc, pu1_pic_qp, pu1_cur_pic_luma, pu1_cur_pic_chroma, pu4_pic_horz_bs);
860 }
861
862 /* horizontal edge 1 */
863 if (pu4_pic_horz_bs[1] == 0x04040404)
864 {
865 /* strong filter */
866 ps_codec->pf_deblk_luma_horz_bs4(pu1_cur_pic_luma + 4 * i4_rec_strd, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
867 }
868 else
869 {
870 /* normal filter */
871 ps_codec->pf_deblk_luma_horz_bslt4(pu1_cur_pic_luma + 4 * i4_rec_strd, i4_rec_strd, u4_alpha_luma,
872 u4_beta_luma, pu4_pic_horz_bs[1],
873 gu1_ih264_clip_table[u4_idx_A_luma]);
874 }
875
876 /* horizontal edge 2 */
877 if (pu4_pic_horz_bs[2] == 0x04040404)
878 {
879 /* strong filter */
880 ps_codec->pf_deblk_luma_horz_bs4(pu1_cur_pic_luma + 8 * i4_rec_strd, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
881 ps_codec->pf_deblk_chroma_horz_bs4(pu1_cur_pic_chroma + 4 * i4_rec_strd, i4_rec_strd, u4_alpha_chroma, u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma);
882 }
883 else
884 {
885 /* normal filter */
886 ps_codec->pf_deblk_luma_horz_bslt4(pu1_cur_pic_luma + 8 * i4_rec_strd, i4_rec_strd, u4_alpha_luma,
887 u4_beta_luma, pu4_pic_horz_bs[2],
888 gu1_ih264_clip_table[u4_idx_A_luma]);
889
890 ps_codec->pf_deblk_chroma_horz_bslt4(pu1_cur_pic_chroma + 4 * i4_rec_strd, i4_rec_strd, u4_alpha_chroma,
891 u4_beta_chroma, u4_alpha_chroma, u4_beta_chroma, pu4_pic_horz_bs[2],
892 gu1_ih264_clip_table[u4_idx_A_chroma], gu1_ih264_clip_table[u4_idx_A_chroma]);
893 }
894
895 /* horizontal edge 3 */
896 if (pu4_pic_horz_bs[3] == 0x04040404)
897 {
898 /* strong filter */
899 ps_codec->pf_deblk_luma_horz_bs4(pu1_cur_pic_luma + 12 * i4_rec_strd, i4_rec_strd, u4_alpha_luma, u4_beta_luma);
900 }
901 else
902 {
903 /* normal filter */
904 ps_codec->pf_deblk_luma_horz_bslt4(pu1_cur_pic_luma + 12 * i4_rec_strd, i4_rec_strd, u4_alpha_luma,
905 u4_beta_luma, pu4_pic_horz_bs[3],
906 gu1_ih264_clip_table[u4_idx_A_luma]);
907 }
908
909 return ;
910}