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

📄 coretrans.c

📁 decode the h264 video
💻 C
字号:
#include "common.h"#include "coretrans.h"core_block core_block_multiply(core_block a, core_block b) {  int i,j,k;  int sum;  core_block res;    for(i=0; i<4; ++i)    for(j=0; j<4; ++j) {      sum=0;      for(k=0; k<4; ++k)        sum+=CoreBlock(a,i,k)*CoreBlock(b,k,j);      CoreBlock(res,i,j)=sum;    }  return res;}core_block forward_core_transform(core_block original) {  CONST core_block transform0={{1,1,1,1,2,1,-1,-2,1,-1,-1,1,1,-2,2,-1}};  CONST core_block transformT={{1,2,1,1,1,1,-1,-2,1,-1,-1,2,1,-2,1,-1}};  core_block temp=core_block_multiply(transform0,original);  return core_block_multiply(temp,transformT);}#define QP0   13107,8066,13107,8066, 8066,5243,8066,5243#define QP1   11916,7490,11916,7490, 7490,4660,7490,4660#define QP2   10082,6554,10082,6554, 6554,4194,6554,4194#define QP3    9362,5825, 9352,5825, 5825,3647,5825,3647#define QP4    8192,5243, 8192,5243, 5243,3355,5243,3355#define QP5    7282,4559, 7282,4559, 4559,2893,4559,2893core_block forward_quantize(core_block raw, int quantizer, int rounding_mode) {  CONST core_block factors[6]={{{QP0,QP0}},{{QP1,QP1}},{{QP2,QP2}},                               {{QP3,QP3}},{{QP4,QP4}},{{QP5,QP5}}};  int qbits=(quantizer/6)+15;  int table=(quantizer%6);  int round_adjust=(1<<qbits)/rounding_mode;  int l;  core_block res;  for(l=0; l<16; ++l) {    int value=raw.items[l];    res.items[l]=CombineSign(ExtractSign(value),                 (abs(value)*factors[table].items[l]+round_adjust)>>qbits);  }  return res;}#define DQP0  10,13,10,13, 13,16,13,16#define DQP1  11,14,11,14, 14,18,14,18#define DQP2  13,16,13,16, 16,20,16,20#define DQP3  14,18,14,18, 18,23,18,23#define DQP4  16,20,16,20, 20,25,20,25#define DQP5  18,23,18,23, 23,29,23,29core_block inverse_quantize(core_block quantized, int quantizer, int without_dc) {  CONST core_block factors[6]={{{DQP0,DQP0}},{{DQP1,DQP1}},{{DQP2,DQP2}},                               {{DQP3,DQP3}},{{DQP4,DQP4}},{{DQP5,DQP5}}};  int qbits=quantizer/6;  int table=quantizer%6;  int l;  core_block res;  if(without_dc) res.items[0]=quantized.items[0];  for(l=without_dc; l<16; ++l) {    int value=quantized.items[l];    res.items[l]=CombineSign(ExtractSign(value),                 (abs(value)*factors[table].items[l])<<qbits);  }  return res;}core_block inverse_core_transform_slow(core_block coeff) {  CONST core_block transform0={{2,2,2,1,2,1,-2,-2,2,-1,-2,2,2,-2,2,-1}};  CONST core_block transformT={{2,2,2,2,2,1,-1,-2,2,-2,-2,2,1,-2,2,-1}};  core_block temp=core_block_multiply(transform0,coeff);  core_block scaled=core_block_multiply(temp,transformT);  int l;  for(l=0; l<16; ++l) {    scaled.items[l]=(scaled.items[l]+128)>>8;  }  return scaled;}core_block inverse_core_transform_fast(core_block coeff) {  core_block temp=coeff;  int i,e0,e1,e2,e3,*l=&temp.items[0];  for(i=0;i<4;++i) {    e0=l[0]+l[2];    e1=l[0]-l[2];    e2=(l[1]>>1)-l[3];    e3=l[1]+(l[3]>>1);    *l++=e0+e3;    *l++=e1+e2;    *l++=e1-e2;    *l++=e0-e3;  }  for(i=0;i<4;++i) {    l=&temp.items[i];    e0=l[0]+l[8];    e1=l[0]-l[8];    e2=(l[4]>>1)-l[12];    e3=l[4]+(l[12]>>1);    l[0] =(e0+e3+32)>>6;    l[4] =(e1+e2+32)>>6;    l[8] =(e1-e2+32)>>6;    l[12]=(e0-e3+32)>>6;  }  return temp;}static inline void enter(unsigned char *ptr, int q_delta) {  register int i=*ptr+((q_delta+32)>>6);#ifdef USE_X86_ASM  asm(" \    cdq;              \    notl %%edx;       \    andl %%edx,%%eax; \    subl $256, %%eax; \    cdq;              \    notl %%edx;       \    orl  %%edx,%%eax; \  ":"=a"(i):"a"(i):"%edx");  *ptr=i;#else  *ptr=Clip(i);#endif}void direct_ict(core_block coeff, unsigned char *img, int pitch) {  core_block temp=coeff;  int i,e0,e1,e2,e3,*l=&temp.items[0];  for(i=0;i<4;++i) {    e0=l[0]+l[2];    e1=l[0]-l[2];    e2=(l[1]>>1)-l[3];    e3=l[1]+(l[3]>>1);    *l++=e0+e3;    *l++=e1+e2;    *l++=e1-e2;    *l++=e0-e3;  }  for(i=0;i<4;++i) {    l=&temp.items[i];    e0=l[0]+l[8];    e1=l[0]-l[8];    e2=(l[4]>>1)-l[12];    e3=l[4]+(l[12]>>1);    enter(&img[0]       ,e0+e3);    enter(&img[pitch]   ,e1+e2);    enter(&img[pitch<<1],e1-e2);    enter(&img[pitch*3] ,e0-e3);    ++img;  }}core_block hadamard(core_block coeff) {  CONST core_block transform={{1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1}};  return core_block_multiply(transform,core_block_multiply(coeff,transform));}////////////////////////////////////////////////////////////////////////////////void _dump_core_block(core_block block) {  int i,j;  for(i=0; i<4; ++i) {    for(j=0; j<4; ++j)      printf("%5d",CoreBlock(block,i,j));    printf("\n");  }  printf("\n");}#ifdef BUILD_TESTSint _test_coretrans(int argc, char *argv[]) {  core_block test_block={{5,11,8,10,9,8,4,12,1,10,11,4,19,6,15,7}};  int quantizer=10;  int mode=IntraRoundingMode;    core_block temp;    printf("Original block:\n");  _dump_core_block(test_block);  temp=forward_core_transform(test_block);  printf("Forward core transform:\n");  _dump_core_block(temp);  temp=forward_quantize(temp,quantizer,mode);  printf("Forward quantizer:\n");  _dump_core_block(temp);  temp=inverse_quantize(temp,quantizer,0);  printf("Inverse quantizer:\n");  _dump_core_block(temp);  temp=inverse_core_transform(temp);  printf("Inverse core transform:\n");  _dump_core_block(temp);    return 0;}#endif

⌨️ 快捷键说明

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