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

📄 umc_mpeg2_dec_mv.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 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 + -