📄 getvlc.c
字号:
{ Print_Bits(code,3,MVtab0[code].len); printf("%d): %d\n", Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val); }#endif /* TRACE */ return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val; } if (code>=24) { code >>= 3; Flush_Buffer(MVtab1[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code,6,MVtab1[code].len); printf("%d): %d\n", Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val); }#endif /* TRACE */ return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val; } if ((code-=12)<0) { if (!Quiet_Flag)/* HACK */ printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic); Fault_Flag=1; return 0; } Flush_Buffer(MVtab2[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code+12,9,MVtab2[code].len); printf("%d): %d\n", Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val); }#endif /* TRACE */ return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;}/* get differential motion vector (for dual prime prediction) */int Get_dmvector(){#ifdef TRACE if (Trace_Flag) printf("dmvector (");#endif /* TRACE */ if (Get_Bits(1)) {#ifdef TRACE if (Trace_Flag) printf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");#endif /* TRACE */ return Get_Bits(1) ? -1 : 1; } else {#ifdef TRACE if (Trace_Flag) printf("0): 0\n");#endif /* TRACE */ return 0; }}int Get_coded_block_pattern(){ int code;#ifdef TRACE if (Trace_Flag) printf("coded_block_pattern_420 (");#endif /* TRACE */ if ((code = Show_Bits(9))>=128) { code >>= 4; Flush_Buffer(CBPtab0[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code,5,CBPtab0[code].len); printf("): "); Print_Bits(CBPtab0[code].val,6,6); printf(" (%d)\n",CBPtab0[code].val); }#endif /* TRACE */ return CBPtab0[code].val; } if (code>=8) { code >>= 1; Flush_Buffer(CBPtab1[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code,8,CBPtab1[code].len); printf("): "); Print_Bits(CBPtab1[code].val,6,6); printf(" (%d)\n",CBPtab1[code].val); }#endif /* TRACE */ return CBPtab1[code].val; } if (code<1) { if (!Quiet_Flag) printf("Invalid coded_block_pattern code\n"); Fault_Flag = 1; return 0; } Flush_Buffer(CBPtab2[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code,9,CBPtab2[code].len); printf("): "); Print_Bits(CBPtab2[code].val,6,6); printf(" (%d)\n",CBPtab2[code].val); }#endif /* TRACE */ return CBPtab2[code].val;}int Get_macroblock_address_increment(){ int code, val;#ifdef TRACE if (Trace_Flag) printf("macroblock_address_increment (");#endif /* TRACE */ val = 0; while ((code = Show_Bits(11))<24) { if (code!=15) /* if not macroblock_stuffing */ { if (code==8) /* if macroblock_escape */ {#ifdef TRACE if (Trace_Flag) printf("00000001000 ");#endif /* TRACE */ val+= 33; } else { if (!Quiet_Flag) printf("Invalid macroblock_address_increment code\n"); Fault_Flag = 1; return 1; } } else /* macroblock suffing */ {#ifdef TRACE if (Trace_Flag) printf("00000001111 ");#endif /* TRACE */ } Flush_Buffer(11); } /* macroblock_address_increment == 1 */ /* ('1' is in the MSB position of the lookahead) */ if (code>=1024) { Flush_Buffer(1);#ifdef TRACE if (Trace_Flag) printf("1): %d\n",val+1);#endif /* TRACE */ return val + 1; } /* codes 00010 ... 011xx */ if (code>=128) { /* remove leading zeros */ code >>= 6; Flush_Buffer(MBAtab1[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code,5,MBAtab1[code].len); printf("): %d\n",val+MBAtab1[code].val); }#endif /* TRACE */ return val + MBAtab1[code].val; } /* codes 00000011000 ... 0000111xxxx */ code-= 24; /* remove common base */ Flush_Buffer(MBAtab2[code].len);#ifdef TRACE if (Trace_Flag) { Print_Bits(code+24,11,MBAtab2[code].len); printf("): %d\n",val+MBAtab2[code].val); }#endif /* TRACE */ return val + MBAtab2[code].val;}/* combined MPEG-1 and MPEG-2 stage. parse VLC and perform dct_diff arithmetic. MPEG-1: ISO/IEC 11172-2 section MPEG-2: ISO/IEC 13818-2 section 7.2.1 Note: the arithmetic here is presented more elegantly than the spec, yet the results, dct_diff, are the same.*/int Get_Luma_DC_dct_diff(){ int code, size, dct_diff;#ifdef TRACE/* if (Trace_Flag) printf("dct_dc_size_luminance: (");*/#endif /* TRACE */ /* decode length */ code = Show_Bits(5); if (code<31) { size = DClumtab0[code].val; Flush_Buffer(DClumtab0[code].len);#ifdef TRACE/* if (Trace_Flag) { Print_Bits(code,5,DClumtab0[code].len); printf("): %d",size); }*/#endif /* TRACE */ } else { code = Show_Bits(9) - 0x1f0; size = DClumtab1[code].val; Flush_Buffer(DClumtab1[code].len);#ifdef TRACE/* if (Trace_Flag) { Print_Bits(code+0x1f0,9,DClumtab1[code].len); printf("): %d",size); }*/#endif /* TRACE */ }#ifdef TRACE/* if (Trace_Flag) printf(", dct_dc_differential (");*/#endif /* TRACE */ if (size==0) dct_diff = 0; else { dct_diff = Get_Bits(size);#ifdef TRACE/* if (Trace_Flag) Print_Bits(dct_diff,size,size);*/#endif /* TRACE */ if ((dct_diff & (1<<(size-1)))==0) dct_diff-= (1<<size) - 1; }#ifdef TRACE/* if (Trace_Flag) printf("): %d\n",dct_diff);*/#endif /* TRACE */ return dct_diff;}int Get_Chroma_DC_dct_diff(){ int code, size, dct_diff;#ifdef TRACE/* if (Trace_Flag) printf("dct_dc_size_chrominance: (");*/#endif /* TRACE */ /* decode length */ code = Show_Bits(5); if (code<31) { size = DCchromtab0[code].val; Flush_Buffer(DCchromtab0[code].len);#ifdef TRACE/* if (Trace_Flag) { Print_Bits(code,5,DCchromtab0[code].len); printf("): %d",size); }*/#endif /* TRACE */ } else { code = Show_Bits(10) - 0x3e0; size = DCchromtab1[code].val; Flush_Buffer(DCchromtab1[code].len);#ifdef TRACE/* if (Trace_Flag) { Print_Bits(code+0x3e0,10,DCchromtab1[code].len); printf("): %d",size); }*/#endif /* TRACE */ }#ifdef TRACE/* if (Trace_Flag) printf(", dct_dc_differential (");*/#endif /* TRACE */ if (size==0) dct_diff = 0; else { dct_diff = Get_Bits(size);#ifdef TRACE/* if (Trace_Flag) Print_Bits(dct_diff,size,size);*/#endif /* TRACE */ if ((dct_diff & (1<<(size-1)))==0) dct_diff-= (1<<size) - 1; }#ifdef TRACE/* if (Trace_Flag) printf("): %d\n",dct_diff);*/#endif /* TRACE */ return dct_diff;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -