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

📄 omxvcm4p10_blockmatch_half.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  omxVCM4P10_BlockMatch_Half.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 half pel Block matching,  *  */ #include "omxtypes.h"#include "armOMX.h"#include "omxVC.h"#include "armVC.h"#include "armCOMM.h"    /** * Function:  omxVCM4P10_BlockMatch_Half   (6.3.5.2.2) * * Description: * Performs a half-pel block match using results from a prior integer search.  *  Returns the best MV and associated cost.  This function estimates the  * half-pixel motion vector by interpolating the integer resolution motion  * vector referenced by the input parameter pSrcDstBestMV, i.e., the initial  * integer MV is generated externally.  The function  * omxVCM4P10_BlockMatch_Integer may be used for integer motion estimation.  * * Input Arguments: *    *   pSrcOrgY - Pointer to the current position in original picture plane. 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 in terms of full  *            pixels; must be a multiple of iBlockWidth.  *   nSrcRefStep - Stride of the reference picture plane in terms of full  *            pixels  *   iBlockWidth - Width of the current block in terms of full pixels; must  *            be equal to either 4, 8, or 16.  *   iBlockHeight - Height of the current block in terms of full pixels; must  *            be equal to either 4, 8, or 16.  *   nLamda - Lamda factor, used to compute motion cost  *   pMVPred - Predicted MV, represented in terms of 1/4-pel units; used to  *            compute motion cost  *   pSrcDstBestMV - The best MV resulting from a prior integer search,  *            represented in terms of 1/4-pel units  * * Output Arguments: *    *   pSrcDstBestMV - Best MV resulting from the half-pel 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 pointers is NULL: pSrcOrgY, pSrcRefY,  *              pSrcDstBestMV, pMVPred, pBestCost  *    -    iBlockWidth or iBlockHeight are equal to values other than 4, 8, or 16.  *    -    Any alignment restrictions are violated  * */ OMXResult omxVCM4P10_BlockMatch_Half(    const OMX_U8* pSrcOrgY,     OMX_S32 nSrcOrgStep,     const OMX_U8* pSrcRefY,     OMX_S32 nSrcRefStep,     OMX_U8 iBlockWidth,     OMX_U8 iBlockHeight,     OMX_U32 nLamda,     const OMXVCMotionVector* pMVPred,     OMXVCMotionVector* pSrcDstBestMV,     OMX_S32* pBestCost){    /* 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, candMV, integerMV;    OMX_U8      interpolY[256];    /* 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((nSrcOrgStep % iBlockWidth), OMX_Sts_BadArgErr);    armRetArgErrIf(pSrcOrgY == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pSrcRefY == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pMVPred == NULL, OMX_Sts_BadArgErr);    armRetArgErrIf(pSrcDstBestMV == 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);                        /* Check for valid region */     fromX = 1;    toX   = 1;    fromY = 1;    toY   = 1;        /* Initialize to max value as a start point */    *pBestCost = 0x7fffffff;        integerMV.dx = pSrcDstBestMV->dx;    integerMV.dy = pSrcDstBestMV->dy;        /* 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 * (integerMV.dy/4)) + (integerMV.dx/4);            if (x < 0)            {                pTempSrcRefY = pTempSrcRefY + x;            }            if (y < 0)            {                pTempSrcRefY = pTempSrcRefY + (y * nSrcRefStep);            }            pTempSrcOrgY = pSrcOrgY;                        /* Prepare cand MV */            candMV.dx = integerMV.dx + x * 2;            candMV.dy = integerMV.dy + y * 2;                        /* Interpolate half pel for the current position*/            armVCM4P10_Interpolate_Luma(                        pTempSrcRefY,                        nSrcRefStep,                        interpolY,                        iBlockWidth,                        iBlockWidth,                        iBlockHeight,                        armAbs(x) * 2,                        armAbs(y) * 2);                        /* Calculate the SAD */            armVCCOMM_SAD(	                        pTempSrcOrgY,                        nSrcOrgStep,                        interpolY,                        iBlockWidth,                        &candSAD,                        iBlockHeight,                        iBlockWidth);             diffMV.dx = candMV.dx - pMVPred->dx;            diffMV.dy = candMV.dy - pMVPred->dy;                        /* Result calculations */            armVCM4P10_CompareMotionCostToMV (                        candMV.dx,                         candMV.dy,                         diffMV,                         candSAD,                         pSrcDstBestMV,                         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 + -