unsigned short* rl2blk(int *blk,unsigned short *mdec_rl) { int i,k,q_scale,rl; int *iqtab; memset (blk, 0, 6*DCTSIZE2*4); iqtab = iq_uv; for(i=0;i<6;i++) { // decode blocks (Cr,Cb,Y1,Y2,Y3,Y4) if (i>1) iqtab = iq_y; // zigzag transformation rl = *mdec_rl++; q_scale = RUNOF(rl); blk[0] = iqtab[0]*VALOF(rl); for(k = 0;;) { rl = *mdec_rl++; if (rl==NOP) break; k += RUNOF(rl)+1; // skip level zero-coefficients if (k > 63) break; blk[zscan[k]] = (VALOF(rl) * iqtab[k] * q_scale) / 8; // / 16; } idct(blk,k+1); blk+=DCTSIZE2; } return mdec_rl; }
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); } }