blob: c30f7530d2aab6d45805558ad10f3c4817c50523 [file] [log] [blame] [edit]
/******************************************************************************
*
* 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
* ih264_deblk_edge_filters.c
*
* @brief
* Contains function definitions for deblocking
*
* @author
* ittiam
*
* @par List of Functions:
* - ih264_deblk_luma_vert_bs4
* - ih264_deblk_luma_horz_bs4
* - ih264_deblk_chroma_vert_bs4_bp
* - ih264_deblk_chroma_horz_bs4_bp
* - ih264_deblk_luma_vert_bslt4
* - ih264_deblk_chroma_vert_bslt4_bp
* - ih264_deblk_luma_horz_bslt4
* - ih264_deblk_luma_horz_bslt4
* - ih264_deblk_luma_vert_bs4_mbaff
* - ih264_deblk_chroma_vert_bs4_mbaff_bp
* - ih264_deblk_luma_vert_bslt4_mbaff
* - 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
*
* @remarks
* none
*
*******************************************************************************
*/
/*****************************************************************************/
/* File Includes */
/*****************************************************************************/
/* System Include Files */
#include <stdio.h>
/* User Include Files */
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_deblk_edge_filters.h"
#include "ih264_platform_macros.h"
/*****************************************************************************/
/* Function Definitions */
/*****************************************************************************/
/**
*******************************************************************************
*
* @brief luma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a luma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief luma horizontal edge deblock @ bs4
*
* @par Description
* This function performs filtering of a luma block horizontal edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma horizontal edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block horizontal edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief luma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a luma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief luma horizontal edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a luma block horizontal edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma horizontal edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block horizontal edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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 */
/*****************************************************************************/
/**
*******************************************************************************
*
* @brief luma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a luma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
/**
*******************************************************************************
*
* @brief luma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a luma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha
* alpha value for the boundary
*
* @param[in] beta
* beta value for the boundary
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab
* tc0_table
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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 */
/*****************************************************************************/
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma horizontal edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block horizontal edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab_cb
* tc0_table of U
*
* @param[in] pu1_cliptab_cr
* tc0_table of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma horizontal edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block horizontal edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab_cb
* tc0_table of U
*
* @param[in] pu1_cliptab_cr
* tc0_table of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is set to 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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;
}
}
}
/**
*******************************************************************************
*
* @brief chroma vertical edge deblock @ bs < 4
*
* @par Description
* This function performs filtering of a chroma block vertical edge when the
* boundary strength is less than 4
*
* @param[in] pu1_src
* pointer to the src sample q0 of U
*
* @param[in] src_strd
* source stride
*
* @param[in] alpha_cb
* alpha value for the boundary of U
*
* @param[in] beta_cb
* beta value for the boundary of U
*
* @param[in] alpha_cr
* alpha value for the boundary of V
*
* @param[in] beta_cr
* beta value for the boundary of V
*
* @param[in] u4_bs
* packed Boundary strength array
*
* @param[in] pu1_cliptab_cb
* tc0_table of U
*
* @param[in] pu1_cliptab_cr
* tc0_table of V
*
* @returns none
*
* @remarks 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
*
******************************************************************************
*/
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);
}
}
}