1/**
2 *
3 * File Name:  omxVCCOMM_LimitMVToRect.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 module for limiting the MV
14 *
15 */
16
17#include "omxtypes.h"
18#include "armOMX.h"
19#include "omxVC.h"
20
21#include "armCOMM.h"
22
23/**
24 * Function:  omxVCCOMM_LimitMVToRect   (6.1.4.1.3)
25 *
26 * Description:
27 * Limits the motion vector associated with the current block/macroblock to
28 * prevent the motion compensated block/macroblock from moving outside a
29 * bounding rectangle as shown in Figure 6-1.
30 *
31 * Input Arguments:
32 *
33 *   pSrcMV - pointer to the motion vector associated with the current block
34 *            or macroblock
35 *   pRectVOPRef - pointer to the bounding rectangle
36 *   Xcoord, Ycoord  - coordinates of the current block or macroblock
37 *   size - size of the current block or macroblock; must be equal to 8 or
38 *            16.
39 *
40 * Output Arguments:
41 *
42 *   pDstMV - pointer to the limited motion vector
43 *
44 * Return Value:
45 *
46 *    OMX_Sts_NoErr - no error
47 *    OMX_Sts_BadArgErr - bad arguments.  Returned if one or more of the
48 *              following conditions is true:
49 *    -    at least one of the following pointers is NULL:
50 *         pSrcMV, pDstMV, or pRectVOPRef.
51 *    -    size is not equal to either 8 or 16.
52 *    -    the width or height of the bounding rectangle is less than
53 *         twice the block size.
54 */
55OMXResult omxVCCOMM_LimitMVToRect(
56     const OMXVCMotionVector * pSrcMV,
57     OMXVCMotionVector *pDstMV,
58     const OMXRect * pRectVOPRef,
59     OMX_INT Xcoord,
60     OMX_INT Ycoord,
61     OMX_INT size
62)
63{
64    /* Argument error checks */
65    armRetArgErrIf(pSrcMV == NULL, OMX_Sts_BadArgErr);
66    armRetArgErrIf(pDstMV == NULL, OMX_Sts_BadArgErr);
67    armRetArgErrIf(pRectVOPRef == NULL, OMX_Sts_BadArgErr);
68    armRetArgErrIf((size != 8) && (size != 16), OMX_Sts_BadArgErr);
69    armRetArgErrIf((pRectVOPRef->width < (2* size)), OMX_Sts_BadArgErr);
70    armRetArgErrIf((pRectVOPRef->height < (2* size)), OMX_Sts_BadArgErr);
71
72    pDstMV->dx = armMin (armMax (pSrcMV->dx, 2*pRectVOPRef->x - Xcoord),
73                    (2*pRectVOPRef->x + pRectVOPRef->width - Xcoord - size));
74    pDstMV->dy = armMin (armMax (pSrcMV->dy, 2*pRectVOPRef->y - Ycoord),
75                    (2*pRectVOPRef->y + pRectVOPRef->height - Ycoord - size));
76
77
78    return OMX_Sts_NoErr;
79}
80
81/* End of file */
82