📄 mp4decvopi.c
字号:
if (!mp4_DecodeVideoPacket(pInfo, &quant)) break; } return MP4_STATUS_OK; }// decode not data partitioned I-VOP else { int stepY, dct_type, pYoff2, pYoff3, nAux; Ipp8u *pQuantMatIntraA[3], *ppbqA[3], *pA[3]; Ipp16s *ppbrA[3], *ppbcA[3]; nAux = mp4_aux_comp_count[pInfo->VisualObject.VideoObject.shape_extension]; mbCurr = 0; // avoid warning C4701 pY = pCb = pCr = ppbq = pB = 0; ppbrY = ppbrCb = ppbrCr = 0; for (k = 0; k < nAux; k ++) { pA[k] = 0; ppbqA[k] = 0; ppbrA[k] = 0; pQuantMatIntraA[k] = pInfo->VisualObject.VideoObject.quant_type ? pInfo->VisualObject.VideoObject.intra_quant_mat_grayscale[k] : NULL; } colNum = rowNum = 0; dct_type = 0; stepY = stepYc; pYoff2 = 8 * stepYc; pYoff3 = 8 * stepYc + 8; for (;;) { // reset ACDC predict buffer on new Video_packet for (i = 0; i <= mbPerRow; i ++) { pInfo->VisualObject.VideoObject.PredictBuffRow_Y[i*16] = -1; pInfo->VisualObject.VideoObject.PredictBuffRow_Y[i*16+8] = -1; pInfo->VisualObject.VideoObject.PredictBuffRow_Cb[i*8] = -1; pInfo->VisualObject.VideoObject.PredictBuffRow_Cr[i*8] = -1; for (k = 0; k < nAux; k ++) { pInfo->VisualObject.VideoObject.PredictBuffRow_A[k][i*16] = -1; pInfo->VisualObject.VideoObject.PredictBuffRow_A[k][i*16+8] = -1; } } ppbcY[0] = ppbcY[8] = ppbcCb[0] = ppbcCr[0] = -1; for (k = 0; k < nAux; k ++) { ppbcA[k][0] = -1; } mbInVideoPacket = 0; // decode blocks for (;;) { if (colNum == 0) { pY = pInfo->VisualObject.cFrame.pY + rowNum * 16 * stepYc; pCb = pInfo->VisualObject.cFrame.pCb + rowNum * 8 * stepCbc; pCr = pInfo->VisualObject.cFrame.pCr + rowNum * 8 * stepCrc; ppbrY = pInfo->VisualObject.VideoObject.PredictBuffRow_Y + 16; ppbrCb = pInfo->VisualObject.VideoObject.PredictBuffRow_Cb + 8; ppbrCr = pInfo->VisualObject.VideoObject.PredictBuffRow_Cr + 8; ppbcY[0] = ppbcY[8] = ppbcCb[0] = ppbcCr[0] = -1; ppbq = pInfo->VisualObject.VideoObject.PredictBuffQuant; pB = pInfo->VisualObject.cFrame.pB + rowNum * 16 * stepYc; for (k = 0; k < nAux; k ++) { pA[k] = pInfo->VisualObject.cFrame.pA[k] + rowNum * 16 * stepYc; ppbrA[k] = pInfo->VisualObject.VideoObject.PredictBuffRow_A[k] + 16; ppbcA[k][0] = ppbcA[k][8] = -1; ppbqA[k] = pInfo->VisualObject.VideoObject.PredictBuffQuant_A[k]; } } // decode BAB mp4_DecodeBABtype(pInfo, colNum, rowNum, curShapeInfo, mbPerRow); if (curShapeInfo->bab_type == MP4_BAB_TYPE_INTRACAE) { if (!pInfo->VisualObject.VideoObject.VideoObjectPlane.change_conv_ratio_disable) conv_ratio = mp4_GetConvRatio(pInfo); blockSize = conv_ratio == 1 ? 16 : conv_ratio == 2 ? 8 : 4; scan_type = mp4_GetBit(pInfo); { Ipp8u tb[18*4], *p; int i, j; p = pB - 2 * stepYc - 2; for (i = 0; i < 18; i ++) { tb[i*4] = 0; if (p[0]) tb[i*4] |= 2; if (p[1]) tb[i*4] |= 1; tb[i*4+1] = 0; for (j = 0; j < 8; j ++) { if (p[j+2]) tb[i*4+1] |= (1 << (7 - j)); } tb[i*4+2] = 0; for (j = 0; j < 8; j ++) { if (p[j+2+8]) tb[i*4+2] |= (1 << (7 - j)); } tb[i*4+3] = 0; if (p[2+16]) tb[i*4+3] |= 128; if (p[2+17]) tb[i*4+3] |= 64; p += stepYc; } p = tb + 4 * 2 + 1; if (scan_type == 1) ippiDecodeCAEIntraH_MPEG4_1u8u(&pInfo->bufptr, &pInfo->bitoff, p, 4, blockSize); else ippiDecodeCAEIntraV_MPEG4_1u8u(&pInfo->bufptr, &pInfo->bitoff, p, 4, blockSize); for (i = 0; i < 16; i ++) { for (j = 0; j < 8; j ++) { pB[i*stepYc+j] = (Ipp8u)((tb[2*4+i*4+1] & (1 << (7 - j))) ? 255 : 0); } for (j = 0; j < 8; j ++) { pB[i*stepYc+j+8] = (Ipp8u)((tb[2*4+i*4+2] & (1 << (7 - j))) ? 255 : 0); } } } curShapeInfo->opaque = mp4_CheckTransparency(pB, stepYc); } else { if (curShapeInfo->bab_type == MP4_BAB_TYPE_TRANSPARENT) { mp4_Set16x16_8u(pB, stepYc, 0); curShapeInfo->opaque = 0; ppbcY[0] = ppbrY[8]; ppbrY[-8] = ppbcY[8]; ppbrY[0] = ppbrY[8] = ppbcY[8] = -1; ppbcCb[0] = ppbrCb[0]; ppbrCb[0] = -1; ppbcCr[0] = ppbrCr[0]; ppbrCr[0] = -1; } else { mp4_Set16x16_8u(pB, stepYc, 255); curShapeInfo->opaque = 15; } } if (pInfo->VisualObject.VideoObject.shape != MP4_SHAPE_TYPE_BINARYONLY && curShapeInfo->bab_type != MP4_BAB_TYPE_TRANSPARENT) { // decode mcbpc do { if (mp4_DecodeMCBPC_I(pInfo, &MacroBlock.type, &MacroBlock.cbpc) != MP4_STATUS_OK) return MP4_STATUS_ERROR; } while (MacroBlock.type == IPPVC_MB_STUFFING); // decode ac_pred_flag MacroBlock.ac_pred_flag = mp4_GetBit(pInfo); nOpaq = (curShapeInfo->opaque & 1) + ((curShapeInfo->opaque & 2) >> 1) + ((curShapeInfo->opaque & 4) >> 2) + ((curShapeInfo->opaque & 8) >> 3); // decode cbpy if (mp4_DecodeCBPY_I_Shape(pInfo, nOpaq, &MacroBlock.cbpy) != MP4_STATUS_OK) return MP4_STATUS_ERROR; quantPred = quant; // decode dquant if (MacroBlock.type == IPPVC_MBTYPE_INTRA_Q) mp4_UpdateQuant(pInfo, quant); if (mbCurr == 0) quantPred = quant; dcVLC = (quantPred < mp4_DC_vlc_Threshold[pInfo->VisualObject.VideoObject.VideoObjectPlane.intra_dc_vlc_thr]) ? 1 : 0; if (pInfo->VisualObject.VideoObject.interlaced) { dct_type = mp4_GetBit(pInfo); if (dct_type) { stepY = stepYc * 2; pYoff2 = stepYc; pYoff3 = stepYc + 8; } else { stepY = stepYc; pYoff2 = 8 * stepYc; pYoff3 = 8 * stepYc + 8; } } // decode blocks cbpy = MacroBlock.cbpy; nOpaq --; if (pInfo->VisualObject.VideoObject.VideoObjectPlane.alternate_vertical_scan_flag) { if (curShapeInfo->opaque & 1) { if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pY, stepY, ppbrY, ppbcY, ppbq, quant, 0, pQuantMatIntra, cbpy & (1 << nOpaq))) != ippStsNoErr) return MP4_STATUS_ERROR; nOpaq --; } else { ppbcY[0] = ppbrY[0]; ppbrY[0] = -1; } if (curShapeInfo->opaque & 2) { if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pY+8, stepY, ppbrY+8, ppbcY, ppbq, quant, 1, pQuantMatIntra, cbpy & (1 << nOpaq))) != ippStsNoErr) return MP4_STATUS_ERROR; nOpaq --; } else { { Ipp16s tmp; tmp = ppbcY[8]; ppbcY[8] = ppbrY[8-16]; ppbrY[8-16] = tmp; } ppbcY[0] = ppbrY[8]; ppbrY[8] = -1; } if (curShapeInfo->opaque & 4) { if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pY+pYoff2, stepY, ppbrY, ppbcY+8, ppbq, quant, 2, pQuantMatIntra, cbpy & (1 << nOpaq))) != ippStsNoErr) return MP4_STATUS_ERROR; nOpaq --; } else { ppbcY[8] = ppbrY[0]; ppbrY[0] = -1; } if (curShapeInfo->opaque & 8) { if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pY+pYoff3, stepY, ppbrY+8, ppbcY+8, ppbq, quant, 3, pQuantMatIntra, cbpy & (1 << nOpaq))) != ippStsNoErr) return MP4_STATUS_ERROR; nOpaq --; } else { ppbcY[8] = -1; } if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pCb, stepCbc, ppbrCb, ppbcCb, ppbq, quant, 4, pQuantMatIntra, MacroBlock.cbpc & 2)) != ippStsNoErr) return MP4_STATUS_ERROR; if ((status = mp4_ReconBlockIntraVertScan_MPEG4(pInfo, MacroBlock.ac_pred_flag, dcVLC, pCr, stepCrc, ppbrCr, ppbcCr, ppbq, quant, 5, pQuantMatIntra, MacroBlock.cbpc & 1)) != ippStsNoErr) return MP4_STATUS_ERROR; } else { if (curShapeInfo->opaque & 1) { mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, cbpy & (1 << nOpaq), pY, stepY, ppbrY, ppbcY, 0); nOpaq --; } else { ppbcY[0] = ppbrY[0]; ppbrY[0] = -1; } if (curShapeInfo->opaque & 2) { mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, cbpy & (1 << nOpaq), pY+8, stepY, ppbrY+8, ppbcY, 1); nOpaq --; } else { { Ipp16s tmp; tmp = ppbcY[8]; ppbcY[8] = ppbrY[8-16]; ppbrY[8-16] = tmp; } ppbcY[0] = ppbrY[8]; ppbrY[8] = -1; } if (curShapeInfo->opaque & 4) { mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, cbpy & (1 << nOpaq), pY+pYoff2, stepY, ppbrY, ppbcY+8, 2); nOpaq --; } else { ppbcY[8] = ppbrY[0]; ppbrY[0] = -1; } if (curShapeInfo->opaque & 8) { mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, cbpy & (1 << nOpaq), pY+pYoff3, stepY, ppbrY+8, ppbcY+8, 3); nOpaq --; } else { ppbcY[8] = -1; } mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, MacroBlock.cbpc & 2, pCb, stepCbc, ppbrCb, ppbcCb, 4); mp4_DecodeBlockIntra_MPEG4(MacroBlock.ac_pred_flag, MacroBlock.cbpc & 1, pCr, stepCrc, ppbrCr, ppbcCr, 5); } if (pInfo->VisualObject.VideoObject.shape == MP4_SHAPE_TYPE_GRAYSCALE) { for (k = 0; k < nAux; k ++) { // only Classic Zigzag and Frame DCT for Aux stepY = stepYc; pYoff2 = 8 * stepYc; pYoff3 = 8 * stepYc + 8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -