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

DVD

开发平台:

Unix_Linux

  1. #include "all.hh"
  2. #include "getvlc.hh"
  3. /* private prototypes */
  4. inline int getIMBtype(void);
  5. inline int getPMBtype(void);
  6. inline int getBMBtype(void);
  7. inline int getDMBtype(void);
  8. inline int getspIMBtype(void);
  9. inline int getspPMBtype(void);
  10. inline int getspBMBtype(void);
  11. inline int getSNRMBtype(void);
  12. int getMBtype(){
  13.   if (ld->scalable_mode==SC_SNR) return getSNRMBtype();
  14.   else{
  15.     switch (pict_type){
  16.     case I_TYPE: return ld->pict_scal ? getspIMBtype() : getIMBtype();
  17.     case P_TYPE: return ld->pict_scal ? getspPMBtype() : getPMBtype();
  18.     case B_TYPE: return ld->pict_scal ? getspBMBtype() : getBMBtype();
  19.     case D_TYPE: return getDMBtype();
  20.     default: if (!quiet) { msg("getMBtype: unknown coding type");dec2hex(pict_type);}
  21.       /* MPEG-1 only, not implemented */
  22.     }
  23.   }
  24.   return 0;
  25. }
  26. inline int getIMBtype(){
  27. #ifdef TRACE
  28.   if (trace) printf("mb_type(I) ");
  29. #endif
  30.   if (vs->getbits(1)){
  31. #ifdef TRACE
  32.     if (trace) printf("(1): Intra (1)n");
  33. #endif
  34.     return 1;
  35.   }
  36.   if (!vs->getbits(1)){
  37.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getIMBtype)n");
  38.     fault = 1;
  39.   }
  40. #ifdef TRACE
  41.   if (trace) printf("(01): Intra, Quant (17)n");
  42. #endif
  43.   return 17;
  44. }
  45. #ifdef TRACE
  46. static char *MBdescr[]={
  47.   "",                  "Intra",        "No MC, Coded",         "",
  48.   "Bwd, Not Coded",    "",             "Bwd, Coded",           "",
  49.   "Fwd, Not Coded",    "",             "Fwd, Coded",           "",
  50.   "Interp, Not Coded", "",             "Interp, Coded",        "",
  51.   "",                  "Intra, Quant", "No MC, Coded, Quant",  "",
  52.   "",                  "",             "Bwd, Coded, Quant",    "",
  53.   "",                  "",             "Fwd, Coded, Quant",    "",
  54.   "",                  "",             "Interp, Coded, Quant", ""
  55. };
  56. #endif
  57. inline int getPMBtype(){
  58.   int code;
  59. #ifdef TRACE
  60.   if (trace) printf("mb_type(P) (");
  61. #endif
  62.   if ((code = vs->showbits(6))>=8){
  63.     code >>= 3;
  64.     vs->flushbits(PMBtab0[code].len);
  65. #ifdef TRACE
  66.     if (trace){
  67.       printbits(code,3,PMBtab0[code].len);
  68.       printf("): %s (%d)n",MBdescr[PMBtab0[code].val],PMBtab0[code].val);
  69.     }
  70. #endif
  71.     return PMBtab0[code].val;
  72.   }
  73.   if (code==0){
  74.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getPMBtype)n");
  75.     fault = 1;
  76.     return 0;
  77.   }
  78.   vs->flushbits(PMBtab1[code].len);
  79. #ifdef TRACE
  80.   if (trace){
  81.     printbits(code,6,PMBtab1[code].len);
  82.     printf("): %s (%d)n",MBdescr[PMBtab1[code].val],PMBtab1[code].val);
  83.   }
  84. #endif
  85.   return PMBtab1[code].val;
  86. }
  87. inline int getBMBtype(){
  88.   int code;
  89. #ifdef TRACE
  90.   if (trace) printf("mb_type(B) (");
  91. #endif
  92.   if ((code = vs->showbits(6))>=8){
  93.     code >>= 2;
  94.     vs->flushbits(BMBtab0[code].len);
  95. #ifdef TRACE
  96.     if (trace){
  97.       printbits(code,4,BMBtab0[code].len);
  98.       printf("): %s (%d)n",MBdescr[BMBtab0[code].val],BMBtab0[code].val);
  99.     }
  100. #endif
  101.     return BMBtab0[code].val;
  102.   }
  103.   if (code==0){
  104.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getBMBtype)n");
  105.     fault = 1;
  106.     return 0;
  107.   }
  108.   vs->flushbits(BMBtab1[code].len);
  109. #ifdef TRACE
  110.   if (trace){
  111.     printbits(code,6,BMBtab1[code].len);
  112.     printf("): %s (%d)n",MBdescr[BMBtab1[code].val],BMBtab1[code].val);
  113.   }
  114. #endif
  115.   return BMBtab1[code].val;
  116. }
  117. inline int getDMBtype(){
  118.   if (!vs->getbits(1)){
  119.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getDMBtype)n");
  120.     fault=1;
  121.   }
  122.   return 1;
  123. }
  124. /* macroblock_type for pictures with spatial scalability */
  125. inline int getspIMBtype(){
  126.   int code;
  127. #ifdef TRACE
  128.   if (trace)
  129.     printf("mb_type(I,spat) (");
  130. #endif
  131.   code = vs->showbits(4);
  132.   if (code==0){
  133.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getspIMBtype)n");
  134.     fault = 1;
  135.     return 0;
  136.   }
  137. #ifdef TRACE
  138.   if (trace){
  139.     printbits(code,4,spIMBtab[code].len);
  140.     printf("): %02xn",spIMBtab[code].val);
  141.   }
  142. #endif
  143.   vs->flushbits(spIMBtab[code].len);
  144.   return spIMBtab[code].val;
  145. }
  146. inline int getspPMBtype(){
  147. #ifdef TRACE
  148.   if (trace) printf("mb_type(P,spat) (");
  149. #endif
  150.   int code = vs->showbits(7);
  151.   if (code<2){
  152.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getspPMBtype)n");
  153.     fault = 1;
  154.     return 0;
  155.   }
  156.   if (code>=16){
  157.     code >>= 3;
  158.     vs->flushbits(spPMBtab0[code].len);
  159. #ifdef TRACE
  160.     if (trace){
  161.       printbits(code,4,spPMBtab0[code].len);
  162.       printf("): %02xn",spPMBtab0[code].val);
  163.     }
  164. #endif
  165.     return spPMBtab0[code].val;
  166.   }
  167.   vs->flushbits(spPMBtab1[code].len);
  168. #ifdef TRACE
  169.   if (trace){
  170.     printbits(code,7,spPMBtab1[code].len);
  171.     printf("): %02xn",spPMBtab1[code].val);
  172.   }
  173. #endif
  174.   return spPMBtab1[code].val;
  175. }
  176. inline int getspBMBtype(){
  177.   VLCtab *p;
  178. #ifdef TRACE
  179.   if (trace) printf("mb_type(B,spat) (");
  180. #endif
  181.   int code = vs->showbits(9);
  182.   if (code>=64)      p = &spBMBtab0[(code>>5)-2];
  183.   else if (code>=16) p = &spBMBtab1[(code>>2)-4];
  184.   else if (code>=8)  p = &spBMBtab2[code-8];
  185.   else {
  186.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getspBMBtype)n");
  187.     fault = 1;
  188.     return 0;
  189.   }
  190.   vs->flushbits(p->len);
  191. #ifdef TRACE
  192.   if (trace){
  193.     printbits(code,9,p->len);
  194.     printf("): %02xn",p->val);
  195.   }
  196. #endif
  197.   return p->val;
  198. }
  199. inline int getSNRMBtype(){
  200.   int code = vs->showbits(3);
  201.   if (code==0){
  202.     if (!quiet) fprintf(stderr,"Invalid macroblock_type code (getSNSRMBtype)n");
  203.     fault = 1;
  204.     return 0;
  205.   }
  206.   vs->flushbits(SNRMBtab[code].len);
  207.   return SNRMBtab[code].val;
  208. }
  209. int getMV(){
  210.   int code;
  211. #ifdef TRACE
  212.   if (trace) printf("motion_code (");
  213. #endif
  214.   if (vs->getbits(1)){
  215. #ifdef TRACE
  216.     if (trace) printf("0): 0n");
  217. #endif
  218.     return 0;
  219.   }
  220.   if ((code = vs->showbits(9))>=64){
  221.     code >>= 6;
  222.     vs->flushbits(MVtab0[code].len);
  223. #ifdef TRACE
  224.     if (trace){
  225.       printbits(code,3,MVtab0[code].len);
  226.       printf("%d): %dn",
  227.         vs->showbits(1),vs->showbits(1)?-MVtab0[code].val:MVtab0[code].val);
  228.     }
  229. #endif
  230.     return vs->getbits(1)?-MVtab0[code].val:MVtab0[code].val;
  231.   }
  232.   if (code>=24){
  233.     code >>= 3;
  234.     vs->flushbits(MVtab1[code].len);
  235. #ifdef TRACE
  236.     if (trace){
  237.       printbits(code,6,MVtab1[code].len);
  238.       printf("%d): %dn",
  239.         vs->showbits(1),vs->showbits(1)?-MVtab1[code].val:MVtab1[code].val);
  240.     }
  241. #endif
  242.     return vs->getbits(1)?-MVtab1[code].val:MVtab1[code].val;
  243.   }
  244.   if ((code-=12)<0){
  245.     if (!quiet) fprintf(stderr,"Invalid motion_vector coden");
  246.     fault=1;
  247.     return 0;
  248.   }
  249.   vs->flushbits(MVtab2[code].len);
  250. #ifdef TRACE
  251.   if (trace){
  252.     printbits(code+12,9,MVtab2[code].len);
  253.     printf("%d): %dn",
  254.       vs->showbits(1),vs->showbits(1)?-MVtab2[code].val:MVtab2[code].val);
  255.   }
  256. #endif
  257.   return vs->getbits(1) ? -MVtab2[code].val : MVtab2[code].val;
  258. }
  259. /* get differential motion vector (for dual prime prediction) */
  260. int getDMV(){
  261. #ifdef TRACE
  262.   if (trace) printf("dmvector (");
  263. #endif
  264.   if (vs->getbits(1)){
  265. #ifdef TRACE
  266.     if (trace) printf(vs->showbits(1) ? "11): -1n" : "10): 1n");
  267. #endif
  268.     return vs->getbits(1) ? -1 : 1;
  269.   }
  270.   else {
  271. #ifdef TRACE
  272.     if (trace) printf("0): 0n");
  273. #endif
  274.     return 0;
  275.   }
  276. }
  277. int getCBP(){
  278.   int code;
  279. #ifdef TRACE
  280.   if (trace) printf("coded_block_pattern_420 (");
  281. #endif
  282.   if ((code = vs->showbits(9))>=128){
  283.     code >>= 4;
  284.     vs->flushbits(CBPtab0[code].len);
  285. #ifdef TRACE
  286.     if (trace){
  287.       printbits(code,5,CBPtab0[code].len);
  288.       printf("): ");
  289.       printbits(CBPtab0[code].val,6,6);
  290.       printf(" (%d)n",CBPtab0[code].val);
  291.     }
  292. #endif
  293.     return CBPtab0[code].val;
  294.   }
  295.   if (code>=8){
  296.     code >>= 1;
  297.     vs->flushbits(CBPtab1[code].len);
  298. #ifdef TRACE
  299.     if (trace){
  300.       printbits(code,8,CBPtab1[code].len);
  301.       printf("): ");
  302.       printbits(CBPtab1[code].val,6,6);
  303.       printf(" (%d)n",CBPtab1[code].val);
  304.     }
  305. #endif
  306.     return CBPtab1[code].val;
  307.   }
  308.   if (code<1){
  309.     if (!quiet) fprintf(stderr,"Invalid coded_block_pattern coden");
  310.     fault = 1;
  311.     return 0;
  312.   }
  313.   vs->flushbits(CBPtab2[code].len);
  314. #ifdef TRACE
  315.   if (trace){
  316.     printbits(code,9,CBPtab2[code].len);
  317.     printf("): ");
  318.     printbits(CBPtab2[code].val,6,6);
  319.     printf(" (%d)n",CBPtab2[code].val);
  320.   }
  321. #endif
  322.   return CBPtab2[code].val;
  323. }
  324. int getMBA(){
  325.   int code, val;
  326. #ifdef TRACE
  327.   if (trace) printf("macroblock_address_increment (");
  328. #endif
  329.   val=0;
  330.   while ((code = vs->showbits(11))<24){
  331.     if (code!=15){     /* if not macroblock_stuffing */
  332.       if (code==8){    /* if macroblock_escape */
  333. #ifdef TRACE
  334.         if (trace) printf("00000001000 ");
  335. #endif
  336.         val+= 33;
  337.       }
  338.       else {
  339.         if (!quiet) fprintf(stderr,"Invalid macroblock_address_increment coden");
  340.         fault = 1;
  341.         return 1;
  342.       }
  343.     }
  344. #ifdef TRACE
  345.     else if (trace) printf("00000001111 ");
  346. #endif
  347.     vs->flushbits(11);
  348.   }
  349.   if (code>=1024){
  350.     vs->flushbits(1);
  351. #ifdef TRACE
  352.     if (trace) printf("1): %dn",val+1);
  353. #endif
  354.     return val + 1;
  355.   }
  356.   if (code>=128){
  357.     code >>= 6;
  358.     vs->flushbits(MBAtab1[code].len);
  359. #ifdef TRACE
  360.     if (trace){
  361.       printbits(code,5,MBAtab1[code].len);
  362.       printf("): %dn",val+MBAtab1[code].val);
  363.     }
  364. #endif
  365.     return val + MBAtab1[code].val;
  366.   }
  367.   code-= 24;
  368.   vs->flushbits(MBAtab2[code].len);
  369. #ifdef TRACE
  370.   if (trace){
  371.     printbits(code+24,11,MBAtab2[code].len);
  372.     printf("): %dn",val+MBAtab2[code].val);
  373.   }
  374. #endif
  375.   return val + MBAtab2[code].val;
  376. }
  377. int getDClum(){
  378.   int code, size, val;
  379. #ifdef TRACE
  380.   if (trace) printf("dct_dc_size_luminance: (");
  381. #endif
  382.   /* decode length */
  383.   code = vs->showbits(5);
  384.   if (code<31){
  385.     size = DClumtab0[code].val;
  386.     vs->flushbits(DClumtab0[code].len);
  387. #ifdef TRACE
  388.     if (trace){
  389.       printbits(code,5,DClumtab0[code].len);
  390.       printf("): %d",size);
  391.     }
  392. #endif
  393.   }
  394.   else {
  395.     code = vs->showbits(9) - 0x1f0;
  396.     size = DClumtab1[code].val;
  397.     vs->flushbits(DClumtab1[code].len);
  398. #ifdef TRACE
  399.     if (trace){
  400.       printbits(code+0x1f0,9,DClumtab1[code].len);
  401.       printf("): %d",size);
  402.     }
  403. #endif
  404.   }
  405. #ifdef TRACE
  406.   if (trace) printf(", dct_dc_differential (");
  407. #endif
  408.   if (size==0) val = 0;
  409.   else {
  410.     val = vs->getbits(size);
  411. #ifdef TRACE
  412.     if (trace) printbits(val,size,size);
  413. #endif
  414.     if ((val & (1<<(size-1)))==0)  val-= (1<<size) - 1;
  415.   }
  416. #ifdef TRACE
  417.   if (trace) printf("): %dn",val);
  418. #endif
  419.   return val;
  420. }
  421. int getDCchrom(){
  422.   int code, size, val;
  423. #ifdef TRACE
  424.   if (trace) printf("dct_dc_size_chrominance: (");
  425. #endif
  426.   /* decode length */
  427.   code = vs->showbits(5);
  428.   if (code<31){
  429.     size = DCchromtab0[code].val;
  430.     vs->flushbits(DCchromtab0[code].len);
  431. #ifdef TRACE
  432.     if (trace){
  433.       printbits(code,5,DCchromtab0[code].len);
  434.       printf("): %d",size);
  435.     }
  436. #endif
  437.   }
  438.   else {
  439.     code = vs->showbits(10) - 0x3e0;
  440.     size = DCchromtab1[code].val;
  441.     vs->flushbits(DCchromtab1[code].len);
  442. #ifdef TRACE
  443.     if (trace){
  444.       printbits(code+0x3e0,10,DCchromtab1[code].len);
  445.       printf("): %d",size);
  446.     }
  447. #endif
  448.   }
  449. #ifdef TRACE
  450.   if (trace) printf(", dct_dc_differential (");
  451. #endif
  452.   if (size==0) val = 0;
  453.   else {
  454.     val = vs->getbits(size);
  455. #ifdef TRACE
  456.     if (trace) printbits(val,size,size);
  457. #endif
  458.     if ((val & (1<<(size-1)))==0) val-= (1<<size) - 1;
  459.   }
  460. #ifdef TRACE
  461.   if (trace) printf("): %dn",val);
  462. #endif
  463.   return val;
  464. }