idctref.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:3k
开发平台:

C/C++

  1. /* Reference_IDCT.c, Inverse Discrete Fourier 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. /*  Perform IEEE 1180 reference (64-bit floating point, separable 8x1
  28.  *  direct matrix multiply) Inverse Discrete Cosine Transform
  29. */
  30. /* Here we use math.h to generate constants.  Compiler results may
  31.    vary a little */
  32. #include <math.h>
  33. #include "config.h"
  34. #ifndef PI
  35. # ifdef M_PI
  36. #  define PI M_PI
  37. # else
  38. #  define PI 3.14159265358979323846
  39. # endif
  40. #endif
  41. /* global declarations */
  42. void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
  43. void Reference_IDCT _ANSI_ARGS_((short *block));
  44. /* private data */
  45. /* cosine transform matrix for 8x1 IDCT */
  46. static double c[8][8];
  47. /* initialize DCT coefficient matrix */
  48. void Initialize_Reference_IDCT()
  49. {
  50.   int freq, time;
  51.   double scale;
  52.   for (freq=0; freq < 8; freq++)
  53.   {
  54.     scale = (freq == 0) ? sqrt(0.125) : 0.5;
  55.     for (time=0; time<8; time++)
  56.       c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
  57.   }
  58. }
  59. /* perform IDCT matrix multiply for 8x8 coefficient block */
  60. void Reference_IDCT(block)
  61. short *block;
  62. {
  63.   int i, j, k, v;
  64.   double partial_product;
  65.   double tmp[64];
  66.   for (i=0; i<8; i++)
  67.     for (j=0; j<8; j++)
  68.     {
  69.       partial_product = 0.0;
  70.       for (k=0; k<8; k++)
  71.         partial_product+= c[k][j]*block[8*i+k];
  72.       tmp[8*i+j] = partial_product;
  73.     }
  74.   /* Transpose operation is integrated into address mapping by switching 
  75.      loop order of i and j */
  76.   for (j=0; j<8; j++)
  77.     for (i=0; i<8; i++)
  78.     {
  79.       partial_product = 0.0;
  80.       for (k=0; k<8; k++)
  81.         partial_product+= c[k][i]*tmp[8*k+j];
  82.       v = (int) floor(partial_product+0.5);
  83.       block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
  84.     }
  85. }