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

📄 h263decfuncs.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 3 页
字号:
    pCrc = frame->pCr + (stepCrc << 3)*i;    pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*i;    if (pMBinfo[0].type != IPPVC_MB_STUFFING) {      H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);    }    for (j = 1; j < mbPerRow; j++) {      pYc += 16;      pCbc += 8;      pCrc += 8;      if (pMBinfo[j].type != IPPVC_MB_STUFFING) {        quant = pMBinfo[j].quant;        quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;        H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);        H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);      } else if (pMBinfo[j-1].type != IPPVC_MB_STUFFING) {        quant = pMBinfo[j-1].quant;        quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;        H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);      }    }  }}void h263_DeblockingFilter_I(h263_Info *pInfo, h263_Frame *frame){  Ipp8u *pYc, *pCbc, *pCrc;  int stepYc, stepCbc, stepCrc, mbPerRow, mbPerCol;  h263_MacroBlock *pMBinfo;  int quant, quant_c;  int i, j;  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;  int modQ = VPic->oppmodes.modQuant;  stepYc = frame->stepY;  stepCbc = frame->stepCb;  stepCrc = frame->stepCr;  mbPerRow = frame->mbPerRow;  mbPerCol = frame->mbPerCol;  for (i = 1; i < mbPerCol; i++) {    pYc = frame->pY + (stepYc << 4)*i;    pCbc = frame->pCb + (stepCbc << 3)*i;    pCrc = frame->pCr + (stepCrc << 3)*i;    pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*i;    if (pInfo->VideoSequence.GOBboundary[i] > 0) {      if (pInfo->VideoSequence.GOBboundary[i] > 1) {        continue; /* the row belongs to a skipped GOB */      } else { /* no horizontal filtering across GOB boundary */        quant = pMBinfo[-mbPerRow].quant;        H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc-16*stepYc, stepYc, quant);        for (j = 1; j < mbPerRow; j++) {          pYc += 16;          pCbc += 8;          pCrc += 8;          quant = pMBinfo[j-mbPerRow].quant;          quant_c = modQ ? h263_quant_c[quant] : quant;          H263_MB_VER_DEBLOCKING(pYc-16*stepYc, stepYc, pCbc-8*stepCbc, stepCbc, pCrc-8*stepCrc, stepCrc, quant, quant_c);          H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, quant);        }      }    } else {      quant = pMBinfo[0].quant;      quant_c = modQ ? h263_quant_c[quant] : quant;      H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);      H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, pMBinfo[-mbPerRow].quant);      for (j = 1; j < mbPerRow; j++) {        pYc += 16;        pCbc += 8;        pCrc += 8;        quant = pMBinfo[j].quant;        quant_c = modQ ? h263_quant_c[quant] : quant;        H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);        quant = pMBinfo[j-mbPerRow].quant;        quant_c = modQ ? h263_quant_c[quant] : quant;        H263_MB_VER_DEBLOCKING(pYc-16*stepYc, stepYc, pCbc-8*stepCbc, stepCbc, pCrc-8*stepCrc, stepCrc, quant, quant_c);        H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, quant);      }    }  }  pYc = frame->pY + (stepYc << 4)*(mbPerCol - 1);  pCbc = frame->pCb + (stepCbc << 3)*(mbPerCol - 1);  pCrc = frame->pCr + (stepCrc << 3)*(mbPerCol - 1);  pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*(mbPerCol - 1);  quant = pMBinfo[0].quant;  quant_c = modQ ? h263_quant_c[quant] : quant;  H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);  for (j = 1; j < mbPerRow; j++) {    pYc += 16;    pCbc += 8;    pCrc += 8;    quant = pMBinfo[j].quant;    quant_c = modQ ? h263_quant_c[quant] : quant;    H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);  }}#ifdef _OMP_KARABASint h263_GetNumOfThreads(void){    int maxThreads = 1;#ifdef _OPENMP#pragma omp parallel shared(maxThreads)#endif    {#ifdef _OPENMP#pragma omp master#endif    {#ifdef _OPENMP        maxThreads = omp_get_num_threads();#endif    }    }    return maxThreads;}h263_Status h263_DecodeDequantMacroBlockIntra(h263_Info *pInfo, int x, int pat, int quant, int quant_c,                                              int scan, Ipp16s *coeffMB, Ipp8u lastNZ[]){  Ipp16s *coeff = coeffMB;  int         blockNum, pm = 32, lnz, dc, ac, k, nz;  Ipp16s      *predC, *predA;  h263_IntraPredBlock *bCurr;  int modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;  int advI = pInfo->VideoSequence.VideoPicture.oppmodes.advIntra;  if (!advI) {    for (blockNum = 0; blockNum < 6; blockNum++) {      if (blockNum > 3)        quant = quant_c;      if (ippiReconstructCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, pat & pm, quant, 0, IPPVC_SCAN_ZIGZAG, modQ) != ippStsNoErr) {        return H263_STATUS_ERROR;      }      if (lnz > 0) {        h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_AC);      } else {        h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_DC);      }      pm >>= 1;      lastNZ[blockNum] = lnz;      coeff += 64;    }    return H263_STATUS_OK;  }  /* Advance Intra Coding */  for (blockNum = 0; blockNum < 6; blockNum ++) {    bCurr = &pInfo->VideoSequence.IntraPredBuff.block[6*x+blockNum];    if (blockNum > 3)      quant = quant_c;    if (pat & pm) {      if (ippiReconstructCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, pat & pm, quant, 1, scan, modQ) != ippStsNoErr)        return H263_STATUS_ERROR;      if (lnz) {        h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_AC);      } else {        h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_DC);      }    } else {      if (scan != IPPVC_SCAN_ZIGZAG) {        h263_Zero64_16s(coeff);      } else        coeff[0] = 0;      lnz = 0;    }    nz = 0;    if (scan == IPPVC_SCAN_ZIGZAG) {      if (bCurr->predA->dct_dc >= 0) {        dc = bCurr->predA->dct_dc;        dc = bCurr->predC->dct_dc >= 0 ? ((dc + bCurr->predC->dct_dc) >> 1) : dc;      } else        dc = bCurr->predC->dct_dc >= 0 ? bCurr->predC->dct_dc : 1024;      if (lnz && ((quant > 8) || modQ)) { /* ??? */        for (k = 1; k < 64; k ++) {          h263_CLIP(coeff[k], -2048, 2047);        }      }    } else if (scan == IPPVC_SCAN_HORIZONTAL) {      if (bCurr->predC->dct_dc >= 0) {        dc = bCurr->predC->dct_dc;        predC = bCurr->predC->dct_acC;        for (k = 1; k < 8; k ++) {          ac = coeff[k] + predC[k];          h263_CLIP(ac, -2048, 2047); /* ??? */          coeff[k] = (Ipp16s)ac;          if (ac)            nz = 1;        }        if ((lnz > 7) && ((quant > 8) || modQ)) { /* ??? */          for (k = 8; k < 64; k ++) {            h263_CLIP(coeff[k], -2048, 2047);          }        }      } else {        dc = 1024;        if (lnz && ((quant > 8) || modQ)) { /* ??? */          for (k = 1; k < 64; k ++) {            h263_CLIP(coeff[k], -2048, 2047);          }        }      }    } else { /* scan == IPPVC_SCAN_VERTICAL */      if (bCurr->predA->dct_dc >= 0) {        dc = bCurr->predA->dct_dc;        predA = bCurr->predA->dct_acA;        for (k = 1; k < 8; k ++) {          ac = coeff[k*8] + predA[k];          h263_CLIP(ac, -2048, 2047); /* ??? */          coeff[k*8] = (Ipp16s)ac;          if (ac)            nz = 1;        }      } else        dc = 1024;      if (lnz && ((quant > 8) || modQ)) { /* ??? */        for (k = 1; k < 64; k ++) {          h263_CLIP(coeff[k], -2048, 2047);        }      }    }    dc += coeff[0];    dc |= 1; /* oddify */    h263_CLIP(dc, 0, 2047); /* ??? h263_CLIPR(dc, 2047); */    coeff[0] = (Ipp16s)dc;    if (nz)      lnz = 63;    if (lnz) {      /* copy predicted coeffs for future Prediction */      for (k = 1; k < 8; k ++) {        bCurr[6].dct_acC[k] = coeff[k];        bCurr[6].dct_acA[k] = coeff[k*8];      }    } else {      for (k = 1; k < 8; k ++) {        bCurr[6].dct_acC[k] = bCurr[6].dct_acA[k] = 0;      }    }    bCurr[6].dct_dc = coeff[0];    pm >>= 1;    lastNZ[blockNum] = (Ipp8u)lnz;    coeff += 64;  }  return H263_STATUS_OK;}h263_Status h263_DecodeDequantMacroBlockInter(h263_Info *pInfo, int pat, int quant, int quant_c,                                              Ipp16s *coeffMB, Ipp8u lastNZ[]){  int   i, lnz, pm = 32;  Ipp16s *coeff = coeffMB;  int modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;  int altInterVLC = pInfo->VideoSequence.VideoPicture.oppmodes.altInterVLC;  for (i = 0; i < 6; i ++) {    if (i > 3)      quant = quant_c;    if (pat & pm) {      if (!altInterVLC) {        if (ippiReconstructCoeffsInter_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, quant, modQ) != ippStsNoErr)          return H263_STATUS_ERROR;      } else {        __ALIGN16(Ipp16s, coeffZ, 64);        if (ippiDecodeCoeffsInter_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeffZ, &lnz, modQ, IPPVC_SCAN_NONE) != ippStsNoErr)          if (ippiDecodeCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeffZ, &lnz, 1, modQ, IPPVC_SCAN_NONE) != ippStsNoErr)            return H263_STATUS_ERROR;        ippiQuantInvInter_H263_16s_C1I(coeffZ, lnz, quant, modQ);        ippiScanInv_16s_C1(coeffZ, coeff, lnz, IPPVC_SCAN_ZIGZAG);      }      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_C);    } else {      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);    }    pm >>= 1;    lastNZ[i] = (Ipp8u)lnz;    coeff += 64;  }  return H263_STATUS_OK;}void h263_DCT_MacroBlockInter(Ipp16s *coeffMB, Ipp8u lastNZ[], int pat){  int   i, lnz, pm = 32;  Ipp16s *coeff = coeffMB;  for (i = 0; i < 6; i ++) {    if ((pat) & pm) {      lnz = lastNZ[i];      if (lnz != 0) {        if ((lnz <= 4) && (coeff[16] == 0))            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);    }    pm >>= 1;    coeff += 64;  }}void h263_DeblockingFilterHor_P_MT(h263_Info *pInfo, int curRow){  Ipp8u *pYc, *pCbc, *pCrc;  int stepYc, stepCbc, stepCrc, mbPerRow;  h263_MacroBlock *pMBinfo;  int quant, quant_c;  int j;  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;  if (pInfo->VideoSequence.GOBboundary[curRow] > 0)    return; /* no filtering across GOB boundaries */  mbPerRow = VPic->MacroBlockPerRow;  stepYc = pInfo->VideoSequence.cFrame.stepY;  stepCbc = pInfo->VideoSequence.cFrame.stepCb;  stepCrc = pInfo->VideoSequence.cFrame.stepCr;  pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc;  pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc;  pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc;  pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow;  for (j = 0; j < mbPerRow; j++) {    if (pMBinfo[j].type != IPPVC_MB_STUFFING) {      quant = pMBinfo[j].quant;      quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;      H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    } else if (pMBinfo[j-mbPerRow].type != IPPVC_MB_STUFFING) {      quant = pMBinfo[j-mbPerRow].quant;      quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;      H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    }    pYc += 16;    pCbc += 8;    pCrc += 8;  }}void h263_DeblockingFilterVer_P_MT(h263_Info *pInfo, int curRow){  Ipp8u *pYc, *pCbc, *pCrc;  int stepYc, stepCbc, stepCrc, mbPerRow;  h263_MacroBlock *pMBinfo;  int quant, quant_c;  int j;  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;  mbPerRow = VPic->MacroBlockPerRow;  stepYc = pInfo->VideoSequence.cFrame.stepY;  stepCbc = pInfo->VideoSequence.cFrame.stepCb;  stepCrc = pInfo->VideoSequence.cFrame.stepCr;  pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc;  pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc;  pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc;  pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow;  if (pMBinfo[0].type != IPPVC_MB_STUFFING) {    quant = pMBinfo[0].quant;    H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);  }  for (j = 1; j < mbPerRow; j++) {    pYc += 16;    pCbc += 8;    pCrc += 8;    if (pMBinfo[j].type != IPPVC_MB_STUFFING) {      quant = pMBinfo[j].quant;      quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;      H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);      H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);    } else if (pMBinfo[j-1].type != IPPVC_MB_STUFFING) {      quant = pMBinfo[j-1].quant;      quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;      H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    }  }}void h263_DeblockingFilterHor_I_MT(h263_Info *pInfo, int curRow){  Ipp8u *pYc, *pCbc, *pCrc;  int stepYc, stepCbc, stepCrc, mbPerRow;  h263_MacroBlock *pMBinfo;  int quant, quant_c;  int j;  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;  if (pInfo->VideoSequence.GOBboundary[curRow] > 0)    return; /* no filtering across GOB boundaries */  mbPerRow = VPic->MacroBlockPerRow;  stepYc = pInfo->VideoSequence.cFrame.stepY;  stepCbc = pInfo->VideoSequence.cFrame.stepCb;  stepCrc = pInfo->VideoSequence.cFrame.stepCr;  pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc;  pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc;  pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc;  pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow;  for (j = 0; j < mbPerRow; j++) {    quant = pMBinfo[j].quant;    quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;    H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    pYc += 16;    pCbc += 8;    pCrc += 8;  }}void h263_DeblockingFilterVer_I_MT(h263_Info *pInfo, int curRow){  Ipp8u *pYc, *pCbc, *pCrc;  int stepYc, stepCbc, stepCrc, mbPerRow;  h263_MacroBlock *pMBinfo;  int quant, quant_c;  int j;  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;  mbPerRow = VPic->MacroBlockPerRow;  stepYc = pInfo->VideoSequence.cFrame.stepY;  stepCbc = pInfo->VideoSequence.cFrame.stepCb;  stepCrc = pInfo->VideoSequence.cFrame.stepCr;  pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc;  pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc;  pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc;  pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow;  quant = pMBinfo[0].quant;  H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);  for (j = 1; j < mbPerRow; j++) {    pYc += 16;    pCbc += 8;    pCrc += 8;    quant = pMBinfo[j].quant;    quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant;    H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c);    H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant);  }}#endif // _OMP_KARABAS

⌨️ 快捷键说明

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