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 + -
显示快捷键?