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

📄 h263decframeb.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ///////////////////////////////////////////////////////////////////////
//
//               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) 2005-2007 Intel Corporation. All Rights Reserved.
//
//  Description:    Decodes B-Frames
//
*/

#include "h263.h"
#include "h263dec.h"

static h263_Status h263_PredictDecodeMV_B(h263_Info *pInfo, IppMotionVector *mvPred, IppMotionVector *mvCurr,
                                          Ipp32s frGOB, Ipp32s y, Ipp32s x)
{
  IppMotionVector *mvLeft, *mvTop, *mvRight;
  h263_Status status;
  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;
  Ipp32s  mbInRow = VPic->MacroBlockPerRow;

  mvLeft  = &mvPred[x-1];
  mvTop   = &mvPred[x];
  mvRight = &mvPred[x+1];
  if (y == frGOB && x == 0) {
    mvCurr->dx = mvCurr->dy = 0;
  } else if (x == 0) {
    mvCurr->dx = h263_Median(0, mvTop->dx, mvRight->dx);
    mvCurr->dy = h263_Median(0, mvTop->dy, mvRight->dy);
  } else if (y == frGOB) {
    *mvCurr = *mvLeft;
  } else if (x == mbInRow - 1) {
    mvCurr->dx = h263_Median(0, mvLeft->dx, mvTop->dx);
    mvCurr->dy = h263_Median(0, mvLeft->dy, mvTop->dy);
  } else {
    mvCurr->dx = h263_Median(mvLeft->dx, mvTop->dx, mvRight->dx);
    mvCurr->dy = h263_Median(mvLeft->dy, mvTop->dy, mvRight->dy);
  }

  if (!VPic->oppmodes.UMV && !VPic->modes.UMV) {
    status = h263_DecodeMV(pInfo, mvCurr, -32, 31);
  } else if (!VPic->oppmodes.UMV) {
    status = h263_DecodeMV(pInfo, mvCurr, -63, 63);
  } else {
    Ipp32s mvdx, mvdy;
    status = h263_DecodeMVD_umvplus(pInfo, &mvdx, &mvdy);
    mvCurr->dx = mvCurr->dx + (Ipp16s)mvdx;
    mvCurr->dy = mvCurr->dy + (Ipp16s)mvdy;
  }

  *mvTop = *mvCurr; /* updating the predictor */

  return status;
}

static void h263_CalculateMV_Direct(IppMotionVector *mvC, IppMotionVector *mvF, IppMotionVector *mvB,
                                    IppMotionVector *mvCbCrF, IppMotionVector *mvCbCrB,
                                    Ipp32s trd, Ipp32s trb, Ipp32s mb_typeC, Ipp32s dx, Ipp32s dy,
                                    IppiRect *limitRectL, IppiRect *limitRectC)
{
  Ipp32s i;
  if (mb_typeC == IPPVC_MBTYPE_INTER4V || mb_typeC == IPPVC_MBTYPE_INTER4V_Q) {
    for (i = 0; i < 4; i++) {
      mvF[i].dx = (Ipp16s)(mvC[i].dx * trb / trd);
      mvF[i].dy = (Ipp16s)(mvC[i].dy * trb / trd);
      mvB[i].dx = (Ipp16s)((trb - trd) * mvC[i].dx / trd);
      mvB[i].dy = (Ipp16s)((trb - trd) * mvC[i].dy / trd);
    }
    h263_Limit4MV(mvF, mvF, limitRectL, dx, dy, 8);
    h263_Limit4MV(mvB, mvB, limitRectL, dx, dy, 8);
    h263_ComputeChroma4MV(mvF, mvCbCrF);
    h263_ComputeChroma4MV(mvB, mvCbCrB);
    h263_LimitMV(mvCbCrF, mvCbCrF, limitRectC, dx >> 1, dy >> 1, 8);
    h263_LimitMV(mvCbCrB, mvCbCrB, limitRectC, dx >> 1, dy >> 1, 8);
  } else {
    mvF[0].dx = (Ipp16s)(mvC[0].dx * trb / trd);
    mvF[0].dy = (Ipp16s)(mvC[0].dy * trb / trd);
    mvB[0].dx = (Ipp16s)((trb - trd) * mvC[0].dx / trd);
    mvB[0].dy = (Ipp16s)((trb - trd) * mvC[0].dy / trd);
    h263_LimitMV(mvF, mvF, limitRectL, dx, dy, 16);
    h263_LimitMV(mvB, mvB, limitRectL, dx, dy, 16);
    h263_ComputeChromaMV(mvF, mvCbCrF);
    h263_ComputeChromaMV(mvB, mvCbCrB);
  }
}

