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

📄 transform.c

📁 h.264 影像壓縮 必須在 .net 的環境 下操作
💻 C
字号:
/*!
 ***************************************************************************
 * \file transform.c
 *
 * \brief
 *    Transform functions
 *
 * \author
 *    Main contributors (see contributors.h for copyright, address and affiliation details)
 *    - Alexis Michael Tourapis
 * \date
 *    01. July 2007
 **************************************************************************
 */

#include <stdlib.h>

#include "global.h"
#include "transform.h"

static int tmp[64];

void forward4x4(int (*block)[16], int (*tblock)[16], int pos_y, int pos_x)
{
  int i, ii;  
  int *pTmp = tmp, *pblock;
  static int p0,p1,p2,p3;
  static int t0,t1,t2,t3;

  // Horizontal
  for (i=pos_y; i < pos_y + BLOCK_SIZE; i++)
  {
    pblock = &block[i][pos_x];
    p0 = *(pblock++);
    p1 = *(pblock++);
    p2 = *(pblock++);
    p3 = *(pblock  );

    t0 = p0 + p3;
    t1 = p1 + p2;
    t2 = p1 - p2;
    t3 = p0 - p3;

    *(pTmp++) =  t0 + t1;
    *(pTmp++) = (t3 << 1) + t2;
    *(pTmp++) =  t0 - t1;    
    *(pTmp++) =  t3 - (t2 << 1);
  }

  // Vertical 
  for (i=0; i < BLOCK_SIZE; i++)
  {
    pTmp = tmp + i;
    p0 = *pTmp;
    p1 = *(pTmp += BLOCK_SIZE);
    p2 = *(pTmp += BLOCK_SIZE);
    p3 = *(pTmp += BLOCK_SIZE);

    t0 = p0 + p3;
    t1 = p1 + p2;
    t2 = p1 - p2;
    t3 = p0 - p3;

    ii = pos_x + i;
    tblock[pos_y    ][ii] = t0 +  t1;
    tblock[pos_y + 1][ii] = t2 + (t3 << 1);
    tblock[pos_y + 2][ii] = t0 -  t1;
    tblock[pos_y + 3][ii] = t3 - (t2 << 1);
  }
}


void inverse4x4(int (*tblock)[16], int (*block)[16], int pos_y, int pos_x)
{
  int i, ii;  
  int *pTmp = tmp, *pblock;
  static int p0,p1,p2,p3;
  static int t0,t1,t2,t3;

  // Horizontal
  for (i = pos_y; i < pos_y + BLOCK_SIZE; i++)
  {
    pblock = &tblock[i][pos_x];
    t0 = *(pblock++);
    t1 = *(pblock++);
    t2 = *(pblock++);
    t3 = *(pblock  );

    p0 =  t0 + t2;
    p1 =  t0 - t2;
    p2 = (t1 >> 1) - t3;
    p3 =  t1 + (t3 >> 1);

    *(pTmp++) = p0 + p3;
    *(pTmp++) = p1 + p2;
    *(pTmp++) = p1 - p2;
    *(pTmp++) = p0 - p3;
  }

  //  Vertical 
  for (i = 0; i < BLOCK_SIZE; i++)
  {
    pTmp = tmp + i;
    t0 = *pTmp;
    t1 = *(pTmp += BLOCK_SIZE);
    t2 = *(pTmp += BLOCK_SIZE);
    t3 = *(pTmp += BLOCK_SIZE);

    p0 = t0 + t2;
    p1 = t0 - t2;
    p2 =(t1 >> 1) - t3;
    p3 = t1 + (t3 >> 1);

    ii = i + pos_x;
    block[pos_y    ][ii] = p0 + p3;
    block[pos_y + 1][ii] = p1 + p2;
    block[pos_y + 2][ii] = p1 - p2;
    block[pos_y + 3][ii] = p0 - p3;
  }
}


void hadamard4x4(int (*block)[4], int (*tblock)[4])
{
  int i;
  int *pTmp = tmp, *pblock;
  static int p0,p1,p2,p3;
  static int t0,t1,t2,t3;

  // Horizontal
  for (i = 0; i < BLOCK_SIZE; i++)
  {
    pblock = block[i];
    p0 = *(pblock++);
    p1 = *(pblock++);
    p2 = *(pblock++);
    p3 = *(pblock  );

    t0 = p0 + p3;
    t1 = p1 + p2;
    t2 = p1 - p2;
    t3 = p0 - p3;

    *(pTmp++) = t0 + t1;
    *(pTmp++) = t3 + t2;
    *(pTmp++) = t0 - t1;    
    *(pTmp++) = t3 - t2;
  }

  // Vertical 
  for (i = 0; i < BLOCK_SIZE; i++)
  {
    pTmp = tmp + i;
    p0 = *pTmp;
    p1 = *(pTmp += BLOCK_SIZE);
    p2 = *(pTmp += BLOCK_SIZE);
    p3 = *(pTmp += BLOCK_SIZE);

    t0 = p0 + p3;
    t1 = p1 + p2;
    t2 = p1 - p2;
    t3 = p0 - p3;

    tblock[0][i] = (t0 + t1) >> 1;
    tblock[1][i] = (t2 + t3) >> 1;
    tblock[2][i] = (t0 - t1) >> 1;
    tblock[3][i] = (t3 - t2) >> 1;
  }
}


