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

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    : GetHdr.cpp
  22. //
  23. /////////////////////////////////////////////////////////////////////////////
  24. /************************************************************************
  25.  *
  26.  *  gethdr.c, header decoding 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. #include "GetHdr.h"
  61. /*
  62.  * decode headers from one input stream
  63.  * until an End of Sequence or picture start code
  64.  * is found
  65.  */
  66. int getheader()
  67. {
  68.   unsigned int code, gob;
  69.   /* look for startcode */
  70.   startcode();
  71. //  #define PSC_LENGTH        17
  72.   code = getbits(PSC_LENGTH);
  73.   
  74.   gob = getbits(5);
  75.   
  76.   if (gob == SE_CODE) 
  77.   return 0;
  78.   
  79.   if (gob == 0) 
  80.   {
  81.     getpicturehdr();
  82.    
  83. // reset decoder after receiving */
  84. if (syntax_arith_coding)        
  85.     decoder_reset();         /* fixed length PSC string */
  86.   }
  87.   
  88.   
  89.   
  90.   return gob + 1;
  91. }
  92. /* align to start of next startcode */
  93. void startcode()
  94. {
  95. /* search for new picture start code */
  96.   while (showbits(PSC_LENGTH)!=1l) 
  97.          flushbits(1);
  98. }
  99. /* decode picture header */
  100. static void getpicturehdr()
  101. {
  102.   int pos, pei, tmp;
  103.   pos = ld->bitcnt;
  104.   prev_temp_ref = temp_ref;
  105.   temp_ref = getbits(8);
  106.   trd = temp_ref - prev_temp_ref;
  107.   if (trd < 0)
  108.     trd += 256;
  109.   tmp = getbits(1); /* always "1" */
  110.   
  111.   if (!tmp)
  112.     if (!quiet)
  113.       fputs("warning: spare in picture header should be "1"n",dlog);
  114.   tmp = getbits(1); /* always "0" */
  115.   
  116.   if (tmp)
  117.     if (!quiet)
  118.       fputs("warning: H.261 distinction bit should be "0"n",dlog);
  119.   
  120.   tmp = getbits(1); /* split_screen_indicator */
  121.   if (tmp) 
  122.   {
  123.     if (!quiet)
  124.       fputs("error: split-screen not supported in this versionn",dlog);
  125.     return;
  126.   }
  127.   
  128.   tmp = getbits(1); /* document_camera_indicator */
  129.   if (tmp)
  130.     if (!quiet)
  131.       fputs("warning: document camera indicator not supported in this versionn",dlog);
  132.   tmp = getbits(1); /* freeze_picture_release */
  133.   if (tmp)
  134.     if (!quiet)
  135.       fputs("warning: frozen picture not supported in this versionn",dlog);
  136.   source_format = getbits(3);
  137.   pict_type = getbits(1);
  138.   mv_outside_frame = getbits(1);
  139.   long_vectors = (mv_outside_frame ? 1 : 0);
  140.   syntax_arith_coding = getbits(1);
  141.   adv_pred_mode = getbits(1);
  142.   mv_outside_frame = (adv_pred_mode ? 1 : mv_outside_frame);
  143.   pb_frame = getbits(1);
  144.   quant = getbits(5);
  145.   tmp = getbits(1);
  146.   if (tmp) {
  147.     if (!quiet)
  148.       fputs("error: CPM not supported in this versionn",dlog);
  149. return;
  150.   }
  151.   if (pb_frame) {
  152.     trb = getbits(3);
  153.     bquant = getbits(2);
  154.   }
  155.   else {
  156.     trb = 0;
  157.   }
  158.   pei = getbits(1);
  159. pspare:
  160.   
  161.   if (pei) 
  162.   {
  163.      /* extra info for possible future backward compatible additions */
  164.     getbits(8);  /* not used */
  165.     pei = getbits(1);
  166.     if (pei) goto pspare; /* keep on reading pspare until pei=0 */
  167.   }
  168. }