int rv_decode_dc(MpegEncContext *s, int n) { int code; if (n < 4) { code = get_vlc(&s->gb, &rv_dc_lum); if (code < 0) { /* XXX: I don't understand why they use LONGER codes than necessary. The following code would be completely useless if they had thought about it !!! */ code = get_bits(&s->gb, 7); if (code == 0x7c) { code = (INT8)(get_bits(&s->gb, 7) + 1); } else if (code == 0x7d) { code = -128 + get_bits(&s->gb, 7); } else if (code == 0x7e) { if (get_bits(&s->gb, 1) == 0) code = (INT8)(get_bits(&s->gb, 8) + 1); else code = (INT8)(get_bits(&s->gb, 8)); } else if (code == 0x7f) { get_bits(&s->gb, 11); code = 1; } } else { code -= 128; } } else { code = get_vlc(&s->gb, &rv_dc_chrom); /* same remark */ if (code < 0) { code = get_bits(&s->gb, 9); if (code == 0x1fc) { code = (INT8)(get_bits(&s->gb, 7) + 1); } else if (code == 0x1fd) { code = -128 + get_bits(&s->gb, 7); } else if (code == 0x1fe) { get_bits(&s->gb, 9); code = 1; } else { return 0xffff; } } else { code -= 128; } } return -code; }
int decode_ac(jpeg_ctx_t *ctx, int yuv_index, short mb[]) { int code, len, val; GetBitContext *gb = &ctx->getbit_ctx; int ac_index = yuv_index ? 1 : 0; int16_t (*table)[2] = ctx->dec_vlcs[1][ac_index].table; int zero_num = 0; while (zero_num < 63) { code = get_vlc(gb, table); if (code < 0) { log("JO: format wrong, huffman decode fail in decode_ac\n"); return -1; } zero_num += code >> 4; //尼玛, 构造vlc时篡改符号值,每个符号加了16,原来就是了这里能够自动zero_num + 1啊,太扣效率了吧 len = code & 0xf; if (len) { val = get_xbits(gb, len); mb[zero_num] = (short)val; } } return 0; }
int decode_dc(jpeg_ctx_t *ctx, int yuv_index, short mb[]) { int code, val; code = get_vlc(&ctx->getbit_ctx, ctx->dec_vlcs[0][yuv_index ? 1 : 0].table); if (code < 0) { log("JO: format wrong, huffman decode fail in decode_dc\n"); return -1; } if (code) { val = get_xbits(&ctx->getbit_ctx, code); mb[0] = (short)val; } return 0; }