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

📄 h263decfuncs.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 4 页
字号:
    {
#ifdef _OPENMP
        maxThreads = omp_get_num_threads();
#endif
    }
    }
    return maxThreads;
}

h263_Status h263_DecodeDequantMacroBlockIntra(h263_Info *pInfo, Ipp32s x, Ipp32s pat, Ipp32s quant, Ipp32s quant_c,
                                              Ipp32s scan, Ipp16s *coeffMB, Ipp8u lastNZ[])
{
  Ipp16s *coeff = coeffMB;
  Ipp32s blockNum, pm = 32, lnz, dc, ac, k, nz;
  Ipp16s *predC, *predA;
  h263_IntraPredBlock *bCurr;
  Ipp32s modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;
  Ipp32s 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, Ipp32s pat, Ipp32s quant, Ipp32s quant_c,
                                              Ipp16s *coeffMB, Ipp8u lastNZ[])
{
  Ipp32s i, lnz, pm = 32;
  Ipp16s *coeff = coeffMB;
  Ipp32s modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;
  Ipp32s 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[], Ipp32s pat)
{
  Ipp32s 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, Ipp32s curRow)
{
  Ipp8u *pYc, *pCbc, *pCrc;
  Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
  h263_MacroBlock *pMBinfo;
  Ipp32s quant, quant_c;
  Ipp32s 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, Ipp32s curRow)
{
  Ipp8u *pYc, *pCbc, *pCrc;
  Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
  h263_MacroBlock *pMBinfo;
  Ipp32s quant, quant_c;
  Ipp32s 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, Ipp32s curRow)
{
  Ipp8u *pYc, *pCbc, *pCrc;
  Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
  h263_MacroBlock *pMBinfo;
  Ipp32s quant, quant_c;
  Ipp32s 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, Ipp32s curRow)
{
  Ipp8u *pYc, *pCbc, *pCrc;
  Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
  h263_MacroBlock *pMBinfo;
  Ipp32s quant, quant_c;
  Ipp32s 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 + -