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

📄 h263decfuncs.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 4 页
字号:
          ippiDCT8x8Inv_2x2_16s_C1I(coeff);
        else if ((lnz <= 13) && (coeff[32] == 0))
          ippiDCT8x8Inv_4x4_16s_C1I(coeff);
        else
          ippiDCT8x8Inv_16s_C1I(coeff);
      } else {
        h263_Set64_16s((Ipp16s)((coeff[0] + 4) >> 3), coeff);
      }
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_C);
    } else {
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
    }
    pm >>= 1;
    coeff += 64;
  }
  return H263_STATUS_OK;
}

h263_Status h263_BidirPredMacroblock(Ipp8u *pYr, Ipp32s stepYr, Ipp8u *pCbr, Ipp8u* pCrr, Ipp32s stepCr,
                                     Ipp8u *pYc, Ipp32s stepYc, Ipp8u *pCbc, Ipp8u* pCrc, Ipp32s stepCc,
                                     Ipp8u *predMB, IppMotionVector *mvForw, IppMotionVector *mvFCbCr,
                                     IppMotionVector *mvBack, IppMotionVector *mvBCbCr, Ipp32s fourMVmode)
{
  Ipp32s mvx0, mvx1, mvy0, mvy1, xL0, w0, xL, xR, yT, yB;
  IppiSize roiSize;
  Ipp8u *pCur;

  if (!fourMVmode)
    h263_Copy16x16HP_8u(pYr, stepYr, predMB, 16, &mvForw[0], 0);
  else {
    h263_Copy8x8HP_8u(pYr, stepYr, predMB, 16, &mvForw[0], 0);
    h263_Copy8x8HP_8u(pYr + 8, stepYr, predMB + 8, 16, &mvForw[1], 0);
    h263_Copy8x8HP_8u(pYr + 8*stepYr, stepYr, predMB + 8*16, 16, &mvForw[2], 0);
    h263_Copy8x8HP_8u(pYr + 8 + 8*stepYr, stepYr, predMB + 8 + 8*16, 16, &mvForw[3], 0);
  }
  h263_Copy8x8HP_8u(pCbr, stepCr, predMB + 4*64, 8, mvFCbCr, 0);
  h263_Copy8x8HP_8u(pCrr, stepCr, predMB + 5*64, 8, mvFCbCr, 0);

  pCur = pYc + H263_MV_OFF_HP(mvBack[0].dx, mvBack[0].dy, stepYc);
  pCbc += H263_MV_OFF_HP(mvBCbCr->dx, mvBCbCr->dy, stepCc);
  pCrc += H263_MV_OFF_HP(mvBCbCr->dx, mvBCbCr->dy, stepCc);

  mvx0 = (-mvBack[0].dx + 1) >> 1;
  mvx1 = 16 - ((mvBack[0].dx + 1) >> 1);
  mvy0 = (-mvBack[0].dy + 1) >> 1;
  mvy1 = 16 - ((mvBack[0].dy + 1) >> 1);

  xL = IPP_MAX(mvx0, 0);
  xR = IPP_MIN(mvx1, 8);
  roiSize.width = xR - xL;
  yT = IPP_MAX(mvy0, 0);
  yB = IPP_MIN(mvy1, 8);
  roiSize.height = yB - yT;
  h263_AddBackPredPB_8u(pCur + xL + yT*stepYc, stepYc, roiSize, predMB + xL + yT*16, 16, &mvBack[0]);

  if (!fourMVmode) {
    xL0 = xL;
    w0 = roiSize.width;
    xL = IPP_MAX(mvx0 - 8, 0);
    xR = IPP_MIN(mvx1 - 8, 8);
    roiSize.width = xR - xL;
    h263_AddBackPredPB_8u(pCur + 8 + xL + yT*stepYc, stepYc, roiSize, predMB + 8 + xL + yT*16, 16, &mvBack[0]);

    roiSize.width = w0;
    yT = IPP_MAX(mvy0 - 8, 0);
    yB = IPP_MIN(mvy1 - 8, 8);
    roiSize.height = yB - yT;
    h263_AddBackPredPB_8u(pCur + 8*stepYc + xL0 + yT*stepYc, stepYc, roiSize, predMB + 8*16 + xL0 + yT*16, 16, &mvBack[0]);

    roiSize.width = xR - xL;
    h263_AddBackPredPB_8u(pCur + 8*stepYc + 8 + xL + yT*stepYc, stepYc, roiSize, predMB + 8 + 8*16 + xL + yT*16, 16, &mvBack[0]);

  } else {
    Ipp32s i;
    for (i = 1; i < 4; i++) {
      mvx0 = ((-mvBack[i].dx + 1) >> 1) - (i & 1)*8;
      mvx1 = 16 - ((mvBack[i].dx + 1) >> 1) - (i & 1)*8;
      mvy0 = ((-mvBack[i].dy + 1) >> 1) - (i & 2)*4;
      mvy1 = 16 - ((mvBack[i].dy + 1) >> 1) - (i & 2)*4;

      xL = IPP_MAX(mvx0, 0);
      xR = IPP_MIN(mvx1, 8);
      roiSize.width = xR - xL;
      yT = IPP_MAX(mvy0, 0);
      yB = IPP_MIN(mvy1, 8);
      roiSize.height = yB - yT;

      pCur = pYc + H263_MV_OFF_HP(mvBack[i].dx, mvBack[i].dy, stepYc) + (i & 1)*8 + (i & 2)*4*stepYc + xL + yT*stepYc;

      h263_AddBackPredPB_8u(pCur, stepYc, roiSize, predMB + (i & 1)*8 + (i & 2)*4*16 + xL + yT*16, 16, &mvBack[i]);
    }
  }

  mvx0 = (-mvBCbCr->dx + 1) >> 1;
  mvx1 = 8 - ((mvBCbCr->dx + 1) >> 1);
  mvy0 = (-mvBCbCr->dy + 1) >> 1;
  mvy1 = 8 - ((mvBCbCr->dy + 1) >> 1);
  xL = IPP_MAX(mvx0, 0);
  xR = IPP_MIN(mvx1, 8);
  yT = IPP_MAX(mvy0, 0);
  yB = IPP_MIN(mvy1, 8);
  roiSize.width = xR - xL;
  roiSize.height = yB - yT;
  h263_AddBackPredPB_8u(pCbc + xL + yT*stepCc, stepCc, roiSize, predMB + 4*64 + xL + yT*8, 8, mvBCbCr);
  h263_AddBackPredPB_8u(pCrc + xL + yT*stepCc, stepCc, roiSize, predMB + 5*64 + xL + yT*8, 8, mvBCbCr);

  return H263_STATUS_OK;
}

/*
//  decode mcbpc and set MBtype and ChromaPattern
*/
h263_Status h263_DecodeMCBPC_P(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *mbPattern, Ipp32s stat)
{
  Ipp32u      code;
  Ipp32s      type, pattern;

  code = h263_ShowBits9(pInfo, 9);
  if (code >= 256) {
    type = IPPVC_MBTYPE_INTER;
    pattern = 0;
    h263_FlushBits(pInfo, 1);
  } else if (code) {
    type = h263_Pmb_type[code];
    pattern = h263_Pmb_cbpc[code];
    h263_FlushBits(pInfo, h263_Pmb_bits[code]);
  } else {
    h263_FlushBits(pInfo, 9);
    code = h263_ShowBits9(pInfo, 4);
    if (code < 8) {
      h263_Error("Error when decoding mcbpc of P-Frame macroblock");
      return H263_STATUS_ERROR;
    } else if (code < 12) {
       pattern = 0;
       h263_FlushBits(pInfo, 2);
    } else {
      pattern = (code & 3) ? (code & 3) : 1;
      h263_FlushBits(pInfo, 4);
    }
    type = IPPVC_MBTYPE_INTER4V_Q;
  }
  *mbType = type;
  *mbPattern = pattern;
  if (stat) {
    if (type == IPPVC_MBTYPE_INTER)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER);
    else if (type == IPPVC_MBTYPE_INTER_Q)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER_Q);
    else if (type == IPPVC_MBTYPE_INTRA)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
    else if (type == IPPVC_MBTYPE_INTRA_Q)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
    else if (type == IPPVC_MBTYPE_INTER4V)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER4V);
    else if (type == IPPVC_MBTYPE_INTER4V_Q)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER4V_Q);
  }
  return H263_STATUS_OK;
}

void h263_DecodeMODB_iPB(h263_Info* pInfo, Ipp32s *bmb_type, Ipp32s *cbpb, Ipp32s *mvdb)
{
  Ipp32u code;
  Ipp32s fbits;
  code = h263_ShowBits9(pInfo, 5);
  if (code < 24) {
    *bmb_type = IPPVC_MBTYPE_INTERPOLATE;
    *cbpb = code >> 4;
    fbits = 1 + *cbpb;
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_iPB);
  } else if (code < 30) {
    *bmb_type = IPPVC_MBTYPE_FORWARD;
    *mvdb = 1;
    *cbpb = (code >> 2) & 1;
    fbits = 3 + *cbpb;
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_FORWARD_iPB);
  } else {
    *bmb_type = IPPVC_MBTYPE_BACKWARD;
    *cbpb = code & 1;
    fbits = 5;
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_iPB);
  }
  h263_FlushBits(pInfo, fbits);
}

/*
//  decode mcbpc and set MBtype and ChromaPattern for EI-frames
*/
h263_Status h263_DecodeMCBPC_EI(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *mbPattern)
{
  Ipp32u  code;
  Ipp32s  len;
  h263_VLC1 vlc;

  code = h263_ShowBits9(pInfo, 8);

  if (code >= 32) {
    code >>= 5;
    *mbType = IPPVC_MBTYPE_INTER; /* IPPVC_MBTYPE_INTER(_Q) is used for UPWARD prediction */
    *mbPattern = (code > 3) ? 0 : (code & 3);
    len = (code > 3) ? 1 : 3;
  } else if (code >= 16) {
    *mbType = IPPVC_MBTYPE_INTER_Q;
    *mbPattern = 0;
    len = 4;
  } else if (code != 0) {
    vlc = h263_EImb_type[code - 1];
    *mbType = vlc.code;
    len = vlc.len & 15;
    *mbPattern = vlc.len >> 4;
  } else {
    h263_FlushBits(pInfo, 8);
    if (h263_GetBit(pInfo) == 1) {
      *mbType = IPPVC_MB_STUFFING;
      return H263_STATUS_OK;
    } else {
      h263_Error("Error when decoding mcbpc of EI-Frame macroblock");
      return H263_STATUS_ERROR;
    }
  }
  h263_FlushBits(pInfo, len);

#ifdef H263_FULL_STAT
  if (*mbType == IPPVC_MBTYPE_INTER)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_EI);
  else if (*mbType == IPPVC_MBTYPE_INTER_Q)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_Q_EI);
  else if (*mbType == IPPVC_MBTYPE_INTRA)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_EI);
  else if (*mbType == IPPVC_MBTYPE_INTRA_Q)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q_EI);
#endif
  return H263_STATUS_OK;
}

/*
//  decode MBTYPE for B-frames
*/
h263_Status h263_DecodeMBTYPE_B(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *cbp, Ipp32s *dquant)
{
  Ipp32u code;
  Ipp32s len;
  h263_VLC1 vlc;

  code = h263_ShowBits9(pInfo, 7);
  if (code == 0) {
    h263_FlushBits(pInfo, 7);
    if (h263_GetBits9(pInfo, 2) == 1) {
      *mbType = IPPVC_MB_STUFFING;
      return H263_STATUS_OK;
    } else {
      h263_Error("Error when decoding mcbpc of B-Frame macroblock");
      return H263_STATUS_ERROR;
    }
  } else if (code <= 3) {
    *dquant = (2 &~ code);
    *cbp = 1;
    *mbType = (code & 2) ? IPPVC_MBTYPE_INTRA : IPPVC_MBTYPE_INTRA_Q;
    h263_FlushBits(pInfo, 7 - (code >> 1));
#ifdef H263_FULL_STAT
    if (*mbType == IPPVC_MBTYPE_INTRA)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
    else
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
#endif
    return H263_STATUS_OK;
  }

  vlc = h263_Bmb_type[(code >> 2) - 1];
  *mbType = vlc.code;
  len = vlc.len & 15;
  *cbp = vlc.len & 0x10;
  *dquant = vlc.len & 0x20;

  h263_FlushBits(pInfo, len);

#ifdef H263_FULL_STAT
  if (*mbType == IPPVC_MBTYPE_DIRECT)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_DIRECT_B);
  else if (*mbType == IPPVC_MBTYPE_INTERPOLATE)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_B);
  else if (*mbType == IPPVC_MBTYPE_BACKWARD)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_B);
  else if (*mbType == IPPVC_MBTYPE_FORWARD)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_B);
#endif
  return H263_STATUS_OK;
}

/*
//  decode MBTYPE for EP-frames
*/
h263_Status h263_DecodeMBTYPE_EP(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *cbp, Ipp32s *dquant)
{
  Ipp32u code;
  Ipp32s len;
  h263_VLC1 vlc;

  code = h263_ShowBits9(pInfo, 8);
  if (code == 0) {
    h263_FlushBits(pInfo, 8);
    if (h263_GetBit(pInfo) == 1) {
      *mbType = IPPVC_MB_STUFFING;
      return H263_STATUS_OK;
    } else {
      h263_Error("Error when decoding mcbpc of EP-Frame macroblock");
      return H263_STATUS_ERROR;
    }
  } else if (code <= 3) {
    *mbType = (code & 2) ? IPPVC_MBTYPE_INTRA : IPPVC_MBTYPE_INTRA_Q;
    h263_FlushBits(pInfo, 8 - (code >> 1));
#ifdef H263_FULL_STAT
    if (*mbType == IPPVC_MBTYPE_INTRA)
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
    else
      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
#endif
    return H263_STATUS_OK;
  }
  code >>= 2;

  if (code < 8)
    vlc = h263_EPmb_type_0[code - 1];
  else
    vlc = h263_EPmb_type_1[(code >> 3) - 1];

  *mbType = vlc.code;
  len = vlc.len & 15;
  *cbp = vlc.len & 0x10;
  *dquant = vlc.len & 0x20;

  h263_FlushBits(pInfo, len);

#ifdef H263_FULL_STAT
  if (*mbType == IPPVC_MBTYPE_INTERPOLATE)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_EP);
  else if (*mbType == IPPVC_MBTYPE_BACKWARD)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_EP);
  else if (*mbType == IPPVC_MBTYPE_FORWARD)
    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_FORWARD_EP);
#endif
  return H263_STATUS_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -