slice.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,200 行 · 第 1/5 页

C
2,200
字号
	    i += UBITS (bit_buf << 6, 6) - 64;	    if (i >= 64)		break;	/* illegal, check needed to avoid buffer overflow */            i_noreorder;	    j = scan[i];	    DUMPBITS (bit_buf, bits, 12);	    NEEDBITS (bit_buf, bits, bit_ptr);            tmp = quant_matrix[j];            S32I2M(xr10, j);            val = SBITS (bit_buf, 12);            val *= tmp;            S32MAX(xr11, xr11, xr10);            val >>= 4;            i_reorder; 	    SATURATE (val);	    dest[j] = val;	    mismatch ^= val;	    DUMPBITS (bit_buf, bits, 12);	    NEEDBITS (bit_buf, bits, bit_ptr);	    continue;	} else if (bit_buf >= 0x02000000) {	    tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);            i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00800000) {	    tab = DCT_13 + (UBITS (bit_buf, 13) - 16);	     i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;            i_reorder;             if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00200000) {	    tab = DCT_15 + (UBITS (bit_buf, 15) - 16);	     i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;            i_reorder;            if (i < 64)		goto normal_code;	} else {	    tab = DCT_16 + UBITS (bit_buf, 16);	    bit_buf <<= 16;	    GETWORD (bit_buf, bits + 16, bit_ptr);	    i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;            i_reorder;            if (i < 64)		goto normal_code;	}	break;	/* illegal, check needed to avoid buffer overflow */    }    val = S32M2I(xr11);    dest[63] ^= mismatch & 1;    DUMPBITS (bit_buf, bits, 2);	/* dump end of block code */    decoder->bitstream_buf = bit_buf;    decoder->bitstream_bits = bits;    decoder->bitstream_ptr = bit_ptr;    idct_row_max_intra = val>>3;}#elsestatic void get_intra_block_B14 (mpeg2_decoder_t * const decoder,				 const uint16_t * const quant_matrix){    int i;    int j;    int val;    const uint8_t * const scan = decoder->scan;    int mismatch;    const DCTtab * tab;    uint32_t bit_buf;    int bits;    const uint8_t * bit_ptr;    int16_t * const dest = decoder->DCTblock;    i = 0;    mismatch = ~dest[0];    bit_buf = decoder->bitstream_buf;    bits = decoder->bitstream_bits;    bit_ptr = decoder->bitstream_ptr;    NEEDBITS (bit_buf, bits, bit_ptr);    while (1) {	if (bit_buf >= 0x28000000) {	    tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);	    i += tab->run;	    if (i >= 64)		break;	/* end of block */	normal_code:	    j = scan[i];	    bit_buf <<= tab->len;	    bits += tab->len + 1;	    val = (tab->level * quant_matrix[j]) >> 4;	    /* if (bitstream_get (1)) val = -val; */	    val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);	    SATURATE (val);	    dest[j] = val;	    mismatch ^= val;	    bit_buf <<= 1;	    NEEDBITS (bit_buf, bits, bit_ptr);	    continue;	} else if (bit_buf >= 0x04000000) {	    tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4);	    i += tab->run;	    if (i < 64)		goto normal_code;	    /* escape code */	    i += UBITS (bit_buf << 6, 6) - 64;	    if (i >= 64)		break;	/* illegal, check needed to avoid buffer overflow */	    j = scan[i];	    DUMPBITS (bit_buf, bits, 12);	    NEEDBITS (bit_buf, bits, bit_ptr);	    val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16;	    SATURATE (val);	    dest[j] = val;	    mismatch ^= val;	    DUMPBITS (bit_buf, bits, 12);	    NEEDBITS (bit_buf, bits, bit_ptr);	    continue;	} else if (bit_buf >= 0x02000000) {	    tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00800000) {	    tab = DCT_13 + (UBITS (bit_buf, 13) - 16);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00200000) {	    tab = DCT_15 + (UBITS (bit_buf, 15) - 16);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else {	    tab = DCT_16 + UBITS (bit_buf, 16);	    bit_buf <<= 16;	    GETWORD (bit_buf, bits + 16, bit_ptr);	    i += tab->run;	    if (i < 64)		goto normal_code;	}	break;	/* illegal, check needed to avoid buffer overflow */    }    dest[63] ^= mismatch & 1;    DUMPBITS (bit_buf, bits, 2);	/* dump end of block code */    decoder->bitstream_buf = bit_buf;    decoder->bitstream_bits = bits;    decoder->bitstream_ptr = bit_ptr;}#endif#ifdef JZ4740_MXU_OPTstatic void get_intra_block_B15 (mpeg2_decoder_t * const decoder,				 const uint16_t * const quant_matrix){    int i;    int j;    int val;    const uint8_t * const scan = decoder->scan;    int mismatch;    const DCTtab * tab;    uint32_t bit_buf;    int bits;    const uint8_t * bit_ptr;    int16_t * const dest = decoder->DCTblock;    S32CPS(xr11, xr0, xr0);    i = 0;    mismatch = ~dest[0];    bit_buf = decoder->bitstream_buf;    bits = decoder->bitstream_bits;    bit_ptr = decoder->bitstream_ptr;    NEEDBITS (bit_buf, bits, bit_ptr);    while (1) {        int32_t my_run, my_len, my_lvl, tmp;	if (bit_buf >= 0x04000000) {	    tab = DCT_B15_8 + (UBITS (bit_buf, 8) - 4);            i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;	    i += my_run;            i_reorder;	    if (i < 64) {	    normal_code:                i_noreorder;		j = scan[i];		bit_buf <<= my_len;		bits += my_len + 1;                val = quant_matrix[j];                S32I2M(xr10, j);                tmp =  my_lvl;                val *= tmp;                S32MAX(xr11, xr11, xr10);                tmp = SBITS (bit_buf, 1);                val >>= 4;                val = (val ^ tmp) - tmp;                i_reorder;		SATURATE (val);		dest[j] = val;		mismatch ^= val;		bit_buf <<= 1;		NEEDBITS (bit_buf, bits, bit_ptr);		continue;	    } else {		/* end of block. I commented out this code because if we */		/* dont exit here we will still exit at the later test :) */		/* if (i >= 128) break;	*/	/* end of block */		/* escape code */		i += UBITS (bit_buf << 6, 6) - 64;		if (i >= 64)		    break;	/* illegal, check against buffer overflow */                i_noreorder;		j = scan[i];		DUMPBITS (bit_buf, bits, 12);		NEEDBITS (bit_buf, bits, bit_ptr);                tmp = quant_matrix[j];                S32I2M(xr10, j);                val = SBITS (bit_buf, 12);                 val *= tmp;                S32MAX(xr11, xr11, xr10);                val >>= 4;                i_reorder;               		SATURATE (val);		dest[j] = val;		mismatch ^= val;		DUMPBITS (bit_buf, bits, 12);		NEEDBITS (bit_buf, bits, bit_ptr);		continue;	    }	} else if (bit_buf >= 0x02000000) {	    tab = DCT_B15_10 + (UBITS (bit_buf, 10) - 8);            i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;	    i += my_run;            i_reorder;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00800000) {	    tab = DCT_13 + (UBITS (bit_buf, 13) - 16);            i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;            i_reorder; 	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00200000) {	    tab = DCT_15 + (UBITS (bit_buf, 15) - 16);	     i_noreorder;             my_run = (uint32_t)tab->run;             my_len = (uint32_t)tab->len;             my_lvl = (uint32_t)tab->level;             i += my_run;             i_reorder;             if (i < 64)		goto normal_code;	} else {	    tab = DCT_16 + UBITS (bit_buf, 16);	    bit_buf <<= 16;	    GETWORD (bit_buf, bits + 16, bit_ptr);            i_noreorder;            my_run = (uint32_t)tab->run;            my_len = (uint32_t)tab->len;            my_lvl = (uint32_t)tab->level;            i += my_run;            i_reorder;	    if (i < 64)		goto normal_code;	}	break;	/* illegal, check needed to avoid buffer overflow */    }    val = S32M2I(xr11);    dest[63] ^= mismatch & 1;    DUMPBITS (bit_buf, bits, 4);	/* dump end of block code */    decoder->bitstream_buf = bit_buf;    decoder->bitstream_bits = bits;    decoder->bitstream_ptr = bit_ptr;    idct_row_max_intra = val>>3;}#else static void get_intra_block_B15 (mpeg2_decoder_t * const decoder,				 const uint16_t * const quant_matrix){    int i;    int j;    int val;    const uint8_t * const scan = decoder->scan;    int mismatch;    const DCTtab * tab;    uint32_t bit_buf;    int bits;    const uint8_t * bit_ptr;    int16_t * const dest = decoder->DCTblock;    i = 0;    mismatch = ~dest[0];    bit_buf = decoder->bitstream_buf;    bits = decoder->bitstream_bits;    bit_ptr = decoder->bitstream_ptr;    NEEDBITS (bit_buf, bits, bit_ptr);    while (1) {	if (bit_buf >= 0x04000000) {	    tab = DCT_B15_8 + (UBITS (bit_buf, 8) - 4);	    i += tab->run;	    if (i < 64) {	    normal_code:		j = scan[i];		bit_buf <<= tab->len;		bits += tab->len + 1;		val = (tab->level * quant_matrix[j]) >> 4;		/* if (bitstream_get (1)) val = -val; */		val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);		SATURATE (val);		dest[j] = val;		mismatch ^= val;		bit_buf <<= 1;		NEEDBITS (bit_buf, bits, bit_ptr);		continue;	    } else {		/* end of block. I commented out this code because if we */		/* dont exit here we will still exit at the later test :) */		/* if (i >= 128) break;	*/	/* end of block */		/* escape code */		i += UBITS (bit_buf << 6, 6) - 64;		if (i >= 64)		    break;	/* illegal, check against buffer overflow */		j = scan[i];		DUMPBITS (bit_buf, bits, 12);		NEEDBITS (bit_buf, bits, bit_ptr);		val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16;		SATURATE (val);		dest[j] = val;		mismatch ^= val;		DUMPBITS (bit_buf, bits, 12);		NEEDBITS (bit_buf, bits, bit_ptr);		continue;	    }	} else if (bit_buf >= 0x02000000) {	    tab = DCT_B15_10 + (UBITS (bit_buf, 10) - 8);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00800000) {	    tab = DCT_13 + (UBITS (bit_buf, 13) - 16);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else if (bit_buf >= 0x00200000) {	    tab = DCT_15 + (UBITS (bit_buf, 15) - 16);	    i += tab->run;	    if (i < 64)		goto normal_code;	} else {	    tab = DCT_16 + UBITS (bit_buf, 16);	    bit_buf <<= 16;	    GETWORD (bit_buf, bits + 16, bit_ptr);	    i += tab->run;	    if (i < 64)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?