putvlc.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:2k
源码类别:

DVD

开发平台:

Others

  1. #include "Includesysdefs.h"
  2. #include "PlaycoreCaptureLogompeg_encvlc.h"
  3. #include "PlaycoreCaptureLogompeg_encputbits.h"
  4. #ifdef SUPPORT_CAPTURE_LOGO
  5. static void putDC (CONST sVLCtable *tab, int val);
  6. /* generate variable length code for luminance DC coefficient */
  7. void putDClum(int val)
  8. {
  9. putDC(DClumtab,val);
  10. }
  11. /* generate variable length code for chrominance DC coefficient */
  12. void putDCchrom(int val)
  13. {
  14. putDC(DCchromtab,val);
  15. }
  16. /* generate variable length code for DC coefficient (7.2.1) */
  17. static void putDC(CONST sVLCtable *tab,int val)
  18. {
  19.   int absval, size;
  20.   absval = (val<0) ? -val : val; /* abs(val) */
  21.   /* compute dct_dc_size */
  22.   size = 0;
  23.   while (absval)
  24.   {
  25.     absval >>= 1;
  26.     size++;
  27.   }
  28.   /* generate VLC for dct_dc_size (Table B-12 or B-13) */
  29.   putbits(tab[size].code,tab[size].len);
  30.   /* append fixed length code (dc_dct_differential) */
  31.   if (size!=0)
  32.   {
  33.     if (val>=0)
  34.       absval = val;
  35.     else
  36.       absval = val + (1<<size) - 1; /* val + (2 ^ size) - 1 */
  37.     putbits(absval,size);
  38.   }
  39. }
  40. /* generate variable length code for other DCT coefficients (7.2.2) */
  41. void putAC(int run,int signed_level)
  42. {
  43.   int level, len;
  44.   CONST VLCtable *ptab;
  45.   level = (signed_level<0) ? -signed_level : signed_level; /* abs(signed_level) */
  46.   len = 0;
  47.   if (run<2 && level<41)
  48.   {
  49.     ptab = &dct_code_tab1[run][level-1];
  50.     len = ptab->len;
  51.   }
  52.   else if (run<32 && level<6)
  53.   {
  54.     /* vlcformat selects either of Table B-14 / B-15 */
  55.     ptab = &dct_code_tab2[run-2][level-1];
  56.     len = ptab->len;
  57.   }
  58.   if (len!=0) /* a VLC code exists */
  59.   {
  60.     putbits(ptab->code,len);
  61.     putbits(signed_level<0,1); /* sign */
  62.   }
  63.   else
  64.   {
  65.     /* no VLC for this (run, level) combination: use escape coding (7.2.2.3) */
  66.     putbits(1l,6); /* Escape */
  67.     putbits(run,6); /* 6 bit code for run */
  68.     putbits(signed_level,12);
  69.   }
  70. }
  71. /* generate variable length code for macroblock_type (6.3.16.1) */
  72. void putmbtype(MB_TYPE mb_type)
  73. {
  74.   putbits(mbtypetab[mb_type].code,
  75.           mbtypetab[mb_type].len);
  76. }
  77. #endif