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: armVCM4P10_DeBlockPixel.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#ifdef DEBUG_ARMVCM4P10_DEBLOCKPIXEL 33#undef DEBUG_ON 34#define DEBUG_ON 35#endif /* DEBUG_ARMVCM4P10_DEBLOCKPIXEL */ 36 37#include "omxtypes.h" 38#include "armOMX.h" 39#include "omxVC.h" 40 41#include "armCOMM.h" 42#include "armVC.h" 43 44/* 45 * Description 46 * Deblock one boundary pixel 47 * 48 * Parameters: 49 * [in] pQ0 Pointer to pixel q0 50 * [in] Step Step between pixels q0 and q1 51 * [in] tC0 Edge threshold value 52 * [in] alpha alpha threshold value 53 * [in] beta beta threshold value 54 * [in] bS deblocking strength 55 * [in] ChromaFlag True for chroma blocks 56 * [out] pQ0 Deblocked pixels 57 * 58 */ 59 60void armVCM4P10_DeBlockPixel( 61 OMX_U8 *pQ0, /* pointer to the pixel q0 */ 62 int Step, /* step between pixels q0 and q1 */ 63 int tC0, /* edge threshold value */ 64 int alpha, /* alpha */ 65 int beta, /* beta */ 66 int bS, /* deblocking strength */ 67 int ChromaFlag 68) 69{ 70 int p3, p2, p1, p0, q0, q1, q2, q3; 71 int ap, aq, delta; 72 73 if (bS==0) 74 { 75 return; 76 } 77 78 p3 = pQ0[-4*Step]; 79 p2 = pQ0[-3*Step]; 80 p1 = pQ0[-2*Step]; 81 p0 = pQ0[-1*Step]; 82 q0 = pQ0[ 0*Step]; 83 q1 = pQ0[ 1*Step]; 84 q2 = pQ0[ 2*Step]; 85 q3 = pQ0[ 3*Step]; 86 87 if (armAbs(p0-q0)>=alpha || armAbs(p1-p0)>=beta || armAbs(q1-q0)>=beta) 88 { 89 DEBUG_PRINTF_10("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x alpha=%d beta=%d\n", 90 p3, p2, p1, p0, q0, q1, q2, q3, alpha, beta); 91 return; 92 } 93 94 ap = armAbs(p2 - p0); 95 aq = armAbs(q2 - q0); 96 97 if (bS < 4) 98 { 99 int tC = tC0; 100 101 if (ChromaFlag) 102 { 103 tC++; 104 } 105 else 106 { 107 if (ap < beta) 108 { 109 tC++; 110 } 111 if (aq < beta) 112 { 113 tC++; 114 } 115 } 116 117 delta = (((q0-p0)<<2) + (p1-q1) + 4) >> 3; 118 delta = armClip(-tC, tC, delta); 119 120 pQ0[-1*Step] = (OMX_U8)armClip(0, 255, p0 + delta); 121 pQ0[ 0*Step] = (OMX_U8)armClip(0, 255, q0 - delta); 122 123 if (ChromaFlag==0 && ap<beta) 124 { 125 delta = (p2 + ((p0+q0+1)>>1) - (p1<<1))>>1; 126 delta = armClip(-tC0, tC0, delta); 127 pQ0[-2*Step] = (OMX_U8)(p1 + delta); 128 } 129 130 if (ChromaFlag==0 && aq<beta) 131 { 132 delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1; 133 delta = armClip(-tC0, tC0, delta); 134 pQ0[ 1*Step] = (OMX_U8)(q1 + delta); 135 } 136 } 137 else /* bS==4 */ 138 { 139 if (ChromaFlag==0 && ap<beta && armAbs(p0-q0)<((alpha>>2)+2)) 140 { 141 pQ0[-1*Step] = (OMX_U8)((p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3); 142 pQ0[-2*Step] = (OMX_U8)((p2 + p1 + p0 + q0 + 2)>>2); 143 pQ0[-3*Step] = (OMX_U8)((2*p3 + 3*p2 + p1 + p0 + q0 + 4)>>3); 144 } 145 else 146 { 147 pQ0[-1*Step] = (OMX_U8)((2*p1 + p0 + q1 + 2)>>2); 148 } 149 150 if (ChromaFlag==0 && aq<beta && armAbs(p0-q0)<((alpha>>2)+2)) 151 { 152 pQ0[ 0*Step] = (OMX_U8)((q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4)>>3); 153 pQ0[ 1*Step] = (OMX_U8)((q2 + q1 + p0 + q0 + 2)>>2); 154 pQ0[ 2*Step] = (OMX_U8)((2*q3 + 3*q2 + q1 + q0 + p0 + 4)>>3); 155 } 156 else 157 { 158 pQ0[ 0*Step] = (OMX_U8)((2*q1 + q0 + p1 + 2)>>2); 159 } 160 } 161 162 DEBUG_PRINTF_13("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x bS=%d -> %02x %02x %02x %02x\n", 163 p3, p2, p1, p0, q0, q1, q2, q3, bS, 164 pQ0[-2*Step], pQ0[-1*Step],pQ0[0*Step],pQ0[1*Step]); 165 166} 167