📄 umc_mpeg2_dec_blk.cpp
字号:
}
i++;
UNPACK_VLC2(tbl, run, val, len);
i += run;
i &= 63;
j = scanMatrix[i];
val = (val*(quant*pQuantMatrix[j])) >> 4;
sign = SHBITS(code << len, 1);
APPLY_SIGN(val, sign);
SKIP_BITS(BS, (len + 1));
pDstBlock[j] = val;
#ifdef MISMATCH_INTRA
mask ^= val;
#endif
SHOW_HI9BITS(BS, code);
}
#ifdef MISMATCH_INTRA
pDstBlock[63] ^= mask & 1;
#endif
SKIP_BITS(BS, 2);
COPY_BITSTREAM(*BitStream, BS)
}
IDCT_INTRA(pDstBlock, i, idct, pDst, dstStep);
return ippStsOk;
}
/********************************************************************/
MP2_FUNC(IppStatus, ippiDecodeInter8x8IDCTAdd_MPEG1_1u8u, (
Ipp8u** BitStream_curr_ptr,
Ipp32s* BitStream_bit_offset,
IppiDecodeInterSpec_MPEG2* pQuantSpec,
Ipp32s quant,
Ipp8u* pSrcDst,
Ipp32s srcDstStep))
{
DEF_VARS();
COPY_BITSTREAM(BS, *BitStream)
if (!pQuantMatrix) pQuantMatrix = Qmatrix;
SHOW_HI9BITS(BS, code);
if (code & 0x80000000) { /* first 2-bit code */
val = (3*quant*pQuantMatrix[0]) >> 4;
val = (val - 1) | 1;
sign = SHBITS(code + code, 1);
APPLY_SIGN(val, sign);
for (k = 0; k < 64; k++) {
pDstBlock[k] = 0;
}
pDstBlock[0] = val;
SKIP_BITS(BS, 2);
SHOW_HI9BITS(BS, code);
i = 0;
} else {
for (k = 0; k < 64; k++) {
pDstBlock[k] = 0;
}
i = -1;
}
for (;;) {
if ((code & 0xc0000000) == 0x80000000) {
break;
} else if (code >= 0x08000000) {
tbl = MPEG2_VLC_TAB1[UHBITS(code - 0x08000000, 8)];
common:
i++;
UNPACK_VLC1(tbl, run, val, len)
i += run;
i &= 63;
j = scanMatrix[i];
val = (val * (quant*pQuantMatrix[j])) >> 4;
val = (val - 1) | 1;
sign = SHBITS(code << len, 1);
APPLY_SIGN(val, sign);
SKIP_BITS(BS, (len + 1));
pDstBlock[j] = val;
SHOW_HI9BITS(BS, code);
continue;
} else if (code >= 0x04000000) {
EXPAND_17BITS(BS, code);
i += 1 + UHBITS (code << 6, 6);
i &= 63;
j = scanMatrix[i];
SKIP_BITS(BS, 12);
GET_TO9BITS(BS, 8, val);
val = (Ipp8s)val;
if (!(val & 0x7f))
{
Ipp32s val2;
GET_TO9BITS(BS, 8, val2);
val = 2*val + val2;
}
sign = SHBITS(val, 1);
val = 2*(val + sign) + 1;
val = (val * (quant*pQuantMatrix[j])) / 16;
val = (val + ~sign) | 1;
SAT(val)
pDstBlock[j] = val;
SHOW_HI9BITS(BS, code);
continue;
} else {
EXPAND_17BITS(BS, code);
if (code >= 0x00800000) {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_10BIT + UHBITS(code, 13)];
goto common;
} else if (code >= 0x00200000) {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_15BIT + UHBITS(code, 15)];
goto common;
} else {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_16BIT + UHBITS(code, 16)];
if (code < 16)
return ippStsVLCErr;
code <<= 16;
SKIP_BITS(BS, 16);
goto common;
}
}
}
SKIP_BITS(BS, 2);
COPY_BITSTREAM(*BitStream, BS)
IDCT_INTER(pDstBlock, i, idct, pSrcDst, srcDstStep);
return ippStsOk;
}
MP2_FUNC(IppStatus, ippiDecodeIntra8x8IDCT_MPEG1_1u8u, (
Ipp8u** BitStream_curr_ptr,
Ipp32s* BitStream_bit_offset,
IppiDecodeIntraSpec_MPEG2* pQuantSpec,
Ipp32s quant,
Ipp32s blockType,
Ipp16s* dct_dc_past,
Ipp8u* pDst,
Ipp32s dstStep))
{
DEF_VARS();
Ipp32s chromaFlag = blockType & 1;
for (k = 0; k < 64; k++) {
pDstBlock[k] = 0;
}
COPY_BITSTREAM(BS, *BitStream)
/* DC */
DECODE_DC(val)
val += *dct_dc_past;
*dct_dc_past = val;
pDstBlock[0] = val << 3;
if (blockType & 4) { // D-type picture, DC coef only
COPY_BITSTREAM(*BitStream, BS)
IDCT_INTRA(pDstBlock, 0, idct, pDst, dstStep);
return ippStsOk;
}
i = 0;
SHOW_HI9BITS(BS, code);
for (;;) {
if ((code & 0xc0000000) == 0x80000000) {
break;
} else if (code >= 0x08000000) {
tbl = MPEG2_VLC_TAB1[UHBITS(code - 0x08000000, 8)];
} else if (code >= 0x04000000) {
EXPAND_17BITS(BS, code);
i += 1 + UHBITS(code << 6, 6);
i &= 63;
j = scanMatrix[i];
SKIP_BITS(BS, 12);
GET_TO9BITS(BS, 8, val);
val = (Ipp8s)val;
if (!(val & (Ipp8s)0x7f))
{
Ipp16s base = (val & 0x80) ? -256 : 0;
GET_TO9BITS(BS, 8, val);
val = (Ipp16s)(val+base);
}
sign = SHBITS(val, 1);
val = (val * (quant*pQuantMatrix[j])) / 8;
val = (val + ~sign) | 1;
SAT(val)
pDstBlock[j] = val;
SHOW_HI9BITS(BS, code);
continue;
} else {
EXPAND_17BITS(BS, code);
if (code >= 0x00800000) {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_10BIT + UHBITS(code, 13)];
} else if (code >= 0x00200000) {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_15BIT + UHBITS(code, 15)];
} else {
tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_16BIT + UHBITS(code, 16)];
if (code < 16)
return ippStsVLCErr;
code <<= 16;
SKIP_BITS(BS, 16);
}
}
i++;
UNPACK_VLC2(tbl, run, val, len)
i += run;
i &= 63;
j = scanMatrix[i];
val = (val*(quant*pQuantMatrix[j])) >> 3;
sign = SHBITS(code << len, 1);
val = (val-1) | 1;
APPLY_SIGN(val, sign);
SKIP_BITS(BS, (len + 1));
pDstBlock[j] = val;
SHOW_HI9BITS(BS, code);
}
SKIP_BITS(BS, 2);
COPY_BITSTREAM(*BitStream, BS)
IDCT_INTRA(pDstBlock, i, idct, pDst, dstStep);
return ippStsOk;
}
/*******************************************************/
/* ///////////////////////////////////////////////////////////////////////////
// Name:
// ippiDecodeIntraInit_MPEG2
// ippiDecodeInterInit_MPEG2
//
// Purpose:
// Initialized IppiDecodeIntraSpec_16s(IppiDecodeInterSpec_MPEG2) structure.
// If pQuantMatrix is NULL this means default quantization matrix.
//
// Parameters:
// pQuantMatrix Pointer to the quantization matrix size of 64.
// scan Type of the scan, takes one of the following values:
// IPPVC_SCAN_ZIGZAG, indicating the classical zigzag scan,
// IPPVC_SCAN_VERTICAL - alternate-vertical scan
// intraVLCFormat 0 or 1, defines one of two VLC tables for decoding intra blocks
// intraShiftDC Integer value for shifting intra DC coefficient after VLC decoding
// pSpec Pointer to the structure IppiDecodeIntraSpec_16s or
// IppiDecodeInterSpec_MPEG2 which will initialized.
//
// Returns:
// ippStsNoErr No error.
// ippStsNullPtrErr Indicates an error when pointer pSpec is NULL.
*/
MP2_FUNC(IppStatus, ippiDecodeIntraInit_MPEG2, (
const Ipp8u* pQuantMatrix,
Ipp32s flag,
Ipp32s intraVLCFormat,
Ipp32s intraShiftDC,
IppiDecodeIntraSpec_MPEG2* pSpec))
{
SCAN_MATRIX_TYPE *scan = scan_tbl[flag & 1]; // IPPVC_ALT_SCAN == 1
pSpec->intraVLCFormat = intraVLCFormat;
pSpec->intraShiftDC = intraShiftDC;
if (!(flag & IPPVC_LEAVE_SCAN_UNCHANGED)) {
pSpec->scanMatrix = scan;
}
if (!(flag & IPPVC_LEAVE_QUANT_UNCHANGED)) {
Ipp32s i;
if (!pQuantMatrix) pQuantMatrix = default_intra_quantizer_matrix;
pSpec->quantMatrix = pSpec->_quantMatrix;
for (i = 0; i < 64; i++) {
pSpec->quantMatrix[scan[i]] = pQuantMatrix[i];
}
}
return ippStsNoErr;
}
MP2_FUNC(IppStatus, ippiDecodeInterInit_MPEG2, (
const Ipp8u* pQuantMatrix,
Ipp32s flag,
IppiDecodeInterSpec_MPEG2* pSpec))
{
SCAN_MATRIX_TYPE *scan = scan_tbl[flag & 1];
if (!(flag & IPPVC_LEAVE_SCAN_UNCHANGED)) {
pSpec->scanMatrix = scan;
}
if (!(flag & IPPVC_LEAVE_QUANT_UNCHANGED)) {
if (pQuantMatrix) {
Ipp32s i, mask = 0;
pSpec->quantMatrix = pSpec->_quantMatrix;
for (i = 0; i < 64; i++) {
pSpec->quantMatrix[scan[i]] = pQuantMatrix[i];
mask |= pQuantMatrix[i];
}
if (mask == 16) { // default matrix
pSpec->quantMatrix = NULL;
}
} else {
pSpec->quantMatrix = NULL;
}
}
return ippStsNoErr;
}
/* /////////////////////////////////////////////////////////////////////////// */
/*static*/ void IDCTAdd_1x1to8x8(Ipp32s val, Ipp8u* y, Ipp32s step) {
Ipp32s i, j;
val = (val + 4) >> 3;
for (j = 0; j < 8; j++) {
for (i = 0; i < 8; i++) {
Ipp32s r = y[i] + val;
if (r < 0) r = 0;
if (r > 255) r = 255;
y[i] = r;
}
y += step;
}
}
#endif // UMC_ENABLE_MPEG2_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -