⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_mpeg2_dec_mc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  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 + -