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

📄 omxvcm4p10_blockmatch_integer.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  omxVCM4P10_BlockMatch_Integer.c * OpenMAX DL: v1.0.2 * Revision:   10586 * Date:       Wednesday, March 5, 2008 *  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. *  *  * * Description: * Contains modules for Block matching, a full search algorithm * is implemented *  */ #include "omxtypes.h"#include "armOMX.h"#include "omxVC.h"#include "armVC.h"#include "armCOMM.h"/** * Function:  omxVCM4P10_BlockMatch_Integer   (6.3.5.2.1) * * Description: * Performs integer block match.  Returns best MV and associated cost.  * * Input Arguments: *    *   pSrcOrgY - Pointer to the top-left corner of the current block. If  *            iBlockWidth==4,  4-byte alignment required. If iBlockWidth==8,   *            8-byte alignment required. If iBlockWidth==16, 16-byte alignment  *            required.  *   pSrcRefY - Pointer to the top-left corner of the co-located block in the  *            reference picture. If iBlockWidth==4,  4-byte alignment  *            required.  If iBlockWidth==8,  8-byte alignment required.  If  *            iBlockWidth==16, 16-byte alignment required.  *   nSrcOrgStep - Stride of the original picture plane, expressed in terms  *            of integer pixels; must be a multiple of iBlockWidth.  *   nSrcRefStep - Stride of the reference picture plane, expressed in terms  *            of integer pixels  *   pRefRect - pointer to the valid reference rectangle inside the reference  *            picture plane  *   nCurrPointPos - position of the current block in the current plane  *   iBlockWidth - Width of the current block, expressed in terms of integer  *            pixels; must be equal to either 4, 8, or 16.  *   iBlockHeight - Height of the current block, expressed in terms of  *            integer pixels; must be equal to either 4, 8, or 16.  *   nLamda - Lamda factor; used to compute motion cost  *   pMVPred - Predicted MV; used to compute motion cost, expressed in terms  *            of 1/4-pel units  *   pMVCandidate - Candidate MV; used to initialize the motion search,  *            expressed in terms of integer pixels  *   pMESpec - pointer to the ME specification structure  * * Output Arguments: *    *   pDstBestMV - Best MV resulting from integer search, expressed in terms  *            of 1/4-pel units  *   pBestCost - Motion cost associated with the best MV; computed as  *            SAD+Lamda*BitsUsedByMV  * * Return Value: *    OMX_Sts_NoErr, if the function runs without error. *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:  *    -    any of the following poitners are NULL: *         pSrcOrgY, pSrcRefY, pRefRect, pMVPred, pMVCandidate, or pMESpec.  *    -    Either iBlockWidth or iBlockHeight are values other than 4, 8, or 16.  *    -    Any alignment restrictions are violated  * */  OMXResult omxVCM4P10_BlockMatch_Integer (     const OMX_U8 *pSrcOrgY,     OMX_S32 nSrcOrgStep,     const OMX_U8 *pSrcRefY,     OMX_S32 nSrcRefStep,	 const OMXRect *pRefRect,	 const OMXVCM4P2Coordinate *pCurrPointPos,     OMX_U8 iBlockWidth,     OMX_U8 iBlockHeight,     OMX_U32 nLamda,     const OMXVCMotionVector *pMVPred,     const OMXVCMotionVector *pMVCandidate,     OMXVCMotionVector *pBestMV,     OMX_S32 *pBestCost,     void *pMESpec){    /* Definitions and Initializations*/    OMX_INT candSAD;    OMX_INT fromX, toX, fromY, toY;    /* Offset to the reference at the begining of the bounding box */    const OMX_U8 *pTempSrcRefY, *pTempSrcOrgY;    OMX_S16 x, y;    OMXVCMotionVector diffMV;    OMX_S32 nSearchRange;    ARMVCM4P10_MESpec *armMESpec = (ARMVCM4P10_MESpec *) pMESpec;    /* Argument error checks */    armRetArgErrIf((iBlockWidth ==  4) && (!armIs4ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr);    armRetArgErrIf((iBlockWidth ==  8) && (!armIs8ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr);    armRetArgErrIf((iBlockWidth == 16) && (!armIs16ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr);	armRetArgErrIf((iBlockWidth ==  4) && (!armIs4ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr);    armRetArgErrIf((iBlockWidth ==  8) && (!armIs8ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr);    armRetArgErrIf((iBlockWidth == 16) && (!armIs16ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr);    armRetArgErrIf(pSrcOrgY == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pSrcRefY == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pMVPred == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pMVCandidate == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pBestMV == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pBestCost == NULL, OMX_Sts_BadArgErr);	armRetArgErrIf(((iBlockWidth!=4)&&(iBlockWidth!=8)&&(iBlockWidth!=16)) , OMX_Sts_BadArgErr);	armRetArgErrIf(((iBlockHeight!=4)&&(iBlockHeight!=8)&&(iBlockHeight!=16)) , OMX_Sts_BadArgErr);    armIgnore (pMESpec);    if(iBlockWidth == 4)    {        nSearchRange = armMESpec->MEParams.searchRange4x4;    }    else if(iBlockWidth == 8)    {        nSearchRange = armMESpec->MEParams.searchRange8x8;    }    else    {        nSearchRange = armMESpec->MEParams.searchRange16x16;    }    /* Check for valid region */     fromX = nSearchRange;    toX   = nSearchRange;    fromY = nSearchRange;    toY   = nSearchRange;        if ((pCurrPointPos->x - nSearchRange) < pRefRect->x)    {        fromX =  pCurrPointPos->x - pRefRect->x;    }    if ((pCurrPointPos->x + iBlockWidth + nSearchRange) > (pRefRect->x + pRefRect->width))    {        toX   = pRefRect->width - (pCurrPointPos->x - pRefRect->x) - iBlockWidth;    }    if ((pCurrPointPos->y - nSearchRange) < pRefRect->y)    {        fromY = pCurrPointPos->y - pRefRect->y;    }    if ((pCurrPointPos->y + iBlockWidth + nSearchRange) > (pRefRect->y + pRefRect->height))    {        toY   = pRefRect->width - (pCurrPointPos->y - pRefRect->y) - iBlockWidth;    }        pBestMV->dx = -fromX * 4;    pBestMV->dy = -fromY * 4;    /* Initialize to max value as a start point */    *pBestCost = 0x7fffffff;        /* Looping on y- axis */    for (y = -fromY; y <= toY; y++)    {        /* Looping on x- axis */        for (x = -fromX; x <= toX; x++)        {            /* Positioning the pointer */            pTempSrcRefY = pSrcRefY + (nSrcRefStep * y) + x;            pTempSrcOrgY = pSrcOrgY;                        /* Calculate the SAD */            armVCCOMM_SAD(	    	        pTempSrcOrgY,    	        nSrcOrgStep,    	        pTempSrcRefY,    	        nSrcRefStep,    	        &candSAD,    	        iBlockHeight,    	        iBlockWidth);    	                diffMV.dx = (x * 4) - pMVPred->dx;            diffMV.dy = (y * 4) - pMVPred->dy;                        /* Result calculations */            armVCM4P10_CompareMotionCostToMV ((x * 4), (y * 4), diffMV, candSAD, pBestMV, nLamda, pBestCost);        } /* End of x- axis */    } /* End of y-axis */    return OMX_Sts_NoErr;}/* End of file */

⌨️ 快捷键说明

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