Showing the changes to codec/common/src/deblocking_common.cpp (1 of 40 files). Show all
Unified · Split
| @@ -0,0 +1,204 @@ | |||
| 1 | #include "deblocking_common.h" | ||
| 2 | #include "macros.h" | ||
| 3 | // C code only | ||
| 4 | void DeblockLumaLt4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, | ||
| 5 | int8_t* pTc) { | ||
| 6 | for (int32_t i = 0; i < 16; i++) { | ||
| 7 | int32_t iTc0 = pTc[i >> 2]; | ||
| 8 | if (iTc0 >= 0) { | ||
| 9 | int32_t p0 = pPix[-iStrideX]; | ||
| 10 | int32_t p1 = pPix[-2 * iStrideX]; | ||
| 11 | int32_t p2 = pPix[-3 * iStrideX]; | ||
| 12 | int32_t q0 = pPix[0]; | ||
| 13 | int32_t q1 = pPix[iStrideX]; | ||
| 14 | int32_t q2 = pPix[2 * iStrideX]; | ||
| 15 | bool bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; | ||
| 16 | bool bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 17 | bool bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 18 | int32_t iTc = iTc0; | ||
| 19 | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { | ||
| 20 | bool bDetaP2P0 = WELS_ABS (p2 - p0) < iBeta; | ||
| 21 | bool bDetaQ2Q0 = WELS_ABS (q2 - q0) < iBeta; | ||
| 22 | if (bDetaP2P0) { | ||
| 23 | pPix[-2 * iStrideX] = p1 + WELS_CLIP3 ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1, -iTc0, iTc0); | ||
| 24 | iTc++; | ||
| 25 | } | ||
| 26 | if (bDetaQ2Q0) { | ||
| 27 | pPix[iStrideX] = q1 + WELS_CLIP3 ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1, -iTc0, iTc0); | ||
| 28 | iTc++; | ||
| 29 | } | ||
| 30 | int32_t iDeta = WELS_CLIP3 ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3, -iTc, iTc); | ||
| 31 | pPix[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ | ||
| 32 | pPix[0] = WelsClip1 (q0 - iDeta); /* q0' */ | ||
| 33 | } | ||
| 34 | } | ||
| 35 | pPix += iStrideY; | ||
| 36 | } | ||
| 37 | } | ||
| 38 | void DeblockLumaEq4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta) { | ||
| 39 | int32_t p0, p1, p2, q0, q1, q2; | ||
| 40 | int32_t iDetaP0Q0; | ||
| 41 | bool bDetaP1P0, bDetaQ1Q0; | ||
| 42 | for (int32_t i = 0; i < 16; i++) { | ||
| 43 | p0 = pPix[-iStrideX]; | ||
| 44 | p1 = pPix[-2 * iStrideX]; | ||
| 45 | p2 = pPix[-3 * iStrideX]; | ||
| 46 | q0 = pPix[0]; | ||
| 47 | q1 = pPix[iStrideX]; | ||
| 48 | q2 = pPix[2 * iStrideX]; | ||
| 49 | iDetaP0Q0 = WELS_ABS (p0 - q0); | ||
| 50 | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 51 | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 52 | if ((iDetaP0Q0 < iAlpha) && bDetaP1P0 && bDetaQ1Q0) { | ||
| 53 | if (iDetaP0Q0 < ((iAlpha >> 2) + 2)) { | ||
| 54 | bool bDetaP2P0 = WELS_ABS (p2 - p0) < iBeta; | ||
| 55 | bool bDetaQ2Q0 = WELS_ABS (q2 - q0) < iBeta; | ||
| 56 | if (bDetaP2P0) { | ||
| 57 | const int32_t p3 = pPix[-4 * iStrideX]; | ||
| 58 | pPix[-iStrideX] = (p2 + (p1 << 1) + (p0 << 1) + (q0 << 1) + q1 + 4) >> 3; //p0 | ||
| 59 | pPix[-2 * iStrideX] = (p2 + p1 + p0 + q0 + 2) >> 2; //p1 | ||
| 60 | pPix[-3 * iStrideX] = ((p3 << 1) + p2 + (p2 << 1) + p1 + p0 + q0 + 4) >> 3;//p2 | ||
| 61 | } else { | ||
| 62 | pPix[-1 * iStrideX] = ((p1 << 1) + p0 + q1 + 2) >> 2; //p0 | ||
| 63 | } | ||
| 64 | if (bDetaQ2Q0) { | ||
| 65 | const int32_t q3 = pPix[3 * iStrideX]; | ||
| 66 | pPix[0] = (p1 + (p0 << 1) + (q0 << 1) + (q1 << 1) + q2 + 4) >> 3; //q0 | ||
| 67 | pPix[iStrideX] = (p0 + q0 + q1 + q2 + 2) >> 2; //q1 | ||
| 68 | pPix[2 * iStrideX] = ((q3 << 1) + q2 + (q2 << 1) + q1 + q0 + p0 + 4) >> 3;//q2 | ||
| 69 | } else { | ||
| 70 | pPix[0] = ((q1 << 1) + q0 + p1 + 2) >> 2; //q0 | ||
| 71 | } | ||
| 72 | } else { | ||
| 73 | pPix[-iStrideX] = ((p1 << 1) + p0 + q1 + 2) >> 2; //p0 | ||
| 74 | pPix[ 0] = ((q1 << 1) + q0 + p1 + 2) >> 2; //q0 | ||
| 75 | } | ||
| 76 | } | ||
| 77 | pPix += iStrideY; | ||
| 78 | } | ||
| 79 | } | ||
| 80 | void DeblockLumaLt4V_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc) { | ||
| 81 | DeblockLumaLt4_c (pPix, iStride, 1, iAlpha, iBeta, tc); | ||
| 82 | } | ||
| 83 | void DeblockLumaLt4H_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc) { | ||
| 84 | DeblockLumaLt4_c (pPix, 1, iStride, iAlpha, iBeta, tc); | ||
| 85 | } | ||
| 86 | void DeblockLumaEq4V_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta) { | ||
| 87 | DeblockLumaEq4_c (pPix, iStride, 1, iAlpha, iBeta); | ||
| 88 | } | ||
| 89 | void DeblockLumaEq4H_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta) { | ||
| 90 | DeblockLumaEq4_c (pPix, 1, iStride, iAlpha, iBeta); | ||
| 91 | } | ||
| 92 | void DeblockChromaLt4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, | ||
| 93 | int32_t iBeta, int8_t* pTc) { | ||
| 94 | int32_t p0, p1, q0, q1, iDeta; | ||
| 95 | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; | ||
| 96 | |||
| 97 | for (int32_t i = 0; i < 8; i++) { | ||
| 98 | int32_t iTc0 = pTc[i >> 1]; | ||
| 99 | if (iTc0 > 0) { | ||
| 100 | p0 = pPixCb[-iStrideX]; | ||
| 101 | p1 = pPixCb[-2 * iStrideX]; | ||
| 102 | q0 = pPixCb[0]; | ||
| 103 | q1 = pPixCb[iStrideX]; | ||
| 104 | |||
| 105 | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; | ||
| 106 | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 107 | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 108 | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { | ||
| 109 | iDeta = WELS_CLIP3 ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3, -iTc0, iTc0); | ||
| 110 | pPixCb[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ | ||
| 111 | pPixCb[0] = WelsClip1 (q0 - iDeta); /* q0' */ | ||
| 112 | } | ||
| 113 | |||
| 114 | |||
| 115 | p0 = pPixCr[-iStrideX]; | ||
| 116 | p1 = pPixCr[-2 * iStrideX]; | ||
| 117 | q0 = pPixCr[0]; | ||
| 118 | q1 = pPixCr[iStrideX]; | ||
| 119 | |||
| 120 | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; | ||
| 121 | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 122 | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 123 | |||
| 124 | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { | ||
| 125 | iDeta = WELS_CLIP3 ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3, -iTc0, iTc0); | ||
| 126 | pPixCr[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ | ||
| 127 | pPixCr[0] = WelsClip1 (q0 - iDeta); /* q0' */ | ||
| 128 | } | ||
| 129 | } | ||
| 130 | pPixCb += iStrideY; | ||
| 131 | pPixCr += iStrideY; | ||
| 132 | } | ||
| 133 | } | ||
| 134 | void DeblockChromaEq4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, | ||
| 135 | int32_t iBeta) { | ||
| 136 | int32_t p0, p1, q0, q1; | ||
| 137 | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; | ||
| 138 | for (int32_t i = 0; i < 8; i++) { | ||
| 139 | //cb | ||
| 140 | p0 = pPixCb[-iStrideX]; | ||
| 141 | p1 = pPixCb[-2 * iStrideX]; | ||
| 142 | q0 = pPixCb[0]; | ||
| 143 | q1 = pPixCb[iStrideX]; | ||
| 144 | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; | ||
| 145 | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 146 | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 147 | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { | ||
| 148 | pPixCb[-iStrideX] = ((p1 << 1) + p0 + q1 + 2) >> 2; /* p0' */ | ||
| 149 | pPixCb[0] = ((q1 << 1) + q0 + p1 + 2) >> 2; /* q0' */ | ||
| 150 | } | ||
| 151 | |||
| 152 | //cr | ||
| 153 | p0 = pPixCr[-iStrideX]; | ||
| 154 | p1 = pPixCr[-2 * iStrideX]; | ||
| 155 | q0 = pPixCr[0]; | ||
| 156 | q1 = pPixCr[iStrideX]; | ||
| 157 | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; | ||
| 158 | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; | ||
| 159 | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; | ||
| 160 | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { | ||
| 161 | pPixCr[-iStrideX] = ((p1 << 1) + p0 + q1 + 2) >> 2; /* p0' */ | ||
| 162 | pPixCr[0] = ((q1 << 1) + q0 + p1 + 2) >> 2; /* q0' */ | ||
| 163 | } | ||
| 164 | pPixCr += iStrideY; | ||
| 165 | pPixCb += iStrideY; | ||
| 166 | } | ||
| 167 | } | ||
| 168 | void DeblockChromaLt4V_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, | ||
| 169 | int8_t* tc) { | ||
| 170 | DeblockChromaLt4_c (pPixCb, pPixCr, iStride, 1, iAlpha, iBeta, tc); | ||
| 171 | } | ||
| 172 | void DeblockChromaLt4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, | ||
| 173 | int8_t* tc) { | ||
| 174 | DeblockChromaLt4_c (pPixCb, pPixCr, 1, iStride, iAlpha, iBeta, tc); | ||
| 175 | } | ||
| 176 | void DeblockChromaEq4V_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { | ||
| 177 | DeblockChromaEq4_c (pPixCb, pPixCr, iStride, 1, iAlpha, iBeta); | ||
| 178 | } | ||
| 179 | void DeblockChromaEq4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { | ||
| 180 | DeblockChromaEq4_c (pPixCb, pPixCr, 1, iStride, iAlpha, iBeta); | ||
| 181 | } | ||
| 182 | |||
| 183 | #ifdef X86_ASM | ||
| 184 | extern "C" { | ||
| 185 | void DeblockLumaLt4H_ssse3 (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc) { | ||
| 186 | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); | ||
| 187 | |||
| 188 | DeblockLumaTransposeH2V_sse2 (pPixY - 4, iStride, &uiBuf[0]); | ||
| 189 | DeblockLumaLt4V_ssse3 (&uiBuf[4 * 16], 16, iAlpha, iBeta, pTc); | ||
| 190 | DeblockLumaTransposeV2H_sse2 (pPixY - 4, iStride, &uiBuf[0]); | ||
| 191 | } | ||
| 192 | |||
| 193 | void DeblockLumaEq4H_ssse3 (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta) { | ||
| 194 | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); | ||
| 195 | |||
| 196 | DeblockLumaTransposeH2V_sse2 (pPixY - 4, iStride, &uiBuf[0]); | ||
| 197 | DeblockLumaEq4V_ssse3 (&uiBuf[4 * 16], 16, iAlpha, iBeta); | ||
| 198 | DeblockLumaTransposeV2H_sse2 (pPixY - 4, iStride, &uiBuf[0]); | ||
| 199 | } | ||
| 200 | |||
| 201 | } | ||
| 202 | |||
| 203 | #endif | ||
| 204 | |||