Idctref.cpp
上传用户:panstart
上传日期:2022-04-12
资源大小:199k
文件大小:4k
源码类别:

IP电话/视频会议

开发平台:

C++ Builder

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. //    Project     : VideoNet version 1.1.
  5. //    Description : Peer to Peer Video Conferencing over the LAN.
  6. //   Author      : Nagareshwar Y Talekar ( nsry2002@yahoo.co.in)
  7. //    Date        : 15-6-2004.
  8. //
  9. //    This is the modified version of tmndecode (H.263 decoder) 
  10. //    written by Karl & Robert.It was in ANSI C. I have converted into C++
  11. //    so that it can be integrated into any windows application. I have 
  12. //    removed some of the files which had display and file storing 
  13. //    functions.I have removed the unnecessary code and also added some
  14. //    new files..
  15. //   Original library dealt with files. Input & Output , both were files.
  16. //    I have done some major changes so that it can be used for real time 
  17. //    decoding process. Now one can use this library for decoding H263 frames. 
  18. //
  19. //
  20. //    File description : 
  21. //    Name    : Idctref.cpp
  22. //
  23. /////////////////////////////////////////////////////////////////////////////
  24. /************************************************************************
  25.  *
  26.  *  idctref.c, inverse DCT, double precision, for tmndecode (H.263 decoder)
  27.  *  Copyright (C) 1996  Telenor R&D, Norway
  28.  *        Karl Olav Lillevold <Karl.Lillevold@nta.no>
  29.  *
  30.  *  This program is free software; you can redistribute it and/or modify
  31.  *  it under the terms of the GNU General Public License as published by
  32.  *  the Free Software Foundation; either version 2 of the License, or
  33.  *  (at your option) any later version.
  34.  *
  35.  *  This program is distributed in the hope that it will be useful,
  36.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  37.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  38.  *  GNU General Public License for more details.
  39.  *
  40.  *  You should have received a copy of the GNU General Public License
  41.  *  along with this program; if not, write to the Free Software
  42.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  43.  *
  44.  *  Karl Olav Lillevold               <Karl.Lillevold@nta.no>
  45.  *  Telenor Research and Development
  46.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  47.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  48.  *
  49.  *  Robert Danielsen                  e-mail: Robert.Danielsen@nta.no
  50.  *  Telenor Research and Development  www:    http://www.nta.no/brukere/DVC/
  51.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  52.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  53.  *  
  54.  ************************************************************************/
  55. /*
  56.  * based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
  57.  * and mpeg2play, (C) 1994 Stefan Eckart
  58.  *                         <stefan@lis.e-technik.tu-muenchen.de>
  59.  *
  60.  */
  61. /*  Perform IEEE 1180 reference (64-bit floating point, separable 8x1
  62.  *  direct matrix multiply) Inverse Discrete Cosine Transform
  63. */
  64. /* Here we use math.h to generate constants.  Compiler results may
  65.    vary a little */
  66. #include "Idctref.h"
  67. #ifndef PI
  68. # ifdef M_PI
  69. #  define PI M_PI
  70. # else
  71. #  define PI 3.14159265358979323846
  72. # endif
  73. #endif
  74. /* global declarations */
  75. void init_idctref ();
  76. void idctref (short *block);
  77. /* private data */
  78. /* cosine transform matrix for 8x1 IDCT */
  79. static double c[8][8];
  80. /* initialize DCT coefficient matrix */
  81. void init_idctref()
  82. {
  83.   int freq, time;
  84.   double scale;
  85.   for (freq=0; freq < 8; freq++)
  86.   {
  87.     scale = (freq == 0) ? sqrt(0.125) : 0.5;
  88.     for (time=0; time<8; time++)
  89.       c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
  90.   }
  91. }
  92. /* perform IDCT matrix multiply for 8x8 coefficient block */
  93. void idctref(short *block)
  94. {
  95.   int i, j, k, v;
  96.   double partial_product;
  97.   double tmp[64];
  98.   for (i=0; i<8; i++)
  99.     for (j=0; j<8; j++)
  100.     {
  101.       partial_product = 0.0;
  102.       for (k=0; k<8; k++)
  103.         partial_product+= c[k][j]*block[8*i+k];
  104.       tmp[8*i+j] = partial_product;
  105.     }
  106.   /* Transpose operation is integrated into address mapping by switching 
  107.      loop order of i and j */
  108.   for (j=0; j<8; j++)
  109.     for (i=0; i<8; i++)
  110.     {
  111.       partial_product = 0.0;
  112.       for (k=0; k<8; k++)
  113.         partial_product+= c[k][i]*tmp[8*k+j];
  114.       v = (int)floor(partial_product+0.5);
  115.       block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
  116.     }
  117. }