| /* |
| * 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: armVCM4P10_Interpolate_Chroma.c |
| * OpenMAX DL: v1.0.2 |
| * Revision: 9641 |
| * Date: Thursday, February 7, 2008 |
| * |
| * |
| * |
| * Description: |
| * This function will calculate interpolation for chroma components |
| * |
| */ |
| |
| #include "omxtypes.h" |
| #include "armOMX.h" |
| |
| #include "armCOMM.h" |
| |
| /** |
| * Function: armVCM4P10_Interpolate_Chroma |
| * |
| * Description: |
| * This function performs interpolation for chroma components. |
| * |
| * Remarks: |
| * |
| * [in] pSrc Pointer to top-left corner of block used to |
| * interpolate in the reconstructed frame plane |
| * [in] iSrcStep Step of the source buffer. |
| * [in] iDstStep Step of the destination(interpolation) buffer. |
| * [in] iWidth Width of the current block |
| * [in] iHeight Height of the current block |
| * [in] dx Fractional part of horizontal motion vector |
| * component in 1/8 pixel unit (0~7) |
| * [in] dy Fractional part of vertical motion vector |
| * component in 1/8 pixel unit (0~7) |
| * [out] pDst Pointer to the interpolation buffer |
| * |
| * Return Value: |
| * Standard OMXResult value. |
| * |
| */ |
| OMXResult armVCM4P10_Interpolate_Chroma( |
| OMX_U8 *pSrc, |
| OMX_U32 iSrcStep, |
| OMX_U8 *pDst, |
| OMX_U32 iDstStep, |
| OMX_U32 iWidth, |
| OMX_U32 iHeight, |
| OMX_U32 dx, |
| OMX_U32 dy |
| ) |
| { |
| OMX_U32 EightMinusdx = 8 - dx; |
| OMX_U32 EightMinusdy = 8 - dy; |
| OMX_U32 ACoeff, BCoeff, CCoeff, DCoeff; |
| OMX_U32 x, y; |
| |
| /* check for argument error */ |
| armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr) |
| armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr) |
| armRetArgErrIf(dx > 7, OMX_Sts_BadArgErr) |
| armRetArgErrIf(dy > 7, OMX_Sts_BadArgErr) |
| armRetArgErrIf(iSrcStep == 0, OMX_Sts_BadArgErr) |
| armRetArgErrIf(iDstStep == 0, OMX_Sts_BadArgErr) |
| armRetArgErrIf(iWidth == 0, OMX_Sts_BadArgErr) |
| armRetArgErrIf(iHeight == 0, OMX_Sts_BadArgErr) |
| |
| /* if fractionl mv is not (0, 0) */ |
| if (dx != 0 || dy != 0) |
| { |
| ACoeff = EightMinusdx * EightMinusdy; |
| BCoeff = dx * EightMinusdy; |
| CCoeff = EightMinusdx * dy; |
| DCoeff = dx * dy; |
| |
| for (y = 0; y < iHeight; y++) |
| { |
| for (x = 0; x < iWidth; x++) |
| { |
| pDst [y * iDstStep + x] = ( |
| ACoeff * pSrc [y * iSrcStep + x] + |
| BCoeff * pSrc [y * iSrcStep + x + 1] + |
| CCoeff * pSrc [(y + 1) * iSrcStep + x] + |
| DCoeff * pSrc [(y + 1) * iSrcStep + x + 1] + |
| 32) >> 6; |
| } |
| } |
| } |
| else |
| { |
| for (y = 0; y < iHeight; y++) |
| { |
| for (x = 0; x < iWidth; x++) |
| { |
| pDst [y * iDstStep + x] = pSrc [y * iSrcStep + x]; |
| } |
| } |
| } |
| |
| return OMX_Sts_NoErr; |
| } |
| |
| /***************************************************************************** |
| * END OF FILE |
| *****************************************************************************/ |
| |