10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* ----------------------------------------------------------------
20c1bc742181ded4930842b46e9507372f0b1b963James Dong *
30c1bc742181ded4930842b46e9507372f0b1b963James Dong *
40c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  omxVCM4P10_DeblockLuma_I.c
50c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
60c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   12290
70c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Wednesday, April 9, 2008
80c1bc742181ded4930842b46e9507372f0b1b963James Dong *
90c1bc742181ded4930842b46e9507372f0b1b963James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
100c1bc742181ded4930842b46e9507372f0b1b963James Dong *
110c1bc742181ded4930842b46e9507372f0b1b963James Dong *
120c1bc742181ded4930842b46e9507372f0b1b963James Dong *
130c1bc742181ded4930842b46e9507372f0b1b963James Dong * H.264 luma deblock
140c1bc742181ded4930842b46e9507372f0b1b963James Dong *
150c1bc742181ded4930842b46e9507372f0b1b963James Dong */
160c1bc742181ded4930842b46e9507372f0b1b963James Dong
170c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h"
190c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h"
200c1bc742181ded4930842b46e9507372f0b1b963James Dong
210c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
220c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h"
230c1bc742181ded4930842b46e9507372f0b1b963James Dong
240c1bc742181ded4930842b46e9507372f0b1b963James Dong
250c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P10_DeblockLuma_I
270c1bc742181ded4930842b46e9507372f0b1b963James Dong *
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
290c1bc742181ded4930842b46e9507372f0b1b963James Dong * This function performs deblock filtering the horizontal and vertical edges of a luma macroblock
300c1bc742181ded4930842b46e9507372f0b1b963James Dong *(16x16).
310c1bc742181ded4930842b46e9507372f0b1b963James Dong *
320c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
330c1bc742181ded4930842b46e9507372f0b1b963James Dong *
340c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
350c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pSrcDst         pointer to the input macroblock. Must be 8-byte aligned.
360c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	srcdstStep      image width
370c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pAlpha          pointer to a 2x2 table of alpha thresholds, organized as follows: { external
380c1bc742181ded4930842b46e9507372f0b1b963James Dong *                             vertical edge, internal vertical edge, external horizontal
390c1bc742181ded4930842b46e9507372f0b1b963James Dong *                             edge, internal horizontal edge }
400c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBeta			pointer to a 2x2 table of beta thresholds, organized as follows: { external
410c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              vertical edge, internal vertical edge, external  horizontal edge,
420c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              internal  horizontal edge }
430c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pThresholds		pointer to a 16x2 table of threshold (TC0), organized as follows: { values for
440c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              the  left or above edge of each 4x4 block, arranged in  vertical block order
450c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              and then in horizontal block order)
460c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBS				 pointer to a 16x2 table of BS parameters arranged in scan block order for vertical edges and then horizontal edges;
470c1bc742181ded4930842b46e9507372f0b1b963James Dong *                               valid in the range [0,4] with the following restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^1]== 4.  Must be 4-byte aligned.
480c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]	pSrcDst		pointer to filtered output macroblock.
490c1bc742181ded4930842b46e9507372f0b1b963James Dong *
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
510c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error
520c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments
530c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - Either of the pointers in pSrcDst, pAlpha, pBeta, pTresholds or pBS is NULL.
540c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - pSrcDst is not 8-byte aligned.
550c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - srcdstStep is not a multiple of 8
560c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - pBS is out of range, i.e., one of the following conditions is true: pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or (pBS[i]==4 && pBS[i^1]!=4) for 0<=i<=3.
570c1bc742181ded4930842b46e9507372f0b1b963James Dong.
580c1bc742181ded4930842b46e9507372f0b1b963James Dong *
590c1bc742181ded4930842b46e9507372f0b1b963James Dong */
600c1bc742181ded4930842b46e9507372f0b1b963James Dong
610c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P10_DeblockLuma_I(
620c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_U8* pSrcDst,
630c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_S32 srcdstStep,
640c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pAlpha,
650c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pBeta,
660c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pThresholds,
670c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8 *pBS
680c1bc742181ded4930842b46e9507372f0b1b963James Dong)
690c1bc742181ded4930842b46e9507372f0b1b963James Dong{
700c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMXResult errorCode;
710c1bc742181ded4930842b46e9507372f0b1b963James Dong
720c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pSrcDst == NULL,             OMX_Sts_BadArgErr);
730c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot8ByteAligned(pSrcDst), OMX_Sts_BadArgErr);
740c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(srcdstStep & 7,              OMX_Sts_BadArgErr);
750c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pAlpha == NULL,              OMX_Sts_BadArgErr);
760c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBeta == NULL,               OMX_Sts_BadArgErr);
770c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pThresholds == NULL,         OMX_Sts_BadArgErr);
780c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pThresholds), OMX_Sts_BadArgErr);
790c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBS == NULL,                     OMX_Sts_BadArgErr);
800c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pBS),         OMX_Sts_BadArgErr);
810c1bc742181ded4930842b46e9507372f0b1b963James Dong
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingLuma_VerEdge_I(
830c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha, pBeta, pThresholds, pBS);
840c1bc742181ded4930842b46e9507372f0b1b963James Dong
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(errorCode != OMX_Sts_NoErr, errorCode)
860c1bc742181ded4930842b46e9507372f0b1b963James Dong
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingLuma_HorEdge_I(
880c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha+2, pBeta+2, pThresholds+16, pBS+16);
890c1bc742181ded4930842b46e9507372f0b1b963James Dong
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    return errorCode;
910c1bc742181ded4930842b46e9507372f0b1b963James Dong}
92