1 /* 2 * Copyright (C) 2007-2008 ARM Limited 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 */ 17 /* ---------------------------------------------------------------- 18 * 19 * 20 * File Name: omxVCM4P10_FilterDeblockingLuma_VerEdge_I.c 21 * OpenMAX DL: v1.0.2 22 * Revision: 9641 23 * Date: Thursday, February 7, 2008 24 * 25 * 26 * 27 * 28 * H.264 luma deblock module 29 * 30 */ 31 32 #include "omxtypes.h" 33 #include "armOMX.h" 34 #include "omxVC.h" 35 36 #include "armCOMM.h" 37 #include "armVC.h" 38 39 /** 40 * Function: omxVCM4P10_FilterDeblockingLuma_VerEdge_I (6.3.3.3.1) 41 * 42 * Description: 43 * Performs in-place deblock filtering on four vertical edges of the luma 44 * macroblock (16x16). 45 * 46 * Input Arguments: 47 * 48 * pSrcDst - Pointer to the input macroblock; must be 16-byte aligned. 49 * srcdstStep -Step of the arrays; must be a multiple of 16. 50 * pAlpha -Array of size 2 of alpha thresholds (the first item is the alpha 51 * threshold for the external vertical edge, and the second item is 52 * for the internal vertical edge); per [ISO14496-10] alpha values 53 * must be in the range [0,255]. 54 * pBeta -Array of size 2 of beta thresholds (the first item is the beta 55 * threshold for the external vertical edge, and the second item is 56 * for the internal vertical edge); per [ISO14496-10] beta values 57 * must be in the range [0,18]. 58 * pThresholds -Array of size 16 of Thresholds (TC0) (values for the left 59 * edge of each 4x4 block, arranged in vertical block order); must 60 * be aligned on a 4-byte boundary.. Per [ISO14496-10] values must 61 * be in the range [0,25]. 62 * pBS -Array of size 16 of BS parameters (arranged in vertical block 63 * order); valid in the range [0,4] with the following 64 * restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii) 65 * pBS[i]== 4 if and only if pBS[i^3]== 4. Must be 4-byte aligned. 66 * 67 * Output Arguments: 68 * 69 * pSrcDst -Pointer to filtered output macroblock. 70 * 71 * Return Value: 72 * If the function runs without error, it returns OMX_Sts_NoErr. 73 * If one of the following cases occurs, the function returns 74 * OMX_Sts_BadArgErr: 75 * Either of the pointers in pSrcDst, pAlpha, pBeta, pThresholds, or pBS 76 * is NULL. 77 * Either pThresholds or pBS is not aligned on a 4-byte boundary. 78 * pSrcDst is not 16-byte aligned. 79 * srcdstStep is not a multiple of 16. 80 * pAlpha[0] and/or pAlpha[1] is outside the range [0,255]. 81 * pBeta[0] and/or pBeta[1] is outside the range [0,18]. 82 * One or more entries in the table pThresholds[0..15]is outside of the 83 * range [0,25]. 84 * pBS is out of range, i.e., one of the following conditions is true: 85 * pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or (pBS[i]==4 && 86 * pBS[i^3]!=4) for 0<=i<=3. 87 * 88 */ 89 90 OMXResult omxVCM4P10_FilterDeblockingLuma_VerEdge_I( 91 OMX_U8* pSrcDst, 92 OMX_S32 srcdstStep, 93 const OMX_U8* pAlpha, 94 const OMX_U8* pBeta, 95 const OMX_U8* pThresholds, 96 const OMX_U8 *pBS 97 ) 98 { 99 int X, Y, I, Internal=0; 100 101 armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 102 armRetArgErrIf(armNot16ByteAligned(pSrcDst),OMX_Sts_BadArgErr); 103 armRetArgErrIf(srcdstStep & 15, OMX_Sts_BadArgErr); 104 armRetArgErrIf(pAlpha == NULL, OMX_Sts_BadArgErr); 105 armRetArgErrIf(pBeta == NULL, OMX_Sts_BadArgErr); 106 armRetArgErrIf(pThresholds == NULL, OMX_Sts_BadArgErr); 107 armRetArgErrIf(armNot4ByteAligned(pThresholds), OMX_Sts_BadArgErr); 108 armRetArgErrIf(pBS == NULL, OMX_Sts_BadArgErr); 109 armRetArgErrIf(armNot4ByteAligned(pBS), OMX_Sts_BadArgErr); 110 armRetArgErrIf(pBeta[0] > 18, OMX_Sts_BadArgErr); 111 armRetArgErrIf(pBeta[1] > 18, OMX_Sts_BadArgErr); 112 113 114 for (X=0; X<16; X+=4, Internal=1) 115 { 116 for (Y=0; Y<16; Y++) 117 { 118 I = (Y>>2)+4*(X>>2); 119 120 armRetArgErrIf(pBS[Y] > 4, OMX_Sts_BadArgErr); 121 122 armRetArgErrIf((pBS[Y] == 4) && (Y > 3), 123 OMX_Sts_BadArgErr); 124 125 armRetArgErrIf(( (pBS[Y] == 4) && (pBS[Y^3] != 4) ), 126 OMX_Sts_BadArgErr); 127 128 armRetArgErrIf(pThresholds[Y] > 25, OMX_Sts_BadArgErr); 129 130 /* Filter vertical edge with q0 at (X,Y) */ 131 armVCM4P10_DeBlockPixel( 132 pSrcDst + Y*srcdstStep + X, 133 1, 134 pThresholds[I], 135 pAlpha[Internal], 136 pBeta[Internal], 137 pBS[I], 138 0); 139 } 140 } 141 142 return OMX_Sts_NoErr; 143 } 144