178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar/* 278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Copyright (C) 2007-2008 ARM Limited 378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * you may not use this file except in compliance with the License. 678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * You may obtain a copy of the License at 778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Unless required by applicable law or agreed to in writing, software 1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * See the License for the specific language governing permissions and 1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * limitations under the License. 1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * 1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar */ 170c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 180c1bc742181ded4930842b46e9507372f0b1b963James Dong * 190c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: omxVCM4P10_BlockMatch_Integer.c 200c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2 210c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision: 9641 220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date: Thursday, February 7, 2008 230c1bc742181ded4930842b46e9507372f0b1b963James Dong * 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains modules for Block matching, a full search algorithm 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * is implemented 300c1bc742181ded4930842b46e9507372f0b1b963James Dong * 310c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 320c1bc742181ded4930842b46e9507372f0b1b963James Dong 330c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 340c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 350c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h" 360c1bc742181ded4930842b46e9507372f0b1b963James Dong 370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h" 380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 390c1bc742181ded4930842b46e9507372f0b1b963James Dong 400c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: omxVCM4P10_BlockMatch_Integer (6.3.5.2.1) 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs integer block match. Returns best MV and associated cost. 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * Input Arguments: 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcOrgY - Pointer to the top-left corner of the current block. If 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * iBlockWidth==4, 4-byte alignment required. If iBlockWidth==8, 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * 8-byte alignment required. If iBlockWidth==16, 16-byte alignment 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * required. 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcRefY - Pointer to the top-left corner of the co-located block in the 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * reference picture. If iBlockWidth==4, 4-byte alignment 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * required. If iBlockWidth==8, 8-byte alignment required. If 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * iBlockWidth==16, 16-byte alignment required. 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * nSrcOrgStep - Stride of the original picture plane, expressed in terms 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * of integer pixels; must be a multiple of iBlockWidth. 580c1bc742181ded4930842b46e9507372f0b1b963James Dong * nSrcRefStep - Stride of the reference picture plane, expressed in terms 590c1bc742181ded4930842b46e9507372f0b1b963James Dong * of integer pixels 600c1bc742181ded4930842b46e9507372f0b1b963James Dong * pRefRect - pointer to the valid reference rectangle inside the reference 610c1bc742181ded4930842b46e9507372f0b1b963James Dong * picture plane 620c1bc742181ded4930842b46e9507372f0b1b963James Dong * nCurrPointPos - position of the current block in the current plane 630c1bc742181ded4930842b46e9507372f0b1b963James Dong * iBlockWidth - Width of the current block, expressed in terms of integer 640c1bc742181ded4930842b46e9507372f0b1b963James Dong * pixels; must be equal to either 4, 8, or 16. 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * iBlockHeight - Height of the current block, expressed in terms of 660c1bc742181ded4930842b46e9507372f0b1b963James Dong * integer pixels; must be equal to either 4, 8, or 16. 670c1bc742181ded4930842b46e9507372f0b1b963James Dong * nLamda - Lamda factor; used to compute motion cost 680c1bc742181ded4930842b46e9507372f0b1b963James Dong * pMVPred - Predicted MV; used to compute motion cost, expressed in terms 690c1bc742181ded4930842b46e9507372f0b1b963James Dong * of 1/4-pel units 700c1bc742181ded4930842b46e9507372f0b1b963James Dong * pMVCandidate - Candidate MV; used to initialize the motion search, 710c1bc742181ded4930842b46e9507372f0b1b963James Dong * expressed in terms of integer pixels 720c1bc742181ded4930842b46e9507372f0b1b963James Dong * pMESpec - pointer to the ME specification structure 730c1bc742181ded4930842b46e9507372f0b1b963James Dong * 740c1bc742181ded4930842b46e9507372f0b1b963James Dong * Output Arguments: 750c1bc742181ded4930842b46e9507372f0b1b963James Dong * 760c1bc742181ded4930842b46e9507372f0b1b963James Dong * pDstBestMV - Best MV resulting from integer search, expressed in terms 770c1bc742181ded4930842b46e9507372f0b1b963James Dong * of 1/4-pel units 780c1bc742181ded4930842b46e9507372f0b1b963James Dong * pBestCost - Motion cost associated with the best MV; computed as 790c1bc742181ded4930842b46e9507372f0b1b963James Dong * SAD+Lamda*BitsUsedByMV 800c1bc742181ded4930842b46e9507372f0b1b963James Dong * 810c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 820c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_NoErr, if the function runs without error. 830c1bc742181ded4930842b46e9507372f0b1b963James Dong * OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs: 840c1bc742181ded4930842b46e9507372f0b1b963James Dong * - any of the following poitners are NULL: 850c1bc742181ded4930842b46e9507372f0b1b963James Dong * pSrcOrgY, pSrcRefY, pRefRect, pMVPred, pMVCandidate, or pMESpec. 860c1bc742181ded4930842b46e9507372f0b1b963James Dong * - Either iBlockWidth or iBlockHeight are values other than 4, 8, or 16. 870c1bc742181ded4930842b46e9507372f0b1b963James Dong * - Any alignment restrictions are violated 880c1bc742181ded4930842b46e9507372f0b1b963James Dong * 890c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 900c1bc742181ded4930842b46e9507372f0b1b963James Dong 910c1bc742181ded4930842b46e9507372f0b1b963James Dong OMXResult omxVCM4P10_BlockMatch_Integer ( 920c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8 *pSrcOrgY, 930c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S32 nSrcOrgStep, 940c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8 *pSrcRefY, 950c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S32 nSrcRefStep, 960c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMXRect *pRefRect, 970c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMXVCM4P2Coordinate *pCurrPointPos, 980c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 iBlockWidth, 990c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 iBlockHeight, 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 nLamda, 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMXVCMotionVector *pMVPred, 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMXVCMotionVector *pMVCandidate, 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong OMXVCMotionVector *pBestMV, 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S32 *pBestCost, 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong void *pMESpec 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong) 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Definitions and Initializations*/ 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT candSAD; 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT fromX, toX, fromY, toY; 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Offset to the reference at the begining of the bounding box */ 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8 *pTempSrcRefY, *pTempSrcOrgY; 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 x, y; 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong OMXVCMotionVector diffMV; 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S32 nSearchRange; 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong ARMVCM4P10_MESpec *armMESpec = (ARMVCM4P10_MESpec *) pMESpec; 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Argument error checks */ 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 4) && (!armIs4ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr); 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 8) && (!armIs8ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr); 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 16) && (!armIs16ByteAligned(pSrcOrgY)), OMX_Sts_BadArgErr); 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 4) && (!armIs4ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr); 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 8) && (!armIs8ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr); 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf((iBlockWidth == 16) && (!armIs16ByteAligned(pSrcRefY)), OMX_Sts_BadArgErr); 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcOrgY == NULL, OMX_Sts_BadArgErr); 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pSrcRefY == NULL, OMX_Sts_BadArgErr); 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pMVPred == NULL, OMX_Sts_BadArgErr); 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pMVCandidate == NULL, OMX_Sts_BadArgErr); 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pBestMV == NULL, OMX_Sts_BadArgErr); 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(pBestCost == NULL, OMX_Sts_BadArgErr); 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((iBlockWidth!=4)&&(iBlockWidth!=8)&&(iBlockWidth!=16)) , OMX_Sts_BadArgErr); 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong armRetArgErrIf(((iBlockHeight!=4)&&(iBlockHeight!=8)&&(iBlockHeight!=16)) , OMX_Sts_BadArgErr); 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong armIgnore (pMESpec); 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong if(iBlockWidth == 4) 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong nSearchRange = armMESpec->MEParams.searchRange4x4; 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong else if(iBlockWidth == 8) 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong nSearchRange = armMESpec->MEParams.searchRange8x8; 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong nSearchRange = armMESpec->MEParams.searchRange16x16; 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Check for valid region */ 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong fromX = nSearchRange; 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong toX = nSearchRange; 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong fromY = nSearchRange; 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong toY = nSearchRange; 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong if ((pCurrPointPos->x - nSearchRange) < pRefRect->x) 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong fromX = pCurrPointPos->x - pRefRect->x; 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong if ((pCurrPointPos->x + iBlockWidth + nSearchRange) > (pRefRect->x + pRefRect->width)) 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong toX = pRefRect->width - (pCurrPointPos->x - pRefRect->x) - iBlockWidth; 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong if ((pCurrPointPos->y - nSearchRange) < pRefRect->y) 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong fromY = pCurrPointPos->y - pRefRect->y; 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong if ((pCurrPointPos->y + iBlockWidth + nSearchRange) > (pRefRect->y + pRefRect->height)) 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong toY = pRefRect->width - (pCurrPointPos->y - pRefRect->y) - iBlockWidth; 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong pBestMV->dx = -fromX * 4; 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong pBestMV->dy = -fromY * 4; 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Initialize to max value as a start point */ 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong *pBestCost = 0x7fffffff; 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Looping on y- axis */ 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong for (y = -fromY; y <= toY; y++) 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Looping on x- axis */ 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong for (x = -fromX; x <= toX; x++) 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Positioning the pointer */ 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong pTempSrcRefY = pSrcRefY + (nSrcRefStep * y) + x; 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong pTempSrcOrgY = pSrcOrgY; 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Calculate the SAD */ 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong armVCCOMM_SAD( 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong pTempSrcOrgY, 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong nSrcOrgStep, 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong pTempSrcRefY, 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong nSrcRefStep, 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong &candSAD, 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong iBlockHeight, 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong iBlockWidth); 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong diffMV.dx = (x * 4) - pMVPred->dx; 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong diffMV.dy = (y * 4) - pMVPred->dy; 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Result calculations */ 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong armVCM4P10_CompareMotionCostToMV ((x * 4), (y * 4), diffMV, candSAD, pBestMV, nLamda, pBestCost); 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong } /* End of x- axis */ 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong } /* End of y-axis */ 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong/* End of file */ 212