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

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    : GetVlc.cpp
  22. //
  23. /////////////////////////////////////////////////////////////////////////////
  24. /************************************************************************
  25.  *
  26.  *  getvlc.c, variable length 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.  */
  61. #include "GetVlc.h"
  62. // Definitions of variables......
  63. VLCtab TMNMVtab0[] = {
  64. {3,4}, {61,4}, {2,3}, {2,3}, {62,3}, {62,3}, 
  65. {1,2}, {1,2}, {1,2}, {1,2}, {63,2}, {63,2}, {63,2}, {63,2}
  66. };
  67. VLCtab TMNMVtab1[] = {
  68. {12,10}, {52,10}, {11,10}, {53,10}, {10,9}, {10,9}, 
  69. {54,9}, {54,9}, {9,9}, {9,9}, {55,9}, {55,9}, 
  70. {8,9}, {8,9}, {56,9}, {56,9}, {7,7}, {7,7}, 
  71. {7,7}, {7,7}, {7,7}, {7,7}, {7,7}, {7,7}, 
  72. {57,7}, {57,7}, {57,7}, {57,7}, {57,7}, {57,7}, 
  73. {57,7}, {57,7}, {6,7}, {6,7}, {6,7}, {6,7}, 
  74. {6,7}, {6,7}, {6,7}, {6,7}, {58,7}, {58,7}, 
  75. {58,7}, {58,7}, {58,7}, {58,7}, {58,7}, {58,7}, 
  76. {5,7}, {5,7}, {5,7}, {5,7}, {5,7}, {5,7}, 
  77. {5,7}, {5,7}, {59,7}, {59,7}, {59,7}, {59,7}, 
  78. {59,7}, {59,7}, {59,7}, {59,7}, {4,6}, {4,6}, 
  79. {4,6}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6}, 
  80. {4,6}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6}, 
  81. {4,6}, {4,6}, {60,6}, {60,6},{60,6},{60,6},
  82. {60,6},{60,6},{60,6},{60,6},{60,6},{60,6},
  83. {60,6},{60,6},{60,6},{60,6},{60,6},{60,6}
  84. };
  85. VLCtab TMNMVtab2[] = {
  86. {32,12}, {31,12}, {33,12}, {30,11}, {30,11}, {34,11}, 
  87. {34,11}, {29,11}, {29,11}, {35,11}, {35,11}, {28,11}, 
  88. {28,11}, {36,11}, {36,11}, {27,11}, {27,11}, {37,11}, 
  89. {37,11}, {26,11}, {26,11}, {38,11}, {38,11}, {25,11}, 
  90. {25,11}, {39,11}, {39,11}, {24,10}, {24,10}, {24,10}, 
  91. {24,10}, {40,10}, {40,10}, {40,10}, {40,10}, {23,10}, 
  92. {23,10}, {23,10}, {23,10}, {41,10}, {41,10}, {41,10}, 
  93. {41,10}, {22,10}, {22,10}, {22,10}, {22,10}, {42,10}, 
  94. {42,10}, {42,10}, {42,10}, {21,10}, {21,10}, {21,10}, 
  95. {21,10}, {43,10}, {43,10}, {43,10}, {43,10}, {20,10}, 
  96. {20,10}, {20,10}, {20,10}, {44,10}, {44,10}, {44,10}, 
  97. {44,10}, {19,10}, {19,10}, {19,10}, {19,10}, {45,10}, 
  98. {45,10}, {45,10}, {45,10}, {18,10}, {18,10}, {18,10}, 
  99. {18,10}, {46,10}, {46,10}, {46,10}, {46,10}, {17,10}, 
  100. {17,10}, {17,10}, {17,10}, {47,10}, {47,10}, {47,10}, 
  101. {47,10}, {16,10}, {16,10}, {16,10}, {16,10}, {48,10}, 
  102. {48,10}, {48,10}, {48,10}, {15,10}, {15,10}, {15,10}, 
  103. {15,10}, {49,10}, {49,10}, {49,10}, {49,10}, {14,10}, 
  104. {14,10}, {14,10}, {14,10}, {50,10}, {50,10}, {50,10}, 
  105. {50,10}, {13,10}, {13,10}, {13,10}, {13,10}, {51,10}, 
  106. {51,10}, {51,10}, {51,10}
  107. };
  108. VLCtab MCBPCtab[] = {
  109. {-1,0},
  110. {255,9}, {52,9}, {36,9}, {20,9}, {49,9}, {35,8}, {35,8}, {19,8}, {19,8}, 
  111. {50,8}, {50,8}, {51,7}, {51,7}, {51,7}, {51,7}, {34,7}, {34,7}, {34,7}, 
  112. {34,7}, {18,7}, {18,7}, {18,7}, {18,7}, {33,7}, {33,7}, {33,7}, {33,7}, 
  113. {17,7}, {17,7}, {17,7}, {17,7}, {4,6}, {4,6}, {4,6}, {4,6}, {4,6}, 
  114. {4,6}, {4,6}, {4,6}, {48,6}, {48,6}, {48,6}, {48,6}, {48,6}, {48,6}, 
  115. {48,6}, {48,6}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, 
  116. {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, {3,5}, 
  117. {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, 
  118. {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, 
  119. {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, 
  120. {32,4}, {32,4}, {32,4}, {32,4}, {32,4}, {16,4}, {16,4}, {16,4}, {16,4}, 
  121. {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, 
  122. {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, 
  123. {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, {16,4}, 
  124. {16,4}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  125. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  126. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  127. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  128. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  129. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  130. {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, 
  131. {2,3}, {2,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  132. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  133. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  134. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  135. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  136. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  137. {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, 
  138. {1,3}, {1,3}, {1,3}, 
  139. };
  140. VLCtab MCBPCtabintra[] = {
  141. {-1,0},
  142. {20,6}, {36,6}, {52,6}, {4,4}, {4,4}, {4,4}, 
  143. {4,4}, {19,3}, {19,3}, {19,3}, {19,3}, {19,3}, 
  144. {19,3}, {19,3}, {19,3}, {35,3}, {35,3}, {35,3}, 
  145. {35,3}, {35,3}, {35,3}, {35,3}, {35,3}, {51,3}, 
  146. {51,3}, {51,3}, {51,3}, {51,3}, {51,3}, {51,3}, 
  147. {51,3},
  148. };
  149. VLCtab CBPYtab[48] =
  150. { {-1,0}, {-1,0}, {9,6}, {6,6}, {7,5}, {7,5}, {11,5}, {11,5},
  151.   {13,5}, {13,5}, {14,5}, {14,5}, {15,4}, {15,4}, {15,4}, {15,4}, 
  152.   {3,4}, {3,4}, {3,4}, {3,4}, {5,4},{5,4},{5,4},{5,4},
  153.   {1,4}, {1,4}, {1,4}, {1,4}, {10,4}, {10,4}, {10,4}, {10,4},
  154.   {2,4}, {2,4}, {2,4}, {2,4}, {12,4}, {12,4}, {12,4}, {12,4}, 
  155.   {4,4}, {4,4}, {4,4}, {4,4}, {8,4}, {8,4}, {8,4}, {8,4}, 
  156. };
  157. int getTMNMV()
  158. {
  159.   int code;
  160.   if (trace)
  161.     fputs("motion_code (",dlog);
  162.   if (getbits1())
  163.   {
  164.     if (trace)
  165.       fputs("1): 0n",dlog);
  166.     return 0;
  167.   }
  168.   if ((code = showbits(12))>=512)
  169.   {
  170.     code = (code>>8) - 2;
  171.     flushbits(TMNMVtab0[code].len);
  172.     if (trace)
  173.     {
  174.       fputs("0",dlog);
  175.       printbits(code+2,4,TMNMVtab0[code].len);
  176.       //fputs("): %dn", TMNMVtab0[code].val);
  177.     }
  178.     return TMNMVtab0[code].val;
  179.   }
  180.   if (code>=128)
  181.   {
  182.     code = (code>>2) -32;
  183.     flushbits(TMNMVtab1[code].len);
  184.     if (trace)
  185.     {
  186.       fputs("0",dlog);
  187.       printbits(code+32,10,TMNMVtab1[code].len);
  188.      // printf("): %dn",TMNMVtab1[code].val);
  189.     }
  190.     return TMNMVtab1[code].val;
  191.   }
  192.   if ((code-=5)<0)
  193.   {
  194.     if (!quiet)
  195.       fputs("Invalid motion_vector coden",dlog);
  196.     fault=1;
  197.     return 0;
  198.   }
  199.   flushbits(TMNMVtab2[code].len);
  200.   if (trace)
  201.   {
  202.     fputs("0",dlog);
  203.     printbits(code+5,12,TMNMVtab2[code].len);
  204.    // printf("): %dn",TMNMVtab2[code].val);
  205.   }
  206.   return TMNMVtab2[code].val;
  207. }
  208. int getMCBPC()
  209. {
  210.   int code;
  211.   if (trace)
  212.     fputs("MCBPC (",dlog);
  213.   code = showbits(9);
  214.   if (code == 1) {
  215.     /* macroblock stuffing */
  216.     if (trace)
  217.       fputs("000000001): stuffingn",dlog);
  218.     flushbits(9);
  219.     return 255;
  220.   }
  221.   if (code == 0) {
  222.     if (!quiet) 
  223.       fputs("Invalid MCBPC coden",dlog);
  224.     fault = 1;
  225.     return 0;
  226.   }
  227.     
  228.   if (code>=256)
  229.   {
  230.     flushbits(1);
  231.    // if (trace)
  232.    //  fputs(1): %dn",0);
  233.     return 0;
  234.   }
  235.     
  236.   flushbits(MCBPCtab[code].len);
  237.   if (trace)
  238.   {
  239.     printbits(code,9,MCBPCtab[code].len);
  240.     //printf("): %dn",MCBPCtab[code].val);
  241.   }
  242.   return MCBPCtab[code].val;
  243. }
  244. int getMODB()
  245. {
  246.   int code;
  247.   int MODB;
  248.   if (trace)
  249.     fputs("MODB (",dlog);
  250.   code = showbits(2);
  251.   if (code < 2) {
  252.     if (trace)
  253.       fputs("0): MODB = 0n",dlog);
  254.     MODB = 0;
  255.     flushbits(1);
  256.   }
  257.   else if (code == 2) {
  258.     if (trace)
  259.       fputs("10): MODB = 1n",dlog);
  260.     MODB = 1;
  261.     flushbits(2);
  262.   }
  263.   else { /* code == 3 */
  264.     if (trace)
  265.       fputs("11): MODB = 2n",dlog);
  266.     MODB = 2;
  267.     flushbits(2);
  268.   }
  269.   return MODB;
  270. }
  271. int getMCBPCintra()
  272. {
  273.   int code;
  274.   if (trace)
  275.     fputs("MCBPCintra (",dlog);
  276.   code = showbits(9);
  277.   if (code == 1) {
  278.     /* macroblock stuffing */
  279.     if (trace)
  280.       fputs("000000001): stuffingn",dlog);
  281.     flushbits(9);
  282.     return 255;
  283.   }
  284.   if (code < 8) {
  285.     if (!quiet) 
  286.       fputs("Invalid MCBPCintra coden",dlog);
  287.     fault = 1;
  288.     return 0;
  289.   }
  290.   code >>= 3;
  291.     
  292.   if (code>=32)
  293.   {
  294.     flushbits(1);
  295.     //if (trace)
  296.     //  printf("1): %dn",3);
  297.     return 3;
  298.   }
  299.   flushbits(MCBPCtabintra[code].len);
  300.   if (trace)
  301.   {
  302.     printbits(code,6,MCBPCtabintra[code].len);
  303.     //printf("): %dn",MCBPCtabintra[code].val);
  304.   }
  305.   return MCBPCtabintra[code].val;
  306. }
  307. int getCBPY()
  308. {
  309.   int code;
  310.   if (trace)
  311.     fputs("CBPY (",dlog);
  312.   code = showbits(6);
  313.   if (code < 2) {
  314.     if (!quiet) 
  315.       fputs("Invalid CBPY coden",dlog);
  316.     fault = 1;
  317.     return -1;
  318.   }
  319.     
  320.   if (code>=48)
  321.   {
  322.     flushbits(2);
  323.     //if (trace)
  324.      // printf("11): %dn",0);
  325.     return 0;
  326.   }
  327.   flushbits(CBPYtab[code].len);
  328.   if (trace)
  329.   {
  330.     printbits(code,6,CBPYtab[code].len);
  331.     //printf("): %dn",CBPYtab[code].val);
  332.   }
  333.   return CBPYtab[code].val;
  334. }