omxvcm4p2_motionestimationmb.c
来自「The OpenMAX DL (Development Layer) APIs 」· C语言 代码 · 共 631 行 · 第 1/2 页
C
631 行
/* Preparing a linear buffer for block match */ for (y = 0, index = count = 0; y < 16; y++, index += srcCurrStep - 16) { for(x = 0; x < 16; x++, count++, index++) { pTempSrcCurrBuf[count] = pSrcCurrBuf[index]; } } for(y = 0, index = 0; y < 2; y++) { for(x = 0; x < 2; x++,index++) { if((pMBInfo[0] != NULL) && (pMBInfo[0]->mbType != OMX_VC_INTRA)) { pSrcCandMV1[index] = &(pMBInfo[0]->pMV0[y][x]); } else { pSrcCandMV1[index] = NULL; } if((pMBInfo[1] != NULL) && (pMBInfo[1]->mbType != OMX_VC_INTRA)) { pSrcCandMV2[index] = &(pMBInfo[1]->pMV0[y][x]); } else { pSrcCandMV2[index] = NULL; } if((pMBInfo[3] != NULL) && (pMBInfo[3]->mbType != OMX_VC_INTRA)) { pSrcCandMV3[index] = &(pMBInfo[3]->pMV0[y][x]); } else { pSrcCandMV3[index] = NULL; } } } /* Calculating SAD at MV(0,0) */ armVCCOMM_SAD(pTempSrcCurrBuf, 16, pSrcRefBuf, srcRefStep, &Sad, 16, 16); *pDstSAD = Sad; /* Mode decision for NOT_CODED MB */ if(*pDstSAD == 0) { pSrcDstMBCurr->pMV0[0][0].dx = 0; pSrcDstMBCurr->pMV0[0][0].dy = 0; *pDstSAD = 0; return OMX_Sts_NoErr; } omxVCM4P2_FindMVpred( &(pSrcDstMBCurr->pMV0[0][0]), pSrcCandMV1[0], pSrcCandMV2[0], pSrcCandMV3[0], &(pSrcDstMBCurr->pMVPred[0][0]), NULL, 0); /* Inter 1 MV */ armVCM4P2_BlockMatch_16x16( pSrcRefBuf, srcRefStep, pRefRect, pTempSrcCurrBuf, pCurrPointPos, &(pSrcDstMBCurr->pMVPred[0][0]), NULL, pMEParams, &dstMV16x16, &dstSAD16x16); /* Initialize all with 1 MV values */ pSrcDstMBCurr->pMV0[0][0].dx = dstMV16x16.dx; pSrcDstMBCurr->pMV0[0][0].dy = dstMV16x16.dy; pSrcDstMBCurr->pMV0[0][1].dx = dstMV16x16.dx; pSrcDstMBCurr->pMV0[0][1].dy = dstMV16x16.dy; pSrcDstMBCurr->pMV0[1][0].dx = dstMV16x16.dx; pSrcDstMBCurr->pMV0[1][0].dy = dstMV16x16.dy; pSrcDstMBCurr->pMV0[1][1].dx = dstMV16x16.dx; pSrcDstMBCurr->pMV0[1][1].dy = dstMV16x16.dy; *pDstSAD = dstSAD16x16; if (pMEParams->searchEnable8x8) { /* Inter 4MV */ armVCM4P2_BlockMatch_8x8 (pSrcRefBuf, srcRefStep, pRefRect, pTempSrcCurrBuf, pTempCurrPointPos, &(pSrcDstMBCurr->pMVPred[0][0]), NULL, pMEParams, &(pSrcDstMBCurr->pMV0[0][0]), &dstSAD8x8 ); pDstBlockSAD[0] = dstSAD8x8; *pDstSAD = dstSAD8x8; pTempCurrPointPos->x += 8; pSrcRefBuf += 8; omxVCM4P2_FindMVpred( &(pSrcDstMBCurr->pMV0[0][1]), pSrcCandMV1[1], pSrcCandMV2[1], pSrcCandMV3[1], &(pSrcDstMBCurr->pMVPred[0][1]), NULL, 1); armVCM4P2_BlockMatch_8x8 (pSrcRefBuf, srcRefStep, pRefRect, pTempSrcCurrBuf, pTempCurrPointPos, &(pSrcDstMBCurr->pMVPred[0][1]), NULL, pMEParams, &(pSrcDstMBCurr->pMV0[0][1]), &dstSAD8x8 ); pDstBlockSAD[1] = dstSAD8x8; *pDstSAD += dstSAD8x8; pTempCurrPointPos->x -= 8; pTempCurrPointPos->y += 8; pSrcRefBuf += (srcRefStep * 8) - 8; omxVCM4P2_FindMVpred( &(pSrcDstMBCurr->pMV0[1][0]), pSrcCandMV1[2], pSrcCandMV2[2], pSrcCandMV3[2], &(pSrcDstMBCurr->pMVPred[1][0]), NULL, 2); armVCM4P2_BlockMatch_8x8 (pSrcRefBuf, srcRefStep, pRefRect, pTempSrcCurrBuf, pTempCurrPointPos, &(pSrcDstMBCurr->pMVPred[1][0]), NULL, pMEParams, &(pSrcDstMBCurr->pMV0[1][0]), &dstSAD8x8 ); pDstBlockSAD[2] = dstSAD8x8; *pDstSAD += dstSAD8x8; pTempCurrPointPos->x += 8; pSrcRefBuf += 8; omxVCM4P2_FindMVpred( &(pSrcDstMBCurr->pMV0[1][1]), pSrcCandMV1[3], pSrcCandMV2[3], pSrcCandMV3[3], &(pSrcDstMBCurr->pMVPred[1][1]), NULL, 3); armVCM4P2_BlockMatch_8x8 (pSrcRefBuf, srcRefStep, pRefRect, pTempSrcCurrBuf, pTempCurrPointPos, &(pSrcDstMBCurr->pMVPred[1][1]), NULL, pMEParams, &(pSrcDstMBCurr->pMV0[1][1]), &dstSAD8x8 ); pDstBlockSAD[3] = dstSAD8x8; *pDstSAD += dstSAD8x8; /* Checking if 4MV is equal to 1MV */ if ( (pSrcDstMBCurr->pMV0[0][0].dx != dstMV16x16.dx) || (pSrcDstMBCurr->pMV0[0][0].dy != dstMV16x16.dy) || (pSrcDstMBCurr->pMV0[0][1].dx != dstMV16x16.dx) || (pSrcDstMBCurr->pMV0[0][1].dy != dstMV16x16.dy) || (pSrcDstMBCurr->pMV0[1][0].dx != dstMV16x16.dx) || (pSrcDstMBCurr->pMV0[1][0].dy != dstMV16x16.dy) || (pSrcDstMBCurr->pMV0[1][1].dx != dstMV16x16.dx) || (pSrcDstMBCurr->pMV0[1][1].dy != dstMV16x16.dy) ) { /* select the 4 MV */ pSrcDstMBCurr->mbType = OMX_VC_INTER4V; } } /* finding the error in intra mode */ for (count = 0, average = 0; count < 256 ; count++) { average = average + pTempSrcCurrBuf[count]; } average = average/256; intraSAD = 0; /* Intra SAD calculation */ for (count = 0; count < 256 ; count++) { intraSAD += armAbs ((pTempSrcCurrBuf[count]) - (average)); } /* Using the MPEG4 VM formula for intra/inter mode decision Var < (SAD - 2*NB) where NB = N^2 is the number of pixels of the macroblock.*/ if (intraSAD <= (*pDstSAD - 512)) { pSrcDstMBCurr->mbType = OMX_VC_INTRA; pSrcDstMBCurr->pMV0[0][0].dx = 0; pSrcDstMBCurr->pMV0[0][0].dy = 0; *pDstSAD = intraSAD; pDstBlockSAD[0] = 0xFFFF; pDstBlockSAD[1] = 0xFFFF; pDstBlockSAD[2] = 0xFFFF; pDstBlockSAD[3] = 0xFFFF; } if(pSrcDstMBCurr->mbType == OMX_VC_INTER) { pTempSrcRefBuf = pSrcRefBuf + (srcRefStep * dstMV16x16.dy) + dstMV16x16.dx; if((dstMV16x16.dx & 0x1) && (dstMV16x16.dy & 0x1)) { predictType = OMX_VC_HALF_PIXEL_XY; } else if(dstMV16x16.dx & 0x1) { predictType = OMX_VC_HALF_PIXEL_X; } else if(dstMV16x16.dy & 0x1) { predictType = OMX_VC_HALF_PIXEL_Y; } else { predictType = OMX_VC_INTEGER_PIXEL; } pDst = armAlignTo8Bytes(&(aDst[0])); /* Calculating Block SAD at MV(dstMV16x16.dx,dstMV16x16.dy) */ /* Block 0 */ omxVCM4P2_MCReconBlock(pTempSrcRefBuf, srcRefStep, NULL, pDst, dstStep, predictType, pMEParams->rndVal); armVCCOMM_SAD(pTempSrcCurrBuf, 16, pDst, dstStep, &Sad, 8, 8); pDstBlockSAD[0] = Sad; /* Block 1 */ omxVCM4P2_MCReconBlock(pTempSrcRefBuf + 8, srcRefStep, NULL, pDst, dstStep, predictType, pMEParams->rndVal); armVCCOMM_SAD(pTempSrcCurrBuf + 8, 16, pDst, dstStep, &Sad, 8, 8); pDstBlockSAD[1] = Sad; /* Block 2 */ omxVCM4P2_MCReconBlock(pTempSrcRefBuf + (srcRefStep*8), srcRefStep, NULL, pDst, dstStep, predictType, pMEParams->rndVal); armVCCOMM_SAD(pTempSrcCurrBuf + (16*8), 16, pDst, dstStep, &Sad, 8, 8); pDstBlockSAD[2] = Sad; /* Block 3 */ omxVCM4P2_MCReconBlock(pTempSrcRefBuf + (srcRefStep*8) + 8, srcRefStep, NULL, pDst, dstStep, predictType, pMEParams->rndVal); armVCCOMM_SAD(pTempSrcCurrBuf + (16*8) + 8, 16, pDst, dstStep, &Sad, 8, 8); pDstBlockSAD[3] = Sad; } return OMX_Sts_NoErr;}/* End of file */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?