178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar/*
278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Copyright (C) 2007-2008 ARM Limited
378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * you may not use this file except in compliance with the License.
678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * You may obtain a copy of the License at
778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Unless required by applicable law or agreed to in writing, software
1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * See the License for the specific language governing permissions and
1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * limitations under the License.
1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar */
170c1bc742181ded4930842b46e9507372f0b1b963James Dong/* ----------------------------------------------------------------
180c1bc742181ded4930842b46e9507372f0b1b963James Dong *
190c1bc742181ded4930842b46e9507372f0b1b963James Dong *
200c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  omxVCM4P10_DeblockLuma_I.c
210c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   9641
230c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Thursday, February 7, 2008
240c1bc742181ded4930842b46e9507372f0b1b963James Dong *
250c1bc742181ded4930842b46e9507372f0b1b963James Dong *
260c1bc742181ded4930842b46e9507372f0b1b963James Dong *
270c1bc742181ded4930842b46e9507372f0b1b963James Dong *
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * H.264 luma deblock
290c1bc742181ded4930842b46e9507372f0b1b963James Dong *
300c1bc742181ded4930842b46e9507372f0b1b963James Dong */
310c1bc742181ded4930842b46e9507372f0b1b963James Dong
320c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
330c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h"
340c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h"
350c1bc742181ded4930842b46e9507372f0b1b963James Dong
360c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h"
380c1bc742181ded4930842b46e9507372f0b1b963James Dong
390c1bc742181ded4930842b46e9507372f0b1b963James Dong
400c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P10_DeblockLuma_I
420c1bc742181ded4930842b46e9507372f0b1b963James Dong *
430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
440c1bc742181ded4930842b46e9507372f0b1b963James Dong * This function performs deblock filtering the horizontal and vertical edges of a luma macroblock
450c1bc742181ded4930842b46e9507372f0b1b963James Dong *(16x16).
460c1bc742181ded4930842b46e9507372f0b1b963James Dong *
470c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
480c1bc742181ded4930842b46e9507372f0b1b963James Dong *
490c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pSrcDst         pointer to the input macroblock. Must be 8-byte aligned.
510c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	srcdstStep      image width
520c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pAlpha          pointer to a 2x2 table of alpha thresholds, organized as follows: { external
530c1bc742181ded4930842b46e9507372f0b1b963James Dong *                             vertical edge, internal vertical edge, external horizontal
540c1bc742181ded4930842b46e9507372f0b1b963James Dong *                             edge, internal horizontal edge }
550c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBeta			pointer to a 2x2 table of beta thresholds, organized as follows: { external
560c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              vertical edge, internal vertical edge, external  horizontal edge,
570c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              internal  horizontal edge }
580c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pThresholds		pointer to a 16x2 table of threshold (TC0), organized as follows: { values for
590c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              the  left or above edge of each 4x4 block, arranged in  vertical block order
600c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              and then in horizontal block order)
610c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBS				 pointer to a 16x2 table of BS parameters arranged in scan block order for vertical edges and then horizontal edges;
620c1bc742181ded4930842b46e9507372f0b1b963James 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.
630c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]	pSrcDst		pointer to filtered output macroblock.
640c1bc742181ded4930842b46e9507372f0b1b963James Dong *
650c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
660c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error
670c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments
680c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - Either of the pointers in pSrcDst, pAlpha, pBeta, pTresholds or pBS is NULL.
690c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - pSrcDst is not 8-byte aligned.
700c1bc742181ded4930842b46e9507372f0b1b963James Dong *    - srcdstStep is not a multiple of 8
710c1bc742181ded4930842b46e9507372f0b1b963James 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.
720c1bc742181ded4930842b46e9507372f0b1b963James Dong.
730c1bc742181ded4930842b46e9507372f0b1b963James Dong *
740c1bc742181ded4930842b46e9507372f0b1b963James Dong */
750c1bc742181ded4930842b46e9507372f0b1b963James Dong
760c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P10_DeblockLuma_I(
770c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_U8* pSrcDst,
780c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_S32 srcdstStep,
790c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pAlpha,
800c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pBeta,
810c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pThresholds,
820c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8 *pBS
830c1bc742181ded4930842b46e9507372f0b1b963James Dong)
840c1bc742181ded4930842b46e9507372f0b1b963James Dong{
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMXResult errorCode;
860c1bc742181ded4930842b46e9507372f0b1b963James Dong
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pSrcDst == NULL,             OMX_Sts_BadArgErr);
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot8ByteAligned(pSrcDst), OMX_Sts_BadArgErr);
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(srcdstStep & 7,              OMX_Sts_BadArgErr);
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pAlpha == NULL,              OMX_Sts_BadArgErr);
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBeta == NULL,               OMX_Sts_BadArgErr);
920c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pThresholds == NULL,         OMX_Sts_BadArgErr);
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pThresholds), OMX_Sts_BadArgErr);
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBS == NULL,                     OMX_Sts_BadArgErr);
950c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pBS),         OMX_Sts_BadArgErr);
960c1bc742181ded4930842b46e9507372f0b1b963James Dong
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingLuma_VerEdge_I(
980c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha, pBeta, pThresholds, pBS);
990c1bc742181ded4930842b46e9507372f0b1b963James Dong
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(errorCode != OMX_Sts_NoErr, errorCode)
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingLuma_HorEdge_I(
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha+2, pBeta+2, pThresholds+16, pBS+16);
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong    return errorCode;
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong}
107