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

📄 h263decframe.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 3 页
字号:
    height >>= 1;
    for (i = 0; i < height; i++) {
      p0 = frame->pCb + width;
      p1 = frame->pCr + width;

      if (fillMode == 3) {
        tCb = (p0[-1] << 8) | p0[-1];
        tCr = (p1[-1] << 8) | p1[-1];
      }
      for (j = 0; j < (8 - (width & 7)) >> 1; j++) {
        ((Ipp16u *)p0)[j] = tCb;
        ((Ipp16u *)p1)[j] = tCr;
      }
    }
  }

  if (frame->height & 15) {
    width = frame->width;
    height = frame->height;

    p0 = frame->pY + height * frame->stepY;
    for (i = 0; i < 16 - (height & 15); i++) {
      if (fillMode == 3) {
        ippsCopy_8u(p0 - frame->stepY, p0, (width + 15) &~ 15);
      } else {
        ippsSet_8u((Ipp8u)tY, p0, (width + 15) &~ 15);
      }
      p0 += frame->stepY;
    }

    width >>= 1;
    height >>= 1;

    p0 = frame->pCb + height * frame->stepCb;
    p1 = frame->pCr + height * frame->stepCr;

    for (i = 0; i < 8 - (height & 7); i++) {
      if (fillMode == 3) {
        ippsCopy_8u(p0 - frame->stepCb, p0, (width + 7) &~ 7);
        ippsCopy_8u(p1 - frame->stepCr, p1, (width + 7) &~ 7);
      } else {
        ippsSet_8u((Ipp8u)tCb, p0, (width + 7) &~ 7);
        ippsSet_8u((Ipp8u)tCr, p1, (width + 7) &~ 7);
      }
    }
    p0 += frame->stepCb;
    p1 += frame->stepCr;
  }
}

