/*
 * 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_Luma.c
 * OpenMAX DL: v1.0.2
 * Revision:   9641
 * Date:       Thursday, February 7, 2008
 * 
 * 
 * 
 * Description:
 * This function will calculate interpolation for luma components
 * 
 */

#include "omxtypes.h"
#include "armOMX.h"
#include "omxVC.h"

#include "armCOMM.h"
#include "armVC.h"

/**
 * Function: armM4P10_Copy
 *
 * Description:
 * This function performs copy a block of data from source to destination
 *
 * Remarks:
 *
 *  [in]    pSrc            Pointer to top-left corner of block
 *  [in]    iSrcStep    Step of the source buffer.
 *  [in]    iDstStep    Step of the destination  buffer.
 *  [in]    iWidth      Width of the current block
 *  [in]    iHeight     Height of the current block
 *  [out]   pDst            Pointer to the interpolation buffer
 *
 * Return Value:
 * Standard OMXResult value.
 *
 */
static OMXResult armM4P10_Copy(  
    const OMX_U8*     pSrc,
    OMX_U32     iSrcStep,
    OMX_U8*     pDst,
    OMX_U32     iDstStep, 
    OMX_U32     iWidth,
    OMX_U32     iHeight
)
{
    OMX_U32     x, y;

    for (y = 0; y < iHeight; y++)
    {
        for (x = 0; x < iWidth; x++)
        {
            pDst [y * iDstStep + x] = pSrc [y * iSrcStep + x];
        }
    }

    return OMX_Sts_NoErr;
}

/**
 * Function: armVCM4P10_Interpolate_Luma
 *
 * Description:
 * This function performs interpolation for luma 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/4 pixel unit (0~3) 
 *  [in]    dy              Fractional part of vertical motion vector 
 *                                              component in 1/4 pixel unit (0~3) 
 *  [out]   pDst            Pointer to the interpolation buffer
 *
 * Return Value:
 * Standard OMXResult value.
 *
 */

 OMXResult armVCM4P10_Interpolate_Luma(
     const 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_U8      pBuf1 [16*16];
    const OMX_U8      *pSrcHalfHor = pSrc;
    const OMX_U8      *pSrcHalfVer = pSrc;

    /* check for argument error */
    armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr)
    armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr)
    armRetArgErrIf(dx > 3, OMX_Sts_BadArgErr)
    armRetArgErrIf(dy > 3, OMX_Sts_BadArgErr)

    /* Work out positions for half pixel interpolation */
    if (dx == 3)
    {
        pSrcHalfVer += 1;
    }
    if (dy == 3)
    {
        pSrcHalfHor += iSrcStep;
    }

    /* Switch on type of pixel
     * Pixels are named 'a' to 's' as in the H.264 standard
     */
    if (dx == 0 && dy == 0)
    {
        /* G */
        armM4P10_Copy(pSrc, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    }
    else if (dy == 0)
    {
        /* a, b, c */
        armVCM4P10_InterpolateHalfHor_Luma
            (pSrcHalfHor, iSrcStep, pDst, iDstStep, iWidth, iHeight);            
        
        if (dx == 1 || dx == 3)
        {
            armVCCOMM_Average 
                (pDst, pSrcHalfVer, iDstStep, iSrcStep, pDst, iDstStep, iWidth, iHeight);
        }
    }
    else if (dx == 0)
    {
        /* d, h, n */
        armVCM4P10_InterpolateHalfVer_Luma
            (pSrcHalfVer, iSrcStep, pDst, iDstStep, iWidth, iHeight);

        if (dy == 1 || dy == 3)
        {
            armVCCOMM_Average 
                (pDst, pSrcHalfHor, iDstStep, iSrcStep, pDst, iDstStep, iWidth, iHeight);
        }
    }
    else if (dx == 2 || dy == 2)
    {
        /* j */
        armVCM4P10_InterpolateHalfDiag_Luma
            (pSrc, iSrcStep, pDst, iDstStep, iWidth, iHeight);

        if (dx == 1 || dx == 3)
        {
            /* i, k */
            armVCM4P10_InterpolateHalfVer_Luma
                (pSrcHalfVer, iSrcStep, pBuf1, iWidth, iWidth, iHeight);
                
            armVCCOMM_Average 
                (pDst, pBuf1, iDstStep, iWidth, pDst, iDstStep, iWidth, iHeight);
        }
        if (dy == 1 || dy == 3)
        {
            /* f,q */
            armVCM4P10_InterpolateHalfHor_Luma
                (pSrcHalfHor, iSrcStep, pBuf1, iWidth, iWidth, iHeight);

            armVCCOMM_Average 
                (pDst, pBuf1, iDstStep, iWidth, pDst, iDstStep, iWidth, iHeight);
        }
    }
    else /* dx=1,3 and dy=1,3 */
    {
        /* e, g, p, r */
        armVCM4P10_InterpolateHalfHor_Luma
            (pSrcHalfHor, iSrcStep, pBuf1, iWidth, iWidth, iHeight);

        armVCM4P10_InterpolateHalfVer_Luma
            (pSrcHalfVer, iSrcStep, pDst, iDstStep, iWidth, iHeight);

        armVCCOMM_Average 
            (pBuf1, pDst, iWidth, iDstStep, pDst, iDstStep, iWidth, iHeight);
    }

    return OMX_Sts_NoErr;
}

/*****************************************************************************
 *                              END OF FILE
 *****************************************************************************/
