getblk.c
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:12k
源码类别:

Windows Mobile

开发平台:

C/C++

  1. /* getblk.c, DCT block decoding                                             */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include "config.h"
  29. #include "global.h"
  30. /* defined in getvlc.h */
  31. typedef struct {
  32.   char run, level, len;
  33. } DCTtab;
  34. extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
  35. extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
  36. extern DCTtab DCTtab0a[],DCTtab1a[];
  37. /* decode one intra coded MPEG-1 block */
  38. void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
  39. int comp;
  40. int dc_dct_pred[];
  41. {
  42.   int val, i, j, sign;
  43.   unsigned int code;
  44.   DCTtab *tab;
  45.   short *bp;
  46.   bp = ld->block[comp];
  47.   /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
  48.   /* decode DC coefficients */
  49.   if (comp<4)
  50.     bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
  51.   else if (comp==4)
  52.     bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
  53.   else
  54.     bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
  55.   if (Fault_Flag) return;
  56.   /* D-pictures do not contain AC coefficients */
  57.   if(picture_coding_type == D_TYPE)
  58.     return;
  59.   /* decode AC coefficients */
  60.   for (i=1; ; i++)
  61.   {
  62.     code = Show_Bits(16);
  63.     if (code>=16384)
  64.       tab = &DCTtabnext[(code>>12)-4];
  65.     else if (code>=1024)
  66.       tab = &DCTtab0[(code>>8)-4];
  67.     else if (code>=512)
  68.       tab = &DCTtab1[(code>>6)-8];
  69.     else if (code>=256)
  70.       tab = &DCTtab2[(code>>4)-16];
  71.     else if (code>=128)
  72.       tab = &DCTtab3[(code>>3)-16];
  73.     else if (code>=64)
  74.       tab = &DCTtab4[(code>>2)-16];
  75.     else if (code>=32)
  76.       tab = &DCTtab5[(code>>1)-16];
  77.     else if (code>=16)
  78.       tab = &DCTtab6[code-16];
  79.     else
  80.     {
  81.       if (!Quiet_Flag)
  82.         printf("invalid Huffman code in Decode_MPEG1_Intra_Block()n");
  83.       Fault_Flag = 1;
  84.       return;
  85.     }
  86.     Flush_Buffer(tab->len);
  87.     if (tab->run==64) /* end_of_block */
  88.       return;
  89.     if (tab->run==65) /* escape */
  90.     {
  91.       i+= Get_Bits(6);
  92.       val = Get_Bits(8);
  93.       if (val==0)
  94.         val = Get_Bits(8);
  95.       else if (val==128)
  96.         val = Get_Bits(8) - 256;
  97.       else if (val>128)
  98.         val -= 256;
  99.       if((sign = (val<0)))
  100.         val = -val;
  101.     }
  102.     else
  103.     {
  104.       i+= tab->run;
  105.       val = tab->level;
  106.       sign = Get_Bits(1);
  107.     }
  108.     if (i>=64)
  109.     {
  110.       if (!Quiet_Flag)
  111.         fprintf(stderr,"DCT coeff index (i) out of bounds (intra)n");
  112.       Fault_Flag = 1;
  113.       return;
  114.     }
  115.     j = scan[ZIG_ZAG][i];
  116.     val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
  117.     /* mismatch control ('oddification') */
  118.     if (val!=0) /* should always be true, but it's not guaranteed */
  119.       val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
  120.     /* saturation */
  121.     if (!sign)
  122.       bp[j] = (val>2047) ?  2047 :  val; /* positive */
  123.     else
  124.       bp[j] = (val>2048) ? -2048 : -val; /* negative */
  125.   }
  126. }
  127. /* decode one non-intra coded MPEG-1 block */
  128. void Decode_MPEG1_Non_Intra_Block(comp)
  129. int comp;
  130. {
  131.   int val, i, j, sign;
  132.   unsigned int code;
  133.   DCTtab *tab;
  134.   short *bp;
  135.   bp = ld->block[comp];
  136.   /* decode AC coefficients */
  137.   for (i=0; ; i++)
  138.   {
  139.     code = Show_Bits(16);
  140.     if (code>=16384)
  141.     {
  142.       if (i==0)
  143.         tab = &DCTtabfirst[(code>>12)-4];
  144.       else
  145.         tab = &DCTtabnext[(code>>12)-4];
  146.     }
  147.     else if (code>=1024)
  148.       tab = &DCTtab0[(code>>8)-4];
  149.     else if (code>=512)
  150.       tab = &DCTtab1[(code>>6)-8];
  151.     else if (code>=256)
  152.       tab = &DCTtab2[(code>>4)-16];
  153.     else if (code>=128)
  154.       tab = &DCTtab3[(code>>3)-16];
  155.     else if (code>=64)
  156.       tab = &DCTtab4[(code>>2)-16];
  157.     else if (code>=32)
  158.       tab = &DCTtab5[(code>>1)-16];
  159.     else if (code>=16)
  160.       tab = &DCTtab6[code-16];
  161.     else
  162.     {
  163.       if (!Quiet_Flag)
  164.         printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()n");
  165.       Fault_Flag = 1;
  166.       return;
  167.     }
  168.     Flush_Buffer(tab->len);
  169.     if (tab->run==64) /* end_of_block */
  170.       return;
  171.     if (tab->run==65) /* escape */
  172.     {
  173.       i+= Get_Bits(6);
  174.       val = Get_Bits(8);
  175.       if (val==0)
  176.         val = Get_Bits(8);
  177.       else if (val==128)
  178.         val = Get_Bits(8) - 256;
  179.       else if (val>128)
  180.         val -= 256;
  181.       if((sign = (val<0)))
  182.         val = -val;
  183.     }
  184.     else
  185.     {
  186.       i+= tab->run;
  187.       val = tab->level;
  188.       sign = Get_Bits(1);
  189.     }
  190.     if (i>=64)
  191.     {
  192.       if (!Quiet_Flag)
  193.         fprintf(stderr,"DCT coeff index (i) out of bounds (inter)n");
  194.       Fault_Flag = 1;
  195.       return;
  196.     }
  197.     j = scan[ZIG_ZAG][i];
  198.     val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
  199.     /* mismatch control ('oddification') */
  200.     if (val!=0) /* should always be true, but it's not guaranteed */
  201.       val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
  202.     /* saturation */
  203.     if (!sign)
  204.       bp[j] = (val>2047) ?  2047 :  val; /* positive */
  205.     else
  206.       bp[j] = (val>2048) ? -2048 : -val; /* negative */
  207.   }
  208. }
  209. /* decode one intra coded MPEG-2 block */
  210. void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
  211. int comp;
  212. int dc_dct_pred[];
  213. {
  214.   int val, i, j, sign, nc, cc, run;
  215.   unsigned int code;
  216.   DCTtab *tab;
  217.   short *bp;
  218.   int *qmat;
  219.   struct layer_data *ld1;
  220.   /* with data partitioning, data always goes to base layer */
  221.   ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
  222.   bp = ld1->block[comp];
  223.   if (base.scalable_mode==SC_DP)
  224.     if (base.priority_breakpoint<64)
  225.       ld = &enhan;
  226.     else
  227.       ld = &base;
  228.   cc = (comp<4) ? 0 : (comp&1)+1;
  229.   qmat = (comp<4 || chroma_format==CHROMA420)
  230.          ? ld1->intra_quantizer_matrix
  231.          : ld1->chroma_intra_quantizer_matrix;
  232.   /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
  233.   if (cc==0)
  234.     val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
  235.   else if (cc==1)
  236.     val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
  237.   else
  238.     val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
  239.   if (Fault_Flag) return;
  240.   bp[0] = val << (3-intra_dc_precision);
  241.   nc=0;
  242. #ifdef TRACE
  243.   if (Trace_Flag)
  244.     printf("DCT(%d)i:",comp);
  245. #endif /* TRACE */
  246.   /* decode AC coefficients */
  247.   for (i=1; ; i++)
  248.   {
  249.     code = Show_Bits(16);
  250.     if (code>=16384 && !intra_vlc_format)
  251.       tab = &DCTtabnext[(code>>12)-4];
  252.     else if (code>=1024)
  253.     {
  254.       if (intra_vlc_format)
  255.         tab = &DCTtab0a[(code>>8)-4];
  256.       else
  257.         tab = &DCTtab0[(code>>8)-4];
  258.     }
  259.     else if (code>=512)
  260.     {
  261.       if (intra_vlc_format)
  262.         tab = &DCTtab1a[(code>>6)-8];
  263.       else
  264.         tab = &DCTtab1[(code>>6)-8];
  265.     }
  266.     else if (code>=256)
  267.       tab = &DCTtab2[(code>>4)-16];
  268.     else if (code>=128)
  269.       tab = &DCTtab3[(code>>3)-16];
  270.     else if (code>=64)
  271.       tab = &DCTtab4[(code>>2)-16];
  272.     else if (code>=32)
  273.       tab = &DCTtab5[(code>>1)-16];
  274.     else if (code>=16)
  275.       tab = &DCTtab6[code-16];
  276.     else
  277.     {
  278.       if (!Quiet_Flag)
  279.         printf("invalid Huffman code in Decode_MPEG2_Intra_Block()n");
  280.       Fault_Flag = 1;
  281.       return;
  282.     }
  283.     Flush_Buffer(tab->len);
  284. #ifdef TRACE
  285.     if (Trace_Flag)
  286.     {
  287.       printf(" (");
  288.       Print_Bits(code,16,tab->len);
  289.     }
  290. #endif /* TRACE */
  291.     if (tab->run==64) /* end_of_block */
  292.     {
  293. #ifdef TRACE
  294.       if (Trace_Flag)
  295.         printf("): EOBn");
  296. #endif /* TRACE */
  297.       return;
  298.     }
  299.     if (tab->run==65) /* escape */
  300.     {
  301. #ifdef TRACE
  302.       if (Trace_Flag)
  303.       {
  304.         putchar(' ');
  305.         Print_Bits(Show_Bits(6),6,6);
  306.       }
  307. #endif /* TRACE */
  308.       i+= run = Get_Bits(6);
  309. #ifdef TRACE
  310.       if (Trace_Flag)
  311.       {
  312.         putchar(' ');
  313.         Print_Bits(Show_Bits(12),12,12);
  314.       }
  315. #endif /* TRACE */
  316.       val = Get_Bits(12);
  317.       if ((val&2047)==0)
  318.       {
  319.         if (!Quiet_Flag)
  320.           printf("invalid escape in Decode_MPEG2_Intra_Block()n");
  321.         Fault_Flag = 1;
  322.         return;
  323.       }
  324.       if((sign = (val>=2048)))
  325.         val = 4096 - val;
  326.     }
  327.     else
  328.     {
  329.       i+= run = tab->run;
  330.       val = tab->level;
  331.       sign = Get_Bits(1);
  332. #ifdef TRACE
  333.       if (Trace_Flag)
  334.         printf("%d",sign);
  335. #endif /* TRACE */
  336.     }
  337.     if (i>=64)
  338.     {
  339.       if (!Quiet_Flag)
  340.         fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)n");
  341.       Fault_Flag = 1;
  342.       return;
  343.     }
  344. #ifdef TRACE
  345.     if (Trace_Flag)
  346.       printf("): %d/%d",run,sign ? -val : val);
  347. #endif /* TRACE */
  348.     j = scan[ld1->alternate_scan][i];
  349.     val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
  350.     bp[j] = sign ? -val : val;
  351.     nc++;
  352.     if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
  353.       ld = &enhan;
  354.   }
  355. }
  356. /* decode one non-intra coded MPEG-2 block */
  357. void Decode_MPEG2_Non_Intra_Block(comp)
  358. int comp;
  359. {
  360.   int val, i, j, sign, nc, run;
  361.   unsigned int code;
  362.   DCTtab *tab;
  363.   short *bp;
  364.   int *qmat;
  365.   struct layer_data *ld1;
  366.   /* with data partitioning, data always goes to base layer */
  367.   ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
  368.   bp = ld1->block[comp];
  369.   if (base.scalable_mode==SC_DP)
  370.     if (base.priority_breakpoint<64)
  371.       ld = &enhan;
  372.     else
  373.       ld = &base;
  374.   qmat = (comp<4 || chroma_format==CHROMA420)
  375.          ? ld1->non_intra_quantizer_matrix
  376.          : ld1->chroma_non_intra_quantizer_matrix;
  377.   nc = 0;
  378. #ifdef TRACE
  379.   if (Trace_Flag)
  380.     printf("DCT(%d)n:",comp);
  381. #endif /* TRACE */
  382.   /* decode AC coefficients */
  383.   for (i=0; ; i++)
  384.   {
  385.     code = Show_Bits(16);
  386.     if (code>=16384)
  387.     {
  388.       if (i==0)
  389.         tab = &DCTtabfirst[(code>>12)-4];
  390.       else
  391.         tab = &DCTtabnext[(code>>12)-4];
  392.     }
  393.     else if (code>=1024)
  394.       tab = &DCTtab0[(code>>8)-4];
  395.     else if (code>=512)
  396.       tab = &DCTtab1[(code>>6)-8];
  397.     else if (code>=256)
  398.       tab = &DCTtab2[(code>>4)-16];
  399.     else if (code>=128)
  400.       tab = &DCTtab3[(code>>3)-16];
  401.     else if (code>=64)
  402.       tab = &DCTtab4[(code>>2)-16];
  403.     else if (code>=32)
  404.       tab = &DCTtab5[(code>>1)-16];
  405.     else if (code>=16)
  406.       tab = &DCTtab6[code-16];
  407.     else
  408.     {
  409.       if (!Quiet_Flag)
  410.         printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()n");
  411.       Fault_Flag = 1;
  412.       return;
  413.     }
  414.     Flush_Buffer(tab->len);
  415. #ifdef TRACE
  416.     if (Trace_Flag)
  417.     {
  418.       printf(" (");
  419.       Print_Bits(code,16,tab->len);
  420.     }
  421. #endif /* TRACE */
  422.     if (tab->run==64) /* end_of_block */
  423.     {
  424. #ifdef TRACE
  425.       if (Trace_Flag)
  426.         printf("): EOBn");
  427. #endif /* TRACE */
  428.       return;
  429.     }
  430.     if (tab->run==65) /* escape */
  431.     {
  432. #ifdef TRACE
  433.       if (Trace_Flag)
  434.       {
  435.         putchar(' ');
  436.         Print_Bits(Show_Bits(6),6,6);
  437.       }
  438. #endif /* TRACE */
  439.       i+= run = Get_Bits(6);
  440. #ifdef TRACE
  441.       if (Trace_Flag)
  442.       {
  443.         putchar(' ');
  444.         Print_Bits(Show_Bits(12),12,12);
  445.       }
  446. #endif /* TRACE */
  447.       val = Get_Bits(12);
  448.       if ((val&2047)==0)
  449.       {
  450.         if (!Quiet_Flag)
  451.           printf("invalid escape in Decode_MPEG2_Intra_Block()n");
  452.         Fault_Flag = 1;
  453.         return;
  454.       }
  455.       if((sign = (val>=2048)))
  456.         val = 4096 - val;
  457.     }
  458.     else
  459.     {
  460.       i+= run = tab->run;
  461.       val = tab->level;
  462.       sign = Get_Bits(1);
  463. #ifdef TRACE
  464.       if (Trace_Flag)
  465.         printf("%d",sign);
  466. #endif /* TRACE */
  467.     }
  468.     if (i>=64)
  469.     {
  470.       if (!Quiet_Flag)
  471.         fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)n");
  472.       Fault_Flag = 1;
  473.       return;
  474.     }
  475. #ifdef TRACE
  476.     if (Trace_Flag)
  477.       printf("): %d/%d",run,sign?-val:val);
  478. #endif /* TRACE */
  479.     j = scan[ld1->alternate_scan][i];
  480.     val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
  481.     bp[j] = sign ? -val : val;
  482.     nc++;
  483.     if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
  484.       ld = &enhan;
  485.   }
  486. }