⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skl_dct_c.c

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -