OutputVlc.cpp
上传用户:szklck
上传日期:2007-01-22
资源大小:925k
文件大小:4k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "OutputVlc.h"
  3. #include <math.h>
  4. #include <assert.h>
  5. #include <direct.h>
  6. extern CFile streamfile; /* the only global var we need here */
  7. /* private data */
  8. static unsigned char outbfr=0;//
  9. static int outcnt;            //输出位数
  10. static int bytecnt;           //字节数
  11. /****************************************************************************
  12. *  extern int put_mv (int)                  -输出mv
  13. *  extern int put_cbpcm_intra (int, int)
  14. *  extern int put_cbpcm_inter (int, int)
  15. *  extern int put_cbpy (int, int)
  16. *  extern int put_coeff (int, int, int)
  17. *
  18. *  extern void initbits()
  19. *  extern void putbits (int, int)
  20. *  extern int alignbits ()
  21. *  extern int bitcount()
  22. *  
  23. *****************************************************************************/
  24. int put_mv (int mvint)
  25. {
  26.   int sign = 0;
  27.   int absmv;
  28.   if (mvint >= 32) 
  29.   {
  30.     absmv = -mvint + 64;
  31.     sign = 1;
  32.   }
  33.   else
  34.     absmv = mvint;
  35.   
  36.   putbits (mvtab[absmv].len, mvtab[absmv].code);
  37.   if (mvint != 0) 
  38.   {
  39.     putbits (1, sign);
  40.     return mvtab[absmv].len + 1;
  41.   }
  42.   else
  43.     return mvtab[absmv].len;
  44. }
  45. int put_cbpcm_intra (int cbpc, int mode)
  46. {
  47.   int index;
  48.   index = ((mode & 7) >> 1) | ((cbpc & 3) << 2);
  49.   putbits (cbpcm_intra_tab[index].len, cbpcm_intra_tab[index].code);
  50.   
  51.   return cbpcm_intra_tab[index].len;
  52. }
  53. int put_cbpcm_inter (int cbpc, int mode)
  54. {
  55.   int index;
  56.   index = (mode & 7) | ((cbpc & 3) << 3);
  57.   putbits (cbpcm_inter_tab[index].len, cbpcm_inter_tab[index].code);
  58.   
  59.   return cbpcm_inter_tab[index].len;
  60. }
  61. int put_cbpy (int cbp, int mode)
  62. {
  63.   int index;
  64.   index = cbp >> 2;
  65.   if (mode < 3)
  66.     index ^= 15;
  67.   
  68.   putbits (cbpy_tab[index].len, cbpy_tab[index].code);
  69.   
  70.   return cbpy_tab[index].len;
  71. }
  72. int put_coeff (int last, int run, int level)
  73. {
  74.   int length = 0;
  75.  
  76.    assert (level > 0 && level < 128);
  77.   if (last == 0) {
  78.     if (run < 2 && level < 13 ) {
  79.       putbits (coeff_tab0[run][level-1].len,
  80.        coeff_tab0[run][level-1].code);
  81.       length = coeff_tab0[run][level-1].len;
  82.     }
  83.     else if (run > 1 && run < 27 && level < 5) {
  84.       putbits (coeff_tab1[run-2][level-1].len,
  85.        coeff_tab1[run-2][level-1].code);
  86.       
  87.       length = coeff_tab1[run-2][level-1].len;
  88.     }
  89.   }
  90.   else if (last == 1) {
  91.     if (run < 2 && level < 4) {
  92.       putbits (coeff_tab2[run][level-1].len,
  93.        coeff_tab2[run][level-1].code);
  94.       
  95.       length = coeff_tab2[run][level-1].len;
  96.     }
  97.     else if (run > 1 && run < 42 && level == 1) {
  98.       putbits (coeff_tab3[run-2].len,
  99.        coeff_tab3[run-2].code);
  100.       
  101.       length = coeff_tab3[run-2].len;
  102.     }
  103.   }
  104.  
  105.   return length;
  106. }
  107.  void putbits(int n, int value)
  108.  {
  109.  int i;
  110.  unsigned int mask=0;
  111.  mask = 1 << (n-1); /* selects first (leftmost) bit */
  112.      for (i=0; i<n; i++) {
  113.      outbfr <<= 1;
  114.      if (value & mask)
  115.      outbfr|= 1;
  116.      mask >>= 1; /* select next bit */
  117.      outcnt--;
  118.  if (outcnt==0) /* 8 bit buffer full */ 
  119.  {
  120.  streamfile.Write(&outbfr,1);
  121.          outcnt = 8;
  122.          outbfr = 0; 
  123.          bytecnt++;
  124.  }
  125.  }
  126.  }
  127.  
  128.  void initbits()
  129.  {
  130.  outcnt = 8;
  131.      bytecnt = 0;
  132.  }
  133. /************************************************************************
  134. * zero bit stuffing to next byte boundary  
  135. ************************************************************************/
  136.  int alignbits ()
  137.  {
  138. int ret_value;
  139.     if (outcnt!=8) {
  140.     ret_value = outcnt; /* outcnt is reset in call to putbits () */
  141.     putbits (outcnt, 0);
  142.     return ret_value;
  143.   }
  144.   else
  145.     return 0;
  146.  }
  147. /************************************************************************
  148. * return total number of generated bits 
  149. ************************************************************************/
  150. int bitcount(){ return 8*bytecnt + (8-outcnt);}