/*
//  Purpose:  decode H.263 B-Frame
*/
h263_Status h263_DecodeFrame_B(h263_Info* pInfo, h263_EnhancedLayer *Layer, h263_Frame *rFrame)
{
  __ALIGN16(Ipp16s, coeffMB, 64*2);
  __ALIGN16(Ipp8u, tmpMB, 64*4*2);
  Ipp8u           *pYc, *pCbc, *pCrc, *pYn, *pCbn, *pCrn, *pYr, *pCbr, *pCrr, *pF[6];
  Ipp32s          stepYc, stepYn, stepCbc, stepCbn, stepCrc, stepCrn;
  Ipp32s          stepYr, stepCbr, stepCrr, mbPerRow, mbPerCol, stepF[6];
  Ipp32s          dx, dy, TRB, TRD, colNum, rowNum;
  IppiRect        limitRectL, limitRectC;
  Ipp32s          mb_type, cbpy, cbpc;
  Ipp32s          quant, quant_c;
  h263_MacroBlock *pMBinfo;
  Ipp32s          frGOB;
  Ipp32s          rt;
  h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture;
  Ipp32s gob_header_present = 1;
  Ipp32s predMode = 0;
  h263_Status status;
  Ipp32s num_rows_per_gob, num_gobs, row;
  Ipp32s i, k;
  Ipp32s cbpFlag, dquantFlag;
  IppMotionVector mvCbCrF, mvCbCrB, mvForw[4], mvBack[4];
  IppMotionVector *predMVF, *predMVB;
  h263_IntraPredBlock  *b = pInfo->VideoSequence.IntraPredBuff.block;
  Ipp32s mb_not_coded;
  IppiSize roiSize;
  h263_Status sts;

  mbPerRow = pInfo->VideoSequence.VideoPicture.MacroBlockPerRow;
  mbPerCol = pInfo->VideoSequence.VideoPicture.MacroBlockPerCol;
  predMVF = &pInfo->VideoSequence.Bmv[0];
  predMVB = &pInfo->VideoSequence.Bmv[mbPerRow];

  /* B-frame in n, next (in displaying order) P - c, previous - r */
  if (VPic->enh_layer_num == 1) {
    stepYn = pInfo->VideoSequence.nFrame.stepY;
    stepCbn = pInfo->VideoSequence.nFrame.stepCb;
    stepCrn = pInfo->VideoSequence.nFrame.stepCr;
    pYn = pInfo->VideoSequence.nFrame.pY;
    pCbn = pInfo->VideoSequence.nFrame.pCb;
    pCrn = pInfo->VideoSequence.nFrame.pCr;
  } else {
    stepYn = Layer->n_Frame.stepY;
    stepCbn = Layer->n_Frame.stepCb;
    stepCrn = Layer->n_Frame.stepCr;
    pYn = Layer->n_Frame.pY;
    pCbn = Layer->n_Frame.pCb;
    pCrn = Layer->n_Frame.pCr;
  }

  if (VPic->ref_layer_num == 1) {
    stepYc = pInfo->VideoSequence.cFrame.stepY;
    stepCbc = pInfo->VideoSequence.cFrame.stepCb;
    stepCrc = pInfo->VideoSequence.cFrame.stepCr;
    pYc = pInfo->VideoSequence.cFrame.pY;
    pCbc = pInfo->VideoSequence.cFrame.pCb;
    pCrc = pInfo->VideoSequence.cFrame.pCr;
  } else {
    h263_EnhancedLayer *refLayer = pInfo->VideoSequence.enhLayers[VPic->ref_layer_num - 2];
    stepYc = refLayer->c_Frame.stepY;
    stepCbc = refLayer->c_Frame.stepCb;
    stepCrc = refLayer->c_Frame.stepCr;
    pYc = refLayer->c_Frame.pY;
    pCbc = refLayer->c_Frame.pCb;
    pCrc = refLayer->c_Frame.pCr;
  }

  stepYr = rFrame->stepY;
  stepCbr = rFrame->stepCb;
  stepCrr = rFrame->stepCr;
  pYr = rFrame->pY;
  pCbr = rFrame->pCb;
  pCrr = rFrame->pCr;


  stepF[0] = stepF[1] = stepF[2] = stepF[3] = stepYc; stepF[4] = stepCbc; stepF[5] = stepCrc;

  // Bounding rectangles for MV limitation
  limitRectL.x = -16;
  limitRectL.y = -16;
  limitRectL.width = pInfo->VideoSequence.VideoPicture.MacroBlockPerRow * 16 + 32;
  limitRectL.height = pInfo->VideoSequence.VideoPicture.MacroBlockPerCol * 16 + 32;
  limitRectC.x = -8;
  limitRectC.y = -8;
  limitRectC.width = pInfo->VideoSequence.VideoPicture.MacroBlockPerRow * 8 + 16;
  limitRectC.height = pInfo->VideoSequence.VideoPicture.MacroBlockPerCol * 8 + 16;
  quant = pInfo->VideoSequence.VideoPicture.pic_quant;
  colNum = rowNum = 0;
  TRD = pInfo->VideoSequence.TRD;
  TRB = pInfo->VideoSequence.TRB;
  pMBinfo = pInfo->VideoSequence.MBinfo;

  quant = VPic->pic_quant;
  pInfo->VideoSequence.VideoPicture.gob_number = 0;
  num_gobs = pInfo->VideoSequence.VideoPicture.num_gobs_in_pic;
  num_rows_per_gob = pInfo->VideoSequence.VideoPicture.RowsPerGOB;

  rt = VPic->rtype;

  dy = 0;
  frGOB = 0;

  for (i = 0; i < num_gobs; i++) {
    VPic->gob_number = i;

    if (i) {
ErrRet_1:
      gob_header_present = h263_ParseGOBHeader(pInfo);
      if (gob_header_present < 0) {
        h263_Error("Error: Invalid GOB header");
        goto Err_1;
      }

      if (VPic->gob_number > 30)
        return H263_STATUS_OK; /* EOS or EOSBS */

      if (gob_header_present) {
        Ipp32s nummbs2copy = (VPic->gob_number * num_rows_per_gob - rowNum) * mbPerRow - colNum;
        h263_CopyMacroBlocks(&pInfo->VideoSequence.rFrame, &pInfo->VideoSequence.nFrame, mbPerRow, rowNum, colNum, nummbs2copy);
        rowNum = num_rows_per_gob * VPic->gob_number;
        colNum = 0;
        pYc = pInfo->VideoSequence.cFrame.pY + (stepYc << 4) * rowNum;
        pCbc = pInfo->VideoSequence.cFrame.pCb + (stepCbc << 3) * rowNum;
        pCrc = pInfo->VideoSequence.cFrame.pCr + (stepCrc << 3) * rowNum;
        pYr = pInfo->VideoSequence.rFrame.pY + (stepYr << 4) * rowNum;
        pCbr = pInfo->VideoSequence.rFrame.pCb + (stepCbr << 3) * rowNum;
        pCrr = pInfo->VideoSequence.rFrame.pCr + (stepCrr << 3) * rowNum;
        pYn = pInfo->VideoSequence.nFrame.pY + (stepYn << 4) * rowNum;
        pCbn = pInfo->VideoSequence.nFrame.pCb + (stepCbn << 3) * rowNum;
        pCrn = pInfo->VideoSequence.nFrame.pCr + (stepCrn << 3) * rowNum;
        pMBinfo = pInfo->VideoSequence.MBinfo + rowNum * mbPerRow;
        if (VPic->gob_number > i)
          ippsSet_8u(127, pInfo->VideoSequence.GOBboundary + i*num_rows_per_gob, (VPic->gob_number - i) * num_rows_per_gob);
        i = VPic->gob_number;
      }
      if (gob_header_present) {
        frGOB = i*num_rows_per_gob;
        pInfo->VideoSequence.GOBboundary[frGOB] = 1;
      }
    }

⌨️ 快捷键说明

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