📄 skl_dct_c.c
字号:
TYPE *pIn; int i; int Rows = 8; pIn = In; while(Rows-->0) { const int Left = pIn[0]|pIn[1]|pIn[2]|pIn[3]; const int Right = pIn[4]|pIn[5]|pIn[6]|pIn[7]; if (!Right) { if (Left) { int mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7, Spill; // odd mm6 = (int)pIn[3]; mm7 = (int)pIn[1]; mm2 = mm6; mm3 = mm7; ROTATE2(mm2, mm3, ROT17_C, -ROT17_SpC, -ROT17_SmC, mm1); ROTATE0(mm4, mm7, -ROT37_C, ROT37_SpC, ROT37_SmC, mm1); ROTATE0(mm5, mm6, -ROT13_C, ROT13_SmC, ROT13_SpC, mm1); mm4 += mm2; mm5 += mm3; mm6 += mm2; mm7 += mm3; // even mm3 = (int)pIn[2]; mm2 = 0; ROTATE2(mm3, mm2, ROT6_C, ROT6_SmC, -ROT6_SpC, mm1); mm0 = (int)pIn[0]; mm0 = SHIFTL(mm0, FIX) + HALF(FIX-IPASS); mm1 = mm0; BUTF(mm0, mm3, Spill); BUTF(mm1, mm2, Spill); BUTF(mm0, mm7, Spill); pIn[0] = SHIFTR(mm0, FIX-IPASS); pIn[7] = SHIFTR(mm7, FIX-IPASS); BUTF(mm1, mm6, mm0); pIn[1] = SHIFTR(mm1, FIX-IPASS); pIn[6] = SHIFTR(mm6, FIX-IPASS); BUTF(mm2, mm5, mm0); pIn[2] = SHIFTR(mm2, FIX-IPASS); pIn[5] = SHIFTR(mm5, FIX-IPASS); BUTF(mm3, mm4, mm0); pIn[3] = SHIFTR(mm3, FIX-IPASS); pIn[4] = SHIFTR(mm4, FIX-IPASS); } } else { int mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7, Spill; // odd mm4 = (int)pIn[7]; mm5 = (int)pIn[5]; mm6 = (int)pIn[3]; mm7 = (int)pIn[1]; mm2 = mm4 + mm6; mm3 = mm5 + mm7; ROTATE2(mm2, mm3, ROT17_C, -ROT17_SpC, -ROT17_SmC, mm1); ROTATE2(mm4, mm7, -ROT37_C, ROT37_SpC, ROT37_SmC, mm1); ROTATE2(mm5, mm6, -ROT13_C, ROT13_SmC, ROT13_SpC, mm1); mm4 += mm2; mm5 += mm3; mm6 += mm2; mm7 += mm3; // even mm3 = (int)pIn[2]; mm2 = (int)pIn[6]; ROTATE2(mm3, mm2, ROT6_C, ROT6_SmC, -ROT6_SpC, mm1); LOAD_BUTF(mm0, mm1, 0, 4, Spill, pIn); mm0 = SHIFTL(mm0, FIX) + HALF(FIX-IPASS); mm1 = SHIFTL(mm1, FIX) + HALF(FIX-IPASS); BUTF(mm0, mm3, Spill); BUTF(mm1, mm2, Spill); BUTF(mm0, mm7, Spill); pIn[0] = SHIFTR(mm0, FIX-IPASS); pIn[7] = SHIFTR(mm7, FIX-IPASS); BUTF(mm1, mm6, mm0); pIn[1] = SHIFTR(mm1, FIX-IPASS); pIn[6] = SHIFTR(mm6, FIX-IPASS); BUTF(mm2, mm5, mm0); pIn[2] = SHIFTR(mm2, FIX-IPASS); pIn[5] = SHIFTR(mm5, FIX-IPASS); BUTF(mm3, mm4, mm0); pIn[3] = SHIFTR(mm3, FIX-IPASS); pIn[4] = SHIFTR(mm4, FIX-IPASS); } pIn += 8; } pIn = In; for (i=8; i>0; --i) { int mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7, Spill; // odd mm4 = (int)pIn[7*8]; mm5 = (int)pIn[5*8]; mm6 = (int)pIn[3*8]; mm7 = (int)pIn[1*8]; mm2 = mm4 + mm6; mm3 = mm5 + mm7; ROTATE2(mm2, mm3, ROT17_C, -ROT17_SpC, -ROT17_SmC, mm1); ROTATE2(mm4, mm7, -ROT37_C, ROT37_SpC, ROT37_SmC, mm1); ROTATE2(mm5, mm6, -ROT13_C, ROT13_SmC, ROT13_SpC, mm1); mm4 += mm2; mm5 += mm3; mm6 += mm2; mm7 += mm3; // even mm3 = (int)pIn[2*8]; mm2 = (int)pIn[6*8]; ROTATE2(mm3, mm2, ROT6_C, ROT6_SmC, -ROT6_SpC, mm1); LOAD_BUTF(mm0, mm1, 0*8, 4*8, Spill, pIn); mm0 = SHIFTL(mm0, FIX) + HALF(FIX+IPASS+3); mm1 = SHIFTL(mm1, FIX) + HALF(FIX+IPASS+3); BUTF(mm0, mm3, Spill); BUTF(mm1, mm2, Spill); BUTF(mm0, mm7, Spill); pIn[8*0] = (TYPE) SHIFTR(mm0, FIX+IPASS+3); pIn[8*7] = (TYPE) SHIFTR(mm7, FIX+IPASS+3); BUTF(mm1, mm6, mm0); pIn[8*1] = (TYPE) SHIFTR(mm1, FIX+IPASS+3); pIn[8*6] = (TYPE) SHIFTR(mm6, FIX+IPASS+3); BUTF(mm2, mm5, mm0); pIn[8*2] = (TYPE) SHIFTR(mm2, FIX+IPASS+3); pIn[8*5] = (TYPE) SHIFTR(mm5, FIX+IPASS+3); BUTF(mm3, mm4, mm0); pIn[8*3] = (TYPE) SHIFTR(mm3, FIX+IPASS+3); pIn[8*4] = (TYPE) SHIFTR(mm4, FIX+IPASS+3); pIn++; }}//////////////////////////////////////////////////////////// IDCT + Put/Add shortcuts#define CLIP(v) ((v)<0 ? 0 : (v)>255 ? 255 : (SKL_BYTE)(v))void Skl_IDct16_Put_C(SKL_BYTE *Dst, int BpS, TYPE *In){ int j; Skl_IDct16_Sparse_C( In ); for(j=8; j>0; --j) { Dst[0] = CLIP(In[0]); Dst[1] = CLIP(In[1]); Dst[2] = CLIP(In[2]); Dst[3] = CLIP(In[3]); Dst[4] = CLIP(In[4]); Dst[5] = CLIP(In[5]); Dst[6] = CLIP(In[6]); Dst[7] = CLIP(In[7]); Dst += BpS; In += 8; }}void Skl_IDct16_Add_C(SKL_BYTE *Dst, int BpS, TYPE *In){ int j; Skl_IDct16_Sparse_C( In ); for(j=8; j>0; --j) { int v; v = In[0] + Dst[0]; Dst[0] = CLIP(v); v = In[1] + Dst[1]; Dst[1] = CLIP(v); v = In[2] + Dst[2]; Dst[2] = CLIP(v); v = In[3] + Dst[3]; Dst[3] = CLIP(v); v = In[4] + Dst[4]; Dst[4] = CLIP(v); v = In[5] + Dst[5]; Dst[5] = CLIP(v); v = In[6] + Dst[6]; Dst[6] = CLIP(v); v = In[7] + Dst[7]; Dst[7] = CLIP(v); Dst += BpS; In += 8; }}#undef CLIP#undef FIX#undef FPASS#undef IPASS#undef BUTF#undef LOAD_BUTF#undef ROTATE#undef ROTATE2#undef SHIFTL#undef SHIFTR#undef TYPE//////////////////////////////////////////////////////////// - Data flow schematics for FDCT -// Output is scaled by 2.sqrt(2)// Initial butterflies (in0/in7, etc.) are not fully depicted.// Note: Rot6 coeffs are multiplied by sqrt(2).///////////////////////////////////////////////////////////* <---------Stage1 =even part=-----------> in3 mm3 +_____.___-___________.____* out6 x \ / | in4 mm4 \ | / \ | in0 mm0 +_____o___+__.___-___ | ___* out4 x \ / | in7 mm7 \ (Rot6) / \ | in1 mm1 +_____o___+__o___+___ | ___* out0 x \ / | in6 mm6 / | / \ | in2 mm2 +_____.___-___________o____* out2 x in5 mm5 <---------Stage2 =odd part=----------------> mm7*___._________.___-___[xSqrt2]___* out3 | \ / (Rot3) \ | / \ mm5*__ | ___o____o___+___.___-______* out7 | | \ / | (Rot1) \ | | / \ mm6*__ |____.____o___+___o___+______* out1 | \ / | / | / \ mm4*___o_________.___-___[xSqrt2]___* out5 Alternative schematics for stage 2: ----------------------------------- mm7 *___[xSqrt2]____o___+____o_______* out1 \ / | / (Rot1) / \ | mm6 *____o___+______.___-___ | __.___* out5 \ / | | / | | / \ | | mm5 *____.___-______.___-____.__ | __* out7 \ / | \ (Rot3) / \ | mm4 *___[xSqrt2]____o___+________o___* out3*///////////////////////////////////////////////////////////// - Data flow schematics for IDCT -// Output is scaled by 2.sqrt(2)// Note: Rot6 coeffs are multiplied by sqrt(2).///////////////////////////////////////////////////////////* <---------Stage 1 =even part=----------------> in3 *___[xSqrt2]____.___-________o____* mm7 \ / | / | / \ | in1 *____o___+______o___+____.__ | ___* mm3 \ / | | / (Rot3)| / \ | | in7 *____.___-______.___-____o__ | ___* mm1 \ / | \ (Rot1) / \ | in5 *___[xSqrt2]____o___+________.____* mm5 Alternative schematics for stage 1: ----------------------------------- in1 *________.____.___-_____[xSqrt2]__* mm1 | \ / (Rot1) \ | / \ in5 *___o___ | ___o___+_____.___-_____* mm5 | | \ / | | \ | | / \ in7 *__ | ___o____o___+__ __o___+_____* mm7 | \ / (Rot3) / | / \ in3 *___._________.___-_____[xSqrt2]__* mm3 <---------Stage2 =odd part=---------> in6 *__o___________o___+___* mm6 -> butterfly with mm3 -> out3/out4 mm6 | \ / | / | / \ in4 *_ | ___o___+__.___-___* mm4 -> butf. w/ mm1 -> out7/out0 mm4 | \ / (Rot6) / | / \ in0 *_ | ___.___-__.___-___* mm0 -> butf. w/ mm5 -> out6/out1 mm0 | \ / | \ | / \ in2 *__.___________o___+___* mm2 -> butf. w/ mm7 -> out2/out5 mm2*///////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -