📄 h263decframep.c
字号:
} else { pRefY = pYc; stepLum = stepYc; pRefCb = pCbc; stepChr = stepCbc; pRefCr = pCrc; } h263_MC(cbpbPrev & 32, pRefY, stepLum, pYn, stepYn, coeffMB_b); h263_MC(cbpbPrev & 16, pRefY+8, stepLum, pYn+8, stepYn, coeffMB_b + 64); h263_MC(cbpbPrev & 8, pRefY+8*stepLum, stepLum, pYn+8*stepYn, stepYn, coeffMB_b + 2*64); h263_MC(cbpbPrev & 4, pRefY+8+8*stepLum, stepLum, pYn+8+8*stepYn, stepYn, coeffMB_b + 3*64); h263_MC(cbpbPrev & 2, pRefCb, stepChr, pCbn, stepCbn, coeffMB_b + 4*64); h263_MC(cbpbPrev & 1, pRefCr, stepChr, pCrn, stepCrn, coeffMB_b + 5*64); } else { h263_MC_HP(cbpbPrev & 32, pYr, stepYr, pYn, stepYn, coeffMB_b, &mvForwPrev[0], 0); h263_MC_HP(cbpbPrev & 16, pYr+8, stepYr, pYn+8, stepYn, coeffMB_b + 64, &mvForwPrev[0], 0); h263_MC_HP(cbpbPrev & 8, pYr+8*stepYr, stepYr, pYn+8*stepYn, stepYn, coeffMB_b + 2*64, &mvForwPrev[0], 0); h263_MC_HP(cbpbPrev & 4, pYr+8+8*stepYr, stepYr, pYn+8+8*stepYn, stepYn, coeffMB_b + 3*64, &mvForwPrev[0], 0); h263_MC_HP(cbpbPrev & 2, pCbr, stepCbr, pCbn, stepCbn, coeffMB_b + 4*64, &mvFCbCrPrev, 0); h263_MC_HP(cbpbPrev & 1, pCrr, stepCrr, pCrn, stepCrn, coeffMB_b + 5*64, &mvFCbCrPrev, 0); } } } } } } h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB); if (VPic->oppmodes.deblockFilt && !mb_not_coded) { H263_MB_INTERNAL_HOR_DEBLOCKING_LUM(pYc, stepYc, quant); } pYc += 16; pCrc += 8; pCbc += 8; pYr += 16; pCrr += 8; pCbr += 8; if (pbFlag) { pYn += 16; pCrn += 8; pCbn += 8; } pMBinfo++; } pYc += 2 * H263_NUM_EXT_MB * 16 + (stepYc << 4) - stepYc; pCbc += 2 * H263_NUM_EXT_MB * 8 + (stepCbc << 3) - stepCbc; pCrc += 2 * H263_NUM_EXT_MB * 8 + (stepCrc << 3) - stepCrc; pYr += 2 * H263_NUM_EXT_MB * 16 + (stepYr << 4) - stepYr; pCbr += 2 * H263_NUM_EXT_MB * 8 + (stepCbr << 3) - stepCbr; pCrr += 2 * H263_NUM_EXT_MB * 8 + (stepCrr << 3) - stepCrr; if (pbFlag) { pYn += 2 * H263_NUM_EXT_MB * 16 + (stepYn << 4) - stepYn; pCbn += 2 * H263_NUM_EXT_MB * 8 + (stepCbn << 3) - stepCbn; pCrn += 2 * H263_NUM_EXT_MB * 8 + (stepCrn << 3) - stepCrn; } } } h263_AlignBits(pInfo); /* Deblocking filtering */ if (VPic->oppmodes.deblockFilt) h263_DeblockingFilter_P(pInfo, &pInfo->VideoSequence.cFrame); return H263_STATUS_OK; }}#ifdef _OMP_KARABASstatic h263_Status h263_DecodeFrame_P_DecodeSlice(h263_Info* pInfo, int curRow, h263_MacroBlockMT* pMBinfoMT){ int quant, quant_c, bquant, bquant_c; int mb_not_coded, mb_type = 0, cbpc = 0, cbpy = 0; int mbPerRow; h263_MacroBlock *pMBinfo; IppMotionVector mvForwPred; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; int cbpb = 0, mvdb, bmb_type = 0; int predMode = 0; h263_Status status; int k; int fourMVmode = VPic->modes.advPred | VPic->oppmodes.advPred | VPic->oppmodes.deblockFilt; int pbFlag = VPic->picture_coding_type == H263_PIC_TYPE_PB || VPic->picture_coding_type == H263_PIC_TYPE_iPB; int trd = VPic->temporal_reference - VPic->prev_temporal_reference; int trb = VPic->temporal_reference_B; int frGOB; h263_IntraPredBlock *b = pInfo->VideoSequence.IntraPredBuff.block; int colNum; int fourMVmb; if (trd < 0) trd += VPic->PCF ? 1024 : 256; mbPerRow = VPic->MacroBlockPerRow; pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow; frGOB = pInfo->VideoSequence.GOBboundary[curRow] ? curRow : 0; quant = quant_c = VPic->pic_quant; if (VPic->oppmodes.modQuant) quant_c = h263_quant_c[quant]; if (VPic->picture_coding_type == H263_PIC_TYPE_PB || VPic->picture_coding_type == H263_PIC_TYPE_iPB) { bquant_c = bquant = (VPic->dbquant + 5)*quant >> 2; h263_CLIPR(bquant, 31); if (VPic->oppmodes.modQuant) bquant_c = h263_quant_c[bquant]; } for (colNum = 0; colNum < mbPerRow; colNum++) { do { mb_not_coded = h263_GetBit(pInfo); if (mb_not_coded) break; if (h263_DecodeMCBPC_P(pInfo, &mb_type, &cbpc, 1) != H263_STATUS_OK) return H263_STATUS_ERROR; } while (mb_type == IPPVC_MB_STUFFING); if (mb_not_coded) { mb_type = pMBinfo->type = IPPVC_MB_STUFFING; /* to indicate mb_not_coded */ h263_Zero4MV(pMBinfo->mv); mvForwPred.dx = mvForwPred.dy = 0; if (VPic->oppmodes.advIntra) { for (k = 0; k < 6; k++) b[(colNum + 1)*6 + k].dct_dc = -1; } h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_NOTCODED); } else { if (VPic->oppmodes.advIntra && (mb_type == IPPVC_MBTYPE_INTRA || mb_type == IPPVC_MBTYPE_INTRA_Q)) h263_AdvI_PredMode(pInfo, predMode); mvdb = cbpb = 0; if (VPic->picture_coding_type == H263_PIC_TYPE_PB) { if (h263_GetBit(pInfo)) { mvdb = 1; cbpb = h263_GetBit(pInfo); } else { pMBinfoMT->mvF[0].dx = pMBinfoMT->mvF[0].dy = pMBinfoMT->mvB[0].dx = pMBinfoMT->mvB[0].dy = 0; } bmb_type = -1; } else if (VPic->picture_coding_type == H263_PIC_TYPE_iPB) { h263_DecodeMODB_iPB(pInfo, &bmb_type, &cbpb, &mvdb); if (!mvdb || colNum == 0) mvForwPred.dx = mvForwPred.dy = 0; } if (cbpb) cbpb = h263_GetBits9(pInfo, 6); if (VPic->oppmodes.altInterVLC && cbpc == 3) { if (h263_DecodeCBPY_I(pInfo, &cbpy) != H263_STATUS_OK) return H263_STATUS_ERROR; } else { if (h263_DecodeCBPY_P(pInfo, &cbpy, mb_type) != H263_STATUS_OK) return H263_STATUS_ERROR; } pMBinfo->type = (Ipp8u)mb_type; pMBinfoMT->cbpc = cbpc; pMBinfoMT->cbpy = cbpy; pMBinfoMT->cbpb = cbpb; pMBinfoMT->bmb_type = bmb_type; fourMVmb = (mb_type == IPPVC_MBTYPE_INTER4V || mb_type == IPPVC_MBTYPE_INTER4V_Q); if (mb_type == IPPVC_MBTYPE_INTRA_Q || mb_type == IPPVC_MBTYPE_INTER_Q || mb_type == IPPVC_MBTYPE_INTER4V_Q) { if (!VPic->oppmodes.modQuant) { h263_UpdateQuant(pInfo, VPic->pic_quant); quant_c = VPic->pic_quant; } else { quant_c = h263_UpdateQuant_Mod(pInfo); } quant = VPic->pic_quant; if (VPic->picture_coding_type == H263_PIC_TYPE_PB || VPic->picture_coding_type == H263_PIC_TYPE_iPB) { bquant_c = bquant = (VPic->dbquant + 5)*quant >> 2; h263_CLIPR(bquant, 31); if (VPic->oppmodes.modQuant) bquant_c = h263_quant_c[bquant]; } } pMBinfo->quant = (Ipp8u)quant; if (mb_type == IPPVC_MBTYPE_INTRA || mb_type == IPPVC_MBTYPE_INTRA_Q) { if (VPic->picture_coding_type == H263_PIC_TYPE_PB || (VPic->picture_coding_type == H263_PIC_TYPE_iPB && bmb_type == IPPVC_MBTYPE_INTERPOLATE)) { if (h263_PredictDecodeMV(pInfo, pMBinfo, frGOB, curRow, colNum, fourMVmode) != H263_STATUS_OK) { h263_Error("Error when decoding motion vector"); return H263_STATUS_ERROR; } if (fourMVmode) { pMBinfo->mv[1] = pMBinfo->mv[2] = pMBinfo->mv[3] = pMBinfo->mv[0]; } } else { if (!fourMVmode) pMBinfo->mv[0].dx = pMBinfo->mv[0].dy = 0; else { h263_Zero4MV(pMBinfo->mv); pMBinfo->type |= 0x80; } } if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) { if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &pMBinfoMT->mvF[0], &pMBinfoMT->mvB[0], &mvForwPred, bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) { h263_Error("Error when decoding MVDB"); return H263_STATUS_ERROR; } } status = h263_DecodeDequantMacroBlockIntra(pInfo, colNum, (cbpy << 2) + cbpc, quant, quant_c, predMode, pMBinfoMT->dctCoeffs, pMBinfoMT->lnz); if (status != H263_STATUS_OK) { h263_Error("Error when decoding coefficients of Intra block"); return H263_STATUS_ERROR; } if (pbFlag) { status = h263_DecodeDequantMacroBlockInter(pInfo, cbpb, bquant, bquant_c, pMBinfoMT->dctCoeffs_B, &pMBinfoMT->lnz[6]); if (status != H263_STATUS_OK) { h263_Error("Error when decoding coefficients of a B-block"); return H263_STATUS_ERROR; } } } else { /* INTER MB */ if (VPic->oppmodes.advIntra) { for (k = 0; k < 6; k++) b[(colNum + 1)*6 + k].dct_dc = -1; } if (!fourMVmb) { if (h263_PredictDecodeMV(pInfo, pMBinfo, frGOB, curRow, colNum, fourMVmode) != H263_STATUS_OK) { h263_Error("Error when decoding motion vector"); return H263_STATUS_ERROR; } if (fourMVmode) { pMBinfo->mv[1] = pMBinfo->mv[2] = pMBinfo->mv[3] = pMBinfo->mv[0]; } if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) { if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &pMBinfoMT->mvF[0], &pMBinfoMT->mvB[0], &mvForwPred, bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) { h263_Error("Error when decoding MVDB"); return H263_STATUS_ERROR; } } } else { if (h263_PredictDecode4MV(pInfo, pMBinfo, frGOB, curRow, colNum) != H263_STATUS_OK) { h263_Error("Error when decoding motion vectors"); return H263_STATUS_ERROR; } if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) { if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &pMBinfoMT->mvF[0], &pMBinfoMT->mvB[0], &mvForwPred, bmb_type, mvdb, trd, trb, 1) != H263_STATUS_OK) { h263_Error("Error when decoding MVDB"); return H263_STATUS_ERROR; } } } status = h263_DecodeDequantMacroBlockInter(pInfo, (cbpy << 2) | cbpc, quant, quant_c, pMBinfoMT->dctCoeffs, &pMBinfoMT->lnz[0]); if (status != H263_STATUS_OK) { h263_Error("Error when decoding coefficients of a P-block"); return H263_STATUS_ERROR; } if (pbFlag) { status = h263_DecodeDequantMacroBlockInter(pInfo, cbpb, bquant, bquant_c, pMBinfoMT->dctCoeffs_B, &pMBinfoMT->lnz[6]); if (status != H263_STATUS_OK) { h263_Error("Error when decoding coefficients of a B-block"); return H263_STATUS_ERROR; } } } } h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB); pMBinfo++; pMBinfoMT++; } // skip stuffing while (h263_ShowBits(pInfo, 10) == 1) h263_FlushBits(pInfo, 10); return H263_STATUS_OK;}/*********************************************************************************/static void h263_DecodeFrame_P_ReconSlice(h263_Info* pInfo, int curRow, h263_MacroBlockMT* pMBinfoMT, h263_Frame *rFrame){ __ALIGN16(Ipp8u, predMB, 64*6); int i, j, dx, dy; int stepYr, stepYc, stepCbr, stepCbc, stepCrr, stepCrc, mbPerRow; int stepF[6]; Ipp8u *pYc, *pCbc, *pCrc, *pYr, *pCbr, *pCrr, *pF[6]; Ipp8u *pYn, *pCbn, *pCrn; int stepYn, stepCbn, stepCrn; int mb_not_coded, mb_type, cbpc, cbpy; h263_MacroBlock *pMBinfo; int rt; IppiRect limitRectL, limitRectC; IppMotionVector mvCur[4], mvCbCr; IppMotionVector *mvBack, *mvForw, mvFCbCr, mvBCbCr; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; int cbpb, bmb_type; int fourMVmode = VPic->modes.advPred | VPic->oppmodes.advPred | VPic->oppmodes.deblockFilt; int obmcFlag = VPic->modes.advPred | VPic->oppmodes.advPred; int pbFlag = VPic->picture_coding_type == H263_PIC_TYPE_PB || VPic->picture_coding_type == H263_PIC_TYPE_iPB; Ipp16s* coeffMB; int fourMVmb; stepYc = pInfo->VideoSequence.cFrame.stepY; stepYr = rFrame->stepY; stepCbc = pInfo->VideoSequence.cFrame.stepCb;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -