Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}