static h263_Status h263_Resample(h263_Info* pInfo, h263_Frame *srcFr, h263_Frame *dstFr, Ipp32s implicit)
{
  h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
  IppMotionVector *warps = VPic->warpParams;
  IppiSize  srcRoi, dstRoi;

  srcRoi.height = srcFr->height;
  srcRoi.width = srcFr->width;
  dstRoi.height = dstFr->height;
  dstRoi.width = dstFr->width;

  if (implicit || (warps[0].dx | warps[0].dy | warps[1].dx | warps[1].dy | warps[2].dx | warps[2].dy | warps[3].dx | warps[3].dy) == 0) {
    if (srcFr->width == 2*dstFr->width && srcFr->height == 2*dstFr->height) {
      ippiDownsampleFour_H263_8u_C1R(srcFr->pY, srcFr->stepY, srcRoi, dstFr->pY, dstFr->stepY, VPic->rtype);
      srcRoi.height >>= 1;
      srcRoi.width >>= 1;
      ippiDownsampleFour_H263_8u_C1R(srcFr->pCb, srcFr->stepCb, srcRoi, dstFr->pCb, dstFr->stepCb, VPic->rtype);
      ippiDownsampleFour_H263_8u_C1R(srcFr->pCr, srcFr->stepCr, srcRoi, dstFr->pCr, dstFr->stepCr, VPic->rtype);
    } else if (2*srcFr->width == dstFr->width && 2*srcFr->height == dstFr->height) {
      ippiUpsampleFour_H263_8u_C1R(srcFr->pY, srcFr->stepY, srcRoi, dstFr->pY, dstFr->stepY, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[0]);
      srcRoi.height >>= 1;
      srcRoi.width >>= 1;
      ippiUpsampleFour_H263_8u_C1R(srcFr->pCb, srcFr->stepCb, srcRoi, dstFr->pCb, dstFr->stepCb, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[1]);
      ippiUpsampleFour_H263_8u_C1R(srcFr->pCr, srcFr->stepCr, srcRoi, dstFr->pCr, dstFr->stepCr, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[2]);
    } else {
      ippiResample_H263_8u_P3R(srcFr->pY, srcFr->stepY, srcRoi, srcFr->pCb, srcFr->stepCb, srcFr->pCr, srcFr->stepCr,
                               dstFr->pY, dstFr->stepY, dstRoi, dstFr->pCb, dstFr->stepCb, dstFr->pCr, dstFr->stepCr,
                               warps, VPic->wda, VPic->rtype, VPic->fillMode, VPic->fillColor);
    }
  } else {
    ippiResample_H263_8u_P3R(srcFr->pY, srcFr->stepY, srcRoi, srcFr->pCb, srcFr->stepCb, srcFr->pCr, srcFr->stepCr,
                             dstFr->pY, dstFr->stepY, dstRoi, dstFr->pCb, dstFr->stepCb, dstFr->pCr, dstFr->stepCr,
                             warps, VPic->wda, VPic->rtype, VPic->fillMode, VPic->fillColor);
  }

  if ((dstFr->width | dstFr->height) & 15)
    h263_PadResampledFrame(dstFr, VPic->fillMode, VPic->fillColor);

  h263_PadFrame(dstFr);

  H263_UPDATE_RESAMPLE_PARAMS(VPic, &pInfo->VideoSequence);

  return H263_STATUS_OK;
}
Ipp32s h263_Check_Resize(h263_Info* pInfo)
{
  h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
  Ipp32s mbpR = VPic->MacroBlockPerRow, mbpC = VPic->MacroBlockPerCol;
  Ipp32s newSize = (mbpR + 2*H263_NUM_EXT_MB) * (mbpC + 2*H263_NUM_EXT_MB);
  Ipp32s oldSize;
  h263_Frame *frame, *refFrame;
  Ipp32s resizeMask = 0, msk;
  h263_EnhancedLayer *enh_layer = NULL;
  Ipp32s modiFlag;

  VPic->implicit_resample = 0;

  if (VPic->MacroBlockPerRow * VPic->MacroBlockPerCol > pInfo->VideoSequence.num_of_MBs)
    resizeMask |= 0x100;

  switch (VPic->picture_coding_type) {
  case H263_PIC_TYPE_I:
    frame = &pInfo->VideoSequence.rFrame;
    oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
    if (newSize > oldSize)
      resizeMask |= 1;
    break;
  case H263_PIC_TYPE_P:
    frame = &pInfo->VideoSequence.rFrame;
    oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
    if (newSize > oldSize)
      resizeMask |= 1;

    if (!VPic->modes.resample && // VPic->plusptype &&
      (VPic->width != pInfo->VideoSequence.cFrame.width || VPic->height != pInfo->VideoSequence.cFrame.height))
      VPic->implicit_resample = 1;

    if (VPic->modes.resample || VPic->implicit_resample) {
      frame = &pInfo->VideoSequence.bFrame; // ref frame will be resampled into this one
      oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
      if (newSize > oldSize)
        resizeMask |= 4;
    }
    break;

  case H263_PIC_TYPE_PB:
  case H263_PIC_TYPE_iPB:
    frame = &pInfo->VideoSequence.rFrame;
    oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
    if (newSize > oldSize)
      resizeMask |= 1;

    if (pInfo->VideoSequence.Bpics_to_show > 0) {
      frame = &pInfo->VideoSequence.bFrame;
      msk = 4;
    } else {
      frame = &pInfo->VideoSequence.nFrame;
      msk = 2;
    }
    oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
    if (newSize > oldSize)
      resizeMask |= msk;

    if (!VPic->modes.resample && // VPic->plusptype &&
      (VPic->width != pInfo->VideoSequence.cFrame.width || VPic->height != pInfo->VideoSequence.cFrame.height))
      VPic->implicit_resample = 1;

    if (VPic->modes.resample || VPic->implicit_resample) {
      frame = &pInfo->VideoSequence.aFrame;
      oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
      if (newSize > oldSize)
        resizeMask |= 8;
    }
    break;

  case H263_PIC_TYPE_B:
    if (VPic->enh_layer_num == 1) {
      if (pInfo->VideoSequence.Bpics_to_show > 0) {
        frame = &pInfo->VideoSequence.bFrame;
        msk = 4;
      } else {
        frame = &pInfo->VideoSequence.nFrame;
        msk = 2;
      }
      oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
      if (newSize > oldSize)
        resizeMask |= msk;
    } else {
      enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
      if (enh_layer == NULL)
        resizeMask |= 0xF0;
      else { // paranoid: what if enhanced layer frame size has changed
        frame = &enh_layer->n_Frame;
        oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
        if (newSize > oldSize)
          resizeMask |= 0x20;
      }
    }

    if (VPic->enh_layer_num == 1 || VPic->ref_layer_num == 1)
      refFrame = &pInfo->VideoSequence.cFrame;
    else
      refFrame = &pInfo->VideoSequence.enhLayers[VPic->ref_layer_num - 2]->c_Frame;

    if (!VPic->modes.resample && // VPic->plusptype &&
      (VPic->width != refFrame->width || VPic->height != refFrame->height)) {
        VPic->implicit_resample = 1;
        VPic->wda = 3;
        VPic->fillMode = 3;
        h263_Zero4MV(VPic->warpParams);
      }

    if (VPic->modes.resample || VPic->implicit_resample) {
      H263_COMPARE_RESAMPLE_PARAMS(modiFlag, &pInfo->VideoSequence, VPic);
      if (modiFlag) {
        if (VPic->enh_layer_num == 1) {
          frame = &pInfo->VideoSequence.aFrame;
          msk = 8;
        } else {
          frame = &enh_layer->a_Frame;
          msk = 0x80;
        }
        oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
        if (newSize > oldSize)
          resizeMask |= msk;
      }
    }
    break;

  case H263_PIC_TYPE_EI:
    enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
    if (enh_layer == NULL)
      resizeMask |= 0xF0;
    else {
      frame = &enh_layer->r_Frame;
      oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
      if (newSize > oldSize)
        resizeMask |= 0x10;
    }
    break;

  case H263_PIC_TYPE_EP:
    enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
    /* layers can not start with EP frame */
    if (enh_layer == NULL)
      return -1;
    frame = &enh_layer->r_Frame;
    oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
    if (newSize > oldSize)
      resizeMask |= 0x10;

    if (!VPic->modes.resample && // VPic->plusptype &&
      (VPic->width != enh_layer->c_Frame.width || VPic->height != enh_layer->c_Frame.height))
      VPic->implicit_resample = 1;

    if (VPic->modes.resample || VPic->implicit_resample) {
      frame = &enh_layer->a_Frame;
      oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
      if (newSize > oldSize)
        resizeMask |= 0x80;
    }
    break;
  default:
    return -1;
  }

  return resizeMask;
}

/**************************************************************************/
/*                    Main "interface" function                           */
/**************************************************************************/

h263_Status h263_DecodeVideoPicture(h263_Info* pInfo)
{
  h263_Status status = H263_STATUS_OK;
  Ipp64s      pic_time;
  h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
  Ipp32s temp_ref_delta;
  Ipp32s time_factor;
  h263_EnhancedLayer *enh_layer = NULL, *ref_layer = NULL;
  h263_Frame *refFrame, *lowFrame, *curFrame, *auxFrame;

  if (pInfo->VideoSequence.Ppics_to_show > 0) {  /* two P-frames/parts already pending */
    pInfo->VideoSequence.vFrame = &pInfo->VideoSequence.rFrame;
    pInfo->VideoSequence.Ppics_to_show--;
    return H263_STATUS_OK;
  }

  /* set picture time */
  if (pInfo->VideoSequence.PicIndex != 0) {
    if (VPic->picture_coding_type != H263_PIC_TYPE_B)
      temp_ref_delta = VPic->temporal_reference - pInfo->VideoSequence.prevP_temporal_reference;
    else
      temp_ref_delta = VPic->temporal_reference - pInfo->VideoSequence.ref_temporal_reference;
  } else
    temp_ref_delta = 0;

  if (temp_ref_delta < 0) {
    if (VPic->PCF)
      temp_ref_delta += 1024;
    else
      temp_ref_delta += 256;
  }

⌨️ 快捷键说明

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