📄 slice.c
字号:
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 & 16;
DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
decoder->bitstream_buf = bit_buf;
decoder->bitstream_bits = bits;
decoder->bitstream_ptr = bit_ptr;
}
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)
goto normal_code;
}
break; /* illegal, check needed to avoid buffer overflow */
}
dest[63] ^= mismatch & 16;
DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
decoder->bitstream_buf = bit_buf;
decoder->bitstream_bits = bits;
decoder->bitstream_ptr = bit_ptr;
}
static int get_non_intra_block (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 = -1;
mismatch = -1;
bit_buf = decoder->bitstream_buf;
bits = decoder->bitstream_bits;
bit_ptr = decoder->bitstream_ptr;
NEEDBITS (bit_buf, bits, bit_ptr);
if (bit_buf >= 0x28000000) {
tab = DCT_B14DC_5 + (UBITS (bit_buf, 5) - 5);
goto entry_1;
} else
goto entry_2;
while (1) {
if (bit_buf >= 0x28000000) {
tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);
entry_1:
i += tab->run;
if (i >= 64)
break; /* end of block */
normal_code:
j = scan[i];
bit_buf <<= tab->len;
bits += tab->len + 1;
val = ((2 * tab->level + 1) * quant_matrix[j]) >> 5;
/* 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;
}
entry_2:
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 = 2 * (SBITS (bit_buf, 12) + SBITS (bit_buf, 1)) + 1;
val = (val * quant_matrix[j]) / 32;
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 & 16;
DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
decoder->bitstream_buf = bit_buf;
decoder->bitstream_bits = bits;
decoder->bitstream_ptr = bit_ptr;
return i;
}
static void get_mpeg1_intra_block (mpeg2_decoder_t * const decoder)
{
int i;
int j;
int val;
const uint8_t * const scan = decoder->scan;
const uint16_t * const quant_matrix = decoder->quantizer_matrix[0];
const DCTtab * tab;
uint32_t bit_buf;
int bits;
const uint8_t * bit_ptr;
int16_t * const dest = decoder->DCTblock;
i = 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;
/* oddification */
val = (val - 1) | 1;
/* if (bitstream_get (1)) val = -val; */
val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
SATURATE (val);
dest[j] = 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -