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

📄 mp4decvopi.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 4 页
字号:
                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 + -