void transform_skip_8_fallback(uint8_t *dst, int16_t *coeffs, ptrdiff_t stride) { int nT = 4; int bdShift2 = 20-8; for (int y=0;y<nT;y++) for (int x=0;x<nT;x++) { int32_t c = coeffs[x+y*nT] << 7; c = (c+(1<<(bdShift2-1)))>>bdShift2; dst[y*stride+x] = Clip1_8bit(dst[y*stride+x] + c); } }
void transform_4x4_luma_add_8_fallback(uint8_t *dst, int16_t *coeffs, ptrdiff_t stride) { int16_t g[4][4]; int postShift = 20-8; // 8 bit int rndV = 1<<(7-1); int rndH = 1<<(postShift-1); // --- V --- for (int c=0;c<4;c++) { logtrace(LogTransform,"DST-V: "); for (int r=0;r<4;r++) { logtrace(LogTransform,"%d ",coeffs[c+r*4]); } logtrace(LogTransform,"* -> "); for (int i=0;i<4;i++) { int sum=0; for (int j=0;j<4;j++) { sum += mat_8_357[j][i] * coeffs[c+j*4]; } g[i][c] = Clip3(-32768,32767, (sum+rndV)>>7); } for (int y=0;y<4;y++) { logtrace(LogTransform,"*%d ",g[y][c]); } logtrace(LogTransform,"*\n"); } // --- H --- for (int y=0;y<4;y++) { logtrace(LogTransform,"DST-H: "); for (int c=0;c<4;c++) { logtrace(LogTransform,"%d ",g[y][c]); } logtrace(LogTransform,"* -> "); for (int i=0;i<4;i++) { int sum=0; for (int j=0;j<4;j++) { sum += mat_8_357[j][i] * g[y][j]; } int out = Clip3(-32768,32767, (sum+rndH)>>postShift); dst[y*stride+i] = Clip1_8bit(dst[y*stride+i] + out); logtrace(LogTransform,"*%d ",out); } logtrace(LogTransform,"*\n"); } }
static void transform_dct_add_8(uint8_t *dst, ptrdiff_t stride, int nT, int16_t *coeffs) { int postShift = 20-8; // 8 bit int rnd1 = 1<<(7-1); int rnd2 = 1<<(postShift-1); int fact = (1<<(5-Log2(nT))); int16_t g[32*32]; // actually, only [nT*nT] used // TODO: valgrind reports that dst[] contains uninitialized data. // Probably from intra-prediction. /* for (int i=0;i<nT*nT;i++) { printf("%d\n",coeffs[i]); } for (int y=0;y<nT;y++) { for (int i=0;i<nT;i++) { printf("%d ",dst[y*stride+i]); } } printf("\n"); */ for (int c=0;c<nT;c++) { logtrace(LogTransform,"DCT-V: "); for (int i=0;i<nT;i++) { logtrace(LogTransform,"*%d ",coeffs[c+i*nT]); } logtrace(LogTransform,"* -> "); // find last non-zero coefficient to reduce computations carried out in DCT int lastCol = nT-1; for (;lastCol>=0;lastCol--) { if (coeffs[c+lastCol*nT]) { break; } } for (int i=0;i<nT;i++) { int sum=0; for (int j=0;j<=lastCol /*nT*/;j++) { sum += mat_dct[fact*j][i] * coeffs[c+j*nT]; } g[c+i*nT] = Clip3(-32768,32767, (sum+rnd1)>>7); logtrace(LogTransform,"*%d ",g[c+i*nT]); } logtrace(LogTransform,"*\n"); } for (int y=0;y<nT;y++) { logtrace(LogTransform,"DCT-H: "); for (int i=0;i<nT;i++) { logtrace(LogTransform,"*%d ",g[i+y*nT]); } logtrace(LogTransform,"* -> "); // find last non-zero coefficient to reduce computations carried out in DCT int lastCol = nT-1; for (;lastCol>=0;lastCol--) { if (g[y*nT+lastCol]) { break; } } for (int i=0;i<nT;i++) { int sum=0; for (int j=0;j<=lastCol /*nT*/;j++) { sum += mat_dct[fact*j][i] * g[y*nT+j]; } //int out = Clip3(-32768,32767, (sum+rnd2)>>postShift); int out = (sum+rnd2)>>postShift; //printf("%d\n",Clip1_8bit(dst[y*stride+i])); //printf("%d\n",Clip1_8bit(out)); dst[y*stride+i] = Clip1_8bit(dst[y*stride+i] + out); logtrace(LogTransform,"*%d ",out); } logtrace(LogTransform,"*\n"); } }
static void transform_dct_add_8(uint8_t *dst, ptrdiff_t stride, int nT, int16_t *coeffs) { int postShift = 20-8; // 8 bit int rnd1 = 1<<(7-1); int rnd2 = 1<<(postShift-1); int fact = (1<<(5-Log2(nT))); int16_t g[32*32]; // actually, only [nT*nT] used //int16_t col[32]; // actually, only [nT] used //int32_t out[32]; // actually, only [nT] used for (int c=0;c<nT;c++) { logtrace(LogTransform,"DCT-V: "); for (int i=0;i<nT;i++) { logtrace(LogTransform,"*%d ",coeffs[c+i*nT]); } logtrace(LogTransform,"* -> "); // find last non-zero coefficient to reduce computations carried out in DCT int lastCol = nT-1; for (;lastCol>=0;lastCol--) { if (coeffs[c+lastCol*nT]) { break; } } for (int i=0;i<nT;i++) { int sum=0; for (int j=0;j<=lastCol /*nT*/;j++) { sum += mat_dct[fact*j][i] * coeffs[c+j*nT]; } g[c+i*nT] = Clip3(-32768,32767, (sum+rnd1)>>7); logtrace(LogTransform,"*%d ",g[c+i*nT]); } logtrace(LogTransform,"*\n"); } for (int y=0;y<nT;y++) { logtrace(LogTransform,"DCT-H: "); for (int i=0;i<nT;i++) { logtrace(LogTransform,"*%d ",g[i+y*nT]); } logtrace(LogTransform,"* -> "); // find last non-zero coefficient to reduce computations carried out in DCT int lastCol = nT-1; for (;lastCol>=0;lastCol--) { if (g[y*nT+lastCol]) { break; } } for (int i=0;i<nT;i++) { int sum=0; for (int j=0;j<=lastCol /*nT*/;j++) { sum += mat_dct[fact*j][i] * g[y*nT+j]; } //int out = Clip3(-32768,32767, (sum+rnd2)>>postShift); int out = (sum+rnd2)>>postShift; dst[y*stride+i] = Clip1_8bit(dst[y*stride+i] + out); logtrace(LogTransform,"*%d ",out); } logtrace(LogTransform,"*\n"); } }