diff options
author | Hamsalekha S <hamsalekha.s@ittiam.com> | 2015-03-13 21:24:58 +0530 |
---|---|---|
committer | Hamsalekha S <hamsalekha.s@ittiam.com> | 2015-04-02 15:59:02 +0530 |
commit | 8d3d303c7942ced6a987a52db8977d768dc3605f (patch) | |
tree | cc806c96794356996b13ba9970941d0aed74a97e /common/ih264_deblk_edge_filters.c | |
parent | 3956d913d37327dcb340f836e604b04bd478b158 (diff) | |
download | android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.gz android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.bz2 android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.zip |
Initial version
Change-Id: I7efe9a589cd24edf86e8d086b40c27cbbf8b4017
Diffstat (limited to 'common/ih264_deblk_edge_filters.c')
-rwxr-xr-x | common/ih264_deblk_edge_filters.c | 2087 |
1 files changed, 2087 insertions, 0 deletions
diff --git a/common/ih264_deblk_edge_filters.c b/common/ih264_deblk_edge_filters.c new file mode 100755 index 0000000..d2ffefd --- /dev/null +++ b/common/ih264_deblk_edge_filters.c @@ -0,0 +1,2087 @@ +/****************************************************************************** + * + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore +*/ +/**************************************************************************** */ +/* */ +/* File Name : ih264_deblk_edge_filters.c */ +/* */ +/* Description : Contains function definitions for deblocking */ +/* */ +/* List of Functions : ih264_deblk_luma_vert_bs4() */ +/* ih264_deblk_luma_horz_bs4() */ +/* ih264_deblk_luma_vert_bslt4() */ +/* ih264_deblk_luma_horz_bslt4() */ +/* ih264_deblk_luma_vert_bs4_mbaff() */ +/* ih264_deblk_luma_vert_bslt4_mbaff() */ +/* ih264_deblk_chroma_vert_bs4_bp() */ +/* ih264_deblk_chroma_horz_bs4_bp() */ +/* ih264_deblk_chroma_vert_bslt4_bp() */ +/* ih264_deblk_chroma_horz_bslt4_bp() */ +/* ih264_deblk_chroma_vert_bs4_mbaff_bp() */ +/* ih264_deblk_chroma_vert_bslt4_mbaff_bp() */ +/* ih264_deblk_chroma_vert_bs4() */ +/* ih264_deblk_chroma_horz_bs4() */ +/* ih264_deblk_chroma_vert_bslt4() */ +/* ih264_deblk_chroma_horz_bslt4() */ +/* ih264_deblk_chroma_vert_bs4_mbaff() */ +/* ih264_deblk_chroma_vert_bslt4_mbaff() */ +/* */ +/* Issues / Problems : None */ +/* */ +/* Revision History : */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* 29 12 2014 Kaushik Added double-call vertical */ +/* Senthoor deblocking and high profile */ +/* deblocking functions */ +/* */ +/******************************************************************************/ + +/*****************************************************************************/ +/* File Includes */ +/*****************************************************************************/ + +/* System include files */ +#include <stdio.h> + +/* User include files */ +#include "ih264_typedefs.h" +#include "ih264_platform_macros.h" +#include "ih264_deblk_edge_filters.h" +#include "ih264_macros.h" + +/*****************************************************************************/ +/* Function Definitions */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_vert_bs4() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* vertical edge when the boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_vert_bs4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; + WORD32 pos_p3, pos_p2, pos_p1, pos_p0; + WORD32 pos_q0, pos_q1, pos_q2,pos_q3; + UWORD8 a_p, a_q; /* threshold variables */ + WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */ + UWORD8 *pu1_src_temp; + WORD8 i = 0, edge; + + pos_q0 = 0; + pos_q1 = 1; + pos_q2 = 2; + pos_q3 = 3; + pos_p0 = -1; + pos_p1 = -2; + pos_p2 = -3; + pos_p3 = -4; + + for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) + { + pu1_src_temp = pu1_src; + for(i = 0; i < 4; ++i, pu1_src_temp += src_strd) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_src_temp[pos_p0]; + p1 = pu1_src_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + p2 = pu1_src_temp[pos_p2]; + p3 = pu1_src_temp[pos_p3]; + q2 = pu1_src_temp[pos_q2]; + q3 = pu1_src_temp[pos_q3]; + + if(ABS(p0 - q0) < ((alpha >> 2) + 2)) + { + /* Threshold Variables */ + a_p = (UWORD8)ABS(p2 - p0); + a_q = (UWORD8)ABS(q2 - q0); + + if(a_p < beta) + { + /* p0', p1', p2' */ + pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + + 4) >> 3); + pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2); + pu1_src_temp[pos_p2] = + ((X2(p3) + X3(p2) + p1 + p0 + q0 + + 4) >> 3); + } + else + { + /* p0'*/ + pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); + } + + if(a_q < beta) + { + /* q0', q1', q2' */ + pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2 + + 4) >> 3; + pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; + pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4) + >> 3; + } + else + { + /* q0'*/ + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + else + { + /* p0', q0'*/ + pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_horz_bs4() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* horizontal edge when the boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_horz_bs4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; + WORD32 pos_p3, pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, + pos_q2, pos_q3; + UWORD8 a_p, a_q; /* threshold variables */ + UWORD8 *pu1_p3; /* pointer to the src sample p3 */ + UWORD8 *pu1_p3_temp; + UWORD8 *pu1_src_temp; + WORD8 i = 0, edge; + + pu1_p3 = pu1_src - (src_strd << 2); + pos_q0 = 0; + pos_q1 = src_strd; + pos_q2 = X2(src_strd); + pos_q3 = X3(src_strd); + pos_p0 = X3(src_strd); + pos_p1 = X2(src_strd); + pos_p2 = src_strd; + pos_p3 = 0; + + for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p3 += 4) + { + pu1_src_temp = pu1_src; + pu1_p3_temp = pu1_p3; + for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p3_temp++) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_p3_temp[pos_p0]; + p1 = pu1_p3_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + p2 = pu1_p3_temp[pos_p2]; + p3 = pu1_p3_temp[pos_p3]; + q2 = pu1_src_temp[pos_q2]; + q3 = pu1_src_temp[pos_q3]; + + if(ABS(p0 - q0) < ((alpha >> 2) + 2)) + { + /* Threshold Variables */ + a_p = ABS(p2 - p0); + a_q = ABS(q2 - q0); + + if((a_p < beta)) + { + /* p0', p1', p2' */ + pu1_p3_temp[pos_p0] = (p2 + X2(p1) + X2(p0) + X2(q0) + q1 + + 4) >> 3; + pu1_p3_temp[pos_p1] = (p2 + p1 + p0 + q0 + 2) >> 2; + pu1_p3_temp[pos_p2] = + (X2(p3) + X3(p2) + p1 + p0 + q0 + + 4) >> 3; + } + else + { + /* p0'*/ + pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2; + } + + if(a_q < beta) + { + /* q0', q1', q2' */ + pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + + q2 + 4) >> 3; + pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; + pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + + 4) >> 3; + } + else + { + /* q0'*/ + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + else + { + /* p0', q0'*/ + pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2; + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bs4_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when the boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bs4_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 i = 0, edge; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += + src_strd) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha) && + (ABS(q1_u - q0_u) < beta) && + (ABS(p1_u - p0_u) < beta)) + { + /* p0' */ + pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha) && + (ABS(q1_v - q0_v) < beta) && + (ABS(p1_v - p0_v) < beta)) + { + /* p0' */ + pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_horz_bs4_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* horizontal edge when the boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_horz_bs4_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + UWORD8 *pu1_p1_u; /* pointer to the src sample p1 of U */ + UWORD8 *pu1_p1_v; /* pointer to the src sample p1 of U */ + UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; + WORD8 i = 0, edge; + + pu1_p1_u = pu1_src_u - (src_strd << 1); + pu1_p1_v = pu1_src_v - (src_strd << 1); + pos_q0 = 0; + pos_q1 = src_strd; + pos_p0 = src_strd; + pos_p1 = 0; + + for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, + pu1_src_v += 4, pu1_p1_v += 4) + { + pu1_src_temp_u = pu1_src_u; + pu1_p1_temp_u = pu1_p1_u; + pu1_src_temp_v = pu1_src_v; + pu1_p1_temp_v = pu1_p1_v; + for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, + pu1_src_temp_v += 2, pu1_p1_temp_v += 2) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_p1_temp_u[pos_p0]; + p1_u = pu1_p1_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_p1_temp_v[pos_p0]; + p1_v = pu1_p1_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha) && + (ABS(q1_u - q0_u) < beta) && + (ABS(p1_u - p0_u) < beta)) + { + /* p0' */ + pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2; + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha) && + (ABS(q1_v - q0_v) < beta) && + (ABS(p1_v - p0_v) < beta)) + { + /* p0' */ + pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2; + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_vert_bslt4() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* vertical edge when the boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_vert_bslt4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + WORD8 i = 0, edge; + UWORD8 p2, p1, p0, q0, q1, q2; + WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; + UWORD8 a_p, a_q; /* threshold variables */ + WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */ + UWORD8 *pu1_src_temp; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 tc0, u1_bs; + + pos_q0 = 0; + pos_q1 = 1; + pos_q2 = 2; + pos_p0 = -1; + pos_p1 = -2; + pos_p2 = -3; + + for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) + { + pu1_src_temp = pu1_src; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + for(i = 0; i < 4; ++i, pu1_src_temp += src_strd) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_src_temp[pos_p0]; + p1 = pu1_src_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + q2 = pu1_src_temp[pos_q2]; + p2 = pu1_src_temp[pos_p2]; + + a_p = ABS(p2 - p0); + a_q = ABS(q2 - q0); + + /* tc */ + tc = tc0 + (a_p < beta) + (a_q < beta); + + val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + + /* p0' */ + val = p0 + delta; + pu1_src_temp[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0 - delta; + pu1_src_temp[pos_q0] = CLIP_U8(val); + + /* Luma only */ + if(a_p < beta) + { + /* p1' */ + val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); + pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val); + } + + if(a_q < beta) + { + /* q1' */ + val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); + pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bslt4_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when the boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bslt4_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * (4 >> 1)*/ + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 i = 0, edge; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 tc0, u1_bs; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + tc = tc0 + 1; + for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += + src_strd) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha) && + (ABS(q1_u - q0_u) < beta) && + (ABS(p1_u - p0_u) < beta)) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_u + delta; + pu1_src_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha) && + (ABS(q1_v - q0_v) < beta) && + (ABS(p1_v - p0_v) < beta)) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_v + delta; + pu1_src_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_horz_bslt4() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* horizontal edge when boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_horz_bslt4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + UWORD8 p2, p1, p0, q0, q1, q2; + WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; + UWORD8 a_p, a_q; /* Threshold variables */ + UWORD8 *pu1_p2; /* Pointer to the src sample p2 */ + UWORD8 *pu1_p2_temp; + UWORD8 *pu1_src_temp; + WORD8 i = 0, edge; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 tc0, u1_bs; + + pu1_p2 = pu1_src - (src_strd << 2); + pos_q0 = 0; + pos_q1 = src_strd; + pos_q2 = X2(src_strd); + pos_p0 = X3(src_strd); + pos_p1 = X2(src_strd); + pos_p2 = src_strd; + + for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p2 += 4) + { + pu1_src_temp = pu1_src; + pu1_p2_temp = pu1_p2; + + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + + for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p2_temp++) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_p2_temp[pos_p0]; + p1 = pu1_p2_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + q2 = pu1_src_temp[pos_q2]; + p2 = pu1_p2_temp[pos_p2]; + + a_p = ABS(p2 - p0); + a_q = ABS(q2 - q0); + + /* tc */ + tc = tc0 + (a_p < beta) + (a_q < beta); + val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0 + delta; + pu1_p2_temp[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0 - delta; + pu1_src_temp[pos_q0] = CLIP_U8(val); + + /* Luma */ + if(a_p < beta) + { + /* p1' */ + val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); + pu1_p2_temp[pos_p1] += CLIP3(-tc0, tc0, val); + } + + if(a_q < beta) + { + /* q1' */ + val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); + pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_horz_bslt4_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* horizontal edge when boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 28 11 2013 Ittiam Draft */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_horz_bslt4_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/ + UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/ + UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; + WORD8 i = 0, edge; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 u1_bs; + UWORD8 tc0; + + pu1_p1_u = pu1_src_u - (src_strd << 1); + pu1_p1_v = pu1_src_v - (src_strd << 1); + pos_q0 = 0; + pos_q1 = src_strd; + pos_p0 = src_strd; + pos_p1 = 0; + + for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, + pu1_src_v += 4, pu1_p1_v += 4) + { + pu1_src_temp_u = pu1_src_u; + pu1_p1_temp_u = pu1_p1_u; + pu1_src_temp_v = pu1_src_v; + pu1_p1_temp_v = pu1_p1_v; + + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + + for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, + pu1_src_temp_v += 2, pu1_p1_temp_v += 2) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_p1_temp_u[pos_p0]; + p1_u = pu1_p1_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_p1_temp_v[pos_p0]; + p1_v = pu1_p1_temp_v[pos_p1]; + + /* tc */ + tc = tc0 + 1; + /* Filter Decision */ + if(ABS(p0_u - q0_u) < alpha && ABS(q1_u - q0_u) < beta + && ABS(p1_u - p0_u) < beta) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_u + delta; + pu1_p1_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + /* Filter Decision */ + if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta + && ABS(p1_v - p0_v) < beta) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_v + delta; + pu1_p1_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } + } +} + +/*****************************************************************************/ +/* Function Definitions for vertical edge deblocking for double-call */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_vert_bs4_mbaff() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* vertical edge when boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.3 under the title "Filtering */ +/* process for edges for bS equal to 4" in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_vert_bs4_mbaff(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; + WORD32 pos_p3, pos_p2, pos_p1, pos_p0; + WORD32 pos_q0, pos_q1, pos_q2, pos_q3; + UWORD8 a_p, a_q; /* threshold variables */ + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ + UWORD8 *pu1_src_temp; + WORD8 i = 0, edge; + + pos_q0 = 0; + pos_q1 = 1; + pos_q2 = 2; + pos_q3 = 3; + pos_p0 = -1; + pos_p1 = -2; + pos_p2 = -3; + pos_p3 = -4; + + for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) + { + pu1_src_temp = pu1_src; + for(i = 0; i < 2; ++i, pu1_src_temp += src_strd) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_src_temp[pos_p0]; + p1 = pu1_src_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + p2 = pu1_src_temp[pos_p2]; + p3 = pu1_src_temp[pos_p3]; + q2 = pu1_src_temp[pos_q2]; + q3 = pu1_src_temp[pos_q3]; + + if(ABS(p0 - q0) < ((alpha >> 2) + 2)) + { + /* Threshold Variables */ + a_p = (UWORD8)ABS(p2 - p0); + a_q = (UWORD8)ABS(q2 - q0); + + if(a_p < beta) + { + /* p0', p1', p2' */ + pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + + 4) >> 3); + pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2); + pu1_src_temp[pos_p2] = + ((X2(p3) + X3(p2) + p1 + p0 + q0 + + 4) >> 3); + } + else + { + /* p0'*/ + pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); + } + + if(a_q < beta) + { + /* q0', q1', q2' */ + pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2 + + 4) >> 3; + pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; + pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4) + >> 3; + } + else + { + /* q0'*/ + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + else + { + /* p0', q0'*/ + pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); + pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bs4_mbaff_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when boundary strength is set to 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.3 under the title "Filtering */ +/* process for edges for bS equal to 4" in ITU T Rec H.264. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bs4_mbaff_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 edge; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha) && + (ABS(q1_u - q0_u) < beta) && + (ABS(p1_u - p0_u) < beta)) + { + /* p0' */ + pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta + && ABS(p1_v - p0_v) < beta) + { + /* p0' */ + pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_luma_vert_bslt4_mbaff() */ +/* */ +/* Description : This function performs filtering of a luma block */ +/* vertical edge when boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.3 under the title "Filtering */ +/* process for edges for bS less than 4" in ITU T Rec H.264.*/ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_luma_vert_bslt4_mbaff(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + WORD8 i = 0, edge; + UWORD8 p2, p1, p0, q0, q1, q2; + WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; + UWORD8 a_p, a_q; /* Threshold variables */ + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ + UWORD8 *pu1_src_temp; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 tc0, u1_bs; + + pos_q0 = 0; + pos_q1 = 1; + pos_q2 = 2; + pos_p0 = -1; + pos_p1 = -2; + pos_p2 = -3; + + for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) + { + pu1_src_temp = pu1_src; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + for(i = 0; i < 2; ++i, pu1_src_temp += src_strd) + { + q0 = pu1_src_temp[pos_q0]; + q1 = pu1_src_temp[pos_q1]; + p0 = pu1_src_temp[pos_p0]; + p1 = pu1_src_temp[pos_p1]; + + /* Filter Decision */ + if((ABS(p0 - q0) >= alpha) || + (ABS(q1 - q0) >= beta) || + (ABS(p1 - p0) >= beta)) + continue; + + q2 = pu1_src_temp[pos_q2]; + p2 = pu1_src_temp[pos_p2]; + + a_p = ABS(p2 - p0); + a_q = ABS(q2 - q0); + + /* tc */ + tc = tc0 + (a_p < beta) + (a_q < beta); + + val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0 + delta; + pu1_src_temp[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0 - delta; + pu1_src_temp[pos_q0] = CLIP_U8(val); + + /* Luma only */ + if(a_p < beta) + { + /* p1' */ + val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); + pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val); + } + + if(a_q < beta) + { + /* q1' */ + val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); + pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bslt4_mbaff_bp() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when boundary strength is less than 4. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha - alpha value for the boundary */ +/* beta - beta value for the boundary */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab - tc0_table */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.3 under the title "Filtering */ +/* process for edges for bS less than 4" in ITU T Rec H.264.*/ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bslt4_mbaff_bp(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha, + WORD32 beta, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 edge; + WORD8 delta; + WORD8 tc; + WORD16 val; + UWORD8 tc0, u1_bs; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tc0 = pu1_cliptab[u1_bs]; + tc = tc0 + 1; + + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha) && + (ABS(q1_u - q0_u) < beta) && + (ABS(p1_u - p0_u) < beta)) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_u + delta; + pu1_src_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha) && + (ABS(q1_v - q0_v) < beta) && + (ABS(p1_v - p0_v) < beta)) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tc, tc, val); + /* p0' */ + val = p0_v + delta; + pu1_src_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } +} + +/*****************************************************************************/ +/* Function Definitions for chroma deblocking in high profile */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bs4() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when the boundary strength is set to 4 in */ +/* high profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264 with alpha and beta values different in */ +/* U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bs4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2*/ + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 i = 0, edge; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += + src_strd) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha_cb) && + (ABS(q1_u - q0_u) < beta_cb) && + (ABS(p1_u - p0_u) < beta_cb)) + { + /* p0' */ + pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha_cr) && + (ABS(q1_v - q0_v) < beta_cr) && + (ABS(p1_v - p0_v) < beta_cr)) + { + /* p0' */ + pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_horz_bs4() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* horizontal edge when the boundary strength is set to 4 */ +/* in high profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.4 under the */ +/* title "Filtering process for edges for bS equal to 4" in */ +/* ITU T Rec H.264 with alpha and beta values different in */ +/* U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_horz_bs4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of U */ + UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of U */ + UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; + WORD8 i = 0, edge; + + pu1_p1_u = pu1_src_u - (src_strd << 1); + pu1_p1_v = pu1_src_v - (src_strd << 1); + pos_q0 = 0; + pos_q1 = src_strd; + pos_p0 = src_strd; + pos_p1 = 0; + + for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, pu1_src_v += + 4, pu1_p1_v += 4) + { + pu1_src_temp_u = pu1_src_u; + pu1_p1_temp_u = pu1_p1_u; + pu1_src_temp_v = pu1_src_v; + pu1_p1_temp_v = pu1_p1_v; + for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, + pu1_src_temp_v += 2, pu1_p1_temp_v += 2) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_p1_temp_u[pos_p0]; + p1_u = pu1_p1_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_p1_temp_v[pos_p0]; + p1_v = pu1_p1_temp_v[pos_p1]; + + /* Filter Decision */ + if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb + && ABS(p1_u - p0_u) < beta_cb) + { + /* p0' */ + pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2; + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr + && ABS(p1_v - p0_v) < beta_cr) + { + /* p0' */ + pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2; + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bslt4() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when the boundary strength is less than 4 */ +/* in high profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab_cb - tc0_table for U */ +/* pu1_cliptab_cr - tc0_table for V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264 with alpha and beta values different */ +/* in U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bslt4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab_cb, + const UWORD8 *pu1_cliptab_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 i = 0, edge; + WORD8 delta; + WORD8 tcb, tcr; + WORD16 val; + UWORD8 tcb0, tcr0, u1_bs; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tcb0 = pu1_cliptab_cb[u1_bs]; + tcr0 = pu1_cliptab_cr[u1_bs]; + tcb = tcb0 + 1; + tcr = tcr0 + 1; + for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += + src_strd) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb + && ABS(p1_u - p0_u) < beta_cb) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tcb, tcb, val); + /* p0' */ + val = p0_u + delta; + pu1_src_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + + /* Filter Decision */ + if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr + && ABS(p1_v - p0_v) < beta_cr) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tcr, tcr, val); + /* p0' */ + val = p0_v + delta; + pu1_src_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_horz_bslt4() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* horizontal edge when the boundary strength is less than */ +/* 4 in high profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab_cb - tc0_table for U */ +/* pu1_cliptab_cr - tc0_table for V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : This operation is described in Sec. 8.7.2.3 under the */ +/* title "Filtering process for edges for bS less than 4" */ +/* in ITU T Rec H.264 with alpha and beta values different */ +/* in U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_horz_bslt4(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab_cb, + const UWORD8 *pu1_cliptab_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/ + UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/ + UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; + WORD8 i = 0, edge; + WORD8 delta; + WORD8 tcb, tcr; + WORD16 val; + UWORD8 u1_bs; + UWORD8 tcb0, tcr0; + + pu1_p1_u = pu1_src_u - (src_strd << 1); + pu1_p1_v = pu1_src_v - (src_strd << 1); + pos_q0 = 0; + pos_q1 = src_strd; + pos_p0 = src_strd; + pos_p1 = 0; + + for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, + pu1_src_v += 4, pu1_p1_v += 4) + { + pu1_src_temp_u = pu1_src_u; + pu1_p1_temp_u = pu1_p1_u; + pu1_src_temp_v = pu1_src_v; + pu1_p1_temp_v = pu1_p1_v; + + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tcb0 = pu1_cliptab_cb[u1_bs]; + tcr0 = pu1_cliptab_cr[u1_bs]; + + for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, + pu1_src_temp_v += 2, pu1_p1_temp_v += 2) + { + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_p1_temp_u[pos_p0]; + p1_u = pu1_p1_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_p1_temp_v[pos_p0]; + p1_v = pu1_p1_temp_v[pos_p1]; + + /* tc */ + tcb = tcb0 + 1; + tcr = tcr0 + 1; + /* Filter Decision */ + if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb + && ABS(p1_u - p0_u) < beta_cb) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tcb, tcb, val); + /* p0' */ + val = p0_u + delta; + pu1_p1_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + /* Filter Decision */ + if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr + && ABS(p1_v - p0_v) < beta_cr) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tcr, tcr, val); + /* p0' */ + val = p0_v + delta; + pu1_p1_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bs4_mbaff() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when boundary strength is set to 4 in high */ +/* profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab_cb - tc0_table for U */ +/* pu1_cliptab_cr - tc0_table for V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.4 under the title "Filtering */ +/* process for edges for bS equal to 4" in ITU T Rec H.264 */ +/* with alpha and beta values different in U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bs4_mbaff(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 edge; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha_cb) && + (ABS(q1_u - q0_u) < beta_cb) && + (ABS(p1_u - p0_u) < beta_cb)) + { + /* p0' */ + pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); + /* q0' */ + pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha_cr) && + (ABS(q1_v - q0_v) < beta_cr) && + (ABS(p1_v - p0_v) < beta_cr)) + { + /* p0' */ + pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); + /* q0' */ + pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; + } + } +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264_deblk_chroma_vert_bslt4_mbaff() */ +/* */ +/* Description : This function performs filtering of a chroma block */ +/* vertical edge when boundary strength is less than 4 in */ +/* high profile. */ +/* */ +/* Inputs : pu1_src - pointer to the src sample q0 of U */ +/* src_strd - source stride */ +/* alpha_cb - alpha value for the boundary in U */ +/* beta_cb - beta value for the boundary in U */ +/* alpha_cr - alpha value for the boundary in V */ +/* beta_cr - beta value for the boundary in V */ +/* u4_bs - packed Boundary strength array */ +/* pu1_cliptab_cb - tc0_table for U */ +/* pu1_cliptab_cr - tc0_table for V */ +/* */ +/* Globals : None */ +/* */ +/* Processing : When the function is called twice, this operation is as */ +/* described in Sec. 8.7.2.4 under the title "Filtering */ +/* process for edges for bS less than 4" in ITU T Rec H.264 */ +/* with alpha and beta values different in U and V. */ +/* */ +/* Outputs : None */ +/* */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 29 12 2014 Kaushik Draft */ +/* Senthoor */ +/* */ +/*****************************************************************************/ +void ih264_deblk_chroma_vert_bslt4_mbaff(UWORD8 *pu1_src, + WORD32 src_strd, + WORD32 alpha_cb, + WORD32 beta_cb, + WORD32 alpha_cr, + WORD32 beta_cr, + UWORD32 u4_bs, + const UWORD8 *pu1_cliptab_cb, + const UWORD8 *pu1_cliptab_cr) +{ + UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ + UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ + UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; + WORD32 blk_strd = src_strd; + WORD32 pos_p1, pos_p0, pos_q0, pos_q1; + UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; + WORD8 edge; + WORD8 delta; + WORD8 tcb, tcr; + WORD16 val; + UWORD8 tcb0, tcr0, u1_bs; + + pos_q0 = 0; + pos_q1 = 2; + pos_p0 = -2; + pos_p1 = -4; + + for(edge = 0; edge < 4; + edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) + { + pu1_src_temp_u = pu1_src_u; + pu1_src_temp_v = pu1_src_v; + /* Filter Decision */ + u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); + if(!u1_bs) + continue; + /* tc0 */ + tcb0 = pu1_cliptab_cb[u1_bs]; + tcr0 = pu1_cliptab_cr[u1_bs]; + tcb = tcb0 + 1; + tcr = tcr0 + 1; + q0_u = pu1_src_temp_u[pos_q0]; + q1_u = pu1_src_temp_u[pos_q1]; + p0_u = pu1_src_temp_u[pos_p0]; + p1_u = pu1_src_temp_u[pos_p1]; + + q0_v = pu1_src_temp_v[pos_q0]; + q1_v = pu1_src_temp_v[pos_q1]; + p0_v = pu1_src_temp_v[pos_p0]; + p1_v = pu1_src_temp_v[pos_p1]; + + /* Filter Decision */ + if((ABS(p0_u - q0_u) < alpha_cb) && + (ABS(q1_u - q0_u) < beta_cb) && + (ABS(p1_u - p0_u) < beta_cb)) + { + val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); + delta = CLIP3(-tcb, tcb, val); + /* p0' */ + val = p0_u + delta; + pu1_src_temp_u[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_u - delta; + pu1_src_temp_u[pos_q0] = CLIP_U8(val); + } + + /* Filter Decision */ + if((ABS(p0_v - q0_v) < alpha_cr) && + (ABS(q1_v - q0_v) < beta_cr) && + (ABS(p1_v - p0_v) < beta_cr)) + { + val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); + delta = CLIP3(-tcr, tcr, val); + /* p0' */ + val = p0_v + delta; + pu1_src_temp_v[pos_p0] = CLIP_U8(val); + /* q0' */ + val = q0_v - delta; + pu1_src_temp_v[pos_q0] = CLIP_U8(val); + } + } +} |