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

DVD

开发平台:

Unix_Linux

  1. /* getvlc.c, variable length 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 "global.h"
  29. #include "bitstream.h"
  30. #include "getvlc.h"
  31. int Fault_Flag = 0;
  32. int Quiet_Flag = 0;
  33. /* private prototypes */
  34. /* generic picture macroblock type processing functions */
  35. static int Get_I_macroblock_type _ANSI_ARGS_((void));
  36. static int Get_P_macroblock_type _ANSI_ARGS_((void));
  37. static int Get_B_macroblock_type _ANSI_ARGS_((void));
  38. static int Get_D_macroblock_type _ANSI_ARGS_((void));
  39. /* spatial picture macroblock type processing functions */
  40. static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
  41. static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
  42. static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
  43. static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
  44. int Get_macroblock_type(int picture_coding_type)
  45. {
  46.   int macroblock_type = 0;
  47. switch (picture_coding_type)
  48. {
  49. case I_TYPE:
  50. macroblock_type =  Get_I_macroblock_type();
  51. break;
  52. case P_TYPE:
  53. macroblock_type = Get_P_macroblock_type();
  54. break;
  55. case B_TYPE:
  56. macroblock_type =  Get_B_macroblock_type();
  57. break;
  58. case D_TYPE:
  59. macroblock_type = Get_D_macroblock_type();
  60. break;
  61. default:
  62. printf("Get_macroblock_type(): unrecognized picture coding typen");
  63. break;
  64. }
  65.   return macroblock_type;
  66. }
  67. static int Get_I_macroblock_type()
  68. {
  69. #ifdef TRACE
  70.   if (Trace_Flag)
  71.     printf("macroblock_type(I) ");
  72. #endif /* TRACE */
  73.   if (Get_Bits1())
  74.   {
  75. #ifdef TRACE
  76.     if (Trace_Flag)
  77.       printf("(1): Intra (1)n");
  78. #endif /* TRACE */
  79.     return 1;
  80.   }
  81.   if (!Get_Bits1())
  82.   {
  83.     if (!Quiet_Flag)
  84.       printf("Invalid macroblock_type coden");
  85.     Fault_Flag = 1;
  86.   }
  87. #ifdef TRACE
  88.   if (Trace_Flag)
  89.     printf("(01): Intra, Quant (17)n");
  90. #endif /* TRACE */
  91.   return 17;
  92. }
  93. #ifdef TRACE
  94. static char *MBdescr[]={
  95.   "",                  "Intra",        "No MC, Coded",         "",
  96.   "Bwd, Not Coded",    "",             "Bwd, Coded",           "",
  97.   "Fwd, Not Coded",    "",             "Fwd, Coded",           "",
  98.   "Interp, Not Coded", "",             "Interp, Coded",        "",
  99.   "",                  "Intra, Quant", "No MC, Coded, Quant",  "",
  100.   "",                  "",             "Bwd, Coded, Quant",    "",
  101.   "",                  "",             "Fwd, Coded, Quant",    "",
  102.   "",                  "",             "Interp, Coded, Quant", ""
  103. };
  104. #endif
  105. static int Get_P_macroblock_type()
  106. {
  107.   int code;
  108. #ifdef TRACE
  109.   if (Trace_Flag)
  110.     printf("macroblock_type(P) (");
  111. #endif /* TRACE */
  112.   if ((code = Show_Bits(6))>=8)
  113.   {
  114.     code >>= 3;
  115.     Flush_Buffer(PMBtab0[code].len);
  116. #ifdef TRACE
  117.     if (Trace_Flag)
  118.     {
  119.       Print_Bits(code,3,PMBtab0[code].len);
  120.       printf("): %s (%d)n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
  121.     }
  122. #endif /* TRACE */
  123.     return PMBtab0[code].val;
  124.   }
  125.   if (code==0)
  126.   {
  127.     if (!Quiet_Flag)
  128.       printf("Invalid macroblock_type coden");
  129.     Fault_Flag = 1;
  130.     return 0;
  131.   }
  132.   Flush_Buffer(PMBtab1[code].len);
  133. #ifdef TRACE
  134.   if (Trace_Flag)
  135.   {
  136.     Print_Bits(code,6,PMBtab1[code].len);
  137.     printf("): %s (%d)n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
  138.   }
  139. #endif /* TRACE */
  140.   return PMBtab1[code].val;
  141. }
  142. static int Get_B_macroblock_type()
  143. {
  144.   int code;
  145. #ifdef TRACE
  146.   if (Trace_Flag)
  147.     printf("macroblock_type(B) (");
  148. #endif /* TRACE */
  149.   if ((code = Show_Bits(6))>=8)
  150.   {
  151.     code >>= 2;
  152.     Flush_Buffer(BMBtab0[code].len);
  153. #ifdef TRACE
  154.     if (Trace_Flag)
  155.     {
  156.       Print_Bits(code,4,BMBtab0[code].len);
  157.       printf("): %s (%d)n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
  158.     }
  159. #endif /* TRACE */
  160.     return BMBtab0[code].val;
  161.   }
  162.   if (code==0)
  163.   {
  164.     if (!Quiet_Flag)
  165.       printf("Invalid macroblock_type coden");
  166.     Fault_Flag = 1;
  167.     return 0;
  168.   }
  169.   Flush_Buffer(BMBtab1[code].len);
  170. #ifdef TRACE
  171.   if (Trace_Flag)
  172.   {
  173.     Print_Bits(code,6,BMBtab1[code].len);
  174.     printf("): %s (%d)n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
  175.   }
  176. #endif /* TRACE */
  177.   return BMBtab1[code].val;
  178. }
  179. static int Get_D_macroblock_type()
  180. {
  181.   if (!Get_Bits1())
  182.   {
  183.     if (!Quiet_Flag)
  184.       printf("Invalid macroblock_type coden");
  185.     Fault_Flag=1;
  186.   }
  187.   return 1;
  188. }
  189. /* macroblock_type for pictures with spatial scalability */
  190. static int Get_I_Spatial_macroblock_type()
  191. {
  192.   int code;
  193. #ifdef TRACE
  194.   if (Trace_Flag)
  195.     printf("macroblock_type(I,spat) (");
  196. #endif /* TRACE */
  197.   code = Show_Bits(4);
  198.   if (code==0)
  199.   {
  200.     if (!Quiet_Flag)
  201.       printf("Invalid macroblock_type coden");
  202.     Fault_Flag = 1;
  203.     return 0;
  204.   }
  205. #ifdef TRACE
  206.   if (Trace_Flag)
  207.   {
  208.     Print_Bits(code,4,spIMBtab[code].len);
  209.     printf("): %02xn",spIMBtab[code].val);
  210.   }
  211. #endif /* TRACE */
  212.   Flush_Buffer(spIMBtab[code].len);
  213.   return spIMBtab[code].val;
  214. }
  215. static int Get_P_Spatial_macroblock_type()
  216. {
  217.   int code;
  218. #ifdef TRACE
  219.   if (Trace_Flag)
  220.     printf("macroblock_type(P,spat) (");
  221. #endif /* TRACE */
  222.   code = Show_Bits(7);
  223.   if (code<2)
  224.   {
  225.     if (!Quiet_Flag)
  226.       printf("Invalid macroblock_type coden");
  227.     Fault_Flag = 1;
  228.     return 0;
  229.   }
  230.   if (code>=16)
  231.   {
  232.     code >>= 3;
  233.     Flush_Buffer(spPMBtab0[code].len);
  234. #ifdef TRACE
  235.     if (Trace_Flag)
  236.     {
  237.       Print_Bits(code,4,spPMBtab0[code].len);
  238.       printf("): %02xn",spPMBtab0[code].val);
  239.     }
  240. #endif /* TRACE */
  241.     return spPMBtab0[code].val;
  242.   }
  243.   Flush_Buffer(spPMBtab1[code].len);
  244. #ifdef TRACE
  245.   if (Trace_Flag)
  246.   {
  247.     Print_Bits(code,7,spPMBtab1[code].len);
  248.     printf("): %02xn",spPMBtab1[code].val);
  249.   }
  250. #endif /* TRACE */
  251.   return spPMBtab1[code].val;
  252. }
  253. static int Get_B_Spatial_macroblock_type()
  254. {
  255.   int code;
  256.   VLCtab *p;
  257. #ifdef TRACE
  258.   if (Trace_Flag)
  259.     printf("macroblock_type(B,spat) (");
  260. #endif /* TRACE */
  261.   code = Show_Bits(9);
  262.   if (code>=64)
  263.     p = &spBMBtab0[(code>>5)-2];
  264.   else if (code>=16)
  265.     p = &spBMBtab1[(code>>2)-4];
  266.   else if (code>=8)
  267.     p = &spBMBtab2[code-8];
  268.   else
  269.   {
  270.     if (!Quiet_Flag)
  271.       printf("Invalid macroblock_type coden");
  272.     Fault_Flag = 1;
  273.     return 0;
  274.   }
  275.   Flush_Buffer(p->len);
  276. #ifdef TRACE
  277.   if (Trace_Flag)
  278.   {
  279.     Print_Bits(code,9,p->len);
  280.     printf("): %02xn",p->val);
  281.   }
  282. #endif /* TRACE */
  283.   return p->val;
  284. }
  285. static int Get_SNR_macroblock_type()
  286. {
  287.   int code;
  288. #ifdef TRACE /* *CH* */
  289.   if (Trace_Flag)
  290.     printf("macroblock_type(SNR) (");
  291. #endif TRACE
  292.   code = Show_Bits(3);
  293.   if (code==0)
  294.   {
  295.     if (!Quiet_Flag)
  296.       printf("Invalid macroblock_type coden");
  297.     Fault_Flag = 1;
  298.     return 0;
  299.   }
  300.   Flush_Buffer(SNRMBtab[code].len);
  301. #ifdef TRACE /* *CH* */
  302.   if (Trace_Flag)
  303.   {
  304.     Print_Bits(code,3,SNRMBtab[code].len);
  305.     printf("): %s (%d)n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
  306.   }
  307. #endif TRACE
  308.   return SNRMBtab[code].val;
  309. }
  310. int Get_motion_code()
  311. {
  312.   int code;
  313. #ifdef TRACE
  314.   if (Trace_Flag)
  315.     printf("motion_code (");
  316. #endif /* TRACE */
  317.   if (Get_Bits1())
  318.   {
  319. #ifdef TRACE
  320.     if (Trace_Flag)
  321.       printf("0): 0n");
  322. #endif /* TRACE */
  323.     return 0;
  324.   }
  325.   if ((code = Show_Bits(9))>=64)
  326.   {
  327.     code >>= 6;
  328.     Flush_Buffer(MVtab0[code].len);
  329. #ifdef TRACE
  330.     if (Trace_Flag)
  331.     {
  332.       Print_Bits(code,3,MVtab0[code].len);
  333.       printf("%d): %dn",
  334.         Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
  335.     }
  336. #endif /* TRACE */
  337.     return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
  338.   }
  339.   if (code>=24)
  340.   {
  341.     code >>= 3;
  342.     Flush_Buffer(MVtab1[code].len);
  343. #ifdef TRACE
  344.     if (Trace_Flag)
  345.     {
  346.       Print_Bits(code,6,MVtab1[code].len);
  347.       printf("%d): %dn",
  348.         Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
  349.     }
  350. #endif /* TRACE */
  351.     return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
  352.   }
  353.   if ((code-=12)<0)
  354.   {
  355.     Fault_Flag=1;
  356.     return 0;
  357.   }
  358.   Flush_Buffer(MVtab2[code].len);
  359. #ifdef TRACE
  360.   if (Trace_Flag)
  361.   {
  362.     Print_Bits(code+12,9,MVtab2[code].len);
  363.     printf("%d): %dn",
  364.       Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
  365.   }
  366. #endif /* TRACE */
  367.   return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
  368. }
  369. /* get differential motion vector (for dual prime prediction) */
  370. int Get_dmvector()
  371. {
  372. #ifdef TRACE
  373.   if (Trace_Flag)
  374.     printf("dmvector (");
  375. #endif /* TRACE */
  376.   if (Get_Bits(1))
  377.   {
  378. #ifdef TRACE
  379.     if (Trace_Flag)
  380.       printf(Show_Bits(1) ? "11): -1n" : "10): 1n");
  381. #endif /* TRACE */
  382.     return Get_Bits(1) ? -1 : 1;
  383.   }
  384.   else
  385.   {
  386. #ifdef TRACE
  387.     if (Trace_Flag)
  388.       printf("0): 0n");
  389. #endif /* TRACE */
  390.     return 0;
  391.   }
  392. }
  393. int Get_coded_block_pattern()
  394. {
  395.   int code;
  396. #ifdef TRACE
  397.   if (Trace_Flag)
  398.     printf("coded_block_pattern_420 (");
  399. #endif /* TRACE */
  400.   if ((code = Show_Bits(9))>=128)
  401.   {
  402.     code >>= 4;
  403.     Flush_Buffer(CBPtab0[code].len);
  404. #ifdef TRACE
  405.     if (Trace_Flag)
  406.     {
  407.       Print_Bits(code,5,CBPtab0[code].len);
  408.       printf("): ");
  409.       Print_Bits(CBPtab0[code].val,6,6);
  410.       printf(" (%d)n",CBPtab0[code].val);
  411.     }
  412. #endif /* TRACE */
  413.     return CBPtab0[code].val;
  414.   }
  415.   if (code>=8)
  416.   {
  417.     code >>= 1;
  418.     Flush_Buffer(CBPtab1[code].len);
  419. #ifdef TRACE
  420.     if (Trace_Flag)
  421.     {
  422.       Print_Bits(code,8,CBPtab1[code].len);
  423.       printf("): ");
  424.       Print_Bits(CBPtab1[code].val,6,6);
  425.       printf(" (%d)n",CBPtab1[code].val);
  426.     }
  427. #endif /* TRACE */
  428.     return CBPtab1[code].val;
  429.   }
  430.   if (code<1)
  431.   {
  432.     if (!Quiet_Flag)
  433.       printf("Invalid coded_block_pattern coden");
  434.     Fault_Flag = 1;
  435.     return 0;
  436.   }
  437.   Flush_Buffer(CBPtab2[code].len);
  438. #ifdef TRACE
  439.   if (Trace_Flag)
  440.   {
  441.     Print_Bits(code,9,CBPtab2[code].len);
  442.     printf("): ");
  443.     Print_Bits(CBPtab2[code].val,6,6);
  444.     printf(" (%d)n",CBPtab2[code].val);
  445.   }
  446. #endif /* TRACE */
  447.   return CBPtab2[code].val;
  448. }
  449. int Get_macroblock_address_increment()
  450. {
  451.   int code, val;
  452. #ifdef TRACE
  453.   if (Trace_Flag)
  454.     printf("macroblock_address_increment (");
  455. #endif /* TRACE */
  456.   val = 0;
  457.   while ((code = Show_Bits(11))<24)
  458.   {
  459.     if (code!=15) /* if not macroblock_stuffing */
  460.     {
  461.       if (code==8) /* if macroblock_escape */
  462.       {
  463. #ifdef TRACE
  464.         if (Trace_Flag)
  465.           printf("00000001000 ");
  466. #endif /* TRACE */
  467.         val+= 33;
  468.       }
  469.       else
  470.       {
  471.         if (!Quiet_Flag)
  472.           printf("Invalid macroblock_address_increment coden");
  473.         Fault_Flag = 1;
  474.         return 1;
  475.       }
  476.     }
  477.     else /* macroblock suffing */
  478.     {
  479. #ifdef TRACE
  480.       if (Trace_Flag)
  481.         printf("00000001111 ");
  482. #endif /* TRACE */
  483.     }
  484.     Flush_Buffer(11);
  485.   }
  486.   /* macroblock_address_increment == 1 */
  487.   /* ('1' is in the MSB position of the lookahead) */
  488.   if (code>=1024)
  489.   {
  490.     Flush_Buffer(1);
  491. #ifdef TRACE
  492.     if (Trace_Flag)
  493.       printf("1): %dn",val+1);
  494. #endif /* TRACE */
  495.     return val + 1;
  496.   }
  497.   /* codes 00010 ... 011xx */
  498.   if (code>=128)
  499.   {
  500.     /* remove leading zeros */
  501.     code >>= 6;
  502.     Flush_Buffer(MBAtab1[code].len);
  503. #ifdef TRACE
  504.     if (Trace_Flag)
  505.     {
  506.       Print_Bits(code,5,MBAtab1[code].len);
  507.       printf("): %dn",val+MBAtab1[code].val);
  508.     }
  509. #endif /* TRACE */
  510.     
  511.     return val + MBAtab1[code].val;
  512.   }
  513.   
  514.   /* codes 00000011000 ... 0000111xxxx */
  515.   code-= 24; /* remove common base */
  516.   Flush_Buffer(MBAtab2[code].len);
  517. #ifdef TRACE
  518.   if (Trace_Flag)
  519.   {
  520.     Print_Bits(code+24,11,MBAtab2[code].len);
  521.     printf("): %dn",val+MBAtab2[code].val);
  522.   }
  523. #endif /* TRACE */
  524.   return val + MBAtab2[code].val;
  525. }
  526. /* combined MPEG-1 and MPEG-2 stage. parse VLC and 
  527.    perform dct_diff arithmetic.
  528.    MPEG-1:  ISO/IEC 11172-2 section
  529.    MPEG-2:  ISO/IEC 13818-2 section 7.2.1 
  530.    
  531.    Note: the arithmetic here is presented more elegantly than
  532.    the spec, yet the results, dct_diff, are the same.
  533. */
  534. int Get_Luma_DC_dct_diff()
  535. {
  536.   int code, size, dct_diff;
  537. #ifdef TRACE
  538. /*
  539.   if (Trace_Flag)
  540.     printf("dct_dc_size_luminance: (");
  541. */
  542. #endif /* TRACE */
  543.   /* decode length */
  544.   code = Show_Bits(5);
  545.   if (code<31)
  546.   {
  547.     size = DClumtab0[code].val;
  548.     Flush_Buffer(DClumtab0[code].len);
  549. #ifdef TRACE
  550. /*
  551.     if (Trace_Flag)
  552.     {
  553.       Print_Bits(code,5,DClumtab0[code].len);
  554.       printf("): %d",size);
  555.     }
  556. */
  557. #endif /* TRACE */
  558.   }
  559.   else
  560.   {
  561.     code = Show_Bits(9) - 0x1f0;
  562.     size = DClumtab1[code].val;
  563.     Flush_Buffer(DClumtab1[code].len);
  564. #ifdef TRACE
  565. /*
  566.     if (Trace_Flag)
  567.     {
  568.       Print_Bits(code+0x1f0,9,DClumtab1[code].len);
  569.       printf("): %d",size);
  570.     }
  571. */
  572. #endif /* TRACE */
  573.   }
  574. #ifdef TRACE
  575. /*
  576.   if (Trace_Flag)
  577.     printf(", dct_dc_differential (");
  578. */
  579. #endif /* TRACE */
  580.   if (size==0)
  581.     dct_diff = 0;
  582.   else
  583.   {
  584.     dct_diff = Get_Bits(size);
  585. #ifdef TRACE
  586. /*
  587.     if (Trace_Flag)
  588.       Print_Bits(dct_diff,size,size);
  589. */
  590. #endif /* TRACE */
  591.     if ((dct_diff & (1<<(size-1)))==0)
  592.       dct_diff-= (1<<size) - 1;
  593.   }
  594. #ifdef TRACE
  595. /*
  596.   if (Trace_Flag)
  597.     printf("): %dn",dct_diff);
  598. */
  599. #endif /* TRACE */
  600.   return dct_diff;
  601. }
  602. int Get_Chroma_DC_dct_diff()
  603. {
  604.   int code, size, dct_diff;
  605. #ifdef TRACE
  606. /*
  607.   if (Trace_Flag)
  608.     printf("dct_dc_size_chrominance: (");
  609. */
  610. #endif /* TRACE */
  611.   /* decode length */
  612.   code = Show_Bits(5);
  613.   if (code<31)
  614.   {
  615.     size = DCchromtab0[code].val;
  616.     Flush_Buffer(DCchromtab0[code].len);
  617. #ifdef TRACE
  618. /*
  619.     if (Trace_Flag)
  620.     {
  621.       Print_Bits(code,5,DCchromtab0[code].len);
  622.       printf("): %d",size);
  623.     }
  624. */
  625. #endif /* TRACE */
  626.   }
  627.   else
  628.   {
  629.     code = Show_Bits(10) - 0x3e0;
  630.     size = DCchromtab1[code].val;
  631.     Flush_Buffer(DCchromtab1[code].len);
  632. #ifdef TRACE
  633. /*
  634.     if (Trace_Flag)
  635.     {
  636.       Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
  637.       printf("): %d",size);
  638.     }
  639. */
  640. #endif /* TRACE */
  641.   }
  642. #ifdef TRACE
  643. /* 
  644.   if (Trace_Flag)
  645.     printf(", dct_dc_differential (");
  646. */
  647. #endif /* TRACE */
  648.   if (size==0)
  649.     dct_diff = 0;
  650.   else
  651.   {
  652.     dct_diff = Get_Bits(size);
  653. #ifdef TRACE
  654. /*
  655.     if (Trace_Flag)
  656.       Print_Bits(dct_diff,size,size);
  657. */
  658. #endif /* TRACE */
  659.     if ((dct_diff & (1<<(size-1)))==0)
  660.       dct_diff-= (1<<size) - 1;
  661.   }
  662. #ifdef TRACE
  663. /*
  664.   if (Trace_Flag)
  665.     printf("): %dn",dct_diff);
  666. */
  667. #endif /* TRACE */
  668.   return dct_diff;
  669. }