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

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    : sac.cpp
  22. //
  23. /////////////////////////////////////////////////////////////////////////////
  24. /************************************************************************
  25.  *
  26.  *  sac.c, part of 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.  *        SAC Decoder Module
  57.  *        Algorithm as Specified in H26P Annex -E
  58.  *              (c) 1995 BT Labs
  59.  *
  60.  * Author: Wayne Ellis <ellis_w_wayne@bt-web.bt.co.uk>
  61.  *
  62.  *********************************************************************/
  63. #include "Sac.h"
  64.  
  65.  /*********************************************************************
  66.  *        SAC Decoder Algorithm as Specified in H26P Annex -E
  67.  *
  68.  *        Name:        decode_a_symbol
  69.  *
  70.  * Description: Decodes an Aritmetically Encoded Symbol
  71.  *
  72.  * Input:        array holding cumulative freq. data
  73.  *        also uses static data for decoding endpoints
  74.  *        and code_value variable
  75.  *
  76.  * Returns: Index to relevant symbol model
  77.  *
  78.  * Side Effects: Modifies low, high, length, cum and code_value
  79.  *
  80.  * Author:        Wayne Ellis <ellis_w_wayne@bt-web.bt.co.uk>
  81.  *
  82.  *********************************************************************/
  83.  
  84. static long low, high, code_value, bit, length, sacindex, cum, zerorun=0;
  85. int decode_a_symbol(int cumul_freq[ ])
  86. {
  87.   length = high - low + 1;
  88.   cum = (-1 + (code_value - low + 1) * cumul_freq[0]) / length;
  89.   for (sacindex = 1; cumul_freq[sacindex] > cum; sacindex++);
  90.   high = low - 1 + (length * cumul_freq[sacindex-1]) / cumul_freq[0];
  91.   low += (length * cumul_freq[sacindex]) / cumul_freq[0];
  92.   for ( ; ; ) {  
  93.     if (high < q2) ;
  94.     else if (low >= q2) {
  95.       code_value -= q2; 
  96.       low -= q2; 
  97.       high -= q2;
  98.     }
  99.     else if (low >= q1 && high < q3) {
  100.       code_value -= q1; 
  101.       low -= q1; 
  102.       high -= q1;
  103.     }
  104.     else {
  105.       break;
  106.     }
  107.  
  108.     low *= 2; 
  109.     high = 2*high + 1;
  110.     bit_out_psc_layer(); 
  111.     code_value = 2*code_value + bit;
  112.   }
  113.   return (sacindex-1);
  114. }
  115.  
  116. /*********************************************************************
  117.  *
  118.  *        Name:        decoder_reset
  119.  *
  120.  * Description: Fills Decoder FIFO after a fixed word length
  121.  *        string has been detected.
  122.  *
  123.  * Input:        None
  124.  *
  125.  * Returns: Nothing
  126.  *
  127.  * Side Effects: Fills Arithmetic Decoder FIFO
  128.  *
  129.  * Author:        Wayne Ellis <ellis_w_wayne@bt-web.bt.co.uk>
  130.  *
  131.  *********************************************************************/
  132. void decoder_reset( )
  133. {
  134.   int i;
  135.   zerorun = 0;        /* clear consecutive zero's counter */
  136.   code_value = 0;
  137.   low = 0;
  138.   high = top;
  139.   for (i = 1;   i <= 16;   i++) {
  140.     bit_out_psc_layer(); 
  141.     code_value = 2 * code_value + bit;
  142.   }
  143.   if (trace)
  144.     fputs("Arithmetic Decoder Reset n",dlog);
  145. }
  146. /*********************************************************************
  147.  *
  148.  *        Name:        bit_out_psc_layer
  149.  *
  150.  * Description: Gets a bit from the Encoded Stream, Checks for
  151.  *        and removes any PSC emulation prevention bits
  152.  *        inserted at the decoder, provides 'zeros' to the
  153.  *        Arithmetic Decoder FIFO to allow it to finish 
  154.  *        data prior to the next PSC. (Garbage bits)
  155.  *
  156.  * Input:        None
  157.  *
  158.  * Returns: Nothing
  159.  *
  160.  * Side Effects: Gets a bit from the Input Data Stream
  161.  *
  162.  * Author:        Wayne Ellis <ellis_w_wayne@bt-web.bt.co.uk>
  163.  *
  164.  *********************************************************************/
  165. void bit_out_psc_layer()
  166. {
  167.   if (showbits(17)!=1) { /* check for startcode in Arithmetic Decoder FIFO */
  168.     bit = getbits(1);
  169.     if(zerorun > 13) { /* if number of consecutive zeros = 14 */  
  170.       if (!bit) {
  171.         if (trace)
  172.           fputs("PSC/GBSC, Header Data, or Encoded Stream Error n",dlog);
  173.         zerorun = 1;        
  174.       }
  175.       else { /* if there is a 'stuffing bit present */
  176.         if (trace)
  177.           fputs("Removing Startcode Emulation Prevention bit n",dlog);
  178.         bit = getbits(1);        /* overwrite the last bit */
  179.         zerorun = !bit;        /* zerorun=1 if bit is a '0' */
  180.       }
  181.     }
  182.     else { /* if consecutive zero's not exceeded 14 */
  183.       if (!bit)
  184.         zerorun++;
  185.       else
  186.         zerorun = 0;
  187.     }
  188.   } /* end of if !(showbits(17)) */
  189.   else {
  190.     bit = 0;
  191.     if (trace)
  192.       fputs("Startcode Found:Finishing Arithmetic Decoding using 'Garbage bits'n",dlog);
  193.   }
  194.    /*
  195.    printf("lastbit = %ld bit = %ld zerorun = %ld n", lastbit, bit, zerorun); 
  196.    lastbit = bit;
  197.    */
  198.         /* latent diagnostics */
  199.         
  200. }