Home | History | Annotate | Download | only in src
      1 /**
      2  *
      3  * File Name:  armVCM4P10_Interpolate_Luma.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  * Description:
     12  * This function will calculate interpolation for luma components
     13  *
     14  */
     15 
     16 #include "omxtypes.h"
     17 #include "armOMX.h"
     18 #include "omxVC.h"
     19 
     20 #include "armCOMM.h"
     21 #include "armVC.h"
     22 
     23 /**
     24  * Function: armM4P10_Copy
     25  *
     26  * Description:
     27  * This function performs copy a block of data from source to destination
     28  *
     29  * Remarks:
     30  *
     31  *  [in]    pSrc            Pointer to top-left corner of block
     32  *  [in]    iSrcStep    Step of the source buffer.
     33  *  [in]    iDstStep    Step of the destination  buffer.
     34  *  [in]    iWidth      Width of the current block
     35  *  [in]    iHeight     Height of the current block
     36  *  [out]   pDst            Pointer to the interpolation buffer
     37  *
     38  * Return Value:
     39  * Standard OMXResult value.
     40  *
     41  */
     42 static OMXResult armM4P10_Copy(
     43     const OMX_U8*     pSrc,
     44     OMX_U32     iSrcStep,
     45     OMX_U8*     pDst,
     46     OMX_U32     iDstStep,
     47     OMX_U32     iWidth,
     48     OMX_U32     iHeight
     49 )
     50 {
     51     OMX_U32     x, y;
     52 
     53     for (y = 0; y < iHeight; y++)
     54     {
     55         for (x = 0; x < iWidth; x++)
     56         {
     57             pDst [y * iDstStep + x] = pSrc [y * iSrcStep + x];
     58         }
     59     }
     60 
     61     return OMX_Sts_NoErr;
     62 }
     63 
     64 /**
     65  * Function: armVCM4P10_Interpolate_Luma
     66  *
     67  * Description:
     68  * This function performs interpolation for luma components.
     69  *
     70  * Remarks:
     71  *
     72  *  [in]    pSrc            Pointer to top-left corner of block used to
     73  *                                              interpolate in the reconstructed frame plane
     74  *  [in]    iSrcStep    Step of the source buffer.
     75  *  [in]    iDstStep    Step of the destination(interpolation) buffer.
     76  *  [in]    iWidth      Width of the current block
     77  *  [in]    iHeight     Height of the current block
     78  *  [in]    dx              Fractional part of horizontal motion vector
     79  *                                              component in 1/4 pixel unit (0~3)
     80  *  [in]    dy              Fractional part of vertical motion vector
     81  *                                              component in 1/4 pixel unit (0~3)
     82  *  [out]   pDst            Pointer to the interpolation buffer
     83  *
     84  * Return Value:
     85  * Standard OMXResult value.
     86  *
     87  */
     88 
     89  OMXResult armVCM4P10_Interpolate_Luma(
     90      const OMX_U8     *pSrc,
     91      OMX_U32    iSrcStep,
     92      OMX_U8     *pDst,
     93      OMX_U32    iDstStep,
     94      OMX_U32    iWidth,
     95      OMX_U32    iHeight,
     96      OMX_U32    dx,
     97      OMX_U32    dy
     98 )
     99 {
    100     OMX_U8      pBuf1 [16*16];
    101     const OMX_U8      *pSrcHalfHor = pSrc;
    102     const OMX_U8      *pSrcHalfVer = pSrc;
    103 
    104     /* check for argument error */
    105     armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr)
    106     armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr)
    107     armRetArgErrIf(dx > 3, OMX_Sts_BadArgErr)
    108     armRetArgErrIf(dy > 3, OMX_Sts_BadArgErr)
    109 
    110     /* Work out positions for half pixel interpolation */
    111     if (dx == 3)
    112     {
    113         pSrcHalfVer += 1;
    114     }
    115     if (dy == 3)
    116     {
    117         pSrcHalfHor += iSrcStep;
    118     }
    119 
    120     /* Switch on type of pixel
    121      * Pixels are named 'a' to 's' as in the H.264 standard
    122      */
    123     if (dx == 0 && dy == 0)
    124     {
    125         /* G */
    126         armM4P10_Copy(pSrc, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    127     }
    128     else if (dy == 0)
    129     {
    130         /* a, b, c */
    131         armVCM4P10_InterpolateHalfHor_Luma
    132             (pSrcHalfHor, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    133 
    134         if (dx == 1 || dx == 3)
    135         {
    136             armVCCOMM_Average
    137                 (pDst, pSrcHalfVer, iDstStep, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    138         }
    139     }
    140     else if (dx == 0)
    141     {
    142         /* d, h, n */
    143         armVCM4P10_InterpolateHalfVer_Luma
    144             (pSrcHalfVer, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    145 
    146         if (dy == 1 || dy == 3)
    147         {
    148             armVCCOMM_Average
    149                 (pDst, pSrcHalfHor, iDstStep, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    150         }
    151     }
    152     else if (dx == 2 || dy == 2)
    153     {
    154         /* j */
    155         armVCM4P10_InterpolateHalfDiag_Luma
    156             (pSrc, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    157 
    158         if (dx == 1 || dx == 3)
    159         {
    160             /* i, k */
    161             armVCM4P10_InterpolateHalfVer_Luma
    162                 (pSrcHalfVer, iSrcStep, pBuf1, iWidth, iWidth, iHeight);
    163 
    164             armVCCOMM_Average
    165                 (pDst, pBuf1, iDstStep, iWidth, pDst, iDstStep, iWidth, iHeight);
    166         }
    167         if (dy == 1 || dy == 3)
    168         {
    169             /* f,q */
    170             armVCM4P10_InterpolateHalfHor_Luma
    171                 (pSrcHalfHor, iSrcStep, pBuf1, iWidth, iWidth, iHeight);
    172 
    173             armVCCOMM_Average
    174                 (pDst, pBuf1, iDstStep, iWidth, pDst, iDstStep, iWidth, iHeight);
    175         }
    176     }
    177     else /* dx=1,3 and dy=1,3 */
    178     {
    179         /* e, g, p, r */
    180         armVCM4P10_InterpolateHalfHor_Luma
    181             (pSrcHalfHor, iSrcStep, pBuf1, iWidth, iWidth, iHeight);
    182 
    183         armVCM4P10_InterpolateHalfVer_Luma
    184             (pSrcHalfVer, iSrcStep, pDst, iDstStep, iWidth, iHeight);
    185 
    186         armVCCOMM_Average
    187             (pBuf1, pDst, iWidth, iDstStep, pDst, iDstStep, iWidth, iHeight);
    188     }
    189 
    190     return OMX_Sts_NoErr;
    191 }
    192 
    193 /*****************************************************************************
    194  *                              END OF FILE
    195  *****************************************************************************/
    196