getblk.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:9k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   File: getblk.cc
  3. */
  4. #include "all.hh"
  5. /* defined in getvlc.hh */
  6. typedef struct {
  7.   char run, level, len;
  8. } DCTtab;
  9. extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
  10. extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
  11. extern DCTtab DCTtab0a[],DCTtab1a[];
  12. // decode one intra coded MPEG-1 block
  13. void LayerData::getintrablock(int comp, int dc_dct_pred[]){
  14.   int val, j, sign;
  15.   unsigned int code;
  16.   DCTtab *tab;
  17.   short *bp = block[comp];
  18.   /* decode DC coefficients */
  19.   if (comp<4)         bp[0] = (dc_dct_pred[0]+=getDClum()) << 3;
  20.   else if (comp==4)   bp[0] = (dc_dct_pred[1]+=getDCchrom()) << 3;
  21.   else                bp[0] = (dc_dct_pred[2]+=getDCchrom()) << 3;
  22. #ifdef HAVE_MMX
  23.   bp[0] <<= 4;
  24. #endif
  25.   if (fault) return;
  26.   /* decode AC coefficients */
  27.   for (int i=1; ; i++){
  28.     code = (vs->showbits(32) >> 16);
  29.     if (code>=16384) tab = &DCTtabnext[(code>>12)-4];
  30.     else if (code>=1024) tab = &DCTtab0[(code>>8)-4];
  31.     else if (code>=512) tab = &DCTtab1[(code>>6)-8];
  32.     else if (code>=256) tab = &DCTtab2[(code>>4)-16];
  33.     else if (code>=128) tab = &DCTtab3[(code>>3)-16];
  34.     else if (code>=64) tab = &DCTtab4[(code>>2)-16];
  35.     else if (code>=32) tab = &DCTtab5[(code>>1)-16];
  36.     else if (code>=16) tab = &DCTtab6[code-16];
  37.     else {
  38.       if (!quiet) fprintf(stderr,"invalid Huffman code in getintrablock()n");
  39.       fault = 1;
  40.       return;
  41.     }
  42.     vs->flushbits(tab->len);
  43.     if (tab->run==64) break;  // end_of_block
  44.     if (tab->run==65){         // escape
  45.       i+= vs->getbits(6);
  46.       if ((val=vs->getbits(8))==0) val=vs->getbits(8);
  47.       else if (val==128)         val=vs->getbits(8) - 256;
  48.       else if (val>128)          val-= 256;
  49.       if ((sign=(val<0))!=0)        val= -val;
  50.     }
  51.     else {
  52.       i+= tab->run;
  53.       val = tab->level;
  54.       sign = vs->getbits(1);
  55.     }
  56.     j = zig_zag_scan[i];
  57. #ifdef HAVE_MMX
  58.     val = (val*quant_scale*intra_quantizer_matrix[j]) << 1;
  59.     /* if (val!=0) should always be true */
  60.     val = (val-16) | 16;
  61. #else
  62.     val = (val*quant_scale*intra_quantizer_matrix[j]) >> 3;
  63.     /* if (val!=0) should always be true */
  64.     val = (val-1) | 1;
  65. #endif
  66.     bp[j] = sign ? -val : val;
  67.   }
  68.   if (j != 0) {
  69.      /* not a sparse matrice ! */
  70.      sparse[comp] = 0;
  71.   }
  72. }
  73. // decode one non-intra coded MPEG-1 block
  74. void LayerData::getinterblock(int comp){
  75.   int val, j, sign;
  76.   unsigned int code;
  77.   DCTtab *tab;
  78.   short *bp = block[comp];
  79.   /* decode AC coefficients */
  80.   for (int i=0; ; i++){
  81.     code = (vs->showbits(32) >> 16);
  82.     if (code>=16384){
  83.       if (i==0) tab = &DCTtabfirst[(code>>12)-4];
  84.       else      tab = &DCTtabnext[(code>>12)-4];
  85.     }
  86.     else if (code>=1024) tab = &DCTtab0[(code>>8)-4];
  87.     else if (code>=512)  tab = &DCTtab1[(code>>6)-8];
  88.     else if (code>=256)  tab = &DCTtab2[(code>>4)-16];
  89.     else if (code>=128)  tab = &DCTtab3[(code>>3)-16];
  90.     else if (code>=64)   tab = &DCTtab4[(code>>2)-16];
  91.     else if (code>=32)   tab = &DCTtab5[(code>>1)-16];
  92.     else if (code>=16)   tab = &DCTtab6[code-16];
  93.     else {
  94.       if (!quiet)
  95.         fprintf(stderr,"invalid Huffman code in getinterblock()n");
  96.       fault = 1;
  97.       return;
  98.     }
  99.     vs->flushbits(tab->len);
  100.     if (tab->run==64)
  101.        break;   // end of block
  102.     if (tab->run==65){          // escape 
  103.       i+= vs->getbits(6);
  104.       if ((val=vs->getbits(8))==0) val=vs->getbits(8);
  105.       else if (val==128)       val=vs->getbits(8) - 256;
  106.       else if (val>128)        val-= 256;
  107.       if ((sign=(val<0))!=0)      val = -val;
  108.     }
  109.     else {
  110.       i+= tab->run;
  111.       val = tab->level;
  112.       sign = vs->getbits(1);
  113.     }
  114.     j = zig_zag_scan[i];
  115. #ifdef HAVE_MMX
  116.     val = (((val<<1)+1)*quant_scale*non_intra_quantizer_matrix[j]);
  117.     /* if (val!=0) should always be true */
  118.     val = (val-16) | 16;
  119. #else
  120.     val = (((val<<1)+1)*quant_scale*non_intra_quantizer_matrix[j]) >> 4;
  121.     /* if (val!=0) should always be true */
  122.     val = (val-1) | 1;
  123. #endif
  124.     bp[j] = sign ? -val : val;
  125.   }
  126.   if (j != 0) {
  127.      /* not a sparse matrice ! */
  128.      sparse[comp] = 0;
  129.   }
  130. }
  131. // decode one intra coded MPEG-2 block
  132. void LayerData::getmpg2intrablock(int comp, int dc_dct_pred[]){
  133.   int val, j, sign, nc;
  134.   unsigned int code;
  135.   DCTtab *tab;
  136.   short *bp;
  137.   int *qmat;
  138.   /* with data partitioning, data always goes to base layer */
  139. //  ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
  140. //  ld1=ld;
  141.   bp = block[comp];
  142. #ifdef ENHANCEMENT
  143.   if (base.scalable_mode==SC_DP)
  144.     if (base.pri_brk<64) ld = &enhan;
  145.     else ld = &base;
  146. #endif
  147.   qmat = (comp<4 || chroma_format==CHROMA420)
  148.          ? intra_quantizer_matrix
  149.          : chroma_intra_quantizer_matrix;
  150.   /* decode DC coefficients */
  151.   if (comp<4)           val = (dc_dct_pred[0]+= getDClum());
  152.   else if ((comp&1)==0) val = (dc_dct_pred[1]+= getDCchrom());
  153.   else                  val = (dc_dct_pred[2]+= getDCchrom());
  154.   if (fault) return;
  155. #ifdef HAVE_MMX
  156.   bp[0] = val << (7-dc_prec);
  157. #else
  158.   bp[0] = val << (3-dc_prec);
  159. #endif
  160.   nc=0;
  161.   /* decode AC coefficients */
  162.   for (int i=1; ; i++){
  163. //    code = vs->showbits(32) >> 16;
  164.     code = vs->showbits(16);
  165.     if (code>=16384 && !intravlc) tab = &DCTtabnext[(code>>12)-4];
  166.     else if (code>=1024){
  167.       if (intravlc)     tab = &DCTtab0a[(code>>8)-4];
  168.       else              tab = &DCTtab0[(code>>8)-4];
  169.     }
  170.     else if (code>=512){
  171.       if (intravlc)     tab = &DCTtab1a[(code>>6)-8];
  172.       else              tab = &DCTtab1[(code>>6)-8];
  173.     }
  174.     else if (code>=256) tab = &DCTtab2[(code>>4)-16];
  175.     else if (code>=128) tab = &DCTtab3[(code>>3)-16];
  176.     else if (code>=64)  tab = &DCTtab4[(code>>2)-16];
  177.     else if (code>=32)  tab = &DCTtab5[(code>>1)-16];
  178.     else if (code>=16)  tab = &DCTtab6[code-16];
  179.     else {
  180.       if (!quiet) fprintf(stderr,"invalid Huffman code in getmpg2intrablock()n");
  181.       fault = 1;
  182.       return;
  183.     }
  184.     vs->flushbits(tab->len);
  185.     if (tab->run==64)
  186.        break; // end_of_block
  187.     if (tab->run==65){        // escape
  188.       i+= vs->getbits(6);
  189.       val = vs->getbits(12);
  190.       if ((val&2047)==0){
  191.         if (!quiet) fprintf(stderr,"invalid signed_level (escape) in getmpg2intrablock()n");
  192.         fault = 1;
  193.         return;
  194.       }
  195.       if ((sign=(val>=2048))!=0) val = 4096 - val;
  196.     }
  197.     else {
  198.       i+= tab->run;
  199.       val = tab->level;
  200.       sign = vs->getbits(1);
  201.     }
  202.     j = (altscan ? alternate_scan : zig_zag_scan)[i];
  203. #ifdef HAVE_MMX
  204.     val = (val * quant_scale * qmat[j]);
  205. #else
  206.     val = (val * quant_scale * qmat[j]) >> 4;
  207. #endif
  208.     bp[j] = sign ? -val : val;
  209.     nc++;
  210. #ifdef ENHANCEMENT
  211.     if (base.scalable_mode==SC_DP && nc==base.pri_brk-63){
  212.       ld = &enhan;
  213.       incnt = ld->incnt;
  214.       bfr = vs->showbits(32);
  215.     }
  216. #endif
  217.   }
  218.   if (j != 0) {
  219.      /* not a sparse matrice ! */
  220.      sparse[comp] = 0;
  221.   }
  222. }
  223. // decode one non-intra coded MPEG-2 block
  224. void LayerData::getmpg2interblock(int comp){
  225.   int val, j, sign, nc;
  226.   unsigned int code;
  227.   DCTtab *tab;
  228.   short *bp;
  229.   int *qmat;
  230.   /* with data partitioning, data always goes to base layer */
  231. //  ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
  232. //  ld1=ld;
  233.   bp = block[comp];
  234. #ifdef ENHANCEMENT
  235.   if (base.scalable_mode==SC_DP)
  236.     if (base.pri_brk<64) ld = &enhan;
  237.     else                 ld = &base;
  238. #endif
  239.   qmat = (comp<4 || chroma_format==CHROMA420)
  240.          ? non_intra_quantizer_matrix
  241.          : chroma_non_intra_quantizer_matrix;
  242.   nc = 0;
  243.   /* decode AC coefficients */
  244.   for (int i=0; ; i++){
  245. //    code = vs->showbits(32) >> 16;
  246.     code = vs->showbits(16);
  247.     if (code>=16384){
  248.       if (i==0) tab = &DCTtabfirst[(code>>12)-4];
  249.       else      tab = &DCTtabnext[(code>>12)-4];
  250.     }
  251.     else if (code>=1024) tab = &DCTtab0[(code>>8)-4];
  252.     else if (code>=512)  tab = &DCTtab1[(code>>6)-8];
  253.     else if (code>=256)  tab = &DCTtab2[(code>>4)-16];
  254.     else if (code>=128)  tab = &DCTtab3[(code>>3)-16];
  255.     else if (code>=64)   tab = &DCTtab4[(code>>2)-16];
  256.     else if (code>=32)   tab = &DCTtab5[(code>>1)-16];
  257.     else if (code>=16)   tab = &DCTtab6[code-16];
  258.     else {
  259.       if (!quiet) fprintf(stderr,"invalid Huffman code in getmpg2interblock()n");
  260.       fault = 1;
  261.       return;
  262.     }
  263.     vs->flushbits(tab->len);
  264.     if (tab->run==64)
  265.        break;          // end_of_block
  266.     if (tab->run==65){                 // escape
  267.       i+= vs->getbits(6);
  268.       val = vs->getbits(12);
  269.       if ((val&2047)==0){
  270.         if (!quiet) fprintf(stderr,"invalid signed_level (escape) in getmpg2intrablock()n");
  271.         fault = 1;
  272.         return;
  273.       }
  274.       if ((sign=(val>=2048))!=0) val = 4096 - val;
  275.     }
  276.     else {
  277.       i+= tab->run;
  278.       val = tab->level;
  279.       sign = vs->getbits(1);
  280.     }
  281.     j = (altscan ? alternate_scan : zig_zag_scan)[i];
  282. #ifdef HAVE_MMX
  283.      val = (((val<<1)+1) * quant_scale * qmat[j]) >> 1;
  284. #else
  285.      val = (((val<<1)+1) * quant_scale * qmat[j]) >> 5;
  286. #endif
  287.     bp[j] = sign ? (-val) : val ;
  288.     nc++;
  289. /*
  290.     if (base.scalable_mode==SC_DP && nc==base.pri_brk-63){
  291.       ld = &enhan;
  292.       incnt = ld->incnt;
  293.       bfr = vs->showbits(32);
  294.     }
  295. */
  296.   }
  297.   if (j != 0) {
  298.     /* not a sparse matrice ! */
  299.     sparse[comp] = 0;
  300.   }
  301. }