void ihadamard4x4(int (*tblock)[4], int (*block)[4])
{
  int i;  
  int *pTmp = tmp, *pblock;
  static int p0,p1,p2,p3;
  static int t0,t1,t2,t3;

  // Horizontal
  for (i = 0; i < BLOCK_SIZE; i++)
  {
    pblock = tblock[i];
    t0 = *(pblock++);
    t1 = *(pblock++);
    t2 = *(pblock++);
    t3 = *(pblock  );

    p0 = t0 + t2;
    p1 = t0 - t2;
    p2 = t1 - t3;
    p3 = t1 + t3;

    *(pTmp++) = p0 + p3;
    *(pTmp++) = p1 + p2;
    *(pTmp++) = p1 - p2;
    *(pTmp++) = p0 - p3;
  }

  //  Vertical 
  for (i = 0; i < BLOCK_SIZE; i++)
  {
    pTmp = tmp + i;
    t0 = *pTmp;
    t1 = *(pTmp += BLOCK_SIZE);
    t2 = *(pTmp += BLOCK_SIZE);
    t3 = *(pTmp += BLOCK_SIZE);

    p0 = t0 + t2;
    p1 = t0 - t2;
    p2 = t1 - t3;
    p3 = t1 + t3;
    
    block[0][i] = p0 + p3;
    block[1][i] = p1 + p2;
    block[2][i] = p1 - p2;
    block[3][i] = p0 - p3;
  }
}


void forward8x8(int (*block)[16], int (*tblock)[16], int pos_y, int pos_x)
{
  int i, ii;  
  int *pTmp = tmp, *pblock;
  static int a0, a1, a2, a3;
  static int p0, p1, p2, p3, p4, p5 ,p6, p7;
  static int b0, b1, b2, b3, b4, b5, b6, b7;

  // Horizontal
  for (i=pos_y; i < pos_y + BLOCK_SIZE_8x8; i++)
  {
    pblock = &block[i][pos_x];
    p0 = *(pblock++);
    p1 = *(pblock++);
    p2 = *(pblock++);
    p3 = *(pblock++);
    p4 = *(pblock++);
    p5 = *(pblock++);
    p6 = *(pblock++);
    p7 = *(pblock  );

    a0 = p0 + p7;
    a1 = p1 + p6;
    a2 = p2 + p5;
    a3 = p3 + p4;

    b0 = a0 + a3;
    b1 = a1 + a2;
    b2 = a0 - a3;
    b3 = a1 - a2;

    a0 = p0 - p7;
    a1 = p1 - p6;
    a2 = p2 - p5;
    a3 = p3 - p4;

    b4 = a1 + a2 + ((a0 >> 1) + a0);
    b5 = a0 - a3 - ((a2 >> 1) + a2);
    b6 = a0 + a3 - ((a1 >> 1) + a1);
    b7 = a1 - a2 + ((a3 >> 1) + a3);

    *(pTmp++) =  b0 + b1;
    *(pTmp++) =  b4 + (b7 >> 2);
    *(pTmp++) =  b2 + (b3 >> 1);
    *(pTmp++) =  b5 + (b6 >> 2);
    *(pTmp++) =  b0 - b1;
    *(pTmp++) =  b6 - (b5 >> 2);
    *(pTmp++) = (b2 >> 1) - b3;                 
    *(pTmp++) = (b4 >> 2) - b7;
  }

  // Vertical 
  for (i=0; i < BLOCK_SIZE_8x8; i++)
  {
    pTmp = tmp + i;
    p0 = *pTmp;
    p1 = *(pTmp += BLOCK_SIZE_8x8);
    p2 = *(pTmp += BLOCK_SIZE_8x8);
    p3 = *(pTmp += BLOCK_SIZE_8x8);
    p4 = *(pTmp += BLOCK_SIZE_8x8);
    p5 = *(pTmp += BLOCK_SIZE_8x8);
    p6 = *(pTmp += BLOCK_SIZE_8x8);
    p7 = *(pTmp += BLOCK_SIZE_8x8);

    a0 = p0 + p7;
    a1 = p1 + p6;
    a2 = p2 + p5;
    a3 = p3 + p4;

    b0 = a0 + a3;
    b1 = a1 + a2;
    b2 = a0 - a3;
    b3 = a1 - a2;

    a0 = p0 - p7;
    a1 = p1 - p6;
    a2 = p2 - p5;
    a3 = p3 - p4;

    b4 = a1 + a2 + ((a0 >> 1) + a0);
    b5 = a0 - a3 - ((a2 >> 1) + a2);
    b6 = a0 + a3 - ((a1 >> 1) + a1);
    b7 = a1 - a2 + ((a3 >> 1) + a3);

    ii = pos_x + i;
    tblock[pos_y    ][ii] =  b0 + b1;
    tblock[pos_y + 1][ii] =  b4 + (b7 >> 2);
    tblock[pos_y + 2][ii] =  b2 + (b3 >> 1);
    tblock[pos_y + 3][ii] =  b5 + (b6 >> 2);
    tblock[pos_y + 4][ii] =  b0 - b1;
    tblock[pos_y + 5][ii] =  b6 - (b5 >> 2);
    tblock[pos_y + 6][ii] = (b2 >> 1) - b3;
    tblock[pos_y + 7][ii] = (b4 >> 2) - b7;
  }
}

