📄 umc_mpeg2_dec_mv.cpp
字号:
/*////////////////////////////////////////////////////////////////////////////////// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include "umc_mpeg2_dec_base.h"#pragma warning(disable: 4244)using namespace UMC;Status MPEG2VideoDecoderBase::mv_decode(int r,int s, int threadID){ IppVideoContext* video = &Video[threadID]; sMacroblock *pMacro = &Video[threadID].macroblock; int index = 4*r + 2*s; short *c_mv = &pMacro->vector[index]; short *c_mvl = &pMacro->vector_luma[index]; short *c_mvc = &pMacro->vector_chroma[index]; short *c_pmv = &pMacro->PMV[index]; int residual, mcode; int framefieldflag = (pMacro->prediction_type == IPPVC_MC_FIELD) && (PictureHeader.picture_structure == IPPVC_FRAME_PICTURE); // Decode x vector DECODE_VLC(mcode, video->bs, vlcMotionVector); c_mv[0] = c_pmv[0]; if(mcode) { if(PictureHeader.r_size[2*s]) { GET_TO9BITS(video->bs,PictureHeader.r_size[2*s], residual); if(mcode < 0) { c_mv[0] += ((mcode + 1) << PictureHeader.r_size[2*s]) - (residual + 1); if(c_mv[0] < PictureHeader.low_in_range[2*s]) c_mv[0] += PictureHeader.range[2*s]; } else { c_mv[0] += ((mcode - 1) << PictureHeader.r_size[2*s]) + (residual + 1); if(c_mv[0] > PictureHeader.high_in_range[2*s]) c_mv[0] -= PictureHeader.range[2*s]; } } else { c_mv[0] += mcode; if(c_mv[0] < PictureHeader.low_in_range[2*s]) c_mv[0] += PictureHeader.range[2*s]; else if(c_mv[0] > PictureHeader.high_in_range[2*s]) c_mv[0] -= PictureHeader.range[2*s]; } c_pmv[0] = c_mv[0]; } // Decode y vector DECODE_VLC(mcode, video->bs, vlcMotionVector); c_mv[1] = c_pmv[1] >> framefieldflag; // frame y to field if(mcode) { if(PictureHeader.r_size[2*s+1]) { GET_TO9BITS(video->bs,PictureHeader.r_size[2*s+1], residual); if(mcode < 0) { c_mv[1] += ((mcode + 1) << PictureHeader.r_size[2*s+1]) - (residual + 1); if(c_mv[1] < PictureHeader.low_in_range[2*s+1]) c_mv[1] += PictureHeader.range[2*s+1]; } else { c_mv[1] += ((mcode - 1) << PictureHeader.r_size[2*s+1]) + (residual + 1); if(c_mv[1] > PictureHeader.high_in_range[2*s+1]) c_mv[1] -= PictureHeader.range[2*s+1]; } } else { c_mv[1] += mcode; if(c_mv[1] < PictureHeader.low_in_range[2*s+1]) c_mv[1] += PictureHeader.range[2*s+1]; else if(c_mv[1] > PictureHeader.high_in_range[2*s+1]) c_mv[1] -= PictureHeader.range[2*s+1]; } c_pmv[1] = c_mv[1]; } c_pmv[1] = c_mv[1] << framefieldflag; // field y back to frame c_mvl[0] = c_mv[0] >> 1; c_mvl[1] = c_mv[1] >> 1; c_mvc[0] = (c_mv[0]/2) >> 1; c_mvc[1] = (c_mv[1]/2) >> 1 ; return UMC_OK;}Status MPEG2VideoDecoderBase::mv_decode_dp(int threadID){ IppVideoContext* video = &Video[threadID]; sMacroblock *pMacro = &Video[threadID].macroblock; short *c_mv = &pMacro->vector[0]; short *c_mvl = &pMacro->vector_luma[0]; short *c_mvc = &pMacro->vector_chroma[0]; short *c_pmv = &pMacro->PMV[0]; int residual, mcode; int dmv0 = 0, dmv1 = 0; int ispos0, ispos1; // Decode x vector DECODE_VLC(mcode, video->bs, vlcMotionVector); c_mv[0] = c_pmv[0]; if(mcode) { if(PictureHeader.r_size[0]) { GET_TO9BITS(video->bs,PictureHeader.r_size[0], residual); if(mcode < 0) { c_mv[0] += ((mcode + 1) << PictureHeader.r_size[0]) - (residual + 1); if(c_mv[0] < PictureHeader.low_in_range[0]) c_mv[0] += PictureHeader.range[0]; } else { c_mv[0] += ((mcode - 1) << PictureHeader.r_size[0]) + (residual + 1); if(c_mv[0] > PictureHeader.high_in_range[0]) c_mv[0] -= PictureHeader.range[0]; } } else { c_mv[0] += mcode; if(c_mv[0] < PictureHeader.low_in_range[0]) c_mv[0] += PictureHeader.range[0]; else if(c_mv[0] > PictureHeader.high_in_range[0]) c_mv[0] -= PictureHeader.range[0]; } c_pmv[0] = c_mv[0]; } //get dmv0 GET_1BIT(video->bs, dmv0); if(dmv0 == 1) { GET_1BIT(video->bs, dmv0); dmv0 = (dmv0 == 1)?-1:1; } // Decode y vector if (PictureHeader.picture_structure == IPPVC_FRAME_PICTURE) c_pmv[1] >>= 1; DECODE_VLC(mcode, video->bs, vlcMotionVector); c_mv[1] = c_pmv[1]; if(mcode) { if(PictureHeader.r_size[1]) { GET_TO9BITS(video->bs,PictureHeader.r_size[1], residual); if(mcode < 0) { c_mv[1] += ((mcode + 1) << PictureHeader.r_size[1]) - (residual + 1); if(c_mv[1] < PictureHeader.low_in_range[1]) c_mv[1] += PictureHeader.range[1]; } else { c_mv[1] += ((mcode - 1) << PictureHeader.r_size[1]) + (residual + 1); if(c_mv[1] > PictureHeader.high_in_range[1]) c_mv[1] -= PictureHeader.range[1]; } } else { c_mv[1] += mcode; if(c_mv[1] < PictureHeader.low_in_range[1]) c_mv[1] += PictureHeader.range[1]; else if(c_mv[1] > PictureHeader.high_in_range[1]) c_mv[1] -= PictureHeader.range[1]; } c_pmv[1] = c_mv[1]; } //get dmv1 GET_1BIT(video->bs, dmv1); if(dmv1 == 1) { GET_1BIT(video->bs, dmv1); dmv1 = (dmv1 == 1)?-1:1; } //Dual Prime Arithmetic ispos0 = c_pmv[0]>=0; ispos1 = c_pmv[1]>=0; if (PictureHeader.picture_structure == IPPVC_FRAME_PICTURE) { if (PictureHeader.top_field_first ) { /* vector for prediction of top field from bottom field */ c_mv[4] = ((c_pmv[0] + ispos0)>>1) + dmv0; c_mv[5] = ((c_pmv[1] + ispos1)>>1) + dmv1 - 1; /* vector for prediction of bottom field from top field */ c_mv[6] = ((3*c_pmv[0] + ispos0)>>1) + dmv0; c_mv[7] = ((3*c_pmv[1] + ispos1)>>1) + dmv1 + 1; } else { /* vector for prediction of top field from bottom field */ c_mv[4] = ((3*c_pmv[0] + ispos0)>>1) + dmv0; c_mv[5] = ((3*c_pmv[1] + ispos1)>>1) + dmv1 - 1; /* vector for prediction of bottom field from top field */ c_mv[6] = ((c_pmv[0] + ispos0)>>1) + dmv0; c_mv[7] = ((c_pmv[1] + ispos1)>>1) + dmv1 + 1; } c_mvl[6] = c_mv[6] >> 1; c_mvl[7] = c_mv[7] >> 1; c_mvc[6] = (c_mv[6]/2) >> 1; c_mvc[7] = (c_mv[7]/2) >> 1 ; c_pmv[1] <<= 1; c_pmv[4] = c_pmv[0]; c_pmv[5] = c_pmv[1]; } else { //Dual Prime Arithmetic // vector for prediction from field of opposite parity c_mv[4] = ((c_pmv[0]+ispos0)>>1) + dmv0; c_mv[5] = ((c_pmv[1]+ispos1)>>1) + dmv1; /* correct for vertical field shift */ if (PictureHeader.picture_structure == TOP_FIELD) c_mv[5]--; else c_mv[5]++; } c_mvl[4] = c_mv[4] >> 1; c_mvl[5] = c_mv[5] >> 1; c_mvc[4] = (c_mv[4]/2) >> 1; c_mvc[5] = (c_mv[5]/2) >> 1 ; c_mvl[0] = c_mv[0] >> 1; c_mvl[1] = c_mv[1] >> 1; c_mvc[0] = (c_mv[0]/2) >> 1; c_mvc[1] = (c_mv[1]/2) >> 1 ; pMacro->motion_vertical_field_select[0] = 0; pMacro->motion_vertical_field_select[2] = 0; return UMC_OK;}Status MPEG2VideoDecoderBase::mv_decode_full_pel(int s, int threadID){ IppVideoContext* video = &Video[threadID]; sMacroblock *pMacro = &Video[threadID].macroblock; int index = 2*s; short *c_mv = &pMacro->vector[index]; short *c_mvl = &pMacro->vector_luma[index]; short *c_mvc = &pMacro->vector_chroma[index]; short *c_pmv = &pMacro->PMV[index]; int residual, mcode; // Decode x vector DECODE_VLC(mcode, video->bs, vlcMotionVector); c_mv[0] = c_pmv[0]; if(mcode) { if(PictureHeader.r_size[2*s]) { GET_TO9BITS(video->bs,PictureHeader.r_size[2*s], residual); if(mcode < 0) { c_mv[0] += 2*(((mcode + 1) << PictureHeader.r_size[2*s]) - (residual + 1)); if(c_mv[0] < 2*PictureHeader.low_in_range[2*s]) c_mv[0] += 2*PictureHeader.range[2*s]; } else { c_mv[0] += 2*(((mcode - 1) << PictureHeader.r_size[2*s]) + (residual + 1)); if(c_mv[0] > 2*PictureHeader.high_in_range[2*s]) c_mv[0] -= 2*PictureHeader.range[2*s]; } } else { c_mv[0] += 2*mcode; if(c_mv[0] < 2*PictureHeader.low_in_range[2*s]) c_mv[0] += 2*PictureHeader.range[2*s]; else if(c_mv[0] > 2*PictureHeader.high_in_range[2*s]) c_mv[0] -= 2*PictureHeader.range[2*s]; } c_pmv[0] = c_mv[0]; } // Decode y vector DECODE_VLC(mcode, video->bs, vlcMotionVector); if(mcode) { if(PictureHeader.r_size[2*s+1]) { GET_TO9BITS(video->bs,PictureHeader.r_size[2*s+1], residual); if(mcode < 0) { c_mv[1] += 2*(((mcode + 1) << PictureHeader.r_size[2*s+1]) - (residual + 1)); if(c_mv[1] < 2*PictureHeader.low_in_range[2*s+1]) c_mv[1] += 2*PictureHeader.range[2*s+1]; } else { c_mv[1] += 2*(((mcode - 1) << PictureHeader.r_size[2*s+1]) + (residual + 1)); if(c_mv[1] > 2*PictureHeader.high_in_range[2*s+1]) c_mv[1] -= 2*PictureHeader.range[2*s+1]; } } else { c_mv[1] += 2*mcode; if(c_mv[1] < 2*PictureHeader.low_in_range[2*s+1]) c_mv[1] += 2*PictureHeader.range[2*s+1]; else if(c_mv[1] > 2*PictureHeader.high_in_range[2*s+1]) c_mv[1] -= 2*PictureHeader.range[2*s+1]; } c_pmv[1] = c_mv[1]; } c_mvl[0] = c_mv[0] >> 1; c_mvl[1] = c_mv[1] >> 1; c_mvc[0] = c_mv[0]>>2; c_mvc[1] = c_mv[1] >> 2; return UMC_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -