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

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    : Tmndec.cpp
  22. //    Details : Main entry point for decoder.
  23. //
  24. //    Usage : 
  25. // 1) InitH263Decoder
  26. // 2) Invoke DecompressFrame with parameters
  27. //       compressed data and output data pointers.
  28. //   Note > Output data must be large enough to hold RGB data.
  29. //                 > Change the DecompressFrame function if you want 
  30. //  output in YUV420 format only. Just comment out conversion routine
  31. //          3) Repeat the step 2 for each compressed frame , for exit do 4
  32. // 4) ExitH263Decoder  .
  33. //
  34. /////////////////////////////////////////////////////////////////////////////
  35. /************************************************************************
  36.  *
  37.  *  tmndec.c, main(), initialization, options for tmndecode (H.263 decoder)
  38.  *  Copyright (C) 1996  Telenor R&D, Norway
  39.  *        Karl Olav Lillevold <Karl.Lillevold@nta.no>
  40.  *
  41.  *  This program is free software; you can redistribute it and/or modify
  42.  *  it under the terms of the GNU General Public License as published by
  43.  *  the Free Software Foundation; either version 2 of the License, or
  44.  *  (at your option) any later version.
  45.  *
  46.  *  This program is distributed in the hope that it will be useful,
  47.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  48.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  49.  *  GNU General Public License for more details.
  50.  *
  51.  *  You should have received a copy of the GNU General Public License
  52.  *  along with this program; if not, write to the Free Software
  53.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  54.  *
  55.  *  Karl Olav Lillevold               <Karl.Lillevold@nta.no>
  56.  *  Telenor Research and Development
  57.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  58.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  59.  *
  60.  *  Robert Danielsen                  e-mail: Robert.Danielsen@nta.no
  61.  *  Telenor Research and Development  www:    http://www.nta.no/brukere/DVC/
  62.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  63.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  64.  *  
  65.  ************************************************************************/
  66. /*
  67.  * based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
  68.  * and mpeg2play, (C) 1994 Stefan Eckart
  69.  *                         <stefan@lis.e-technik.tu-muenchen.de>
  70.  *
  71.  */
  72. #include "tmndec.h"
  73. void InitH263Decoder()
  74. {
  75.  
  76.     // Open log file
  77. dlog=fopen("decoder.log","w");
  78. if(dlog==NULL)
  79. {
  80. trace=0;
  81. quiet=1;
  82. verbose=0;
  83. }
  84.      framerate=0;  // not used...
  85.      outtype=0;    // YUV 
  86.  temp_ref = 0;
  87.      prev_temp_ref= -1; 
  88.      ld = &base; 
  89.      
  90.      initbits();    // Setup source buffer pointers
  91.  InitConvertTable();
  92.      
  93.    
  94. // For debugging....  
  95. // trace=1; // trace output
  96. // quiet=0;       // don't keep quiet print mesgs
  97.  
  98. }
  99. /**
  100. *    Decompress the frame.....
  101. *    > After decompression 
  102. *    > yp ,up and vp pointers will point to respective Y , U , V frames...
  103. *  
  104. *  Input 
  105. *      cdata    compressed data
  106. *      size     size of the compressed frame
  107. *      outdata  pointer to rgb buffer (size must be enough to store data)  
  108. *  
  109. *  Output
  110. *      return 1  success  , outdata contains rgbdata
  111. *    return 0  operation failed...
  112. */
  113. int DecompressFrame(unsigned char *cdata,int size,unsigned char *outdata,int outsize)
  114. {
  115. static int first=1,framenum=0;
  116. //Initialize output pointers...
  117. yp=NULL;
  118. up=NULL;
  119. vp=NULL;
  120. // Copy to other buffer can be done...
  121. // So that source buffer will be free
  122.  
  123. cindex=0;       // index into the cframe....
  124. csize=size;     // size of compressed frame 
  125. cframe=cdata;   // pointer to compressed frme
  126. //memcpy(cframe,cdata,size);
  127. // Reset the pointers...
  128. initbits();
  129. // Get the frame header
  130. getheader();
  131. // If first time...then call initdecoder....
  132. // This has to be done after calling getheader()
  133. // because getheader() setup some variables using the information
  134. // from header...
  135. if (first) 
  136. {
  137.    initdecoder();
  138.    first = 0;
  139. }
  140.     
  141. // Decompress the frame and get the picture frame in YUV format
  142. getpicture(&framenum);
  143.     
  144. framenum++;
  145. if(yp==NULL || up==NULL || vp==NULL)
  146. {
  147. if(trace)
  148. fputs("decompression failed...",dlog);
  149. return  0;
  150. }
  151.     // convert YUV to RGB
  152. // *******  TODO *********
  153. // check if outdata is enough to store rgb data
  154. //
  155. int totalsize=horizontal_size * vertical_size *3;
  156. if(outsize< totalsize || outdata==NULL)
  157. {
  158. if(dlog)
  159. fputs("Output buffer is not sufficient",dlog);
  160. return 0;
  161. }
  162. ConvertYUV2RGB(yp,up,vp,outdata,horizontal_size,vertical_size);
  163.  
  164. return 1;
  165. }
  166. /**
  167. *    Do the clean up here
  168. *
  169. */
  170. void ExitH263Decoder()
  171. {
  172. int i;
  173.     
  174. for(i=0;i<3;i++)
  175. {
  176. if(refframe[i])
  177. free(refframe[i]);
  178. if(oldrefframe[i])
  179. free(oldrefframe[i]);
  180. if(bframe[i])
  181. free(bframe[i]);
  182. if(edgeframeorig[i])
  183. free(edgeframeorig[i]);
  184.      
  185. }
  186. // close all files...
  187. if(dlog)
  188. fclose(dlog);
  189. }
  190. /**
  191. *    Initialize decoder
  192. *
  193. *
  194. */
  195. void initdecoder()
  196. {
  197.   int i, cc, size;
  198.   /* clip table */
  199.   if (!(clp=(unsigned char *)malloc(1024)))
  200.     error("malloc failedn");
  201.   clp += 384;
  202.   for (i=-384; i<640; i++)
  203.     clp[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
  204.   /* MPEG-1 = TMN parameters */
  205.   matrix_coefficients = 5;
  206.   switch (source_format) 
  207.   {
  208.   
  209. case (SF_SQCIF):
  210.       horizontal_size = 128;
  211.       vertical_size = 96;
  212.       break;
  213.     case (SF_QCIF):
  214.       horizontal_size = 176;
  215.       vertical_size = 144;
  216.       break;
  217.     case (SF_CIF):
  218.       horizontal_size = 352;
  219.       vertical_size = 288;
  220.       break;
  221.     case (SF_4CIF):
  222.       horizontal_size = 704;
  223.       vertical_size = 576;
  224.       break;
  225.     case (SF_16CIF):
  226.       horizontal_size = 1408;
  227.       vertical_size = 1152;
  228.       break;
  229.     default:
  230.       if(trace)
  231.   fputs("ERROR: Illegal input formatn",dlog);
  232.       return;
  233.       break;
  234.   }
  235.   mb_width = horizontal_size/16;
  236.   mb_height = vertical_size/16;
  237.   coded_picture_width = horizontal_size;
  238.   coded_picture_height = vertical_size;
  239.   chrom_width =  coded_picture_width>>1;
  240.   chrom_height = coded_picture_height>>1;
  241.   blk_cnt = 6;
  242.   for (cc=0; cc<3; cc++) 
  243.   
  244.   {
  245.   
  246. // Find out size...
  247.  if (cc==0)
  248.       size = coded_picture_width*coded_picture_height;
  249.     else
  250.       size = chrom_width*chrom_height;
  251. // Allocate memory
  252.     if (!(refframe[cc] = (unsigned char *)malloc(size)))
  253.       error("malloc failedn");
  254.     if (!(oldrefframe[cc] = (unsigned char *)malloc(size)))
  255.       error("malloc failedn");
  256.     if (!(bframe[cc] = (unsigned char *)malloc(size)))
  257.       error("malloc failedn");
  258.   }
  259.   for (cc=0; cc<3; cc++) 
  260.   {
  261.   
  262.   if (cc==0) 
  263.   {
  264.   size = (coded_picture_width+64)*(coded_picture_height+64);
  265.       
  266.   if (!(edgeframeorig[cc] = (unsigned char *)malloc(size)))
  267.   error("malloc failedn");
  268.       
  269.   
  270.   edgeframe[cc] = edgeframeorig[cc] + (coded_picture_width+64) * 32 + 32;
  271.   }
  272.       else 
  273.   {
  274.       size = (chrom_width+32)*(chrom_height+32);
  275.       
  276.   if (!(edgeframeorig[cc] = (unsigned char *)malloc(size)))
  277.       error("malloc failedn");
  278.       
  279.   edgeframe[cc] = edgeframeorig[cc] + (chrom_width+32) * 16 + 16;
  280.   }
  281.     
  282.   }
  283.   
  284.   /* IDCT */
  285.   if (refidct)
  286.     init_idctref();
  287.   else
  288.     init_idct();
  289. }
  290. // Error routine......
  291. void error(char *text)
  292. {
  293. if(dlog)
  294. fputs(text,dlog);
  295. }
  296. /* trace output */
  297. void printbits(int code,int bits,int len)
  298. {
  299.   
  300.    if(dlog) 
  301.    fputs("printbits : remove comment..!!!",dlog);
  302.   // for (i=0; i<len; i++)
  303.   // printf("%d",(code>>(bits-1-i))&1);
  304. }