📄 umc_mpeg2_dec_mc.cpp
字号:
Ipp32s nMCType0, nMCTypeUV0;
Ipp32s nMCType1, nMCTypeUV1;
Ipp32s off_l, off_c;
Ipp32s off0_l, off0_c;
Ipp32s off1_l, off1_c;
mv_decode_dp(video);
pitch_l = frame_buffer.Y_comp_pitch;
pitch_c = frame_buffer.U_comp_pitch;
ref_Y_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].Y_comp_data;
ref_U_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].U_comp_data;
ref_V_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].V_comp_data;
// create first vector for block
CALC_OFFSETS_FIELD_420(off_l, off_c, nMCType, nMCTypeUV, video->vector[0], video->vector[1], 0, HP_FLAG_AV)
// create second vector for upper halfblock
CALC_OFFSETS_FIELD_420(off0_l, off0_c, nMCType0, nMCTypeUV0, video->vector[4], video->vector[5], 0, HP_FLAG_AV)
// create second vector for lower halfblock
CALC_OFFSETS_FIELD_420(off1_l, off1_c, nMCType1, nMCTypeUV1, video->vector[6], video->vector[7], 0, HP_FLAG_AV)
CHECK_OFFSET_L(off_l+pitch_l+(video->vector[0]&1), pitch_l*2, 8+(video->vector[1]&1))
CHECK_OFFSET_L(off0_l+pitch_l+(video->vector[4]&1), pitch_l*2, 8+(video->vector[5]&1))
CHECK_OFFSET_L(off1_l+pitch_l+(video->vector[6]&1), pitch_l*2, 8+(video->vector[7]&1))
FUNC_AVE_HP_B(16, 8, ref_Y_data+off_l, pitch_l * 2, nMCType,
ref_Y_data+off0_l + pitch_l, pitch_l * 2, nMCType0,
cur_Y_data, pitch_l * 2,
0);
FUNC_AVE_HP_B(16, 8, ref_Y_data+off_l+pitch_l, pitch_l * 2, nMCType,
ref_Y_data+off1_l, pitch_l * 2, nMCType1,
cur_Y_data + pitch_l, pitch_l * 2,
0);
FUNC_AVE_HP_B(8, 4, ref_U_data+off_c, pitch_c * 2, nMCTypeUV,
ref_U_data+off0_c + pitch_c, pitch_c * 2, nMCTypeUV0,
cur_U_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 4, ref_U_data+off_c + pitch_c, pitch_c * 2, nMCTypeUV,
ref_U_data+off1_c, pitch_c * 2, nMCTypeUV1,
cur_U_data + pitch_c, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 4, ref_V_data+off_c, pitch_c * 2, nMCTypeUV,
ref_V_data+off0_c + pitch_c, pitch_c * 2, nMCTypeUV0,
cur_V_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 4, ref_V_data+off_c + pitch_c, pitch_c * 2, nMCTypeUV,
ref_V_data+off1_c, pitch_c * 2, nMCTypeUV1,
cur_V_data + pitch_c, pitch_c * 2,
0);
return UMC_OK;
} //mc_dualprime_frame
Status MPEG2VideoDecoderBase::mc_dualprime_field_420(IppVideoContext *video)
{
Ipp32s pitch_l, pitch_c;
Ipp8u *ref_Y_data, *ref_U_data, *ref_V_data;
Ipp8u *prev_Y_data, *prev_U_data, *prev_V_data;
Ipp8u *cur_Y_data = video->blkCurrYUV[0];
Ipp8u *cur_U_data = video->blkCurrYUV[1];
Ipp8u *cur_V_data = video->blkCurrYUV[2];
Ipp32s nMCType, nMCTypeUV, nMCType2, nMCTypeUV2;
Ipp32s off_l, off_c, off2_l, off2_c;
Ipp32s off_fld, off_fldUV;
mv_decode_dp(video);
pitch_l = frame_buffer.Y_comp_pitch;
pitch_c = frame_buffer.U_comp_pitch;
off_fld = 0;
off_fldUV = 0;
if(PictureHeader.picture_structure == BOTTOM_FIELD) {
off_fld = pitch_l;
off_fldUV = pitch_c;
}
prev_Y_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].Y_comp_data;
prev_U_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].U_comp_data;
prev_V_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].V_comp_data;
// for opposite parity
if(frame_buffer.field_buffer_index) { // second field
ref_Y_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].Y_comp_data;
ref_U_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].U_comp_data;
ref_V_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].V_comp_data;
} else {
ref_Y_data = prev_Y_data;
ref_U_data = prev_U_data;
ref_V_data = prev_V_data;
}
// create first vector for block (same parity)
CALC_OFFSETS_FIELD_420(off_l, off_c, nMCType, nMCTypeUV, video->vector[0], video->vector[1], 0, HP_FLAG_AV)
// create second vector for block (opposite parity)
CALC_OFFSETS_FIELD_420(off2_l, off2_c, nMCType2, nMCTypeUV2, video->vector[4], video->vector[5], 0, HP_FLAG_AV)
CHECK_OFFSET_L(off_l+(video->vector[0]&1), pitch_l*2, 16+(video->vector[1]&1))
CHECK_OFFSET_L(off2_l+pitch_l -2*off_fld +(video->vector[4]&1), pitch_l*2, 16+(video->vector[5]&1))
FUNC_AVE_HP_B(16, 16, prev_Y_data + off_l, pitch_l * 2, nMCType,
ref_Y_data + off2_l + pitch_l - 2 * off_fld, pitch_l * 2, nMCType2,
cur_Y_data, pitch_l * 2,
0);
FUNC_AVE_HP_B(8, 8, prev_U_data + off_c, pitch_c * 2, nMCTypeUV,
ref_U_data + off2_c + pitch_c - 2 * off_fldUV, pitch_c * 2, nMCTypeUV2,
cur_U_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 8, prev_V_data + off_c, pitch_c * 2, nMCTypeUV,
ref_V_data + off2_c + pitch_c - 2 * off_fldUV, pitch_c * 2, nMCTypeUV2,
cur_V_data, pitch_c * 2,
0);
return UMC_OK;
} //mc_dualprime_field_420
Status MPEG2VideoDecoderBase::mc_dualprime_frame_422(IppVideoContext *video)
{
Ipp32s pitch_l, pitch_c;
Ipp8u *ref_Y_data, *ref_U_data, *ref_V_data;
Ipp8u *cur_Y_data = video->blkCurrYUV[0];
Ipp8u *cur_U_data = video->blkCurrYUV[1];
Ipp8u *cur_V_data = video->blkCurrYUV[2];
Ipp32s nMCType, nMCTypeUV;
Ipp32s nMCType0, nMCTypeUV0;
Ipp32s nMCType1, nMCTypeUV1;
Ipp32s off_l, off_c;
Ipp32s off0_l, off0_c;
Ipp32s off1_l, off1_c;
mv_decode_dp(video);
pitch_l = frame_buffer.Y_comp_pitch;
pitch_c = frame_buffer.U_comp_pitch;
ref_Y_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].Y_comp_data;
ref_U_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].U_comp_data;
ref_V_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].V_comp_data;
// create first vector for block
CALC_OFFSETS_FIELD_422(off_l, off_c, nMCType, nMCTypeUV, video->vector[0], video->vector[1], 0, HP_FLAG_AV)
// create second vector for upper halfblock
CALC_OFFSETS_FIELD_422(off0_l, off0_c, nMCType0, nMCTypeUV0, video->vector[4], video->vector[5], 0, HP_FLAG_AV)
// create second vector for lower halfblock
CALC_OFFSETS_FIELD_422(off1_l, off1_c, nMCType1, nMCTypeUV1, video->vector[6], video->vector[7], 0, HP_FLAG_AV)
CHECK_OFFSET_L(off_l+pitch_l+(video->vector[0]&1), pitch_l*2, 8+(video->vector[1]&1))
CHECK_OFFSET_L(off0_l+pitch_l+(video->vector[4]&1), pitch_l*2, 8+(video->vector[5]&1))
CHECK_OFFSET_L(off1_l+pitch_l+(video->vector[6]&1), pitch_l*2, 8+(video->vector[7]&1))
FUNC_AVE_HP_B(16, 8, ref_Y_data+off_l, pitch_l * 2, nMCType,
ref_Y_data+off0_l + pitch_l, pitch_l * 2, nMCType0,
cur_Y_data, pitch_l * 2,
0);
FUNC_AVE_HP_B(16, 8, ref_Y_data+off_l+pitch_l, pitch_l * 2, nMCType,
ref_Y_data+off1_l, pitch_l * 2, nMCType1,
cur_Y_data + pitch_l, pitch_l * 2,
0);
FUNC_AVE_HP_B(8, 8, ref_U_data+off_c, pitch_c * 2, nMCTypeUV,
ref_U_data+off0_c + pitch_c, pitch_c * 2, nMCTypeUV0,
cur_U_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 8, ref_U_data+off_c + pitch_c, pitch_c * 2, nMCTypeUV,
ref_U_data+off1_c, pitch_c * 2, nMCTypeUV1,
cur_U_data + pitch_c, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 8, ref_V_data+off_c, pitch_c * 2, nMCTypeUV,
ref_V_data+off0_c + pitch_c, pitch_c * 2, nMCTypeUV0,
cur_V_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 8, ref_V_data+off_c + pitch_c, pitch_c * 2, nMCTypeUV,
ref_V_data+off1_c, pitch_c * 2, nMCTypeUV1,
cur_V_data + pitch_c, pitch_c * 2,
0);
return UMC_OK;
} //mc_dualprime_frame_422
Status MPEG2VideoDecoderBase::mc_dualprime_field_422(IppVideoContext *video)
{
Ipp32s pitch_l, pitch_c;
Ipp8u *ref_Y_data, *ref_U_data, *ref_V_data;
Ipp8u *prev_Y_data, *prev_U_data, *prev_V_data;
Ipp8u *cur_Y_data = video->blkCurrYUV[0];
Ipp8u *cur_U_data = video->blkCurrYUV[1];
Ipp8u *cur_V_data = video->blkCurrYUV[2];
Ipp32s nMCType, nMCTypeUV, nMCType2, nMCTypeUV2;
Ipp32s off_l, off_c, off2_l, off2_c;
Ipp32s off_fld, off_fldUV;
mv_decode_dp(video);
pitch_l = frame_buffer.Y_comp_pitch;
pitch_c = frame_buffer.U_comp_pitch;
off_fld = 0;
off_fldUV = 0;
if(PictureHeader.picture_structure == BOTTOM_FIELD) {
off_fld = pitch_l;
off_fldUV = pitch_c;
}
prev_Y_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].Y_comp_data;
prev_U_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].U_comp_data;
prev_V_data = frame_buffer.frame_p_c_n[frame_buffer.prev_index].V_comp_data;
// for opposite parity
if(frame_buffer.field_buffer_index) { // second field
ref_Y_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].Y_comp_data;
ref_U_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].U_comp_data;
ref_V_data = frame_buffer.frame_p_c_n[frame_buffer.curr_index].V_comp_data;
} else {
ref_Y_data = prev_Y_data;
ref_U_data = prev_U_data;
ref_V_data = prev_V_data;
}
// create first vector for block (same parity)
CALC_OFFSETS_FIELD_422(off_l, off_c, nMCType, nMCTypeUV, video->vector[0], video->vector[1], 0, HP_FLAG_AV)
// create second vector for block (opposite parity)
CALC_OFFSETS_FIELD_422(off2_l, off2_c, nMCType2, nMCTypeUV2, video->vector[4], video->vector[5], 0, HP_FLAG_AV)
CHECK_OFFSET_L(off_l+(video->vector[0]&1), pitch_l*2, 16+(video->vector[1]&1))
CHECK_OFFSET_L(off2_l+pitch_l -2*off_fld +(video->vector[4]&1), pitch_l*2, 16+(video->vector[5]&1))
FUNC_AVE_HP_B(16, 16, prev_Y_data + off_l, pitch_l * 2, nMCType,
ref_Y_data + off2_l + pitch_l - 2 * off_fld, pitch_l * 2, nMCType2,
cur_Y_data, pitch_l * 2,
0);
FUNC_AVE_HP_B(8, 16, prev_U_data + off_c, pitch_c * 2, nMCTypeUV,
ref_U_data + off2_c + pitch_c - 2 * off_fldUV, pitch_c * 2, nMCTypeUV2,
cur_U_data, pitch_c * 2,
0);
FUNC_AVE_HP_B(8, 16, prev_V_data + off_c, pitch_c * 2, nMCTypeUV,
ref_V_data + off2_c + pitch_c - 2 * off_fldUV, pitch_c * 2, nMCTypeUV2,
cur_V_data, pitch_c * 2,
0);
return UMC_OK;
} //mc_dualprime_field_422
#endif // UMC_ENABLE_MPEG2_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -