vp3dsp.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:9k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2004 the ffmpeg project
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18. /**
  19.  * @file vp3dsp.c
  20.  * Standard C DSP-oriented functions cribbed from the original VP3 
  21.  * source code.
  22.  */
  23. #include "common.h"
  24. #include "avcodec.h"
  25. #include "dsputil.h"
  26. #define IdctAdjustBeforeShift 8
  27. #define xC1S7 64277
  28. #define xC2S6 60547
  29. #define xC3S5 54491
  30. #define xC4S4 46341
  31. #define xC5S3 36410
  32. #define xC6S2 25080
  33. #define xC7S1 12785
  34. static always_inline void idct(uint8_t *dst, int stride, int16_t *input, int type)
  35. {
  36.     int16_t *ip = input;
  37.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  38.     int A_, B_, C_, D_, _Ad, _Bd, _Cd, _Dd, E_, F_, G_, H_;
  39.     int _Ed, _Gd, _Add, _Bdd, _Fd, _Hd;
  40.     int t1, t2;
  41.     int i;
  42.     
  43.     /* Inverse DCT on the rows now */
  44.     for (i = 0; i < 8; i++) {
  45.         /* Check for non-zero values */
  46.         if ( ip[0] | ip[1] | ip[2] | ip[3] | ip[4] | ip[5] | ip[6] | ip[7] ) {
  47.             t1 = (int32_t)(xC1S7 * ip[1]);
  48.             t2 = (int32_t)(xC7S1 * ip[7]);
  49.             t1 >>= 16;
  50.             t2 >>= 16;
  51.             A_ = t1 + t2;
  52.             t1 = (int32_t)(xC7S1 * ip[1]);
  53.             t2 = (int32_t)(xC1S7 * ip[7]);
  54.             t1 >>= 16;
  55.             t2 >>= 16;
  56.             B_ = t1 - t2;
  57.             t1 = (int32_t)(xC3S5 * ip[3]);
  58.             t2 = (int32_t)(xC5S3 * ip[5]);
  59.             t1 >>= 16;
  60.             t2 >>= 16;
  61.             C_ = t1 + t2;
  62.             t1 = (int32_t)(xC3S5 * ip[5]);
  63.             t2 = (int32_t)(xC5S3 * ip[3]);
  64.             t1 >>= 16;
  65.             t2 >>= 16;
  66.             D_ = t1 - t2;
  67.             t1 = (int32_t)(xC4S4 * (A_ - C_));
  68.             t1 >>= 16;
  69.             _Ad = t1;
  70.             t1 = (int32_t)(xC4S4 * (B_ - D_));
  71.             t1 >>= 16;
  72.             _Bd = t1;
  73.             _Cd = A_ + C_;
  74.             _Dd = B_ + D_;
  75.             t1 = (int32_t)(xC4S4 * (ip[0] + ip[4]));
  76.             t1 >>= 16;
  77.             E_ = t1;
  78.             t1 = (int32_t)(xC4S4 * (ip[0] - ip[4]));
  79.             t1 >>= 16;
  80.             F_ = t1;
  81.             t1 = (int32_t)(xC2S6 * ip[2]);
  82.             t2 = (int32_t)(xC6S2 * ip[6]);
  83.             t1 >>= 16;
  84.             t2 >>= 16;
  85.             G_ = t1 + t2;
  86.             t1 = (int32_t)(xC6S2 * ip[2]);
  87.             t2 = (int32_t)(xC2S6 * ip[6]);
  88.             t1 >>= 16;
  89.             t2 >>= 16;
  90.             H_ = t1 - t2;
  91.             _Ed = E_ - G_;
  92.             _Gd = E_ + G_;
  93.             _Add = F_ + _Ad;
  94.             _Bdd = _Bd - H_;
  95.             _Fd = F_ - _Ad;
  96.             _Hd = _Bd + H_;
  97.             /*  Final sequence of operations over-write original inputs. */
  98.             ip[0] = _Gd + _Cd ;
  99.             ip[7] = _Gd - _Cd ;
  100.             ip[1] = _Add + _Hd;
  101.             ip[2] = _Add - _Hd;
  102.             ip[3] = _Ed + _Dd ;
  103.             ip[4] = _Ed - _Dd ;
  104.             ip[5] = _Fd + _Bdd;
  105.             ip[6] = _Fd - _Bdd;
  106.         }
  107.         ip += 8;            /* next row */
  108.     }
  109.     
  110.     ip = input;
  111.     for ( i = 0; i < 8; i++) {
  112.         /* Check for non-zero values (bitwise or faster than ||) */
  113.         if ( ip[1 * 8] | ip[2 * 8] | ip[3 * 8] |
  114.              ip[4 * 8] | ip[5 * 8] | ip[6 * 8] | ip[7 * 8] ) {
  115.             t1 = (int32_t)(xC1S7 * ip[1*8]);
  116.             t2 = (int32_t)(xC7S1 * ip[7*8]);
  117.             t1 >>= 16;
  118.             t2 >>= 16;
  119.             A_ = t1 + t2;
  120.             t1 = (int32_t)(xC7S1 * ip[1*8]);
  121.             t2 = (int32_t)(xC1S7 * ip[7*8]);
  122.             t1 >>= 16;
  123.             t2 >>= 16;
  124.             B_ = t1 - t2;
  125.             t1 = (int32_t)(xC3S5 * ip[3*8]);
  126.             t2 = (int32_t)(xC5S3 * ip[5*8]);
  127.             t1 >>= 16;
  128.             t2 >>= 16;
  129.             C_ = t1 + t2;
  130.             t1 = (int32_t)(xC3S5 * ip[5*8]);
  131.             t2 = (int32_t)(xC5S3 * ip[3*8]);
  132.             t1 >>= 16;
  133.             t2 >>= 16;
  134.             D_ = t1 - t2;
  135.             t1 = (int32_t)(xC4S4 * (A_ - C_));
  136.             t1 >>= 16;
  137.             _Ad = t1;
  138.             t1 = (int32_t)(xC4S4 * (B_ - D_));
  139.             t1 >>= 16;
  140.             _Bd = t1;
  141.             _Cd = A_ + C_;
  142.             _Dd = B_ + D_;
  143.             t1 = (int32_t)(xC4S4 * (ip[0*8] + ip[4*8]));
  144.             t1 >>= 16;
  145.             E_ = t1;
  146.             t1 = (int32_t)(xC4S4 * (ip[0*8] - ip[4*8]));
  147.             t1 >>= 16;
  148.             F_ = t1;
  149.             t1 = (int32_t)(xC2S6 * ip[2*8]);
  150.             t2 = (int32_t)(xC6S2 * ip[6*8]);
  151.             t1 >>= 16;
  152.             t2 >>= 16;
  153.             G_ = t1 + t2;
  154.             t1 = (int32_t)(xC6S2 * ip[2*8]);
  155.             t2 = (int32_t)(xC2S6 * ip[6*8]);
  156.             t1 >>= 16;
  157.             t2 >>= 16;
  158.             H_ = t1 - t2;
  159.             _Ed = E_ - G_;
  160.             _Gd = E_ + G_;
  161.             _Add = F_ + _Ad;
  162.             _Bdd = _Bd - H_;
  163.             _Fd = F_ - _Ad;
  164.             _Hd = _Bd + H_;
  165.             if(type==1){  //HACK
  166.                 _Gd += 16*128;
  167.                 _Add+= 16*128;
  168.                 _Ed += 16*128;
  169.                 _Fd += 16*128;
  170.             }
  171.             _Gd += IdctAdjustBeforeShift;
  172.             _Add += IdctAdjustBeforeShift;
  173.             _Ed += IdctAdjustBeforeShift;
  174.             _Fd += IdctAdjustBeforeShift;
  175.             /* Final sequence of operations over-write original inputs. */
  176.             if(type==0){
  177.                 ip[0*8] = (_Gd + _Cd )  >> 4;
  178.                 ip[7*8] = (_Gd - _Cd )  >> 4;
  179.     
  180.                 ip[1*8] = (_Add + _Hd ) >> 4;
  181.                 ip[2*8] = (_Add - _Hd ) >> 4;
  182.     
  183.                 ip[3*8] = (_Ed + _Dd )  >> 4;
  184.                 ip[4*8] = (_Ed - _Dd )  >> 4;
  185.     
  186.                 ip[5*8] = (_Fd + _Bdd ) >> 4;
  187.                 ip[6*8] = (_Fd - _Bdd ) >> 4;
  188.             }else if(type==1){
  189.                 dst[0*stride] = cm[(_Gd + _Cd )  >> 4];
  190.                 dst[7*stride] = cm[(_Gd - _Cd )  >> 4];
  191.     
  192.                 dst[1*stride] = cm[(_Add + _Hd ) >> 4];
  193.                 dst[2*stride] = cm[(_Add - _Hd ) >> 4];
  194.     
  195.                 dst[3*stride] = cm[(_Ed + _Dd )  >> 4];
  196.                 dst[4*stride] = cm[(_Ed - _Dd )  >> 4];
  197.     
  198.                 dst[5*stride] = cm[(_Fd + _Bdd ) >> 4];
  199.                 dst[6*stride] = cm[(_Fd - _Bdd ) >> 4];
  200.             }else{
  201.                 dst[0*stride] = cm[dst[0*stride] + ((_Gd + _Cd )  >> 4)];
  202.                 dst[7*stride] = cm[dst[7*stride] + ((_Gd - _Cd )  >> 4)];
  203.     
  204.                 dst[1*stride] = cm[dst[1*stride] + ((_Add + _Hd ) >> 4)];
  205.                 dst[2*stride] = cm[dst[2*stride] + ((_Add - _Hd ) >> 4)];
  206.     
  207.                 dst[3*stride] = cm[dst[3*stride] + ((_Ed + _Dd )  >> 4)];
  208.                 dst[4*stride] = cm[dst[4*stride] + ((_Ed - _Dd )  >> 4)];
  209.     
  210.                 dst[5*stride] = cm[dst[5*stride] + ((_Fd + _Bdd ) >> 4)];
  211.                 dst[6*stride] = cm[dst[6*stride] + ((_Fd - _Bdd ) >> 4)];
  212.             }
  213.         } else {
  214.             if(type==0){
  215.                 ip[0*8] = 
  216.                 ip[1*8] = 
  217.                 ip[2*8] = 
  218.                 ip[3*8] = 
  219.                 ip[4*8] = 
  220.                 ip[5*8] = 
  221.                 ip[6*8] =
  222.                 ip[7*8] = ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20);
  223.             }else if(type==1){
  224.                 dst[0*stride]=
  225.                 dst[1*stride]=
  226.                 dst[2*stride]=
  227.                 dst[3*stride]=
  228.                 dst[4*stride]=
  229.                 dst[5*stride]=
  230.                 dst[6*stride]=
  231.                 dst[7*stride]= 128 + ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20);
  232.             }else{
  233.                 if(ip[0*8]){
  234.                     int v= ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20);
  235.                     dst[0*stride] = cm[dst[0*stride] + v];
  236.                     dst[1*stride] = cm[dst[1*stride] + v];
  237.                     dst[2*stride] = cm[dst[2*stride] + v];
  238.                     dst[3*stride] = cm[dst[3*stride] + v];
  239.                     dst[4*stride] = cm[dst[4*stride] + v];
  240.                     dst[5*stride] = cm[dst[5*stride] + v];
  241.                     dst[6*stride] = cm[dst[6*stride] + v];
  242.                     dst[7*stride] = cm[dst[7*stride] + v];
  243.                 }
  244.             }
  245.         }
  246.         ip++;            /* next column */
  247.         dst++;
  248.     }
  249. }
  250. void ff_vp3_idct_c(DCTELEM *block/* align 16*/){
  251.     idct(NULL, 0, block, 0);
  252. }
  253.     
  254. void ff_vp3_idct_put_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){
  255.     idct(dest, line_size, block, 1);
  256. }
  257. void ff_vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/){
  258.     idct(dest, line_size, block, 2);
  259. }