void next_start_code() { /* byte align */ Flush_Buffer(ld->Incnt&7); while (Show_Bits(24)!=0x01L) Flush_Buffer(8); }
int Get_motion_code () { int code; if (Get_Bits1 ()) { return 0; } if ((code = Show_Bits (9)) >= 64) { code >>= 6; Flush_Buffer (MVtab0[code][1]); return Get_Bits1 ()? -MVtab0[code][0] : MVtab0[code][0]; }
static int Get_P_macroblock_type() { int code; #ifdef TRACE if (Trace_Flag) printf("macroblock_type(P) ("); #endif /* TRACE */ if ((code = Show_Bits(6))>=8) { code >>= 3; Flush_Buffer(PMBtab0[code].len); #ifdef TRACE if (Trace_Flag) { Print_Bits(code,3,PMBtab0[code].len); printf("): %s (%d)\n",MBdescr[PMBtab0[code].val],PMBtab0[code].val); } #endif /* TRACE */ return PMBtab0[code].val; }
int DecDCTvlc(u_short *mdec_bs,u_short *mdec_rl) { // u_short *mdec_bs = mdecbs,*mdec_rl = mdecrl u_short *rl_end; u_long bitbuf; int incnt; /* 16-有効bit数 x86=char risc = long */ int q_code; int type,n; int last_dc[3]; /* BS_HDR u_short rlsize,magic,ver,q_scale */ //printf("%04x,%04x,",mdec_bs[0],mdec_bs[1]); *(long*)mdec_rl=*(long*)mdec_bs; mdec_rl+=2; rl_end = mdec_rl+(int)mdec_bs[0]*2; q_code = (mdec_bs[2]<<10); /* code = q */ type = mdec_bs[3]; mdec_bs+=4; Init_Buffer(); n = 0; last_dc[0]=last_dc[1]=last_dc[2] = 0; while(mdec_rl<rl_end) { u_long code2; /* DC */ if (type==2) { code2 = Show_Bits(10)|(10<<16); /* DC code */ } else { code2 = Show_Bits(6); if (n>=2) { /* Y */ if (code2<48) { code2 = DC_Ytab0[code2]; code2 = (code2&0xffff0000)|((last_dc[2]+=VALOF(code2)*4)&0x3ff); } else { int nbit,val; int bit = 3; while(Show_Bits(bit)&1) { bit++;} bit++; nbit = bit*2-1; val = Show_Bits(nbit)&((1<<bit)-1); if ((val&(1<<(bit-1)))==0) val -= (1<<bit)-1; val = (last_dc[2]+=val*4); code2 = (nbit<<16) | (val&0x3ff); } //printf("%d ",last_dc[2]); } else { /* U,V */ if (code2<56) { code2 = DC_UVtab0[code2]; code2 = (code2&0xffff0000)|((last_dc[n]+=VALOF(code2)*4)&0x3ff); } else { int nbit,val; int bit = 4; while(Show_Bits(bit)&1) { bit++;} nbit = bit*2; val = Show_Bits(nbit)&((1<<bit)-1); if ((val&(1<<(bit-1)))==0) val -= (1<<bit)-1; val = (last_dc[n]+=val*4); code2 = (nbit<<16) | (val&0x3ff); } //printf("%d ",last_dc[n]); } if (++n==6) n=0; } // printf("%d ",VALOF(code2)); code2 |= q_code; /* AC */ for(;;){ // u_long code; #define code code2 #define SBIT 17 *mdec_rl++=code2; Flush_Buffer(BITOF(code2)); code = Show_Bits(SBIT); if (code>=1<<(SBIT- 2)) { code2 = VLCtabnext[(code>>12)-8]; if (code2==EOB_CODE) break; } else if (code>=1<<(SBIT- 6)) { code2 = VLCtab0[(code>>8)-8]; if (code2==ESCAPE_CODE) { Flush_Buffer(6); /* ESCAPE len */ code2 = Show_Bits(16)| (16<<16); } }