void inverse8x8(int (*tblock)[16], int (*block)[16], int pos_y, int pos_x)
{
  int i, ii;
  int *pTmp = tmp, *pblock;
  static int a0, a1, a2, a3;
  static int p0, p1, p2, p3, p4, p5 ,p6, p7;  
  static int b0, b1, b2, b3, b4, b5, b6, b7;

  // Horizontal  
  for (i=pos_y; i < pos_y + BLOCK_SIZE_8x8; i++)
  {
    pblock = &tblock[i][pos_x];
    p0 = *(pblock++);
    p1 = *(pblock++);
    p2 = *(pblock++);
    p3 = *(pblock++);
    p4 = *(pblock++);
    p5 = *(pblock++);
    p6 = *(pblock++);
    p7 = *(pblock  );

    a0 = p0 + p4;
    a1 = p0 - p4;
    a2 = p6 - (p2 >> 1);
    a3 = p2 + (p6 >> 1);

    b0 =  a0 + a3;
    b2 =  a1 - a2;
    b4 =  a1 + a2;
    b6 =  a0 - a3;

    a0 = -p3 + p5 - p7 - (p7 >> 1);    
    a1 =  p1 + p7 - p3 - (p3 >> 1);    
    a2 = -p1 + p7 + p5 + (p5 >> 1);    
    a3 =  p3 + p5 + p1 + (p1 >> 1);

    
    b1 =  a0 + (a3>>2);    
    b3 =  a1 + (a2>>2);    
    b5 =  a2 - (a1>>2);
    b7 =  a3 - (a0>>2);                

    *(pTmp++) = b0 + b7;
    *(pTmp++) = b2 - b5;
    *(pTmp++) = b4 + b3;
    *(pTmp++) = b6 + b1;
    *(pTmp++) = b6 - b1;
    *(pTmp++) = b4 - b3;
    *(pTmp++) = b2 + b5;
    *(pTmp++) = b0 - b7;
  }

  //  Vertical 
  for (i=0; i < BLOCK_SIZE_8x8; i++)
  {
    pTmp = tmp + i;
    p0 = *pTmp;
    p1 = *(pTmp += BLOCK_SIZE_8x8);
    p2 = *(pTmp += BLOCK_SIZE_8x8);
    p3 = *(pTmp += BLOCK_SIZE_8x8);
    p4 = *(pTmp += BLOCK_SIZE_8x8);
    p5 = *(pTmp += BLOCK_SIZE_8x8);
    p6 = *(pTmp += BLOCK_SIZE_8x8);
    p7 = *(pTmp += BLOCK_SIZE_8x8);

    a0 =  p0 + p4;
    a1 =  p0 - p4;
    a2 =  p6 - (p2>>1);
    a3 =  p2 + (p6>>1);

    b0 = a0 + a3;
    b2 = a1 - a2;
    b4 = a1 + a2;
    b6 = a0 - a3;

    a0 = -p3 + p5 - p7 - (p7 >> 1);
    a1 =  p1 + p7 - p3 - (p3 >> 1);
    a2 = -p1 + p7 + p5 + (p5 >> 1);
    a3 =  p3 + p5 + p1 + (p1 >> 1);


    b1 =  a0 + (a3 >> 2);
    b7 =  a3 - (a0 >> 2);
    b3 =  a1 + (a2 >> 2);
    b5 =  a2 - (a1 >> 2);

    ii = i + pos_x;
    block[pos_y    ][ii] = b0 + b7;
    block[pos_y + 1][ii] = b2 - b5;
    block[pos_y + 2][ii] = b4 + b3;
    block[pos_y + 3][ii] = b6 + b1;
    block[pos_y + 4][ii] = b6 - b1;
    block[pos_y + 5][ii] = b4 - b3;
    block[pos_y + 6][ii] = b2 + b5;
    block[pos_y + 7][ii] = b0 - b7;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -