armVCM4P10_DeBlockPixel.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/* ---------------------------------------------------------------- 2 * 3 * 4 * File Name: armVCM4P10_DeBlockPixel.c 5 * OpenMAX DL: v1.0.2 6 * Revision: 9641 7 * Date: Thursday, February 7, 2008 8 * 9 * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 10 * 11 * 12 * 13 * H.264 luma deblock module 14 * 15 */ 16 17#ifdef DEBUG_ARMVCM4P10_DEBLOCKPIXEL 18#undef DEBUG_ON 19#define DEBUG_ON 20#endif /* DEBUG_ARMVCM4P10_DEBLOCKPIXEL */ 21 22#include "omxtypes.h" 23#include "armOMX.h" 24#include "omxVC.h" 25 26#include "armCOMM.h" 27#include "armVC.h" 28 29/* 30 * Description 31 * Deblock one boundary pixel 32 * 33 * Parameters: 34 * [in] pQ0 Pointer to pixel q0 35 * [in] Step Step between pixels q0 and q1 36 * [in] tC0 Edge threshold value 37 * [in] alpha alpha threshold value 38 * [in] beta beta threshold value 39 * [in] bS deblocking strength 40 * [in] ChromaFlag True for chroma blocks 41 * [out] pQ0 Deblocked pixels 42 * 43 */ 44 45void armVCM4P10_DeBlockPixel( 46 OMX_U8 *pQ0, /* pointer to the pixel q0 */ 47 int Step, /* step between pixels q0 and q1 */ 48 int tC0, /* edge threshold value */ 49 int alpha, /* alpha */ 50 int beta, /* beta */ 51 int bS, /* deblocking strength */ 52 int ChromaFlag 53) 54{ 55 int p3, p2, p1, p0, q0, q1, q2, q3; 56 int ap, aq, delta; 57 58 if (bS==0) 59 { 60 return; 61 } 62 63 p3 = pQ0[-4*Step]; 64 p2 = pQ0[-3*Step]; 65 p1 = pQ0[-2*Step]; 66 p0 = pQ0[-1*Step]; 67 q0 = pQ0[ 0*Step]; 68 q1 = pQ0[ 1*Step]; 69 q2 = pQ0[ 2*Step]; 70 q3 = pQ0[ 3*Step]; 71 72 if (armAbs(p0-q0)>=alpha || armAbs(p1-p0)>=beta || armAbs(q1-q0)>=beta) 73 { 74 DEBUG_PRINTF_10("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x alpha=%d beta=%d\n", 75 p3, p2, p1, p0, q0, q1, q2, q3, alpha, beta); 76 return; 77 } 78 79 ap = armAbs(p2 - p0); 80 aq = armAbs(q2 - q0); 81 82 if (bS < 4) 83 { 84 int tC = tC0; 85 86 if (ChromaFlag) 87 { 88 tC++; 89 } 90 else 91 { 92 if (ap < beta) 93 { 94 tC++; 95 } 96 if (aq < beta) 97 { 98 tC++; 99 } 100 } 101 102 delta = (((q0-p0)<<2) + (p1-q1) + 4) >> 3; 103 delta = armClip(-tC, tC, delta); 104 105 pQ0[-1*Step] = (OMX_U8)armClip(0, 255, p0 + delta); 106 pQ0[ 0*Step] = (OMX_U8)armClip(0, 255, q0 - delta); 107 108 if (ChromaFlag==0 && ap<beta) 109 { 110 delta = (p2 + ((p0+q0+1)>>1) - (p1<<1))>>1; 111 delta = armClip(-tC0, tC0, delta); 112 pQ0[-2*Step] = (OMX_U8)(p1 + delta); 113 } 114 115 if (ChromaFlag==0 && aq<beta) 116 { 117 delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1; 118 delta = armClip(-tC0, tC0, delta); 119 pQ0[ 1*Step] = (OMX_U8)(q1 + delta); 120 } 121 } 122 else /* bS==4 */ 123 { 124 if (ChromaFlag==0 && ap<beta && armAbs(p0-q0)<((alpha>>2)+2)) 125 { 126 pQ0[-1*Step] = (OMX_U8)((p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3); 127 pQ0[-2*Step] = (OMX_U8)((p2 + p1 + p0 + q0 + 2)>>2); 128 pQ0[-3*Step] = (OMX_U8)((2*p3 + 3*p2 + p1 + p0 + q0 + 4)>>3); 129 } 130 else 131 { 132 pQ0[-1*Step] = (OMX_U8)((2*p1 + p0 + q1 + 2)>>2); 133 } 134 135 if (ChromaFlag==0 && aq<beta && armAbs(p0-q0)<((alpha>>2)+2)) 136 { 137 pQ0[ 0*Step] = (OMX_U8)((q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4)>>3); 138 pQ0[ 1*Step] = (OMX_U8)((q2 + q1 + p0 + q0 + 2)>>2); 139 pQ0[ 2*Step] = (OMX_U8)((2*q3 + 3*q2 + q1 + q0 + p0 + 4)>>3); 140 } 141 else 142 { 143 pQ0[ 0*Step] = (OMX_U8)((2*q1 + q0 + p1 + 2)>>2); 144 } 145 } 146 147 DEBUG_PRINTF_13("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x bS=%d -> %02x %02x %02x %02x\n", 148 p3, p2, p1, p0, q0, q1, q2, q3, bS, 149 pQ0[-2*Step], pQ0[-1*Step],pQ0[0*Step],pQ0[1*Step]); 150 151} 152