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

📄 mp4decvops.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 5 页
字号:
                    if (!(interlaced && field_prediction)) {
                        if (mb_type != IPPVC_MBTYPE_INTER4V) {
                            if (quarter_sample) {
                                mp4_LimitMVQ(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 16);
                                mp4_ComputeChromaMVQ(mvCur, &mvCbCr);
                            } else {
                                mp4_LimitMV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 16);
                                mp4_ComputeChromaMV(mvCur, &mvCbCr);
                            }
                            mvCur[1] = mvCur[2] = mvCur[3] = mvCur[0];
                        } else {
                            if (quarter_sample) {
                                mp4_Limit4MVQ(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
                                mp4_ComputeChroma4MVQ(pMBinfo->mv, &mvCbCr);
                            } else {
                                mp4_Limit4MV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
                                mp4_ComputeChroma4MV(pMBinfo->mv, &mvCbCr);
                            }
                            mp4_LimitMV(&mvCbCr, &mvCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
                        }
                    } else {
                        if (quarter_sample) {
                            mp4_LimitFMVQ(&pMVField[0], &mvCur[0], &limitRectL, dx, dy, 16);
                            mp4_LimitFMVQ(&pMVField[1], &mvCur[2], &limitRectL, dx, dy, 16);
                            mvTmpT.dx = (Ipp16s)mp4_Div2(mvCur[0].dx);
                            mvTmpT.dy = (Ipp16s)(mp4_Div2(mvCur[0].dy << 1) >> 1);
                            mvTmpB.dx = (Ipp16s)mp4_Div2(mvCur[2].dx);
                            mvTmpB.dy = (Ipp16s)(mp4_Div2(mvCur[2].dy << 1) >> 1);
                            mp4_ComputeChromaMV(&mvTmpT, &mvCbCrT);
                            mp4_ComputeChromaMV(&mvTmpB, &mvCbCrB);
                        } else {
                            mp4_LimitFMV(&pMVField[0], &mvCur[0], &limitRectL, dx, dy, 16);
                            mp4_LimitFMV(&pMVField[1], &mvCur[2], &limitRectL, dx, dy, 16);
                            mp4_ComputeChromaMV(&mvCur[0], &mvCbCrT);
                            mp4_ComputeChromaMV(&mvCur[2], &mvCbCrB);
                        }
                    }
                    if (pat)
                        mp4_DCTInvCoeffsInterMB(pInfo, coeffMB, pMBinfoMT->lnz, pat, scan);
                    if (obmc_disable || field_prediction) {
                        if (!field_prediction) {
                            if (quarter_sample) {
                                if (mb_type == IPPVC_MBTYPE_INTER4V) {
                                    mp4_Copy8x8QP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
                                    mp4_Copy8x8QP_8u(pYr+8, stepYr, pYc+8, stepYc, &mvCur[1], rt);
                                    mp4_Copy8x8QP_8u(pYr+8*stepYr, stepYr, pYc+8*stepYc, stepYc, &mvCur[2], rt);
                                    mp4_Copy8x8QP_8u(pYr+8*stepYr+8, stepYr, pYc+8*stepYc+8, stepYc, &mvCur[3], rt);
                                } else
                                    mp4_Copy16x16QP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
                            } else {
                                if (mb_type == IPPVC_MBTYPE_INTER4V) {
                                    mp4_Copy8x8HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
                                    mp4_Copy8x8HP_8u(pYr+8, stepYr, pYc+8, stepYc, &mvCur[1], rt);
                                    mp4_Copy8x8HP_8u(pYr+8*stepYr, stepYr, pYc+8*stepYc, stepYc, &mvCur[2], rt);
                                    mp4_Copy8x8HP_8u(pYr+8*stepYr+8, stepYr, pYc+8*stepYc+8, stepYc, &mvCur[3], rt);
                                } else
                                    mp4_Copy16x16HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
                            }
                        } else {
                            if (quarter_sample) {
                                mp4_Copy16x8QP_8u(pYr+stepYr*mb_ftfr, stepYr*2, pYc, stepYc*2, &mvCur[0], rt);
                                mp4_Copy16x8QP_8u(pYr+stepYr*mb_fbfr, stepYr*2, pYc+stepYc, stepYc*2, &mvCur[2], rt);
                            } else {
                                mp4_Copy16x8HP_8u(pYr+stepYr*mb_ftfr, stepYr*2, pYc, stepYc*2, &mvCur[0], rt);
                                mp4_Copy16x8HP_8u(pYr+stepYr*mb_fbfr, stepYr*2, pYc+stepYc, stepYc*2, &mvCur[2], rt);
                            }
                        }
                        if (!dct_type) {
                            mp4_AddResidual(pat & 32, pYc, stepYc, coeffMB);
                            mp4_AddResidual(pat & 16, pYc+8, stepYc, coeffMB+64);
                            mp4_AddResidual(pat & 8, pYc+stepYc*8, stepYc, coeffMB+128);
                            mp4_AddResidual(pat & 4, pYc+stepYc*8+8, stepYc, coeffMB+192);
                        } else {
                            mp4_AddResidual(pat & 32, pYc, stepYc*2, coeffMB);
                            mp4_AddResidual(pat & 16, pYc+8, stepYc*2, coeffMB+64);
                            mp4_AddResidual(pat & 8, pYc+stepYc, stepYc*2, coeffMB+128);
                            mp4_AddResidual(pat & 4, pYc+stepYc+8, stepYc*2, coeffMB+192);
                        }
                        if (!field_prediction) {
                            mp4_MC_HP(pat & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
                            mp4_MC_HP(pat & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);
                        } else {
                            mp4_Copy8x4HP_8u(pCbr+(mb_ftfr ? stepCbr : 0), stepCbr*2, pCbc, stepCbc*2, &mvCbCrT, rt);
                            mp4_Copy8x4HP_8u(pCrr+(mb_ftfr ? stepCrr : 0), stepCrr*2, pCrc, stepCrc*2, &mvCbCrT, rt);
                            mp4_Copy8x4HP_8u(pCbr+(mb_fbfr ? stepCbr : 0), stepCbr*2, pCbc+stepCbc, stepCbc*2, &mvCbCrB, rt);
                            mp4_Copy8x4HP_8u(pCrr+(mb_fbfr ? stepCrr : 0), stepCrr*2, pCrc+stepCrc, stepCrc*2, &mvCbCrB, rt);
                            mp4_AddResidual(pat & 2, pCbc, stepCbc, coeffMB+256);
                            mp4_AddResidual(pat & 1, pCrc, stepCrc, coeffMB+320);
                        }
                    }
                //}
                if (!obmc_disable && !field_prediction) {
                    //if (mb_not_coded) {
                    //    ippiCopy8x8_8u_C1R(pCbr, stepCbr, pCbc, stepCbc);
                    //    ippiCopy8x8_8u_C1R(pCrr, stepCrr, pCrc, stepCrc);
                    //    pat = 0;
                    //    mp4_Zero4MV(mvCur);
                    //} else {
                        mp4_MC_HP(pat & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
                        mp4_MC_HP(pat & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);
                    //}
                    mp4_OBMC(pInfo, pMBinfo, mvCur, j, curRow, limitRectL, pYc, stepYc, pYr, stepYr, pat >> 2, coeffMB, dct_type);
                }
            //}
        }
        pMBinfo ++;
        pMBinfoMT ++;
        pMVField += 2;
        pYc += 16; pCrc += 8; pCbc += 8;
        pYr += 16; pCrr += 8; pCbr += 8;
        dx += 16;
    }
}

mp4_Status mp4_DecodeVOP_S_MT(mp4_Info* pInfo)
{
    Ipp32s     i, mbPerCol, mbPerRow, fcode_forward, sBitOff;
    IppiRect   spriteRect, vopRect;
    Ipp8u      *sBufPtr;
    mp4_Status sts = MP4_STATUS_OK;

    sBufPtr = pInfo->bufptr;
    sBitOff = pInfo->bitoff;
    // init WarpSpec for Sprites or GMC
    vopRect.x = 0;
    vopRect.y = 0;
    vopRect.width = pInfo->VisualObject.VideoObject.width;
    vopRect.height = pInfo->VisualObject.VideoObject.height;
    if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {
        spriteRect.x = pInfo->VisualObject.VideoObject.sprite_left_coordinate;
        spriteRect.y = pInfo->VisualObject.VideoObject.sprite_top_coordinate;
        spriteRect.width = pInfo->VisualObject.VideoObject.sprite_width;
        spriteRect.height = pInfo->VisualObject.VideoObject.sprite_height;
        fcode_forward = 1;
    } else {
        spriteRect = vopRect; // for shapes they may be different !!!!!!
        fcode_forward = pInfo->VisualObject.VideoObject.VideoObjectPlane.fcode_forward;
    }
    ippiWarpInit_MPEG4(pInfo->VisualObject.VideoObject.WarpSpec,
        pInfo->VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_du,
        pInfo->VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_dv,
        pInfo->VisualObject.VideoObject.sprite_warping_points,
        pInfo->VisualObject.VideoObject.sprite_enable,
        pInfo->VisualObject.VideoObject.sprite_warping_accuracy,
        pInfo->VisualObject.VideoObject.VideoObjectPlane.rounding_type,
        pInfo->VisualObject.VideoObject.quarter_sample, fcode_forward,
        &spriteRect, &vopRect);
    // decode basic sprites
    if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {
        Ipp32s  h;
        //if (pInfo->VisualObject.VideoObject.shape != MP4_SHAPE_TYPE_RECTANGULAR) {
        //    if (mp4_InitVOPShape(pInfo) != MP4_STATUS_OK)
        //        return MP4_STATUS_ERROR;
        //}
        h = (vopRect.height / pInfo->num_threads) & (~1); // must be even
#ifdef _OPENMP
#pragma  omp parallel shared(pInfo, h) num_threads(pInfo->num_threads)
#endif
        {
            IppiRect   vopRect;
            Ipp32s            idThread = 0;
#ifdef _OPENMP
            idThread = omp_get_thread_num();
            vm_set_current_thread_priority(pInfo->mTreadPriority);
#endif
            vopRect.x = 0;
            vopRect.width = pInfo->VisualObject.VideoObject.width;
            vopRect.y = idThread * h;
            vopRect.height = h;
            if (idThread == (pInfo->num_threads - 1))
                vopRect.height = pInfo->VisualObject.VideoObject.height - vopRect.y;
            ippiWarpLuma_MPEG4_8u_C1R(pInfo->VisualObject.sFrame.pY, pInfo->VisualObject.sFrame.stepY,
                pInfo->VisualObject.cFrame.pY + vopRect.y * pInfo->VisualObject.cFrame.stepY,
                pInfo->VisualObject.cFrame.stepY, &vopRect, pInfo->VisualObject.VideoObject.WarpSpec);
            if (pInfo->VisualObject.VideoObject.sprite_brightness_change)
                ippiChangeSpriteBrightness_MPEG4_8u_C1IR(pInfo->VisualObject.cFrame.pY, pInfo->VisualObject.cFrame.stepY, vopRect.width, vopRect.height, pInfo->VisualObject.VideoObject.VideoObjectPlane.brightness_change_factor);
            vopRect.y >>= 1; vopRect.width >>= 1; vopRect.height >>= 1;
            ippiWarpChroma_MPEG4_8u_P2R(pInfo->VisualObject.sFrame.pCb, pInfo->VisualObject.sFrame.stepCb,
                pInfo->VisualObject.sFrame.pCr, pInfo->VisualObject.sFrame.stepCr,
                pInfo->VisualObject.cFrame.pCb + vopRect.y * pInfo->VisualObject.cFrame.stepCb, pInfo->VisualObject.cFrame.stepCb,
                pInfo->VisualObject.cFrame.pCr + vopRect.y * pInfo->VisualObject.cFrame.stepCr, pInfo->VisualObject.cFrame.stepCr,
                &vopRect, pInfo->VisualObject.VideoObject.WarpSpec);
        }
        return MP4_STATUS_OK;
    }
    // decode S(GMC)-VOP
    mbPerCol = pInfo->VisualObject.VideoObject.MacroBlockPerCol;
    mbPerRow = pInfo->VisualObject.VideoObject.MacroBlockPerRow;
    pInfo->mbInVideoPacket = 0;
    mp4_ResetIntraPredBuffer(pInfo);
    i = 0;
#ifdef _OPENMP
#pragma  omp parallel shared(pInfo, i, mbPerCol, mbPerRow, sts) num_threads(pInfo->num_threads)
#endif
    {
        Ipp32s            idThread = 0;
        Ipp32s            curRow;
        mp4_MacroBlockMT* pMBinfoMT;

#ifdef _OPENMP
        idThread = omp_get_thread_num();
        vm_set_current_thread_priority(pInfo->mTreadPriority);
#endif
        pMBinfoMT = pInfo->pMBinfoMT + mbPerRow * idThread;
        for (;;) {
#ifdef _OPENMP
#pragma omp critical(HI_FOXY)
#endif
            {
                curRow = i;
                i ++;
                if (curRow < mbPerCol)
                    if (mp4_DecodeVOP_S_DecodeSlice(pInfo, curRow, pMBinfoMT) != MP4_STATUS_OK) {
                        sts = MP4_STATUS_ERROR;
                        i = curRow = mbPerCol;
                    }
           

⌨️ 快捷键说明

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