📄 umc_mpeg2_dec_defs.h
字号:
&BITSTREAM##_bit_offset, \
intraSpec, \
video->cur_q_scale, \
chromaFlag, \
&video->dct_dc_past[cc], \
yuv[cc] + offsets[blk], \
pitch[chromaFlag]); \
if(sts != ippStsOk) \
return sts; \
} \
}
#define RECONSTRUCT_INTRA_MB_420(BITSTREAM, DCT_TYPE) \
RECONSTRUCT_INTRA_MB(BITSTREAM, 6, DCT_TYPE)
#define RECONSTRUCT_INTRA_MB_422(BITSTREAM, DCT_TYPE) \
RECONSTRUCT_INTRA_MB(BITSTREAM, 8, DCT_TYPE)
#define DECODE_MBPATTERN_6(code, BITSTREAM, vlcMBPattern) \
DECODE_VLC(code, BITSTREAM, vlcMBPattern)
#define DECODE_MBPATTERN_8(code, BITSTREAM, vlcMBPattern) \
{ \
Ipp32s cbp_1; \
DECODE_VLC(code, BITSTREAM, vlcMBPattern); \
GET_TO9BITS(video->bs, 2, cbp_1); \
code = (code << 2) | cbp_1; \
}
#define RECONSTRUCT_INTER_MB(BITSTREAM, NUM_BLK, DCT_TYPE) \
{ \
IppiDecodeInterSpec_MPEG2 *interSpec = &video->decodeInterSpec; \
Ipp32s cur_q_scale = video->cur_q_scale; \
Ipp32s *pitch = blkPitches[DCT_TYPE]; \
Ipp32s *offsets = blkOffsets[DCT_TYPE]; \
Ipp32s mask = 1 << (NUM_BLK - 1); \
Ipp32s code; \
Ipp32s blk; \
\
DECODE_MBPATTERN_##NUM_BLK(code, BITSTREAM, vlcMBPattern); \
\
for (blk = 0; blk < NUM_BLK; blk++) { \
if (code & mask) { \
IppStatus sts; \
Ipp32s chromaFlag = blk >> 2; \
Ipp32s cc = chromaFlag + (blk & chromaFlag); \
if (NUM_BLK > 6) \
interSpec = chromaFlag ? &video->decodeInterSpecChroma : &video->decodeInterSpec; \
\
sts = ippiDecodeInter8x8IDCTAdd_MPEG2_1u8u( \
&BITSTREAM##_curr_ptr, \
&BITSTREAM##_bit_offset, \
interSpec, \
cur_q_scale, \
video->blkCurrYUV[cc] + offsets[blk], \
pitch[chromaFlag]); \
if(sts != ippStsOk) \
return sts; \
} \
code += code; \
} \
}
#define RECONSTRUCT_INTER_MB_420(BITSTREAM, DCT_TYPE) \
RECONSTRUCT_INTER_MB(BITSTREAM, 6, DCT_TYPE)
#define RECONSTRUCT_INTER_MB_422(BITSTREAM, DCT_TYPE) \
RECONSTRUCT_INTER_MB(BITSTREAM, 8, DCT_TYPE)
#define UPDATE_MV(val, mcode, S) \
if(PictureHeader.r_size[S]) { \
GET_TO9BITS(video->bs,PictureHeader.r_size[S], residual); \
if(mcode < 0) { \
val += ((mcode + 1) << PictureHeader.r_size[S]) - (residual + 1); \
if(val < PictureHeader.low_in_range[S]) \
val += PictureHeader.range[S]; \
} else { \
val += ((mcode - 1) << PictureHeader.r_size[S]) + (residual + 1); \
if(val > PictureHeader.high_in_range[S]) \
val -= PictureHeader.range[S]; \
} \
} else { \
val += mcode; \
if(val < PictureHeader.low_in_range[S]) \
val += PictureHeader.range[S]; \
else if(val > PictureHeader.high_in_range[S]) \
val -= PictureHeader.range[S]; \
}
#define DECODE_MV(BS, R, S, vectorX, vectorY) \
/* R = 2*(2*r + s); S = 2*s */ \
/* Decode x vector */ \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&video->PMV[R], S, video); \
} \
vectorX = video->PMV[R]; \
\
/* Decode y vector */ \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&video->PMV[R + 1], S + 1, video); \
} \
vectorY = video->PMV[R + 1]
#define DECODE_MV_FIELD(BS, R, S, vectorX, vectorY) \
/* R = 2*(2*r + s); S = 2*s */ \
/* Decode x vector */ \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&video->PMV[R], S, video); \
} \
vectorX = video->PMV[R]; \
\
/* Decode y vector */ \
vectorY = video->PMV[R + 1] >> 1; \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&vectorY, S + 1, video); \
} \
video->PMV[R + 1] = vectorY << 1
#define DECODE_MV_FULLPEL(BS, R, S, vectorX, vectorY) \
/* R = 2*(2*r + s); S = 2*s */ \
/* Decode x vector */ \
vectorX = video->PMV[R] >> 1; \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&vectorX, S, video); \
} \
video->PMV[R] = vectorX << 1; \
\
/* Decode y vector */ \
vectorY = video->PMV[R + 1] >> 1; \
if (IS_NEXTBIT1(BS)) { \
SKIP_BITS(BS, 1) \
} else { \
update_mv(&vectorY, S + 1, video); \
} \
video->PMV[R + 1] = vectorY << 1
#define DECODE_QUANTIZER_SCALE(BS, Q_SCALE) \
{ \
Ipp32s _q_scale; \
GET_TO9BITS(video->bs, 5, _q_scale) \
if (_q_scale < 1) { \
return UMC_ERR_INVALID_STREAM; \
} \
Q_SCALE = q_scale[PictureHeader.q_scale_type][_q_scale]; \
}
#define DECODE_MB_INCREMENT(BS, macroblock_address_increment) \
{ \
Ipp32s code; \
SHOW_BITS(BS, 11, code) \
\
if(code == 0) { \
return UMC_OK; /* end of slice or bad code. Anyway, stop slice */ \
} \
\
macroblock_address_increment = 0; \
while(code == 8) \
{ \
macroblock_address_increment += 33; /* macroblock_escape */ \
GET_BITS(BS, 11, code); \
SHOW_BITS(BS, 11, code) \
} \
DECODE_VLC(code, BS, vlcMBAdressing); \
macroblock_address_increment += code; \
macroblock_address_increment--; \
if (macroblock_address_increment > (sequenceHeader.mb_width - video->mb_col)) { \
macroblock_address_increment = sequenceHeader.mb_width - video->mb_col; \
} \
}
////////////////////////////////////////////////////////////////////
#define APPLY_SIGN(val, sign) \
val += sign; \
if (val > 2047) val = 2047; /* with saturation */ \
val ^= sign
#define SAT(val) \
if (val > 2047) val = 2047; \
if (val < -2048) val = -2048;
#ifdef LOCAL_BUFFERS
#define DEF_BLOCK(NAME) \
Ipp16s NAME[64];
#else
#define DEF_BLOCK(NAME) \
Ipp16s *NAME = pQuantSpec->NAME;
#endif
#define MP2_FUNC(type, name, arg) type name arg
#define FUNC_DCT8x8 ippiDCT8x8Inv_16s_C1
#define FUNC_DCT4x4 ippiDCT8x8Inv_4x4_16s_C1
#define FUNC_DCT2x2 ippiDCT8x8Inv_2x2_16s_C1
#define FUNC_DCT8x8Intra ippiDCT8x8Inv_16s8u_C1R
#define FUNC_ADD8x8 ippiAdd8x8_16s8u_C1IRS
void IDCTAdd_1x1to8x8(Ipp32s val, Ipp8u* y, Ipp32s step);
void IDCTAdd_1x4to8x8(const Ipp16s* x, Ipp8u* y, Ipp32s step);
void Pack8x8(Ipp16s* x, Ipp8u* y, Ipp32s step);
#define IDCT_INTER_1x4(SRC, NUM, DST, STEP)
#define IDCT_INTER(SRC, NUM, BUFF, DST, STEP) \
if (NUM < 10) { \
if (!NUM) { \
IDCTAdd_1x1to8x8(SRC[0], DST, STEP); \
} else \
IDCT_INTER_1x4(SRC, NUM, DST, STEP) \
/*if (NUM < 2) { \
FUNC_DCT2x2(SRC, BUFF); \
FUNC_ADD8x8(BUFF, 16, DST, STEP); \
} else*/ { \
FUNC_DCT4x4(SRC, BUFF); \
FUNC_ADD8x8(BUFF, 16, DST, STEP); \
} \
} else { \
FUNC_DCT8x8(SRC, BUFF); \
FUNC_ADD8x8(BUFF, 16, DST, STEP); \
}
#define IDCT_INTER1(val, idct, pSrcDst, srcDstStep) \
ippiAddC8x8_16s8u_C1IR((val + 4) >> 3, pSrcDst, srcDstStep)
#define IDCT_INTRA(SRC, NUM, BUFF, DST, STEP) \
if (!NUM) { \
ippiDCT8x8Inv_AANTransposed_16s8u_C1R(SRC, DST, STEP, 0); \
} else { \
FUNC_DCT8x8Intra(SRC, DST, STEP); \
}
#define IDCT_INTRA1(val, idct, pSrcDst, srcDstStep) \
pDstBlock[0] = val; \
ippiDCT8x8Inv_AANTransposed_16s8u_C1R(pDstBlock, pSrcDst, srcDstStep, 0)
#endif // __UMC_MPEG2_DEC_DEFS_H
#endif // UMC_ENABLE_MPEG2_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -