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 | + | |