Home | History | Annotate | Download | only in src
      1 /**
      2  *
      3  * File Name:  omxVCM4P2_BlockMatch_Half_8x8.c
      4  * OpenMAX DL: v1.0.2
      5  * Revision:   9641
      6  * Date:       Thursday, February 7, 2008
      7  *
      8  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
      9  *
     10  *
     11  *
     12  * Description:
     13  * Contains modules for Block matching, a full search algorithm
     14  * is implemented
     15  *
     16  */
     17 
     18 #include "omxtypes.h"
     19 #include "armOMX.h"
     20 #include "omxVC.h"
     21 
     22 #include "armVC.h"
     23 #include "armCOMM.h"
     24 
     25 
     26 /**
     27  * Function:  omxVCM4P2_BlockMatch_Half_8x8   (6.2.4.2.4)
     28  *
     29  * Description:
     30  * Performs an 8x8 block match with half-pixel resolution. Returns the
     31  * estimated motion vector and associated minimum SAD.  This function
     32  * estimates the half-pixel motion vector by interpolating the integer
     33  * resolution motion vector referenced by the input parameter pSrcDstMV, i.e.,
     34  * the initial integer MV is generated externally.  The input parameters
     35  * pSrcRefBuf and pSearchPointRefPos should be shifted by the winning MV of
     36  * 8x8 integer search prior to calling BlockMatch_Half_8x8. The function
     37  * BlockMatch_Integer_8x8 may be used for integer motion estimation.
     38  *
     39  * Input Arguments:
     40  *
     41  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
     42  *            block that corresponds to the location of the current 8x8 block
     43  *            in the current plane.
     44  *   refWidth - width of the reference plane
     45  *   pRefRect - reference plane valid region rectangle
     46  *   pSrcCurrBuf - pointer to the current block in the current macroblock
     47  *            buffer extracted from the original plane (linear array, 128
     48  *            entries); must be aligned on a 8-byte boundary.  The number of
     49  *            bytes between lines (step) is 16.
     50  *   pSearchPointRefPos - position of the starting point for half pixel
     51  *            search (specified in terms of integer pixel units) in the
     52  *            reference plane.
     53  *   rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
     54  *   pSrcDstMV - pointer to the initial MV estimate; typically generated
     55  *            during a prior 8x8 integer search, specified in terms of
     56  *            half-pixel units.
     57  *
     58  * Output Arguments:
     59  *
     60  *   pSrcDstMV - pointer to estimated MV
     61  *   pDstSAD - pointer to minimum SAD
     62  *
     63  * Return Value:
     64  *
     65  *    OMX_Sts_NoErr - no error
     66  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one of the following
     67  *              conditions is true:
     68  *    -    at least one of the following pointers is NULL:
     69  *         pSrcRefBuf, pRefRect, pSrcCurrBuff, pSearchPointRefPos, pSrcDstMV
     70  *    -    pSrcCurrBuf is not 8-byte aligned
     71  *
     72  */
     73 
     74 OMXResult omxVCM4P2_BlockMatch_Half_8x8(
     75      const OMX_U8 *pSrcRefBuf,
     76      OMX_INT refWidth,
     77      const OMXRect *pRefRect,
     78      const OMX_U8 *pSrcCurrBuf,
     79      const OMXVCM4P2Coordinate *pSearchPointRefPos,
     80      OMX_INT rndVal,
     81      OMXVCMotionVector *pSrcDstMV,
     82      OMX_INT *pDstSAD
     83 )
     84 {
     85     /* For a blocksize of 8x8 */
     86     OMX_U8 BlockSize = 8;
     87 
     88     /* Argument error checks */
     89     armRetArgErrIf(pSrcRefBuf         == NULL, OMX_Sts_BadArgErr);
     90     armRetArgErrIf(pRefRect           == NULL, OMX_Sts_BadArgErr);
     91     armRetArgErrIf(pSrcCurrBuf        == NULL, OMX_Sts_BadArgErr);
     92     armRetArgErrIf(pSearchPointRefPos == NULL, OMX_Sts_BadArgErr);
     93     armRetArgErrIf(pSrcDstMV          == NULL, OMX_Sts_BadArgErr);
     94     armRetArgErrIf(!armIs8ByteAligned(pSrcCurrBuf), OMX_Sts_BadArgErr);
     95 
     96     return (armVCM4P2_BlockMatch_Half(
     97                                 pSrcRefBuf,
     98                                 refWidth,
     99                                 pRefRect,
    100                                 pSrcCurrBuf,
    101                                 pSearchPointRefPos,
    102                                 rndVal,
    103                                 pSrcDstMV,
    104                                 pDstSAD,
    105                                 BlockSize));
    106 
    107 }
    108 
    109 /* End of file */
    110