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

图形图像处理

开发平台:

Visual C++

  1. // Getblk.cpp: implementation of the CGetblk class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "视频编解码器.h"
  6. #include "Getblk.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. #define INDICES
  13. #include "indices.h"
  14. #define SACTABLES
  15. #include "sactbls.h"
  16. #define mmax(a, b)   ((a) > (b) ? (a) : (b))
  17. #define mmin(a, b)   ((a) < (b) ? (a) : (b))
  18. //////////////////////////////////////////////////////////////////////
  19. // Construction/Destruction
  20. //////////////////////////////////////////////////////////////////////
  21. unsigned char zig_zag_scan[64]= 
  22. {
  23.   0,1,8,16,9,2,3,10,17,24,32,25,
  24.   18,11,4,5,12,19,26,33,40,48,41,
  25.   34,27,20,13,6,7,14,21,28,35,42,
  26.   49,56,57,50,43,36,29,22,15,23,
  27.   30,37,44,51,58,59,52,45,38,31,39,
  28.   46,53,60,61,54,47,55,62,63
  29. };  
  30. int quiet,quant,bquant;
  31. extern int trace;
  32.  int fault;
  33.  extern ldecode *ld;
  34. CGetblk::CGetblk()
  35. {
  36. }
  37. CGetblk::~CGetblk()
  38. {
  39. }
  40. void CGetblk::getblock(int comp, int mode)
  41. {
  42.   int val, i, j, sign;
  43.   unsigned int code;
  44.   VLCtable *tab;
  45.   short *bp;
  46.   int run, last, level, QP;
  47.   short *qval;
  48.   bp = ld->block[comp];   
  49.   // 解码交流系数  
  50.   for (i=(mode==0); ; i++) 
  51.   {
  52.     code = m_getbits.showbits(12);
  53.     if (code>=512)
  54.       tab = &DCT3Dtab0[(code>>5)-16];
  55.     else if (code>=128)
  56.       tab = &DCT3Dtab1[(code>>2)-32];
  57.     else if (code>=8)
  58.       tab = &DCT3Dtab2[(code>>0)-8];
  59.     else 
  60. {
  61.       fault = 1;
  62.       return;
  63.     }
  64.    m_getbits.flushbits(tab->len);
  65.     run = (tab->code >> 4) & 255;
  66.     level = tab->code & 15;
  67.     last = (tab->code >> 12) & 1;
  68.    if (tab->code==deESCAPE) //Escape
  69.    { 
  70.       last = m_getbits.getbits1();
  71.       i += run = m_getbits.getbits(6);
  72.       level = m_getbits.getbits(8);
  73.       if ((sign = (level>=128)))
  74.         val = 256 - level;
  75.       else 
  76.      val = level;
  77.     }
  78.     else 
  79. {
  80.       i+= run;
  81.       val = level;
  82.       sign = m_getbits.getbits(1);
  83.     }
  84.     if (i >= 64)
  85.     {
  86.       fault = 1;
  87.       return;
  88.     }
  89.     //反Zig_zag扫描 
  90.     j = zig_zag_scan[i];
  91.     qval = &bp[j];
  92.     if (comp >= 6)//确定量化因子
  93.       QP = mmax (1, mmin( 31, ( bquant_tab[bquant] * quant ) >> 2 ));
  94.     else 
  95.       QP = quant;
  96.       
  97.     // 反量化
  98.     if ((QP % 2) == 1)
  99.       *qval = ( sign ? -(QP * (2* val+1))  : QP * (2* val+1) );
  100.     else
  101.       *qval = ( sign ? -(QP * (2* val+1)-1): QP * (2* val+1)-1 );
  102.     if (last)  // That's the last coeff
  103.       return;
  104.   }
  105. }
  106. void CGetblk::get_sac_block(int comp, int ptype)
  107. {
  108.   int position=0;
  109.   int TCOEF_index, symbol_word;
  110.   int last=0, QP, i, j;
  111.   short *qval, *bp;
  112.   RunCoef DCTcoef;
  113.   bp = ld->block[comp];
  114.   i = (ptype==0);
  115.   while (!last) { /* while there are DCT coefficients remaining */
  116.     position++; /* coefficient counter relates to Coeff. model */
  117.     TCOEF_index = DecodeTCoef(position, !ptype);
  118.     if (TCOEF_index == ESCAPE_INDEX) {  /* ESCAPE code encountered */
  119.       DCTcoef = Decode_Escape_Char(!ptype, &last);
  120.       if (trace)
  121. printf("ESC: ");
  122.     }
  123.     else {
  124.       symbol_word = tcoeftab[TCOEF_index];
  125.       DCTcoef = vlc_word_decode(symbol_word,&last);
  126.     }
  127.     if (trace) {
  128.       printf("val: %d, run: %d, sign: %d, last: %dn", 
  129.      DCTcoef.val, DCTcoef.run, DCTcoef.sign, last);
  130.     }
  131.     i += DCTcoef.run;
  132.     j = zig_zag_scan[i];
  133.     qval = &bp[j];
  134.     i++;
  135.     if (comp >= 6)
  136.       QP = mmax (1, mmin( 31, ( bquant_tab[bquant] * quant ) >> 2 ));
  137.     else 
  138.       QP = quant;
  139.     if ((QP % 2) == 1)
  140.       *qval = ( (DCTcoef.sign) ? -(QP * (2* (DCTcoef.val)+1))  : 
  141. QP * (2* (DCTcoef.val)+1) );
  142.     else
  143.       *qval = ( (DCTcoef.sign) ? -(QP * (2* (DCTcoef.val)+1)-1): 
  144. QP * (2* (DCTcoef.val)+1)-1 );
  145.   }
  146.   return;
  147. }
  148. RunCoef CGetblk::vlc_word_decode(int symbol_word, int *last)
  149. {
  150.   int sign_index;
  151.   RunCoef DCTcoef;
  152.   *last = (symbol_word >> 12) & 01;
  153.  
  154.   DCTcoef.run = (symbol_word >> 4) & 255; 
  155.   DCTcoef.val = (symbol_word) & 15;
  156.   sign_index = m_sacode.decode_a_symbol(cumf_SIGN);
  157.   DCTcoef.sign = signtab[sign_index];
  158.   return (DCTcoef);
  159. }
  160. RunCoef CGetblk::Decode_Escape_Char(int intra, int *last)
  161. {
  162.   int last_index, run, run_index, level, level_index;
  163.   RunCoef DCTcoef;
  164.   if (intra) {
  165.     last_index = m_sacode.decode_a_symbol(cumf_LAST_intra);
  166.     *last = last_intratab[last_index];
  167.   }
  168.   else {
  169.     last_index = m_sacode.decode_a_symbol(cumf_LAST);
  170.     *last = lasttab[last_index];
  171.   }
  172.   if (intra) 
  173.     run_index = m_sacode.decode_a_symbol(cumf_RUN_intra);
  174.   else
  175.     run_index = m_sacode.decode_a_symbol(cumf_RUN);
  176.   run = runtab[run_index];
  177.   /*$if (mrun) run|=64;$*/
  178.   DCTcoef.run = run;
  179.   if (intra)
  180.     level_index = m_sacode.decode_a_symbol(cumf_LEVEL_intra);
  181.   else
  182.     level_index = m_sacode.decode_a_symbol(cumf_LEVEL);
  183.   if (trace)
  184.     printf("level_idx: %d ",level_index);
  185.   level = leveltab[level_index];
  186.   if (level >128) 
  187.     level -=256;
  188.   if (level < 0) {
  189.     DCTcoef.sign = 1;
  190.     DCTcoef.val = abs(level);
  191.   }
  192.   else {
  193.     DCTcoef.sign = 0;
  194.     DCTcoef.val = level;
  195.   }
  196.   return (DCTcoef);
  197. }
  198. int CGetblk::DecodeTCoef(int position, int intra)
  199. {
  200.   int index;
  201.   switch (position) {
  202.   case 1:
  203.     {
  204.       if (intra) 
  205. index = m_sacode.decode_a_symbol(cumf_TCOEF1_intra);
  206.       else 
  207. index = m_sacode.decode_a_symbol(cumf_TCOEF1); 
  208.       break; 
  209.     }
  210.   case 2:
  211.     {
  212.       if (intra) 
  213. index = m_sacode.decode_a_symbol(cumf_TCOEF2_intra);
  214.       else
  215. index = m_sacode.decode_a_symbol(cumf_TCOEF2);
  216.       break; 
  217.     }
  218.   case 3:
  219.     {
  220.       if (intra) 
  221. index = m_sacode.decode_a_symbol(cumf_TCOEF3_intra);
  222.       else
  223. index = m_sacode.decode_a_symbol(cumf_TCOEF3);
  224.       break; 
  225.     }
  226.   default: 
  227.     {
  228.       if (intra) 
  229. index = m_sacode.decode_a_symbol(cumf_TCOEFr_intra);
  230.       else
  231. index = m_sacode.decode_a_symbol(cumf_TCOEFr);
  232.       break; 
  233.     }
  234.   }
  235.   return (index);
  236. }