fdctref.c
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:3k
源码类别:

Windows Mobile

开发平台:

C/C++

  1. /* fdctref.c, forward discrete cosine transform, double precision           */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <math.h>
  28. #include "config.h"
  29. #ifndef PI
  30. # ifdef M_PI
  31. #  define PI M_PI
  32. # else
  33. #  define PI 3.14159265358979323846
  34. # endif
  35. #endif
  36. /* global declarations */
  37. void init_fdct _ANSI_ARGS_((void));
  38. void fdct _ANSI_ARGS_((short *block));
  39. /* private data */
  40. static double c[8][8]; /* transform coefficients */
  41. void init_fdct()
  42. {
  43.   int i, j;
  44.   double s;
  45.   for (i=0; i<8; i++)
  46.   {
  47.     s = (i==0) ? sqrt(0.125) : 0.5;
  48.     for (j=0; j<8; j++)
  49.       c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
  50.   }
  51. }
  52. void fdct(block)
  53. short *block;
  54. {
  55.   int i, j, k;
  56.   double s;
  57.   double tmp[64];
  58.   for (i=0; i<8; i++)
  59.     for (j=0; j<8; j++)
  60.     {
  61.       s = 0.0;
  62.       for (k=0; k<8; k++)
  63.         s += c[j][k] * block[8*i+k];
  64.       tmp[8*i+j] = s;
  65.     }
  66.   for (j=0; j<8; j++)
  67.     for (i=0; i<8; i++)
  68.     {
  69.       s = 0.0;
  70.       for (k=0; k<8; k++)
  71.         s += c[i][k] * tmp[8*k+j];
  72.       block[8*i+j] = (int)floor(s+0.499999);
  73.       /*
  74.        * reason for adding 0.499999 instead of 0.5:
  75.        * s is quite often x.5 (at least for i and/or j = 0 or 4)
  76.        * and setting the rounding threshold exactly to 0.5 leads to an
  77.        * extremely high arithmetic implementation dependency of the result;
  78.        * s being between x.5 and x.500001 (which is now incorrectly rounded
  79.        * downwards instead of upwards) is assumed to occur less often
  80.        * (if at all)
  81.        */
  82.     }
  83. }