blob: 9ba9093293830c15e1dd7f51a23b6fdca7cefe73 [file] [log] [blame]
/*
* Copyright (C) 2007-2008 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/**
*
* File Name: omxVCCOMM_LimitMVToRect.c
* OpenMAX DL: v1.0.2
* Revision: 9641
* Date: Thursday, February 7, 2008
*
*
*
*
* Description:
* Contains module for limiting the MV
*
*/
#include "omxtypes.h"
#include "armOMX.h"
#include "omxVC.h"
#include "armCOMM.h"
/**
* Function: omxVCCOMM_LimitMVToRect (6.1.4.1.3)
*
* Description:
* Limits the motion vector associated with the current block/macroblock to
* prevent the motion compensated block/macroblock from moving outside a
* bounding rectangle as shown in Figure 6-1.
*
* Input Arguments:
*
* pSrcMV - pointer to the motion vector associated with the current block
* or macroblock
* pRectVOPRef - pointer to the bounding rectangle
* Xcoord, Ycoord - coordinates of the current block or macroblock
* size - size of the current block or macroblock; must be equal to 8 or
* 16.
*
* Output Arguments:
*
* pDstMV - pointer to the limited motion vector
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one or more of the
* following conditions is true:
* - at least one of the following pointers is NULL:
* pSrcMV, pDstMV, or pRectVOPRef.
* - size is not equal to either 8 or 16.
* - the width or height of the bounding rectangle is less than
* twice the block size.
*/
OMXResult omxVCCOMM_LimitMVToRect(
const OMXVCMotionVector * pSrcMV,
OMXVCMotionVector *pDstMV,
const OMXRect * pRectVOPRef,
OMX_INT Xcoord,
OMX_INT Ycoord,
OMX_INT size
)
{
/* Argument error checks */
armRetArgErrIf(pSrcMV == NULL, OMX_Sts_BadArgErr);
armRetArgErrIf(pDstMV == NULL, OMX_Sts_BadArgErr);
armRetArgErrIf(pRectVOPRef == NULL, OMX_Sts_BadArgErr);
armRetArgErrIf((size != 8) && (size != 16), OMX_Sts_BadArgErr);
armRetArgErrIf((pRectVOPRef->width < (2* size)), OMX_Sts_BadArgErr);
armRetArgErrIf((pRectVOPRef->height < (2* size)), OMX_Sts_BadArgErr);
pDstMV->dx = armMin (armMax (pSrcMV->dx, 2*pRectVOPRef->x - Xcoord),
(2*pRectVOPRef->x + pRectVOPRef->width - Xcoord - size));
pDstMV->dy = armMin (armMax (pSrcMV->dy, 2*pRectVOPRef->y - Ycoord),
(2*pRectVOPRef->y + pRectVOPRef->height - Ycoord - size));
return OMX_Sts_NoErr;
}
/* End of file */