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_DeblockChroma_I.c
210c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   12290
230c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Wednesday, April 9, 2008
240c1bc742181ded4930842b46e9507372f0b1b963James Dong *
250c1bc742181ded4930842b46e9507372f0b1b963James Dong *
260c1bc742181ded4930842b46e9507372f0b1b963James Dong *
270c1bc742181ded4930842b46e9507372f0b1b963James Dong *
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * H.264 intra chroma 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 * Function: omxVCM4P10_DeblockChroma_I
410c1bc742181ded4930842b46e9507372f0b1b963James Dong *
420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs deblocking filtering on all edges of the chroma macroblock (16x16).
440c1bc742181ded4930842b46e9507372f0b1b963James Dong *
450c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
460c1bc742181ded4930842b46e9507372f0b1b963James Dong *
470c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
480c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pSrcDst         pointer to the input macroblock. Must be 8-byte aligned.
490c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	srcdstStep      Step of the arrays
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pAlpha          pointer to a 2x2 array of alpha thresholds, organized as follows: { external
510c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          vertical edge, internal  vertical edge, external
520c1bc742181ded4930842b46e9507372f0b1b963James Dong *                         horizontal edge, internal horizontal edge }
530c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBeta			pointer to a 2x2 array of beta thresholds, organized as follows: { external
540c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              vertical edge, internal vertical edge, external  horizontal edge,
550c1bc742181ded4930842b46e9507372f0b1b963James Dong *                              internal  horizontal edge }
560c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pThresholds		AArray of size  8x2 of Thresholds (TC0) (values for the left or
570c1bc742181ded4930842b46e9507372f0b1b963James Dong *                               above edge of each 4x2 or 2x4 block, arranged in  vertical block order
580c1bc742181ded4930842b46e9507372f0b1b963James Dong *                               and then in  horizontal block order)
590c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBS				array of size 16x2 of BS parameters (arranged in scan block order for vertical edges and then horizontal edges);
600c1bc742181ded4930842b46e9507372f0b1b963James 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.
610c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]	pSrcDst		pointer to filtered output macroblock
620c1bc742181ded4930842b46e9507372f0b1b963James Dong *
630c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
640c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr - no error
650c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments
660c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - Either of the pointers in pSrcDst, pAlpha, pBeta, pTresholds, or pBS is NULL.
670c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - pSrcDst is not 8-byte aligned.
680c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - either pThresholds or pBS is not 4-byte aligned.
690c1bc742181ded4930842b46e9507372f0b1b963James 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.
700c1bc742181ded4930842b46e9507372f0b1b963James Dong *   - srcdstStep is not a multiple of 8.
710c1bc742181ded4930842b46e9507372f0b1b963James Dong *
720c1bc742181ded4930842b46e9507372f0b1b963James Dong */
730c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult omxVCM4P10_DeblockChroma_I(
740c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_U8* pSrcDst,
750c1bc742181ded4930842b46e9507372f0b1b963James Dong	OMX_S32 srcdstStep,
760c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pAlpha,
770c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pBeta,
780c1bc742181ded4930842b46e9507372f0b1b963James Dong	const OMX_U8* pThresholds,
790c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 *pBS
800c1bc742181ded4930842b46e9507372f0b1b963James Dong)
810c1bc742181ded4930842b46e9507372f0b1b963James Dong{
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMXResult errorCode;
830c1bc742181ded4930842b46e9507372f0b1b963James Dong
840c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pSrcDst == NULL,                 OMX_Sts_BadArgErr);
850c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot8ByteAligned(pSrcDst),     OMX_Sts_BadArgErr);
860c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(srcdstStep & 7,                  OMX_Sts_BadArgErr);
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pAlpha == NULL,                  OMX_Sts_BadArgErr);
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBeta == NULL,                   OMX_Sts_BadArgErr);
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pThresholds == NULL,             OMX_Sts_BadArgErr);
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pThresholds), OMX_Sts_BadArgErr);
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(pBS == NULL,                     OMX_Sts_BadArgErr);
920c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(armNot4ByteAligned(pBS),         OMX_Sts_BadArgErr);
930c1bc742181ded4930842b46e9507372f0b1b963James Dong
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingChroma_VerEdge_I(
950c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha, pBeta, pThresholds, pBS);
960c1bc742181ded4930842b46e9507372f0b1b963James Dong
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(errorCode != OMX_Sts_NoErr, errorCode)
980c1bc742181ded4930842b46e9507372f0b1b963James Dong
990c1bc742181ded4930842b46e9507372f0b1b963James Dong    errorCode = omxVCM4P10_FilterDeblockingChroma_HorEdge_I(
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong        pSrcDst, srcdstStep, pAlpha+2, pBeta+2, pThresholds+8, pBS+16);
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong    return errorCode;
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong}
104