Home | History | Annotate | Download | only in api
      1 /**
      2  * File: omxVC.h
      3  * Brief: OpenMAX DL v1.0.2 - Video Coding library
      4  *
      5  * Copyright  2005-2008 The Khronos Group Inc. All Rights Reserved.
      6  *
      7  * These materials are protected by copyright laws and contain material
      8  * proprietary to the Khronos Group, Inc.  You may use these materials
      9  * for implementing Khronos specifications, without altering or removing
     10  * any trademark, copyright or other notice from the specification.
     11  *
     12  * Khronos Group makes no, and expressly disclaims any, representations
     13  * or warranties, express or implied, regarding these materials, including,
     14  * without limitation, any implied warranties of merchantability or fitness
     15  * for a particular purpose or non-infringement of any intellectual property.
     16  * Khronos Group makes no, and expressly disclaims any, warranties, express
     17  * or implied, regarding the correctness, accuracy, completeness, timeliness,
     18  * and reliability of these materials.
     19  *
     20  * Under no circumstances will the Khronos Group, or any of its Promoters,
     21  * Contributors or Members or their respective partners, officers, directors,
     22  * employees, agents or representatives be liable for any damages, whether
     23  * direct, indirect, special or consequential damages for lost revenues,
     24  * lost profits, or otherwise, arising from or in connection with these
     25  * materials.
     26  *
     27  * Khronos and OpenMAX are trademarks of the Khronos Group Inc.
     28  *
     29  */
     30 
     31 /* *****************************************************************************************/
     32 
     33 #ifndef _OMXVC_H_
     34 #define _OMXVC_H_
     35 
     36 #include "omxtypes.h"
     37 
     38 #ifdef __cplusplus
     39 extern "C" {
     40 #endif
     41 
     42 
     43 /* 6.1.1.1 Motion Vectors  */
     44 /* In omxVC, motion vectors are represented as follows:  */
     45 
     46 typedef struct {
     47     OMX_S16 dx;
     48     OMX_S16 dy;
     49 } OMXVCMotionVector;
     50 
     51 
     52 
     53 /**
     54  * Function:  omxVCCOMM_Average_8x   (6.1.3.1.1)
     55  *
     56  * Description:
     57  * This function calculates the average of two 8x4, 8x8, or 8x16 blocks.  The
     58  * result is rounded according to (a+b+1)/2.  The block average function can
     59  * be used in conjunction with half-pixel interpolation to obtain quarter
     60  * pixel motion estimates, as described in [ISO14496-10], subclause 8.4.2.2.1.
     61  *
     62  * Input Arguments:
     63  *
     64  *   pPred0     - Pointer to the top-left corner of reference block 0
     65  *   pPred1     - Pointer to the top-left corner of reference block 1
     66  *   iPredStep0 - Step of reference block 0
     67  *   iPredStep1 - Step of reference block 1
     68  *   iDstStep   - Step of the destination buffer.
     69  *   iHeight    - Height of the blocks
     70  *
     71  * Output Arguments:
     72  *
     73  *   pDstPred - Pointer to the destination buffer. 8-byte aligned.
     74  *
     75  * Return Value:
     76  *
     77  *    OMX_Sts_NoErr - no error
     78  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
     79  *              conditions:
     80  *    -   one or more of the following pointers is NULL: pPred0, pPred1, or
     81  *              pDstPred.
     82  *    -   pDstPred is not aligned on an 8-byte boundary.
     83  *    -   iPredStep0 <= 0 or iPredStep0 is not a multiple of 8.
     84  *    -   iPredStep1 <= 0 or iPredStep1 is not a multiple of 8.
     85  *    -   iDstStep   <= 0 or iDstStep is not a multiple of 8.
     86  *    -   iHeight is not 4, 8, or 16.
     87  *
     88  */
     89 OMXResult omxVCCOMM_Average_8x (
     90     const OMX_U8 *pPred0,
     91     const OMX_U8 *pPred1,
     92     OMX_U32 iPredStep0,
     93     OMX_U32 iPredStep1,
     94     OMX_U8 *pDstPred,
     95     OMX_U32 iDstStep,
     96     OMX_U32 iHeight
     97 );
     98 
     99 
    100 
    101 /**
    102  * Function:  omxVCCOMM_Average_16x   (6.1.3.1.2)
    103  *
    104  * Description:
    105  * This function calculates the average of two 16x16 or 16x8 blocks.  The
    106  * result is rounded according to (a+b+1)/2.  The block average function can
    107  * be used in conjunction with half-pixel interpolation to obtain quarter
    108  * pixel motion estimates, as described in [ISO14496-10], subclause 8.4.2.2.1.
    109  *
    110  * Input Arguments:
    111  *
    112  *   pPred0 - Pointer to the top-left corner of reference block 0
    113  *   pPred1 - Pointer to the top-left corner of reference block 1
    114  *   iPredStep0 - Step of reference block 0
    115  *   iPredStep1 - Step of reference block 1
    116  *   iDstStep - Step of the destination buffer
    117  *   iHeight - Height of the blocks
    118  *
    119  * Output Arguments:
    120  *
    121  *   pDstPred - Pointer to the destination buffer. 16-byte aligned.
    122  *
    123  * Return Value:
    124  *
    125  *    OMX_Sts_NoErr - no error
    126  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
    127  *              conditions:
    128  *    -   one or more of the following pointers is NULL: pPred0, pPred1, or
    129  *              pDstPred.
    130  *    -   pDstPred is not aligned on a 16-byte boundary.
    131  *    -   iPredStep0 <= 0 or iPredStep0 is not a multiple of 16.
    132  *    -   iPredStep1 <= 0 or iPredStep1 is not a multiple of 16.
    133  *    -   iDstStep <= 0 or iDstStep is not a multiple of 16.
    134  *    -   iHeight is not 8 or 16.
    135  *
    136  */
    137 OMXResult omxVCCOMM_Average_16x (
    138     const OMX_U8 *pPred0,
    139     const OMX_U8 *pPred1,
    140     OMX_U32 iPredStep0,
    141     OMX_U32 iPredStep1,
    142     OMX_U8 *pDstPred,
    143     OMX_U32 iDstStep,
    144     OMX_U32 iHeight
    145 );
    146 
    147 
    148 
    149 /**
    150  * Function:  omxVCCOMM_ExpandFrame_I   (6.1.3.2.1)
    151  *
    152  * Description:
    153  * This function expands a reconstructed frame in-place.  The unexpanded
    154  * source frame should be stored in a plane buffer with sufficient space
    155  * pre-allocated for edge expansion, and the input frame should be located in
    156  * the plane buffer center.  This function executes the pixel expansion by
    157  * replicating source frame edge pixel intensities in the empty pixel
    158  * locations (expansion region) between the source frame edge and the plane
    159  * buffer edge.  The width/height of the expansion regions on the
    160  * horizontal/vertical edges is controlled by the parameter iExpandPels.
    161  *
    162  * Input Arguments:
    163  *
    164  *   pSrcDstPlane - pointer to the top-left corner of the frame to be
    165  *            expanded; must be aligned on an 8-byte boundary.
    166  *   iFrameWidth - frame width; must be a multiple of 8.
    167  *   iFrameHeight -frame height; must be a multiple of 8.
    168  *   iExpandPels - number of pixels to be expanded in the horizontal and
    169  *            vertical directions; must be a multiple of 8.
    170  *   iPlaneStep - distance, in bytes, between the start of consecutive lines
    171  *            in the plane buffer; must be larger than or equal to
    172  *            (iFrameWidth + 2 * iExpandPels).
    173  *
    174  * Output Arguments:
    175  *
    176  *   pSrcDstPlane -Pointer to the top-left corner of the frame (NOT the
    177  *            top-left corner of the plane); must be aligned on an 8-byte
    178  *            boundary.
    179  *
    180  * Return Value:
    181  *
    182  *    OMX_Sts_NoErr - no error
    183  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
    184  *              conditions:
    185  *    -    pSrcDstPlane is NULL.
    186  *    -    pSrcDstPlane is not aligned on an 8-byte boundary.
    187  *    -    one of the following parameters is either equal to zero or is a
    188  *              non-multiple of 8: iFrameHeight, iFrameWidth, iPlaneStep, or
    189  *              iExpandPels.
    190  *    -    iPlaneStep < (iFrameWidth + 2 * iExpandPels).
    191  *
    192  */
    193 OMXResult omxVCCOMM_ExpandFrame_I (
    194     OMX_U8 *pSrcDstPlane,
    195     OMX_U32 iFrameWidth,
    196     OMX_U32 iFrameHeight,
    197     OMX_U32 iExpandPels,
    198     OMX_U32 iPlaneStep
    199 );
    200 
    201 
    202 
    203 /**
    204  * Function:  omxVCCOMM_Copy8x8   (6.1.3.3.1)
    205  *
    206  * Description:
    207  * Copies the reference 8x8 block to the current block.
    208  *
    209  * Input Arguments:
    210  *
    211  *   pSrc - pointer to the reference block in the source frame; must be
    212  *            aligned on an 8-byte boundary.
    213  *   step - distance between the starts of consecutive lines in the reference
    214  *            frame, in bytes; must be a multiple of 8 and must be larger than
    215  *            or equal to 8.
    216  *
    217  * Output Arguments:
    218  *
    219  *   pDst - pointer to the destination block; must be aligned on an 8-byte
    220  *            boundary.
    221  *
    222  * Return Value:
    223  *
    224  *    OMX_Sts_NoErr - no error
    225  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
    226  *              conditions:
    227  *    -   one or more of the following pointers is NULL: pSrc, pDst
    228  *    -   one or more of the following pointers is not aligned on an 8-byte
    229  *              boundary: pSrc, pDst
    230  *    -    step <8 or step is not a multiple of 8.
    231  *
    232  */
    233 OMXResult omxVCCOMM_Copy8x8 (
    234     const OMX_U8 *pSrc,
    235     OMX_U8 *pDst,
    236     OMX_INT step
    237 );
    238 
    239 
    240 
    241 /**
    242  * Function:  omxVCCOMM_Copy16x16   (6.1.3.3.2)
    243  *
    244  * Description:
    245  * Copies the reference 16x16 macroblock to the current macroblock.
    246  *
    247  * Input Arguments:
    248  *
    249  *   pSrc - pointer to the reference macroblock in the source frame; must be
    250  *            aligned on a 16-byte boundary.
    251  *   step - distance between the starts of consecutive lines in the reference
    252  *            frame, in bytes; must be a multiple of 16 and must be larger
    253  *            than or equal to 16.
    254  *
    255  * Output Arguments:
    256  *
    257  *   pDst - pointer to the destination macroblock; must be aligned on a
    258  *            16-byte boundary.
    259  *
    260  * Return Value:
    261  *
    262  *    OMX_Sts_NoErr - no error
    263  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
    264  *              conditions:
    265  *    -   one or more of the following pointers is NULL: pSrc, pDst
    266  *    -   one or more of the following pointers is not aligned on a 16-byte
    267  *              boundary: pSrc, pDst
    268  *    -    step <16 or step is not a multiple of 16.
    269  *
    270  */
    271 OMXResult omxVCCOMM_Copy16x16 (
    272     const OMX_U8 *pSrc,
    273     OMX_U8 *pDst,
    274     OMX_INT step
    275 );
    276 
    277 
    278 
    279 /**
    280  * Function:  omxVCCOMM_ComputeTextureErrorBlock_SAD   (6.1.4.1.1)
    281  *
    282  * Description:
    283  * Computes texture error of the block; also returns SAD.
    284  *
    285  * Input Arguments:
    286  *
    287  *   pSrc - pointer to the source plane; must be aligned on an 8-byte
    288  *            boundary.
    289  *   srcStep - step of the source plane
    290  *   pSrcRef - pointer to the reference buffer, an 8x8 block; must be aligned
    291  *            on an 8-byte boundary.
    292  *
    293  * Output Arguments:
    294  *
    295  *   pDst - pointer to the destination buffer, an 8x8 block; must be aligned
    296  *            on an 8-byte boundary.
    297  *   pDstSAD - pointer to the Sum of Absolute Differences (SAD) value
    298  *
    299  * Return Value:
    300  *
    301  *    OMX_Sts_NoErr - no error
    302  *    OMX_Sts_BadArgErr - bad arguments
    303  *    -    At least one of the following
    304  *         pointers is NULL: pSrc, pSrcRef, pDst and pDstSAD.
    305  *    -    pSrc is not 8-byte aligned.
    306  *    -    SrcStep <= 0 or srcStep is not a multiple of 8.
    307  *    -    pSrcRef is not 8-byte aligned.
    308  *    -    pDst is not 8-byte aligned.
    309  *
    310  */
    311 OMXResult omxVCCOMM_ComputeTextureErrorBlock_SAD (
    312     const OMX_U8 *pSrc,
    313     OMX_INT srcStep,
    314     const OMX_U8 *pSrcRef,
    315     OMX_S16 *pDst,
    316     OMX_INT *pDstSAD
    317 );
    318 
    319 
    320 
    321 /**
    322  * Function:  omxVCCOMM_ComputeTextureErrorBlock   (6.1.4.1.2)
    323  *
    324  * Description:
    325  * Computes the texture error of the block.
    326  *
    327  * Input Arguments:
    328  *
    329  *   pSrc - pointer to the source plane. This should be aligned on an 8-byte
    330  *            boundary.
    331  *   srcStep - step of the source plane
    332  *   pSrcRef - pointer to the reference buffer, an 8x8 block. This should be
    333  *            aligned on an 8-byte boundary.
    334  *
    335  * Output Arguments:
    336  *
    337  *   pDst - pointer to the destination buffer, an 8x8 block. This should be
    338  *            aligned on an 8-byte boundary.
    339  *
    340  * Return Value:
    341  *
    342  *    OMX_Sts_NoErr - no error
    343  *    OMX_Sts_BadArgErr - bad arguments:
    344  *    -    At least one of the following pointers is NULL:
    345  *         pSrc, pSrcRef, pDst.
    346  *    -    pSrc is not 8-byte aligned.
    347  *    -    SrcStep <= 0 or srcStep is not a multiple of 8.
    348  *    -    pSrcRef is not 8-byte aligned.
    349  *    -    pDst is not 8-byte aligned
    350  *
    351  */
    352 OMXResult omxVCCOMM_ComputeTextureErrorBlock (
    353     const OMX_U8 *pSrc,
    354     OMX_INT srcStep,
    355     const OMX_U8 *pSrcRef,
    356     OMX_S16 *pDst
    357 );
    358 
    359 
    360 
    361 /**
    362  * Function:  omxVCCOMM_LimitMVToRect   (6.1.4.1.3)
    363  *
    364  * Description:
    365  * Limits the motion vector associated with the current block/macroblock to
    366  * prevent the motion compensated block/macroblock from moving outside a
    367  * bounding rectangle as shown in Figure 6-1.
    368  *
    369  * Input Arguments:
    370  *
    371  *   pSrcMV - pointer to the motion vector associated with the current block
    372  *            or macroblock
    373  *   pRectVOPRef - pointer to the bounding rectangle
    374  *   Xcoord, Ycoord  - coordinates of the current block or macroblock
    375  *   size - size of the current block or macroblock; must be equal to 8 or
    376  *            16.
    377  *
    378  * Output Arguments:
    379  *
    380  *   pDstMV - pointer to the limited motion vector
    381  *
    382  * Return Value:
    383  *
    384  *    OMX_Sts_NoErr - no error
    385  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one or more of the
    386  *              following conditions is true:
    387  *    -    at least one of the following pointers is NULL:
    388  *         pSrcMV, pDstMV, or pRectVOPRef.
    389  *    -    size is not equal to either 8 or 16.
    390  *    -    the width or height of the bounding rectangle is less than
    391  *         twice the block size.
    392  */
    393 OMXResult omxVCCOMM_LimitMVToRect (
    394     const OMXVCMotionVector *pSrcMV,
    395     OMXVCMotionVector *pDstMV,
    396     const OMXRect *pRectVOPRef,
    397     OMX_INT Xcoord,
    398     OMX_INT Ycoord,
    399     OMX_INT size
    400 );
    401 
    402 
    403 
    404 /**
    405  * Function:  omxVCCOMM_SAD_16x   (6.1.4.1.4)
    406  *
    407  * Description:
    408  * This function calculates the SAD for 16x16 and 16x8 blocks.
    409  *
    410  * Input Arguments:
    411  *
    412  *   pSrcOrg - Pointer to the original block; must be aligned on a 16-byte
    413  *             boundary.
    414  *   iStepOrg - Step of the original block buffer
    415  *   pSrcRef  - Pointer to the reference block
    416  *   iStepRef - Step of the reference block buffer
    417  *   iHeight  - Height of the block
    418  *
    419  * Output Arguments:
    420  *
    421  *   pDstSAD - Pointer of result SAD
    422  *
    423  * Return Value:
    424  *
    425  *    OMX_Sts_NoErr - no error
    426  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one or more of the
    427  *              following conditions is true:
    428  *    -    at least one of the following pointers is NULL:
    429  *         pSrcOrg, pDstSAD, or pSrcRef
    430  *    -    pSrcOrg is not 16-byte aligned.
    431  *    -    iStepOrg  <= 0 or iStepOrg is not a multiple of 16
    432  *    -    iStepRef <= 0 or iStepRef is not a multiple of 16
    433  *    -    iHeight is not 8 or 16
    434  *
    435  */
    436 OMXResult omxVCCOMM_SAD_16x (
    437     const OMX_U8 *pSrcOrg,
    438     OMX_U32 iStepOrg,
    439     const OMX_U8 *pSrcRef,
    440     OMX_U32 iStepRef,
    441     OMX_S32 *pDstSAD,
    442     OMX_U32 iHeight
    443 );
    444 
    445 
    446 
    447 /**
    448  * Function:  omxVCCOMM_SAD_8x   (6.1.4.1.5)
    449  *
    450  * Description:
    451  * This function calculates the SAD for 8x16, 8x8, 8x4 blocks.
    452  *
    453  * Input Arguments:
    454  *
    455  *   pSrcOrg  - Pointer to the original block; must be aligned on a 8-byte
    456  *              boundary.
    457  *   iStepOrg - Step of the original block buffer
    458  *   pSrcRef  - Pointer to the reference block
    459  *   iStepRef - Step of the reference block buffer
    460  *   iHeight  - Height of the block
    461  *
    462  * Output Arguments:
    463  *
    464  *   pDstSAD -Pointer of result SAD
    465  *
    466  * Return Value:
    467  *
    468  *    OMX_Sts_NoErr - no error
    469  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one or more of the
    470  *              following conditions is true:
    471  *    -    at least one of the following pointers is NULL:
    472  *         pSrcOrg, pDstSAD, or pSrcRef
    473  *    -    pSrcOrg is not 8-byte aligned.
    474  *    -    iStepOrg  <= 0 or iStepOrg is not a multiple of 8
    475  *    -    iStepRef <= 0 or iStepRef is not a multiple of 8
    476  *    -    iHeight is not 4, 8 or 16
    477  *
    478  */
    479 OMXResult omxVCCOMM_SAD_8x (
    480     const OMX_U8 *pSrcOrg,
    481     OMX_U32 iStepOrg,
    482     const OMX_U8 *pSrcRef,
    483     OMX_U32 iStepRef,
    484     OMX_S32*pDstSAD,
    485     OMX_U32 iHeight
    486 );
    487 
    488 
    489 
    490 /* 6.2.1.1 Direction  */
    491 /* The direction enumerator is used with functions that perform AC/DC prediction and zig-zag scan.  */
    492 
    493 enum {
    494     OMX_VC_NONE       = 0,
    495     OMX_VC_HORIZONTAL = 1,
    496     OMX_VC_VERTICAL   = 2
    497 };
    498 
    499 
    500 
    501 /* 6.2.1.2 Bilinear Interpolation  */
    502 /* The bilinear interpolation enumerator is used with motion estimation, motion compensation, and reconstruction functions.  */
    503 
    504 enum {
    505     OMX_VC_INTEGER_PIXEL = 0, /* case a */
    506     OMX_VC_HALF_PIXEL_X  = 1, /* case b */
    507     OMX_VC_HALF_PIXEL_Y  = 2, /* case c */
    508     OMX_VC_HALF_PIXEL_XY = 3  /* case d */
    509 };
    510 
    511 
    512 
    513 /* 6.2.1.3 Neighboring Macroblock Availability  */
    514 /* Neighboring macroblock availability is indicated using the following flags:   */
    515 
    516 enum {
    517     OMX_VC_UPPER = 1,        /** above macroblock is available */
    518     OMX_VC_LEFT = 2,         /** left macroblock is available */
    519     OMX_VC_CENTER = 4,
    520     OMX_VC_RIGHT = 8,
    521     OMX_VC_LOWER = 16,
    522     OMX_VC_UPPER_LEFT = 32,  /** above-left macroblock is available */
    523     OMX_VC_UPPER_RIGHT = 64, /** above-right macroblock is available */
    524     OMX_VC_LOWER_LEFT = 128,
    525     OMX_VC_LOWER_RIGHT = 256
    526 };
    527 
    528 
    529 
    530 /* 6.2.1.4 Video Components  */
    531 /* A data type that enumerates video components is defined as follows:  */
    532 
    533 typedef enum {
    534     OMX_VC_LUMINANCE,    /** Luminance component */
    535     OMX_VC_CHROMINANCE   /** chrominance component */
    536 } OMXVCM4P2VideoComponent;
    537 
    538 
    539 
    540 /* 6.2.1.5 MacroblockTypes  */
    541 /* A data type that enumerates macroblock types is defined as follows:  */
    542 
    543 typedef enum {
    544     OMX_VC_INTER     = 0, /** P picture or P-VOP */
    545     OMX_VC_INTER_Q   = 1, /** P picture or P-VOP */
    546     OMX_VC_INTER4V   = 2, /** P picture or P-VOP */
    547     OMX_VC_INTRA     = 3, /** I and P picture, I- and P-VOP */
    548     OMX_VC_INTRA_Q   = 4, /** I and P picture, I- and P-VOP */
    549     OMX_VC_INTER4V_Q = 5  /** P picture or P-VOP (H.263)*/
    550 } OMXVCM4P2MacroblockType;
    551 
    552 
    553 
    554 /* 6.2.1.6 Coordinates  */
    555 /* Coordinates are represented as follows:  */
    556 
    557 typedef struct {
    558     OMX_INT x;
    559     OMX_INT y;
    560 } OMXVCM4P2Coordinate;
    561 
    562 
    563 
    564 /* 6.2.1.7 Motion Estimation Algorithms  */
    565 /* A data type that enumerates motion estimation search methods is defined as follows:  */
    566 
    567 typedef enum {
    568     OMX_VC_M4P2_FAST_SEARCH = 0,  /** Fast motion search */
    569     OMX_VC_M4P2_FULL_SEARCH = 1   /** Full motion search */
    570 } OMXVCM4P2MEMode;
    571 
    572 
    573 
    574 /* 6.2.1.8 Motion Estimation Parameters  */
    575 /* A data structure containing control parameters for
    576  * motion estimation functions is defined as follows:
    577  */
    578 
    579 typedef struct {
    580     OMX_INT searchEnable8x8;     /** enables 8x8 search */
    581     OMX_INT halfPelSearchEnable; /** enables half-pel resolution */
    582     OMX_INT searchRange;         /** search range */
    583     OMX_INT rndVal;              /** rounding control; 0-disabled, 1-enabled*/
    584 } OMXVCM4P2MEParams;
    585 
    586 
    587 
    588 /* 6.2.1.9 Macroblock Information   */
    589 /* A data structure containing macroblock parameters for
    590  * motion estimation functions is defined as follows:
    591  */
    592 
    593 typedef struct {
    594     OMX_S32 sliceId;                 /* slice number */
    595     OMXVCM4P2MacroblockType mbType;  /* MB type: OMX_VC_INTRA, OMX_VC_INTER, or OMX_VC_INTER4 */
    596     OMX_S32 qp;                      /* quantization parameter*/
    597     OMX_U32 cbpy;                    /* CBP Luma */
    598     OMX_U32 cbpc;                    /* CBP Chroma */
    599     OMXVCMotionVector pMV0[2][2];    /* motion vector, represented using 1/2-pel units,
    600                                       * pMV0[blocky][blockx] (blocky = 0~1, blockx =0~1)
    601                                       */
    602     OMXVCMotionVector pMVPred[2][2]; /* motion vector prediction, represented using 1/2-pel units,
    603                                       * pMVPred[blocky][blockx] (blocky = 0~1, blockx = 0~1)
    604                                       */
    605     OMX_U8 pPredDir[2][2];           /* AC prediction direction:
    606                                       *   OMX_VC_NONE, OMX_VC_VERTICAL, OMX_VC_HORIZONTAL
    607                                       */
    608 } OMXVCM4P2MBInfo, *OMXVCM4P2MBInfoPtr;
    609 
    610 
    611 
    612 /**
    613  * Function:  omxVCM4P2_FindMVpred   (6.2.3.1.1)
    614  *
    615  * Description:
    616  * Predicts a motion vector for the current block using the procedure
    617  * specified in [ISO14496-2], subclause 7.6.5.  The resulting predicted MV is
    618  * returned in pDstMVPred. If the parameter pDstMVPredME if is not NULL then
    619  * the set of three MV candidates used for prediction is also returned,
    620  * otherwise pDstMVPredMEis NULL upon return.
    621  *
    622  * Input Arguments:
    623  *
    624  *   pSrcMVCurMB - pointer to the MV buffer associated with the current Y
    625  *            macroblock; a value of NULL indicates unavailability.
    626  *   pSrcCandMV1 - pointer to the MV buffer containing the 4 MVs associated
    627  *            with the MB located to the left of the current MB; set to NULL
    628  *            if there is no MB to the left.
    629  *   pSrcCandMV2 - pointer to the MV buffer containing the 4 MVs associated
    630  *            with the MB located above the current MB; set to NULL if there
    631  *            is no MB located above the current MB.
    632  *   pSrcCandMV3 - pointer to the MV buffer containing the 4 MVs associated
    633  *            with the MB located to the right and above the current MB; set
    634  *            to NULL if there is no MB located to the above-right.
    635  *   iBlk - the index of block in the current macroblock
    636  *   pDstMVPredME - MV candidate return buffer;  if set to NULL then
    637  *            prediction candidate MVs are not returned and pDstMVPredME will
    638  *            be NULL upon function return; if pDstMVPredME is non-NULL then it
    639  *            must point to a buffer containing sufficient space for three
    640  *            return MVs.
    641  *
    642  * Output Arguments:
    643  *
    644  *   pDstMVPred - pointer to the predicted motion vector
    645  *   pDstMVPredME - if non-NULL upon input then pDstMVPredME  points upon
    646  *            return to a buffer containing the three motion vector candidates
    647  *            used for prediction as specified in [ISO14496-2], subclause
    648  *            7.6.5, otherwise if NULL upon input then pDstMVPredME is NULL
    649  *            upon output.
    650  *
    651  * Return Value:
    652  *
    653  *    OMX_Sts_NoErr - no error
    654  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
    655  *              conditions:
    656  *    -    the pointer pDstMVPred is NULL
    657  *    -    the parameter iBlk does not fall into the range 0 <= iBlk<=3
    658  *
    659  */
    660 OMXResult omxVCM4P2_FindMVpred (
    661     const OMXVCMotionVector *pSrcMVCurMB,
    662     const OMXVCMotionVector *pSrcCandMV1,
    663     const OMXVCMotionVector *pSrcCandMV2,
    664     const OMXVCMotionVector *pSrcCandMV3,
    665     OMXVCMotionVector *pDstMVPred,
    666     OMXVCMotionVector *pDstMVPredME,
    667     OMX_INT iBlk
    668 );
    669 
    670 
    671 
    672 /**
    673  * Function:  omxVCM4P2_IDCT8x8blk   (6.2.3.2.1)
    674  *
    675  * Description:
    676  * Computes a 2D inverse DCT for a single 8x8 block, as defined in
    677  * [ISO14496-2].
    678  *
    679  * Input Arguments:
    680  *
    681  *   pSrc - pointer to the start of the linearly arranged IDCT input buffer;
    682  *            must be aligned on a 16-byte boundary.  According to
    683  *            [ISO14496-2], the input coefficient values should lie within the
    684  *            range [-2048, 2047].
    685  *
    686  * Output Arguments:
    687  *
    688  *   pDst - pointer to the start of the linearly arranged IDCT output buffer;
    689  *            must be aligned on a 16-byte boundary.
    690  *
    691  * Return Value:
    692  *
    693  *    OMX_Sts_NoErr - no error
    694  *    OMX_Sts_BadArgErr - bad arguments:
    695  *    -    pSrc or pDst is NULL.
    696  *    -    pSrc or pDst is not 16-byte aligned.
    697  *
    698  */
    699 OMXResult omxVCM4P2_IDCT8x8blk (
    700     const OMX_S16 *pSrc,
    701     OMX_S16 *pDst
    702 );
    703 
    704 
    705 
    706 /**
    707  * Function:  omxVCM4P2_MEGetBufSize   (6.2.4.1.1)
    708  *
    709  * Description:
    710  * Computes the size, in bytes, of the vendor-specific specification
    711  * structure for the following motion estimation functions:
    712  * BlockMatch_Integer_8x8, BlockMatch_Integer_16x16, and MotionEstimationMB.
    713  *
    714  * Input Arguments:
    715  *
    716  *   MEmode - motion estimation mode; available modes are defined by the
    717  *            enumerated type OMXVCM4P2MEMode
    718  *   pMEParams - motion estimation parameters
    719  *
    720  * Output Arguments:
    721  *
    722  *   pSize - pointer to the number of bytes required for the specification
    723  *            structure
    724  *
    725  * Return Value:
    726  *
    727  *    OMX_Sts_NoErr - no error
    728  *    OMX_Sts_BadArgErr - one or more of the following is true:
    729  *    -    an invalid value was specified for the parameter MEmode
    730  *    -    a negative or zero value was specified for the
    731  *         parameter pMEParams->searchRange
    732  *
    733  */
    734 OMXResult omxVCM4P2_MEGetBufSize (
    735     OMXVCM4P2MEMode MEmode,
    736     const OMXVCM4P2MEParams *pMEParams,
    737     OMX_U32 *pSize
    738 );
    739 
    740 
    741 
    742 /**
    743  * Function:  omxVCM4P2_MEInit   (6.2.4.1.2)
    744  *
    745  * Description:
    746  * Initializes the vendor-specific specification structure required for the
    747  * following motion estimation functions:  BlockMatch_Integer_8x8,
    748  * BlockMatch_Integer_16x16, and MotionEstimationMB. Memory for the
    749  * specification structure *pMESpec must be allocated prior to calling the
    750  * function, and should be aligned on a 4-byte boundary.  Following
    751  * initialization by this function, the vendor-specific structure *pMESpec
    752  * should contain an implementation-specific representation of all motion
    753  * estimation parameters received via the structure pMEParams, for example
    754  * rndVal, searchRange, etc.  The number of bytes required for the
    755  * specification structure can be determined using the function
    756  * omxVCM4P2_MEGetBufSize.
    757  *
    758  * Input Arguments:
    759  *
    760  *   MEmode - motion estimation mode; available modes are defined by the
    761  *            enumerated type OMXVCM4P2MEMode
    762  *   pMEParams - motion estimation parameters
    763  *   pMESpec - pointer to the uninitialized ME specification structure
    764  *
    765  * Output Arguments:
    766  *
    767  *   pMESpec - pointer to the initialized ME specification structure
    768  *
    769  * Return Value:
    770  *
    771  *    OMX_Sts_NoErr - no error
    772  *    OMX_Sts_BadArgErr - one or more of the following is true:
    773  *    -    an invalid value was specified for the parameter MEmode
    774  *    -    a negative or zero value was specified for the
    775  *         parameter pMEParams->searchRange
    776  *
    777  */
    778 OMXResult omxVCM4P2_MEInit (
    779     OMXVCM4P2MEMode MEmode,
    780     const OMXVCM4P2MEParams*pMEParams,
    781     void *pMESpec
    782 );
    783 
    784 
    785 
    786 /**
    787  * Function:  omxVCM4P2_BlockMatch_Integer_16x16   (6.2.4.2.1)
    788  *
    789  * Description:
    790  * Performs a 16x16 block search; estimates motion vector and associated
    791  * minimum SAD. Both the input and output motion vectors are represented using
    792  * half-pixel units, and therefore a shift left or right by 1 bit may be
    793  * required, respectively, to match the input or output MVs with other
    794  * functions that either generate output MVs or expect input MVs represented
    795  * using integer pixel units.
    796  *
    797  * Input Arguments:
    798  *
    799  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
    800  *            MB that corresponds to the location of the current macroblock in
    801  *            the current plane.
    802  *   refWidth - width of the reference plane
    803  *   pRefRect - pointer to the valid reference plane rectangle; coordinates
    804  *            are specified relative to the image origin.  Rectangle
    805  *            boundaries may extend beyond image boundaries if the image has
    806  *            been padded.  For example, if padding extends 4 pixels beyond
    807  *            frame border, then the value for the left border could be set to
    808  *            -4.
    809  *   pSrcCurrBuf - pointer to the current block in the current macroblock
    810  *            buffer extracted from the original plane (linear array, 256
    811  *            entries); must be aligned on a 16-byte boundary.  The number of
    812  *            bytes between lines (step) is 16.
    813  *   pCurrPointPos - position of the current macroblock in the current plane
    814  *   pSrcPreMV - pointer to predicted motion vector; NULL indicates no
    815  *            predicted MV
    816  *   pSrcPreSAD - pointer to SAD associated with the predicted MV (referenced
    817  *            by pSrcPreMV); may be set to NULL if unavailable.
    818  *   pMESpec - vendor-specific motion estimation specification structure;
    819  *            must have been allocated and then initialized using
    820  *            omxVCM4P2_MEInit prior to calling the block matching function.
    821  *
    822  * Output Arguments:
    823  *
    824  *   pDstMV - pointer to estimated MV
    825  *   pDstSAD - pointer to minimum SAD
    826  *
    827  * Return Value:
    828  *
    829  *    OMX_Sts_NoErr - no error
    830  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one of the following
    831  *              conditions is true:
    832  *    -    at least one of the following pointers is NULL: pSrcRefBuf,
    833  *              pRefRect, pSrcCurrBuff, pCurrPointPos, pDstMV, pDstSAD or
    834  *              pMESpec, or
    835  *    -    pSrcCurrBuf is not 16-byte aligned
    836  *
    837  */
    838 OMXResult omxVCM4P2_BlockMatch_Integer_16x16 (
    839     const OMX_U8 *pSrcRefBuf,
    840     OMX_INT refWidth,
    841     const OMXRect *pRefRect,
    842     const OMX_U8 *pSrcCurrBuf,
    843     const OMXVCM4P2Coordinate *pCurrPointPos,
    844     const OMXVCMotionVector*pSrcPreMV,
    845     const OMX_INT *pSrcPreSAD,
    846     void *pMESpec,
    847     OMXVCMotionVector*pDstMV,
    848     OMX_INT *pDstSAD
    849 );
    850 
    851 
    852 
    853 /**
    854  * Function:  omxVCM4P2_BlockMatch_Integer_8x8   (6.2.4.2.2)
    855  *
    856  * Description:
    857  * Performs an 8x8 block search; estimates motion vector and associated
    858  * minimum SAD.  Both the input and output motion vectors are represented
    859  * using half-pixel units, and therefore a shift left or right by 1 bit may be
    860  * required, respectively, to match the input or output MVs with other
    861  * functions that either generate output MVs or expect input MVs represented
    862  * using integer pixel units.
    863  *
    864  * Input Arguments:
    865  *
    866  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
    867  *            block that corresponds to the location of the current 8x8 block
    868  *            in the current plane.
    869  *   refWidth - width of the reference plane
    870  *   pRefRect - pointer to the valid reference plane rectangle; coordinates
    871  *            are specified relative to the image origin.  Rectangle
    872  *            boundaries may extend beyond image boundaries if the image has
    873  *            been padded.
    874  *   pSrcCurrBuf - pointer to the current block in the current macroblock
    875  *            buffer extracted from the original plane (linear array, 128
    876  *            entries); must be aligned on an 8-byte boundary.  The number of
    877  *            bytes between lines (step) is 16 bytes.
    878  *   pCurrPointPos - position of the current block in the current plane
    879  *   pSrcPreMV - pointer to predicted motion vector; NULL indicates no
    880  *            predicted MV
    881  *   pSrcPreSAD - pointer to SAD associated with the predicted MV (referenced
    882  *            by pSrcPreMV); may be set to NULL if unavailable.
    883  *   pMESpec - vendor-specific motion estimation specification structure;
    884  *            must have been allocated and then initialized using
    885  *            omxVCM4P2_MEInit prior to calling the block matching function.
    886  *
    887  * Output Arguments:
    888  *
    889  *   pDstMV - pointer to estimated MV
    890  *   pDstSAD - pointer to minimum SAD
    891  *
    892  * Return Value:
    893  *
    894  *    OMX_Sts_NoErr - no error
    895  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one of the following
    896  *              conditions is true:
    897  *    -    at least one of the following pointers is NULL: pSrcRefBuf,
    898  *              pRefRect, pSrcCurrBuff, pCurrPointPos, pDstMV, pDstSAD or
    899  *              pMESpec, or
    900  *    -    pSrcCurrBuf is not 8-byte aligned
    901  *
    902  */
    903 OMXResult omxVCM4P2_BlockMatch_Integer_8x8 (
    904     const OMX_U8 *pSrcRefBuf,
    905     OMX_INT refWidth,
    906     const OMXRect *pRefRect,
    907     const OMX_U8 *pSrcCurrBuf,
    908     const OMXVCM4P2Coordinate *pCurrPointPos,
    909     const OMXVCMotionVector *pSrcPreMV,
    910     const OMX_INT *pSrcPreSAD,
    911     void *pMESpec,
    912     OMXVCMotionVector *pDstMV,
    913     OMX_INT *pDstSAD
    914 );
    915 
    916 
    917 
    918 /**
    919  * Function:  omxVCM4P2_BlockMatch_Half_16x16   (6.2.4.2.3)
    920  *
    921  * Description:
    922  * Performs a 16x16 block match with half-pixel resolution.  Returns the
    923  * estimated motion vector and associated minimum SAD.  This function
    924  * estimates the half-pixel motion vector by interpolating the integer
    925  * resolution motion vector referenced by the input parameter pSrcDstMV, i.e.,
    926  * the initial integer MV is generated externally.  The input parameters
    927  * pSrcRefBuf and pSearchPointRefPos should be shifted by the winning MV of
    928  * 16x16 integer search prior to calling BlockMatch_Half_16x16. The function
    929  * BlockMatch_Integer_16x16 may be used for integer motion estimation.
    930  *
    931  * Input Arguments:
    932  *
    933  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
    934  *            macroblock that corresponds to the location of the current
    935  *            macroblock in the current plane.
    936  *   refWidth - width of the reference plane
    937  *   pRefRect - reference plane valid region rectangle
    938  *   pSrcCurrBuf - pointer to the current block in the current macroblock
    939  *            buffer extracted from the original plane (linear array, 256
    940  *            entries); must be aligned on a 16-byte boundary.  The number of
    941  *            bytes between lines (step) is 16.
    942  *   pSearchPointRefPos - position of the starting point for half pixel
    943  *            search (specified in terms of integer pixel units) in the
    944  *            reference plane, i.e., the reference position pointed to by the
    945  *            predicted motion vector.
    946  *   rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
    947  *   pSrcDstMV - pointer to the initial MV estimate; typically generated
    948  *            during a prior 16X16 integer search; specified in terms of
    949  *            half-pixel units.
    950  *
    951  * Output Arguments:
    952  *
    953  *   pSrcDstMV - pointer to estimated MV
    954  *   pDstSAD - pointer to minimum SAD
    955  *
    956  * Return Value:
    957  *
    958  *    OMX_Sts_NoErr - no error
    959  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one of the following
    960  *              conditions is true:
    961  *    -    at least one of the following pointers is NULL: pSrcRefBuf,
    962  *         pRefRect, pSrcCurrBuff, pSearchPointRefPos, pSrcDstMV.
    963  *    -    pSrcCurrBuf is not 16-byte aligned, or
    964  *
    965  */
    966 OMXResult omxVCM4P2_BlockMatch_Half_16x16 (
    967     const OMX_U8 *pSrcRefBuf,
    968     OMX_INT refWidth,
    969     const OMXRect *pRefRect,
    970     const OMX_U8 *pSrcCurrBuf,
    971     const OMXVCM4P2Coordinate *pSearchPointRefPos,
    972     OMX_INT rndVal,
    973     OMXVCMotionVector *pSrcDstMV,
    974     OMX_INT *pDstSAD
    975 );
    976 
    977 
    978 
    979 /**
    980  * Function:  omxVCM4P2_BlockMatch_Half_8x8   (6.2.4.2.4)
    981  *
    982  * Description:
    983  * Performs an 8x8 block match with half-pixel resolution. Returns the
    984  * estimated motion vector and associated minimum SAD.  This function
    985  * estimates the half-pixel motion vector by interpolating the integer
    986  * resolution motion vector referenced by the input parameter pSrcDstMV, i.e.,
    987  * the initial integer MV is generated externally.  The input parameters
    988  * pSrcRefBuf and pSearchPointRefPos should be shifted by the winning MV of
    989  * 8x8 integer search prior to calling BlockMatch_Half_8x8. The function
    990  * BlockMatch_Integer_8x8 may be used for integer motion estimation.
    991  *
    992  * Input Arguments:
    993  *
    994  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
    995  *            block that corresponds to the location of the current 8x8 block
    996  *            in the current plane.
    997  *   refWidth - width of the reference plane
    998  *   pRefRect - reference plane valid region rectangle
    999  *   pSrcCurrBuf - pointer to the current block in the current macroblock
   1000  *            buffer extracted from the original plane (linear array, 128
   1001  *            entries); must be aligned on a 8-byte boundary.  The number of
   1002  *            bytes between lines (step) is 16.
   1003  *   pSearchPointRefPos - position of the starting point for half pixel
   1004  *            search (specified in terms of integer pixel units) in the
   1005  *            reference plane.
   1006  *   rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
   1007  *   pSrcDstMV - pointer to the initial MV estimate; typically generated
   1008  *            during a prior 8x8 integer search, specified in terms of
   1009  *            half-pixel units.
   1010  *
   1011  * Output Arguments:
   1012  *
   1013  *   pSrcDstMV - pointer to estimated MV
   1014  *   pDstSAD - pointer to minimum SAD
   1015  *
   1016  * Return Value:
   1017  *
   1018  *    OMX_Sts_NoErr - no error
   1019  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one of the following
   1020  *              conditions is true:
   1021  *    -    at least one of the following pointers is NULL:
   1022  *         pSrcRefBuf, pRefRect, pSrcCurrBuff, pSearchPointRefPos, pSrcDstMV
   1023  *    -    pSrcCurrBuf is not 8-byte aligned
   1024  *
   1025  */
   1026 OMXResult omxVCM4P2_BlockMatch_Half_8x8 (
   1027     const OMX_U8 *pSrcRefBuf,
   1028     OMX_INT refWidth,
   1029     const OMXRect *pRefRect,
   1030     const OMX_U8 *pSrcCurrBuf,
   1031     const OMXVCM4P2Coordinate *pSearchPointRefPos,
   1032     OMX_INT rndVal,
   1033     OMXVCMotionVector *pSrcDstMV,
   1034     OMX_INT *pDstSAD
   1035 );
   1036 
   1037 
   1038 
   1039 /**
   1040  * Function:  omxVCM4P2_MotionEstimationMB   (6.2.4.3.1)
   1041  *
   1042  * Description:
   1043  * Performs motion search for a 16x16 macroblock.  Selects best motion search
   1044  * strategy from among inter-1MV, inter-4MV, and intra modes.  Supports
   1045  * integer and half pixel resolution.
   1046  *
   1047  * Input Arguments:
   1048  *
   1049  *   pSrcCurrBuf - pointer to the top-left corner of the current MB in the
   1050  *            original picture plane; must be aligned on a 16-byte boundary.
   1051  *            The function does not expect source data outside the region
   1052  *            bounded by the MB to be available; for example it is not
   1053  *            necessary for the caller to guarantee the availability of
   1054  *            pSrcCurrBuf[-SrcCurrStep], i.e., the row of pixels above the MB
   1055  *            to be processed.
   1056  *   srcCurrStep - width of the original picture plane, in terms of full
   1057  *            pixels; must be a multiple of 16.
   1058  *   pSrcRefBuf - pointer to the reference Y plane; points to the reference
   1059  *            plane location corresponding to the location of the current
   1060  *            macroblock in the current plane; must be aligned on a 16-byte
   1061  *            boundary.
   1062  *   srcRefStep - width of the reference picture plane, in terms of full
   1063  *            pixels; must be a multiple of 16.
   1064  *   pRefRect - reference plane valid region rectangle, specified relative to
   1065  *            the image origin
   1066  *   pCurrPointPos - position of the current macroblock in the current plane
   1067  *   pMESpec - pointer to the vendor-specific motion estimation specification
   1068  *            structure; must be allocated and then initialized using
   1069  *            omxVCM4P2_MEInit prior to calling this function.
   1070  *   pMBInfo - array, of dimension four, containing pointers to information
   1071  *            associated with four nearby MBs:
   1072  *            -   pMBInfo[0] - pointer to left MB information
   1073  *            -   pMBInfo[1] - pointer to top MB information
   1074  *            -   pMBInfo[2] - pointer to top-left MB information
   1075  *            -   pMBInfo[3] - pointer to top-right MB information
   1076  *            Any pointer in the array may be set equal to NULL if the
   1077  *            corresponding MB doesn't exist.  For each MB, the following structure
   1078  *            members are used:
   1079  *            -   mbType - macroblock type, either OMX_VC_INTRA, OMX_VC_INTER, or
   1080  *                OMX_VC_INTER4V
   1081  *            -   pMV0[2][2] - estimated motion vectors; represented
   1082  *                in 1/2 pixel units
   1083  *            -   sliceID - number of the slice to which the MB belongs
   1084  *   pSrcDstMBCurr - pointer to information structure for the current MB.
   1085  *            The following entries should be set prior to calling the
   1086  *            function: sliceID - the number of the slice the to which the
   1087  *            current MB belongs.  The structure elements cbpy and cbpc are
   1088  *            ignored.
   1089  *
   1090  * Output Arguments:
   1091  *
   1092  *   pSrcDstMBCurr - pointer to updated information structure for the current
   1093  *            MB after MB-level motion estimation has been completed.  The
   1094  *            following structure members are updated by the ME function:
   1095  *              -  mbType - macroblock type: OMX_VC_INTRA, OMX_VC_INTER, or
   1096  *                 OMX_VC_INTER4V.
   1097  *              -  pMV0[2][2] - estimated motion vectors; represented in
   1098  *                 terms of 1/2 pel units.
   1099  *              -  pMVPred[2][2] - predicted motion vectors; represented
   1100  *                 in terms of 1/2 pel units.
   1101  *            The structure members cbpy and cbpc are not updated by the function.
   1102  *   pDstSAD - pointer to the minimum SAD for INTER1V, or sum of minimum SADs
   1103  *            for INTER4V
   1104  *   pDstBlockSAD - pointer to an array of SAD values for each of the four
   1105  *            8x8 luma blocks in the MB.  The block SADs are in scan order for
   1106  *            each MB.
   1107  *
   1108  * Return Value:
   1109  *
   1110  *    OMX_Sts_NoErr - no error
   1111  *    OMX_Sts_BadArgErr - bad arguments.  Returned if one or more of the
   1112  *              following conditions is true:
   1113  *    -    at least one of the following pointers is NULL: pSrcCurrBuf,
   1114  *              pSrcRefBuf, pRefRect, pCurrPointPos, pMBInter, pMBIntra,
   1115  *              pSrcDstMBCurr, or pDstSAD.
   1116  *
   1117  */
   1118 OMXResult omxVCM4P2_MotionEstimationMB (
   1119     const OMX_U8 *pSrcCurrBuf,
   1120     OMX_S32 srcCurrStep,
   1121     const OMX_U8 *pSrcRefBuf,
   1122     OMX_S32 srcRefStep,
   1123     const OMXRect*pRefRect,
   1124     const OMXVCM4P2Coordinate *pCurrPointPos,
   1125     void *pMESpec,
   1126     const OMXVCM4P2MBInfoPtr *pMBInfo,
   1127     OMXVCM4P2MBInfo *pSrcDstMBCurr,
   1128     OMX_U16 *pDstSAD,
   1129     OMX_U16 *pDstBlockSAD
   1130 );
   1131 
   1132 
   1133 
   1134 /**
   1135  * Function:  omxVCM4P2_DCT8x8blk   (6.2.4.4.1)
   1136  *
   1137  * Description:
   1138  * Computes a 2D forward DCT for a single 8x8 block, as defined in
   1139  * [ISO14496-2].
   1140  *
   1141  * Input Arguments:
   1142  *
   1143  *   pSrc - pointer to the start of the linearly arranged input buffer; must
   1144  *            be aligned on a 16-byte boundary.  Input values (pixel
   1145  *            intensities) are valid in the range [-255,255].
   1146  *
   1147  * Output Arguments:
   1148  *
   1149  *   pDst - pointer to the start of the linearly arranged output buffer; must
   1150  *            be aligned on a 16-byte boundary.
   1151  *
   1152  * Return Value:
   1153  *
   1154  *    OMX_Sts_NoErr - no error
   1155  *    OMX_Sts_BadArgErr - bad arguments, returned if:
   1156  *    -    pSrc or pDst is NULL.
   1157  *    -    pSrc or pDst is not 16-byte aligned.
   1158  *
   1159  */
   1160 OMXResult omxVCM4P2_DCT8x8blk (
   1161     const OMX_S16 *pSrc,
   1162     OMX_S16 *pDst
   1163 );
   1164 
   1165 
   1166 
   1167 /**
   1168  * Function:  omxVCM4P2_QuantIntra_I   (6.2.4.4.2)
   1169  *
   1170  * Description:
   1171  * Performs quantization on intra block coefficients. This function supports
   1172  * bits_per_pixel == 8.
   1173  *
   1174  * Input Arguments:
   1175  *
   1176  *   pSrcDst - pointer to the input intra block coefficients; must be aligned
   1177  *            on a 16-byte boundary.
   1178  *   QP - quantization parameter (quantizer_scale).
   1179  *   blockIndex - block index indicating the component type and position,
   1180  *            valid in the range 0 to 5, as defined in [ISO14496-2], subclause
   1181  *            6.1.3.8.
   1182  *   shortVideoHeader - binary flag indicating presence of
   1183  *            short_video_header; shortVideoHeader==1 selects linear intra DC
   1184  *            mode, and shortVideoHeader==0 selects non linear intra DC mode.
   1185  *
   1186  * Output Arguments:
   1187  *
   1188  *   pSrcDst - pointer to the output (quantized) interblock coefficients.
   1189  *            When shortVideoHeader==1, AC coefficients are saturated on the
   1190  *            interval [-127, 127], and DC coefficients are saturated on the
   1191  *            interval [1, 254].  When shortVideoHeader==0, AC coefficients
   1192  *            are saturated on the interval [-2047, 2047].
   1193  *
   1194  * Return Value:
   1195  *
   1196  *    OMX_Sts_NoErr - no error
   1197  *    OMX_Sts_BadArgErr - bad arguments:
   1198  *    -    pSrcDst is NULL.
   1199  *    -    blockIndex < 0 or blockIndex >= 10
   1200  *    -    QP <= 0 or QP >= 32.
   1201  *
   1202  */
   1203 OMXResult omxVCM4P2_QuantIntra_I (
   1204     OMX_S16 *pSrcDst,
   1205     OMX_U8 QP,
   1206     OMX_INT blockIndex,
   1207     OMX_INT shortVideoHeader
   1208 );
   1209 
   1210 
   1211 
   1212 /**
   1213  * Function:  omxVCM4P2_QuantInter_I   (6.2.4.4.3)
   1214  *
   1215  * Description:
   1216  * Performs quantization on an inter coefficient block; supports
   1217  * bits_per_pixel == 8.
   1218  *
   1219  * Input Arguments:
   1220  *
   1221  *   pSrcDst - pointer to the input inter block coefficients; must be aligned
   1222  *            on a 16-byte boundary.
   1223  *   QP - quantization parameter (quantizer_scale)
   1224  *   shortVideoHeader - binary flag indicating presence of short_video_header;
   1225  *            shortVideoHeader==1 selects linear intra DC mode, and
   1226  *            shortVideoHeader==0 selects non linear intra DC mode.
   1227  *
   1228  * Output Arguments:
   1229  *
   1230  *   pSrcDst - pointer to the output (quantized) interblock coefficients.
   1231  *            When shortVideoHeader==1, AC coefficients are saturated on the
   1232  *            interval [-127, 127], and DC coefficients are saturated on the
   1233  *            interval [1, 254].  When shortVideoHeader==0, AC coefficients
   1234  *            are saturated on the interval [-2047, 2047].
   1235  *
   1236  * Return Value:
   1237  *
   1238  *    OMX_Sts_NoErr - no error
   1239  *    OMX_Sts_BadArgErr - bad arguments:
   1240  *    -    pSrcDst is NULL.
   1241  *    -    QP <= 0 or QP >= 32.
   1242  *
   1243  */
   1244 OMXResult omxVCM4P2_QuantInter_I (
   1245     OMX_S16 *pSrcDst,
   1246     OMX_U8 QP,
   1247     OMX_INT shortVideoHeader
   1248 );
   1249 
   1250 
   1251 
   1252 /**
   1253  * Function:  omxVCM4P2_TransRecBlockCoef_intra   (6.2.4.4.4)
   1254  *
   1255  * Description:
   1256  * Quantizes the DCT coefficients, implements intra block AC/DC coefficient
   1257  * prediction, and reconstructs the current intra block texture for prediction
   1258  * on the next frame.  Quantized row and column coefficients are returned in
   1259  * the updated coefficient buffers.
   1260  *
   1261  * Input Arguments:
   1262  *
   1263  *   pSrc - pointer to the pixels of current intra block; must be aligned on
   1264  *            an 8-byte boundary.
   1265  *   pPredBufRow - pointer to the coefficient row buffer containing
   1266  *            ((num_mb_per_row * 2 + 1) * 8) elements of type OMX_S16.
   1267  *            Coefficients are organized into blocks of eight as described
   1268  *            below (Internal Prediction Coefficient Update Procedures).  The
   1269  *            DC coefficient is first, and the remaining buffer locations
   1270  *            contain the quantized AC coefficients. Each group of eight row
   1271  *            buffer elements combined with one element eight elements ahead
   1272  *            contains the coefficient predictors of the neighboring block
   1273  *            that is spatially above or to the left of the block currently to
   1274  *            be decoded. A negative-valued DC coefficient indicates that this
   1275  *            neighboring block is not INTRA-coded or out of bounds, and
   1276  *            therefore the AC and DC coefficients are invalid.  Pointer must
   1277  *            be aligned on an 8-byte boundary.
   1278  *   pPredBufCol - pointer to the prediction coefficient column buffer
   1279  *            containing 16 elements of type OMX_S16. Coefficients are
   1280  *            organized as described in section 6.2.2.5.  Pointer must be
   1281  *            aligned on an 8-byte boundary.
   1282  *   pSumErr - pointer to a flag indicating whether or not AC prediction is
   1283  *            required; AC prediction is enabled if *pSumErr >=0, but the
   1284  *            value is not used for coefficient prediction, i.e., the sum of
   1285  *            absolute differences starts from 0 for each call to this
   1286  *            function.  Otherwise AC prediction is disabled if *pSumErr < 0 .
   1287  *   blockIndex - block index indicating the component type and position, as
   1288  *            defined in [ISO14496-2], subclause 6.1.3.8.
   1289  *   curQp - quantization parameter of the macroblock to which the current
   1290  *            block belongs
   1291  *   pQpBuf - pointer to a 2-element quantization parameter buffer; pQpBuf[0]
   1292  *            contains the quantization parameter associated with the 8x8
   1293  *            block left of the current block (QPa), and pQpBuf[1] contains
   1294  *            the quantization parameter associated with the 8x8 block above
   1295  *            the current block (QPc).  In the event that the corresponding
   1296  *            block is outside of the VOP bound, the Qp value will not affect
   1297  *            the intra prediction process, as described in [ISO14496-2],
   1298  *            sub-clause 7.4.3.3,  Adaptive AC Coefficient Prediction.
   1299  *   srcStep - width of the source buffer; must be a multiple of 8.
   1300  *   dstStep - width of the reconstructed destination buffer; must be a
   1301  *            multiple of 16.
   1302  *   shortVideoHeader - binary flag indicating presence of
   1303  *            short_video_header; shortVideoHeader==1 selects linear intra DC
   1304  *            mode, and shortVideoHeader==0 selects non linear intra DC mode.
   1305  *
   1306  * Output Arguments:
   1307  *
   1308  *   pDst - pointer to the quantized DCT coefficient buffer; pDst[0] contains
   1309  *            the predicted DC coefficient; the remaining entries contain the
   1310  *            quantized AC coefficients (without prediction).  The pointer
   1311  *            pDstmust be aligned on a 16-byte boundary.
   1312  *   pRec - pointer to the reconstructed texture; must be aligned on an
   1313  *            8-byte boundary.
   1314  *   pPredBufRow - pointer to the updated coefficient row buffer
   1315  *   pPredBufCol - pointer to the updated coefficient column buffer
   1316  *   pPreACPredict - if prediction is enabled, the parameter points to the
   1317  *            start of the buffer containing the coefficient differences for
   1318  *            VLC encoding. The entry pPreACPredict[0]indicates prediction
   1319  *            direction for the current block and takes one of the following
   1320  *            values: OMX_VC_NONE (prediction disabled), OMX_VC_HORIZONTAL, or
   1321  *            OMX_VC_VERTICAL.  The entries
   1322  *            pPreACPredict[1]-pPreACPredict[7]contain predicted AC
   1323  *            coefficients.  If prediction is disabled (*pSumErr<0) then the
   1324  *            contents of this buffer are undefined upon return from the
   1325  *            function
   1326  *   pSumErr - pointer to the value of the accumulated AC coefficient errors,
   1327  *            i.e., sum of the absolute differences between predicted and
   1328  *            unpredicted AC coefficients
   1329  *
   1330  * Return Value:
   1331  *
   1332  *    OMX_Sts_NoErr - no error
   1333  *    OMX_Sts_BadArgErr - Bad arguments:
   1334  *    -    At least one of the following pointers is NULL: pSrc, pDst, pRec,
   1335  *         pCoefBufRow, pCoefBufCol, pQpBuf, pPreACPredict, pSumErr.
   1336  *    -    blockIndex < 0 or blockIndex >= 10;
   1337  *    -    curQP <= 0 or curQP >= 32.
   1338  *    -    srcStep, or dstStep <= 0 or not a multiple of 8.
   1339  *    -    pDst is not 16-byte aligned: .
   1340  *    -    At least one of the following pointers is not 8-byte aligned:
   1341  *         pSrc, pRec.
   1342  *
   1343  *  Note: The coefficient buffers must be updated in accordance with the
   1344  *        update procedures defined in section in 6.2.2.
   1345  *
   1346  */
   1347 OMXResult omxVCM4P2_TransRecBlockCoef_intra (
   1348     const OMX_U8 *pSrc,
   1349     OMX_S16 *pDst,
   1350     OMX_U8 *pRec,
   1351     OMX_S16 *pPredBufRow,
   1352     OMX_S16 *pPredBufCol,
   1353     OMX_S16 *pPreACPredict,
   1354     OMX_INT *pSumErr,
   1355     OMX_INT blockIndex,
   1356     OMX_U8 curQp,
   1357     const OMX_U8 *pQpBuf,
   1358     OMX_INT srcStep,
   1359     OMX_INT dstStep,
   1360     OMX_INT shortVideoHeader
   1361 );
   1362 
   1363 
   1364 
   1365 /**
   1366  * Function:  omxVCM4P2_TransRecBlockCoef_inter   (6.2.4.4.5)
   1367  *
   1368  * Description:
   1369  * Implements DCT, and quantizes the DCT coefficients of the inter block
   1370  * while reconstructing the texture residual. There is no boundary check for
   1371  * the bit stream buffer.
   1372  *
   1373  * Input Arguments:
   1374  *
   1375  *   pSrc -pointer to the residuals to be encoded; must be aligned on an
   1376  *            16-byte boundary.
   1377  *   QP - quantization parameter.
   1378  *   shortVideoHeader - binary flag indicating presence of short_video_header;
   1379  *                      shortVideoHeader==1 selects linear intra DC mode, and
   1380  *                      shortVideoHeader==0 selects non linear intra DC mode.
   1381  *
   1382  * Output Arguments:
   1383  *
   1384  *   pDst - pointer to the quantized DCT coefficients buffer; must be aligned
   1385  *            on a 16-byte boundary.
   1386  *   pRec - pointer to the reconstructed texture residuals; must be aligned
   1387  *            on a 16-byte boundary.
   1388  *
   1389  * Return Value:
   1390  *
   1391  *    OMX_Sts_NoErr - no error
   1392  *    OMX_Sts_BadArgErr - bad arguments:
   1393  *    -    At least one of the following pointers is either NULL or
   1394  *         not 16-byte aligned:
   1395  *            - pSrc
   1396  *            - pDst
   1397  *            - pRec
   1398  *    -    QP <= 0 or QP >= 32.
   1399  *
   1400  */
   1401 OMXResult omxVCM4P2_TransRecBlockCoef_inter (
   1402     const OMX_S16 *pSrc,
   1403     OMX_S16 *pDst,
   1404     OMX_S16 *pRec,
   1405     OMX_U8 QP,
   1406     OMX_INT shortVideoHeader
   1407 );
   1408 
   1409 
   1410 
   1411 /**
   1412  * Function:  omxVCM4P2_EncodeVLCZigzag_IntraDCVLC   (6.2.4.5.2)
   1413  *
   1414  * Description:
   1415  * Performs zigzag scan and VLC encoding of AC and DC coefficients for one
   1416  * intra block.  Two versions of the function (DCVLC and ACVLC) are provided
   1417  * in order to support the two different methods of processing DC
   1418  * coefficients, as described in [ISO14496-2], subclause 7.4.1.4, "Intra DC
   1419  * Coefficient Decoding for the Case of Switched VLC Encoding".
   1420  *
   1421  * Input Arguments:
   1422  *
   1423  *   ppBitStream - double pointer to the current byte in the bitstream
   1424  *   pBitOffset - pointer to the bit position in the byte pointed by
   1425  *            *ppBitStream. Valid within 0 to 7.
   1426  *   pQDctBlkCoef - pointer to the quantized DCT coefficient
   1427  *   predDir - AC prediction direction, which is used to decide the zigzag
   1428  *            scan pattern; takes one of the following values:
   1429  *            -  OMX_VC_NONE - AC prediction not used.
   1430  *                             Performs classical zigzag scan.
   1431  *            -  OMX_VC_HORIZONTAL - Horizontal prediction.
   1432  *                             Performs alternate-vertical zigzag scan.
   1433  *            -  OMX_VC_VERTICAL - Vertical prediction.
   1434  *                             Performs alternate-horizontal zigzag scan.
   1435  *   pattern - block pattern which is used to decide whether this block is
   1436  *            encoded
   1437  *   shortVideoHeader - binary flag indicating presence of
   1438  *            short_video_header; escape modes 0-3 are used if
   1439  *            shortVideoHeader==0, and escape mode 4 is used when
   1440  *            shortVideoHeader==1.
   1441  *   videoComp - video component type (luminance, chrominance) of the current
   1442  *            block
   1443  *
   1444  * Output Arguments:
   1445  *
   1446  *   ppBitStream - *ppBitStream is updated after the block is encoded, so
   1447  *            that it points to the current byte in the bit stream buffer.
   1448  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   1449  *            position in the byte pointed by *ppBitStream.
   1450  *
   1451  * Return Value:
   1452  *
   1453  *    OMX_Sts_NoErr - no error
   1454  *    OMX_Sts_BadArgErr - Bad arguments:
   1455  *    -    At least one of the following pointers is NULL: ppBitStream,
   1456  *              *ppBitStream, pBitOffset, pQDctBlkCoef.
   1457  *    -   *pBitOffset < 0, or *pBitOffset >7.
   1458  *    -    PredDir is not one of: OMX_VC_NONE, OMX_VC_HORIZONTAL, or
   1459  *         OMX_VC_VERTICAL.
   1460  *    -    VideoComp is not one component of enum OMXVCM4P2VideoComponent.
   1461  *
   1462  */
   1463 OMXResult omxVCM4P2_EncodeVLCZigzag_IntraDCVLC (
   1464     OMX_U8 **ppBitStream,
   1465     OMX_INT *pBitOffset,
   1466     const OMX_S16 *pQDctBlkCoef,
   1467     OMX_U8 predDir,
   1468     OMX_U8 pattern,
   1469     OMX_INT shortVideoHeader,
   1470     OMXVCM4P2VideoComponent videoComp
   1471 );
   1472 
   1473 
   1474 
   1475 /**
   1476  * Function:  omxVCM4P2_EncodeVLCZigzag_IntraACVLC   (6.2.4.5.2)
   1477  *
   1478  * Description:
   1479  * Performs zigzag scan and VLC encoding of AC and DC coefficients for one
   1480  * intra block.  Two versions of the function (DCVLC and ACVLC) are provided
   1481  * in order to support the two different methods of processing DC
   1482  * coefficients, as described in [ISO14496-2], subclause 7.4.1.4,  Intra DC
   1483  * Coefficient Decoding for the Case of Switched VLC Encoding.
   1484  *
   1485  * Input Arguments:
   1486  *
   1487  *   ppBitStream - double pointer to the current byte in the bitstream
   1488  *   pBitOffset - pointer to the bit position in the byte pointed by
   1489  *            *ppBitStream. Valid within 0 to 7.
   1490  *   pQDctBlkCoef - pointer to the quantized DCT coefficient
   1491  *   predDir - AC prediction direction, which is used to decide the zigzag
   1492  *            scan pattern; takes one of the following values:
   1493  *            -  OMX_VC_NONE - AC prediction not used.
   1494  *                             Performs classical zigzag scan.
   1495  *            -  OMX_VC_HORIZONTAL - Horizontal prediction.
   1496  *                             Performs alternate-vertical zigzag scan.
   1497  *            -  OMX_VC_VERTICAL - Vertical prediction.
   1498  *                             Performs alternate-horizontal zigzag scan.
   1499  *   pattern - block pattern which is used to decide whether this block is
   1500  *            encoded
   1501  *   shortVideoHeader - binary flag indicating presence of
   1502  *            short_video_header; escape modes 0-3 are used if
   1503  *            shortVideoHeader==0, and escape mode 4 is used when
   1504  *            shortVideoHeader==1.
   1505  *
   1506  * Output Arguments:
   1507  *
   1508  *   ppBitStream - *ppBitStream is updated after the block is encoded, so
   1509  *            that it points to the current byte in the bit stream buffer.
   1510  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   1511  *            position in the byte pointed by *ppBitStream.
   1512  *
   1513  * Return Value:
   1514  *
   1515  *    OMX_Sts_NoErr - no error
   1516  *    OMX_Sts_BadArgErr - Bad arguments:
   1517  *    -    At least one of the following pointers is NULL: ppBitStream,
   1518  *              *ppBitStream, pBitOffset, pQDctBlkCoef.
   1519  *    -   *pBitOffset < 0, or *pBitOffset >7.
   1520  *    -    PredDir is not one of: OMX_VC_NONE, OMX_VC_HORIZONTAL, or
   1521  *         OMX_VC_VERTICAL.
   1522  *    -    VideoComp is not one component of enum OMXVCM4P2VideoComponent.
   1523  *
   1524  */
   1525 OMXResult omxVCM4P2_EncodeVLCZigzag_IntraACVLC (
   1526     OMX_U8 **ppBitStream,
   1527     OMX_INT *pBitOffset,
   1528     const OMX_S16 *pQDctBlkCoef,
   1529     OMX_U8 predDir,
   1530     OMX_U8 pattern,
   1531     OMX_INT shortVideoHeader
   1532 );
   1533 
   1534 
   1535 
   1536 /**
   1537  * Function:  omxVCM4P2_EncodeVLCZigzag_Inter   (6.2.4.5.3)
   1538  *
   1539  * Description:
   1540  * Performs classical zigzag scanning and VLC encoding for one inter block.
   1541  *
   1542  * Input Arguments:
   1543  *
   1544  *   ppBitStream - pointer to the pointer to the current byte in the bit
   1545  *            stream
   1546  *   pBitOffset - pointer to the bit position in the byte pointed by
   1547  *            *ppBitStream. Valid within 0 to 7
   1548  *   pQDctBlkCoef - pointer to the quantized DCT coefficient
   1549  *   pattern - block pattern which is used to decide whether this block is
   1550  *            encoded
   1551  *   shortVideoHeader - binary flag indicating presence of
   1552  *            short_video_header; escape modes 0-3 are used if
   1553  *            shortVideoHeader==0, and escape mode 4 is used when
   1554  *            shortVideoHeader==1.
   1555  *
   1556  * Output Arguments:
   1557  *
   1558  *   ppBitStream - *ppBitStream is updated after the block is encoded so that
   1559  *            it points to the current byte in the bit stream buffer.
   1560  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   1561  *            position in the byte pointed by *ppBitStream.
   1562  *
   1563  * Return Value:
   1564  *
   1565  *    OMX_Sts_NoErr - no error
   1566  *    OMX_Sts_BadArgErr - Bad arguments
   1567  *    -    At least one of the pointers: is NULL: ppBitStream, *ppBitStream,
   1568  *              pBitOffset, pQDctBlkCoef
   1569  *    -   *pBitOffset < 0, or *pBitOffset >7.
   1570  *
   1571  */
   1572 OMXResult omxVCM4P2_EncodeVLCZigzag_Inter (
   1573     OMX_U8 **ppBitStream,
   1574     OMX_INT *pBitOffset,
   1575     const OMX_S16 *pQDctBlkCoef,
   1576     OMX_U8 pattern,
   1577     OMX_INT shortVideoHeader
   1578 );
   1579 
   1580 
   1581 
   1582 /**
   1583  * Function:  omxVCM4P2_EncodeMV   (6.2.4.5.4)
   1584  *
   1585  * Description:
   1586  * Predicts a motion vector for the current macroblock, encodes the
   1587  * difference, and writes the output to the stream buffer. The input MVs
   1588  * pMVCurMB, pSrcMVLeftMB, pSrcMVUpperMB, and pSrcMVUpperRightMB should lie
   1589  * within the ranges associated with the input parameter fcodeForward, as
   1590  * described in [ISO14496-2], subclause 7.6.3.  This function provides a
   1591  * superset of the functionality associated with the function
   1592  * omxVCM4P2_FindMVpred.
   1593  *
   1594  * Input Arguments:
   1595  *
   1596  *   ppBitStream - double pointer to the current byte in the bitstream buffer
   1597  *   pBitOffset - index of the first free (next available) bit in the stream
   1598  *            buffer referenced by *ppBitStream, valid in the range 0 to 7.
   1599  *   pMVCurMB - pointer to the current macroblock motion vector; a value of
   1600  *            NULL indicates unavailability.
   1601  *   pSrcMVLeftMB - pointer to the source left macroblock motion vector; a
   1602  *            value of  NULLindicates unavailability.
   1603  *   pSrcMVUpperMB - pointer to source upper macroblock motion vector; a
   1604  *            value of NULL indicates unavailability.
   1605  *   pSrcMVUpperRightMB - pointer to source upper right MB motion vector; a
   1606  *            value of NULL indicates unavailability.
   1607  *   fcodeForward - an integer with values from 1 to 7; used in encoding
   1608  *            motion vectors related to search range, as described in
   1609  *            [ISO14496-2], subclause 7.6.3.
   1610  *   MBType - macro block type, valid in the range 0 to 5
   1611  *
   1612  * Output Arguments:
   1613  *
   1614  *   ppBitStream - updated pointer to the current byte in the bit stream
   1615  *            buffer
   1616  *   pBitOffset - updated index of the next available bit position in stream
   1617  *            buffer referenced by *ppBitStream
   1618  *
   1619  * Return Value:
   1620  *
   1621  *    OMX_Sts_NoErr - no error
   1622  *    OMX_Sts_BadArgErr - bad arguments
   1623  *    -    At least one of the following pointers is NULL: ppBitStream,
   1624  *              *ppBitStream, pBitOffset, pMVCurMB
   1625  *    -    *pBitOffset < 0, or *pBitOffset >7.
   1626  *    -    fcodeForward <= 0, or fcodeForward > 7, or MBType < 0.
   1627  *
   1628  */
   1629 OMXResult omxVCM4P2_EncodeMV (
   1630     OMX_U8 **ppBitStream,
   1631     OMX_INT *pBitOffset,
   1632     const OMXVCMotionVector *pMVCurMB,
   1633     const OMXVCMotionVector*pSrcMVLeftMB,
   1634     const OMXVCMotionVector *pSrcMVUpperMB,
   1635     const OMXVCMotionVector *pSrcMVUpperRightMB,
   1636     OMX_INT fcodeForward,
   1637     OMXVCM4P2MacroblockType MBType
   1638 );
   1639 
   1640 
   1641 
   1642 /**
   1643  * Function:  omxVCM4P2_DecodePadMV_PVOP   (6.2.5.1.1)
   1644  *
   1645  * Description:
   1646  * Decodes and pads the four motion vectors associated with a non-intra P-VOP
   1647  * macroblock.  For macroblocks of type OMX_VC_INTER4V, the output MV is
   1648  * padded as specified in [ISO14496-2], subclause 7.6.1.6. Otherwise, for
   1649  * macroblocks of types other than OMX_VC_INTER4V, the decoded MV is copied to
   1650  * all four output MV buffer entries.
   1651  *
   1652  * Input Arguments:
   1653  *
   1654  *   ppBitStream - pointer to the pointer to the current byte in the bit
   1655  *            stream buffer
   1656  *   pBitOffset - pointer to the bit position in the byte pointed to by
   1657  *            *ppBitStream. *pBitOffset is valid within [0-7].
   1658  *   pSrcMVLeftMB, pSrcMVUpperMB, and pSrcMVUpperRightMB - pointers to the
   1659  *            motion vector buffers of the macroblocks specially at the left,
   1660  *            upper, and upper-right side of the current macroblock,
   1661  *            respectively; a value of NULL indicates unavailability.  Note:
   1662  *            Any neighborhood macroblock outside the current VOP or video
   1663  *            packet or outside the current GOB (when short_video_header is
   1664  *             1 ) for which gob_header_empty is  0  is treated as
   1665  *            transparent, according to [ISO14496-2], subclause 7.6.5.
   1666  *   fcodeForward - a code equal to vop_fcode_forward in MPEG-4 bit stream
   1667  *            syntax
   1668  *   MBType - the type of the current macroblock. If MBType is not equal to
   1669  *            OMX_VC_INTER4V, the destination motion vector buffer is still
   1670  *            filled with the same decoded vector.
   1671  *
   1672  * Output Arguments:
   1673  *
   1674  *   ppBitStream - *ppBitStream is updated after the block is decoded, so
   1675  *            that it points to the current byte in the bit stream buffer
   1676  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   1677  *            position in the byte pointed by *ppBitStream
   1678  *   pDstMVCurMB - pointer to the motion vector buffer for the current
   1679  *            macroblock; contains four decoded motion vectors
   1680  *
   1681  * Return Value:
   1682  *
   1683  *    OMX_Sts_NoErr - no error
   1684  *    OMX_Sts_BadArgErr - bad arguments:
   1685  *    -    At least one of the following pointers is NULL:
   1686  *         ppBitStream, *ppBitStream, pBitOffset, pDstMVCurMB
   1687  *    -    *pBitOffset exceeds [0,7]
   1688  *    -    fcodeForward exceeds (0,7]
   1689  *    -    MBType less than zero
   1690  *    -    motion vector buffer is not 4-byte aligned.
   1691  *    OMX_Sts_Err - status error
   1692  *
   1693  */
   1694 OMXResult omxVCM4P2_DecodePadMV_PVOP (
   1695     const OMX_U8 **ppBitStream,
   1696     OMX_INT *pBitOffset,
   1697     OMXVCMotionVector *pSrcMVLeftMB,
   1698     OMXVCMotionVector*pSrcMVUpperMB,
   1699     OMXVCMotionVector *pSrcMVUpperRightMB,
   1700     OMXVCMotionVector*pDstMVCurMB,
   1701     OMX_INT fcodeForward,
   1702     OMXVCM4P2MacroblockType MBType
   1703 );
   1704 
   1705 
   1706 
   1707 /**
   1708  * Function:  omxVCM4P2_DecodeVLCZigzag_IntraDCVLC   (6.2.5.2.2)
   1709  *
   1710  * Description:
   1711  * Performs VLC decoding and inverse zigzag scan of AC and DC coefficients
   1712  * for one intra block.  Two versions of the function (DCVLC and ACVLC) are
   1713  * provided in order to support the two different methods of processing DC
   1714  * coefficients, as described in [ISO14496-2], subclause 7.4.1.4,  Intra DC
   1715  * Coefficient Decoding for the Case of Switched VLC Encoding.
   1716  *
   1717  * Input Arguments:
   1718  *
   1719  *   ppBitStream - pointer to the pointer to the current byte in the
   1720  *            bitstream buffer
   1721  *   pBitOffset - pointer to the bit position in the current byte referenced
   1722  *            by *ppBitStream.  The parameter *pBitOffset is valid in the
   1723  *            range [0-7].
   1724  *            Bit Position in one byte:  |Most      Least|
   1725  *                    *pBitOffset        |0 1 2 3 4 5 6 7|
   1726  *   predDir - AC prediction direction; used to select the zigzag scan
   1727  *            pattern; takes one of the following values:
   1728  *            -  OMX_VC_NONE - AC prediction not used;
   1729  *                             performs classical zigzag scan.
   1730  *            -  OMX_VC_HORIZONTAL - Horizontal prediction;
   1731  *                             performs alternate-vertical zigzag scan;
   1732  *            -  OMX_VC_VERTICAL - Vertical prediction;
   1733  *                             performs alternate-horizontal zigzag scan.
   1734  *   shortVideoHeader - binary flag indicating presence of
   1735  *            short_video_header; escape modes 0-3 are used if
   1736  *            shortVideoHeader==0, and escape mode 4 is used when
   1737  *            shortVideoHeader==1.
   1738  *   videoComp - video component type (luminance or chrominance) of the
   1739  *            current block
   1740  *
   1741  * Output Arguments:
   1742  *
   1743  *   ppBitStream - *ppBitStream is updated after the block is decoded such
   1744  *            that it points to the current byte in the bit stream buffer
   1745  *   pBitOffset - *pBitOffset is updated such that it points to the current
   1746  *            bit position in the byte pointed by *ppBitStream
   1747  *   pDst - pointer to the coefficient buffer of current block; must be
   1748  *            4-byte aligned.
   1749  *
   1750  * Return Value:
   1751  *
   1752  *    OMX_Sts_NoErr - no error
   1753  *    OMX_Sts_BadArgErr - bad arguments, if:
   1754  *    -    At least one of the following pointers is NULL:
   1755  *         ppBitStream, *ppBitStream, pBitOffset, pDst
   1756  *    -    *pBitOffset exceeds [0,7]
   1757  *    -    preDir exceeds [0,2]
   1758  *    -    pDst is not 4-byte aligned
   1759  *    OMX_Sts_Err - if:
   1760  *    -    In DecodeVLCZigzag_IntraDCVLC, dc_size > 12
   1761  *    -    At least one of mark bits equals zero
   1762  *    -    Illegal stream encountered; code cannot be located in VLC table
   1763  *    -    Forbidden code encountered in the VLC FLC table.
   1764  *    -    The number of coefficients is greater than 64
   1765  *
   1766  */
   1767 OMXResult omxVCM4P2_DecodeVLCZigzag_IntraDCVLC (
   1768     const OMX_U8 **ppBitStream,
   1769     OMX_INT *pBitOffset,
   1770     OMX_S16 *pDst,
   1771     OMX_U8 predDir,
   1772     OMX_INT shortVideoHeader,
   1773     OMXVCM4P2VideoComponent videoComp
   1774 );
   1775 
   1776 
   1777 
   1778 /**
   1779  * Function:  omxVCM4P2_DecodeVLCZigzag_IntraACVLC   (6.2.5.2.2)
   1780  *
   1781  * Description:
   1782  * Performs VLC decoding and inverse zigzag scan of AC and DC coefficients
   1783  * for one intra block.  Two versions of the function (DCVLC and ACVLC) are
   1784  * provided in order to support the two different methods of processing DC
   1785  * coefficients, as described in [ISO14496-2], subclause 7.4.1.4,  Intra DC
   1786  * Coefficient Decoding for the Case of Switched VLC Encoding.
   1787  *
   1788  * Input Arguments:
   1789  *
   1790  *   ppBitStream - pointer to the pointer to the current byte in the
   1791  *            bitstream buffer
   1792  *   pBitOffset - pointer to the bit position in the current byte referenced
   1793  *            by *ppBitStream.  The parameter *pBitOffset is valid in the
   1794  *            range [0-7]. Bit Position in one byte:  |Most Least| *pBitOffset
   1795  *            |0 1 2 3 4 5 6 7|
   1796  *   predDir - AC prediction direction; used to select the zigzag scan
   1797  *            pattern; takes one of the following values: OMX_VC_NONE - AC
   1798  *            prediction not used; performs classical zigzag scan.
   1799  *            OMX_VC_HORIZONTAL - Horizontal prediction; performs
   1800  *            alternate-vertical zigzag scan; OMX_VC_VERTICAL - Vertical
   1801  *            prediction; performs alternate-horizontal zigzag scan.
   1802  *   shortVideoHeader - binary flag indicating presence of
   1803  *            short_video_header; escape modes 0-3 are used if
   1804  *            shortVideoHeader==0, and escape mode 4 is used when
   1805  *            shortVideoHeader==1.
   1806  *   videoComp - video component type (luminance or chrominance) of the
   1807  *            current block
   1808  *
   1809  * Output Arguments:
   1810  *
   1811  *   ppBitStream - *ppBitStream is updated after the block is decoded such
   1812  *            that it points to the current byte in the bit stream buffer
   1813  *   pBitOffset - *pBitOffset is updated such that it points to the current
   1814  *            bit position in the byte pointed by *ppBitStream
   1815  *   pDst - pointer to the coefficient buffer of current block; must be
   1816  *            4-byte aligned.
   1817  *
   1818  * Return Value:
   1819  *
   1820  *    OMX_Sts_NoErr - no error
   1821  *    OMX_Sts_BadArgErr - bad arguments At least one of the following
   1822  *              pointers is NULL: ppBitStream, *ppBitStream, pBitOffset, pDst,
   1823  *              or At least one of the following conditions is true:
   1824  *              *pBitOffset exceeds [0,7], preDir exceeds [0,2], or pDst is
   1825  *              not 4-byte aligned
   1826  *    OMX_Sts_Err In DecodeVLCZigzag_IntraDCVLC, dc_size > 12 At least one of
   1827  *              mark bits equals zero Illegal stream encountered; code cannot
   1828  *              be located in VLC table Forbidden code encountered in the VLC
   1829  *              FLC table The number of coefficients is greater than 64
   1830  *
   1831  */
   1832 OMXResult omxVCM4P2_DecodeVLCZigzag_IntraACVLC (
   1833     const OMX_U8 **ppBitStream,
   1834     OMX_INT *pBitOffset,
   1835     OMX_S16 *pDst,
   1836     OMX_U8 predDir,
   1837     OMX_INT shortVideoHeader
   1838 );
   1839 
   1840 
   1841 
   1842 /**
   1843  * Function:  omxVCM4P2_DecodeVLCZigzag_Inter   (6.2.5.2.3)
   1844  *
   1845  * Description:
   1846  * Performs VLC decoding and inverse zigzag scan for one inter-coded block.
   1847  *
   1848  * Input Arguments:
   1849  *
   1850  *   ppBitStream - double pointer to the current byte in the stream buffer
   1851  *   pBitOffset - pointer to the next available bit in the current stream
   1852  *            byte referenced by *ppBitStream. The parameter *pBitOffset is
   1853  *            valid within the range [0-7].
   1854  *   shortVideoHeader - binary flag indicating presence of
   1855  *            short_video_header; escape modes 0-3 are used if
   1856  *            shortVideoHeader==0, and escape mode 4 is used when
   1857  *            shortVideoHeader==1.
   1858  *
   1859  * Output Arguments:
   1860  *
   1861  *   ppBitStream - *ppBitStream is updated after the block is decoded such
   1862  *            that it points to the current byte in the stream buffer
   1863  *   pBitOffset - *pBitOffset is updated after decoding such that it points
   1864  *            to the next available bit in the stream byte referenced by
   1865  *            *ppBitStream
   1866  *   pDst - pointer to the coefficient buffer of current block; must be
   1867  *            4-byte aligned.
   1868  *
   1869  * Return Value:
   1870  *
   1871  *    OMX_Sts_BadArgErr - bad arguments:
   1872  *    -    At least one of the following pointers is NULL:
   1873  *         ppBitStream, *ppBitStream, pBitOffset, pDst
   1874  *    -    pDst is not 4-byte aligned
   1875  *    -   *pBitOffset exceeds [0,7]
   1876  *    OMX_Sts_Err - status error, if:
   1877  *    -    At least one mark bit is equal to zero
   1878  *    -    Encountered an illegal stream code that cannot be found in the VLC table
   1879  *    -    Encountered an illegal code in the VLC FLC table
   1880  *    -    The number of coefficients is greater than 64
   1881  *
   1882  */
   1883 OMXResult omxVCM4P2_DecodeVLCZigzag_Inter (
   1884     const OMX_U8 **ppBitStream,
   1885     OMX_INT *pBitOffset,
   1886     OMX_S16 *pDst,
   1887     OMX_INT shortVideoHeader
   1888 );
   1889 
   1890 
   1891 
   1892 /**
   1893  * Function:  omxVCM4P2_QuantInvIntra_I   (6.2.5.3.2)
   1894  *
   1895  * Description:
   1896  * Performs the second inverse quantization mode on an intra/inter coded
   1897  * block. Supports bits_per_pixel = 8. The output coefficients are clipped to
   1898  * the range [-2048, 2047].
   1899  *
   1900  * Input Arguments:
   1901  *
   1902  *   pSrcDst - pointer to the input (quantized) intra/inter block; must be
   1903  *            aligned on a 16-byte boundary.
   1904  *   QP - quantization parameter (quantizer_scale)
   1905  *   videoComp - video component type of the current block. Takes one of the
   1906  *            following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra
   1907  *            version only).
   1908  *   shortVideoHeader - binary flag indicating presence of short_video_header
   1909  *            (intra version only).
   1910  *
   1911  * Output Arguments:
   1912  *
   1913  *   pSrcDst - pointer to the output (dequantized) intra/inter block
   1914  *
   1915  * Return Value:
   1916  *
   1917  *    OMX_Sts_NoErr - no error
   1918  *    OMX_Sts_BadArgErr - bad arguments; one or more of the following is
   1919  *              true:
   1920  *    -    pSrcDst is NULL
   1921  *    -    QP <= 0 or QP >=31
   1922  *    -    videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE.
   1923  *
   1924  */
   1925 OMXResult omxVCM4P2_QuantInvIntra_I (
   1926     OMX_S16 *pSrcDst,
   1927     OMX_INT QP,
   1928     OMXVCM4P2VideoComponent videoComp,
   1929     OMX_INT shortVideoHeader
   1930 );
   1931 
   1932 
   1933 
   1934 /**
   1935  * Function:  omxVCM4P2_QuantInvInter_I   (6.2.5.3.2)
   1936  *
   1937  * Description:
   1938  * Performs the second inverse quantization mode on an intra/inter coded
   1939  * block. Supports bits_per_pixel = 8. The output coefficients are clipped to
   1940  * the range [-2048, 2047].
   1941  *
   1942  * Input Arguments:
   1943  *
   1944  *   pSrcDst - pointer to the input (quantized) intra/inter block; must be
   1945  *            aligned on a 16-byte boundary.
   1946  *   QP - quantization parameter (quantizer_scale)
   1947  *   videoComp - video component type of the current block. Takes one of the
   1948  *            following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra
   1949  *            version only).
   1950  *   shortVideoHeader - binary flag indicating presence of short_video_header
   1951  *            (intra version only).
   1952  *
   1953  * Output Arguments:
   1954  *
   1955  *   pSrcDst - pointer to the output (dequantized) intra/inter block
   1956  *
   1957  * Return Value:
   1958  *
   1959  *    OMX_Sts_NoErr - no error
   1960  *    OMX_Sts_BadArgErr - bad arguments; one or more of the following is
   1961  *              true:
   1962  *    -    pSrcDst is NULL
   1963  *    -    QP <= 0 or QP >=31
   1964  *    -    videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE.
   1965  *
   1966  */
   1967 OMXResult omxVCM4P2_QuantInvInter_I (
   1968     OMX_S16 *pSrcDst,
   1969     OMX_INT QP
   1970 );
   1971 
   1972 
   1973 
   1974 /**
   1975  * Function:  omxVCM4P2_DecodeBlockCoef_Intra   (6.2.5.4.1)
   1976  *
   1977  * Description:
   1978  * Decodes the INTRA block coefficients. Inverse quantization, inversely
   1979  * zigzag positioning, and IDCT, with appropriate clipping on each step, are
   1980  * performed on the coefficients. The results are then placed in the output
   1981  * frame/plane on a pixel basis.  Note: This function will be used only when
   1982  * at least one non-zero AC coefficient of current block exists in the bit
   1983  * stream. The DC only condition will be handled in another function.
   1984  *
   1985  *
   1986  * Input Arguments:
   1987  *
   1988  *   ppBitStream - pointer to the pointer to the current byte in the bit
   1989  *            stream buffer. There is no boundary check for the bit stream
   1990  *            buffer.
   1991  *   pBitOffset - pointer to the bit position in the byte pointed to by
   1992  *            *ppBitStream. *pBitOffset is valid within [0-7].
   1993  *   step - width of the destination plane
   1994  *   pCoefBufRow - pointer to the coefficient row buffer; must be aligned on
   1995  *            an 8-byte boundary.
   1996  *   pCoefBufCol - pointer to the coefficient column buffer; must be aligned
   1997  *            on an 8-byte boundary.
   1998  *   curQP - quantization parameter of the macroblock which the current block
   1999  *            belongs to
   2000  *   pQPBuf - pointer to the quantization parameter buffer
   2001  *   blockIndex - block index indicating the component type and position as
   2002  *            defined in [ISO14496-2], subclause 6.1.3.8, Figure 6-5.
   2003  *   intraDCVLC - a code determined by intra_dc_vlc_thr and QP. This allows a
   2004  *            mechanism to switch between two VLC for coding of Intra DC
   2005  *            coefficients as per [ISO14496-2], Table 6-21.
   2006  *   ACPredFlag - a flag equal to ac_pred_flag (of luminance) indicating if
   2007  *            the ac coefficients of the first row or first column are
   2008  *            differentially coded for intra coded macroblock.
   2009  *   shortVideoHeader - binary flag indicating presence of
   2010  *            short_video_header; shortVideoHeader==1 selects linear intra DC
   2011  *            mode, and shortVideoHeader==0 selects non linear intra DC mode.
   2012  *
   2013  * Output Arguments:
   2014  *
   2015  *   ppBitStream - *ppBitStream is updated after the block is decoded, so
   2016  *            that it points to the current byte in the bit stream buffer
   2017  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   2018  *            position in the byte pointed by *ppBitStream
   2019  *   pDst - pointer to the block in the destination plane; must be aligned on
   2020  *            an 8-byte boundary.
   2021  *   pCoefBufRow - pointer to the updated coefficient row buffer.
   2022  *   pCoefBufCol - pointer to the updated coefficient column buffer  Note:
   2023  *            The coefficient buffers must be updated in accordance with the
   2024  *            update procedure defined in section 6.2.2.
   2025  *
   2026  * Return Value:
   2027  *
   2028  *    OMX_Sts_NoErr - no error
   2029  *    OMX_Sts_BadArgErr - bad arguments, if:
   2030  *    -    At least one of the following pointers is NULL:
   2031  *         ppBitStream, *ppBitStream, pBitOffset, pCoefBufRow, pCoefBufCol,
   2032  *         pQPBuf, pDst.
   2033  *    -    *pBitOffset exceeds [0,7]
   2034  *    -    curQP exceeds (1, 31)
   2035  *    -    blockIndex exceeds [0,5]
   2036  *    -    step is not the multiple of 8
   2037  *    -    a pointer alignment requirement was violated.
   2038  *    OMX_Sts_Err - status error. Refer to OMX_Sts_Err of DecodeVLCZigzag_Intra.
   2039  *
   2040  */
   2041 OMXResult omxVCM4P2_DecodeBlockCoef_Intra (
   2042     const OMX_U8 **ppBitStream,
   2043     OMX_INT *pBitOffset,
   2044     OMX_U8 *pDst,
   2045     OMX_INT step,
   2046     OMX_S16 *pCoefBufRow,
   2047     OMX_S16 *pCoefBufCol,
   2048     OMX_U8 curQP,
   2049     const OMX_U8 *pQPBuf,
   2050     OMX_INT blockIndex,
   2051     OMX_INT intraDCVLC,
   2052     OMX_INT ACPredFlag,
   2053     OMX_INT shortVideoHeader
   2054 );
   2055 
   2056 
   2057 
   2058 /**
   2059  * Function:  omxVCM4P2_DecodeBlockCoef_Inter   (6.2.5.4.2)
   2060  *
   2061  * Description:
   2062  * Decodes the INTER block coefficients. This function performs inverse
   2063  * quantization, inverse zigzag positioning, and IDCT (with appropriate
   2064  * clipping on each step) on the coefficients. The results (residuals) are
   2065  * placed in a contiguous array of 64 elements. For INTER block, the output
   2066  * buffer holds the residuals for further reconstruction.
   2067  *
   2068  * Input Arguments:
   2069  *
   2070  *   ppBitStream - pointer to the pointer to the current byte in the bit
   2071  *            stream buffer. There is no boundary check for the bit stream
   2072  *            buffer.
   2073  *   pBitOffset - pointer to the bit position in the byte pointed to by
   2074  *            *ppBitStream. *pBitOffset is valid within [0-7]
   2075  *   QP - quantization parameter
   2076  *   shortVideoHeader - binary flag indicating presence of
   2077  *            short_video_header; shortVideoHeader==1 selects linear intra DC
   2078  *            mode, and shortVideoHeader==0 selects non linear intra DC mode.
   2079  *
   2080  * Output Arguments:
   2081  *
   2082  *   ppBitStream - *ppBitStream is updated after the block is decoded, so
   2083  *            that it points to the current byte in the bit stream buffer
   2084  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
   2085  *            position in the byte pointed by *ppBitStream
   2086  *   pDst - pointer to the decoded residual buffer (a contiguous array of 64
   2087  *            elements of OMX_S16 data type); must be aligned on a 16-byte
   2088  *            boundary.
   2089  *
   2090  * Return Value:
   2091  *
   2092  *    OMX_Sts_NoErr - no error
   2093  *    OMX_Sts_BadArgErr - bad arguments, if:
   2094  *    -    At least one of the following pointers is Null:
   2095  *         ppBitStream, *ppBitStream, pBitOffset , pDst
   2096  *    -    *pBitOffset exceeds [0,7]
   2097  *    -    QP <= 0.
   2098  *    -    pDst is not 16-byte aligned
   2099  *    OMX_Sts_Err - status error. Refer to OMX_Sts_Err of DecodeVLCZigzag_Inter .
   2100  *
   2101  */
   2102 OMXResult omxVCM4P2_DecodeBlockCoef_Inter (
   2103     const OMX_U8 **ppBitStream,
   2104     OMX_INT *pBitOffset,
   2105     OMX_S16 *pDst,
   2106     OMX_INT QP,
   2107     OMX_INT shortVideoHeader
   2108 );
   2109 
   2110 
   2111 
   2112 /**
   2113  * Function:  omxVCM4P2_PredictReconCoefIntra   (6.2.5.4.3)
   2114  *
   2115  * Description:
   2116  * Performs adaptive DC/AC coefficient prediction for an intra block.  Prior
   2117  * to the function call, prediction direction (predDir) should be selected as
   2118  * specified in [ISO14496-2], subclause 7.4.3.1.
   2119  *
   2120  * Input Arguments:
   2121  *
   2122  *   pSrcDst - pointer to the coefficient buffer which contains the quantized
   2123  *            coefficient residuals (PQF) of the current block; must be
   2124  *            aligned on a 4-byte boundary.  The output coefficients are
   2125  *            saturated to the range [-2048, 2047].
   2126  *   pPredBufRow - pointer to the coefficient row buffer; must be aligned on
   2127  *            a 4-byte boundary.
   2128  *   pPredBufCol - pointer to the coefficient column buffer; must be aligned
   2129  *            on a 4-byte boundary.
   2130  *   curQP - quantization parameter of the current block. curQP may equal to
   2131  *            predQP especially when the current block and the predictor block
   2132  *            are in the same macroblock.
   2133  *   predQP - quantization parameter of the predictor block
   2134  *   predDir - indicates the prediction direction which takes one of the
   2135  *            following values: OMX_VC_HORIZONTAL - predict horizontally
   2136  *            OMX_VC_VERTICAL - predict vertically
   2137  *   ACPredFlag - a flag indicating if AC prediction should be performed. It
   2138  *            is equal to ac_pred_flag in the bit stream syntax of MPEG-4
   2139  *   videoComp - video component type (luminance or chrominance) of the
   2140  *            current block
   2141  *
   2142  * Output Arguments:
   2143  *
   2144  *   pSrcDst - pointer to the coefficient buffer which contains the quantized
   2145  *            coefficients (QF) of the current block
   2146  *   pPredBufRow - pointer to the updated coefficient row buffer
   2147  *   pPredBufCol - pointer to the updated coefficient column buffer  Note:
   2148  *            Buffer update: Update the AC prediction buffer (both row and
   2149  *            column buffer).
   2150  *
   2151  * Return Value:
   2152  *
   2153  *    OMX_Sts_NoErr - no error
   2154  *    OMX_Sts_BadArgErr - bad arguments, if:
   2155  *        -    At least one of the pointers is NULL:
   2156  *              pSrcDst, pPredBufRow, or pPredBufCol.
   2157  *        -    curQP <= 0,
   2158  *        -    predQP <= 0,
   2159  *        -    curQP >31,
   2160  *        -    predQP > 31,
   2161  *        -    preDir exceeds [1,2]
   2162  *        -    pSrcDst, pPredBufRow, or pPredBufCol is not 4-byte aligned.
   2163  *
   2164  */
   2165 OMXResult omxVCM4P2_PredictReconCoefIntra (
   2166     OMX_S16 *pSrcDst,
   2167     OMX_S16 *pPredBufRow,
   2168     OMX_S16 *pPredBufCol,
   2169     OMX_INT curQP,
   2170     OMX_INT predQP,
   2171     OMX_INT predDir,
   2172     OMX_INT ACPredFlag,
   2173     OMXVCM4P2VideoComponent videoComp
   2174 );
   2175 
   2176 
   2177 
   2178 /**
   2179  * Function:  omxVCM4P2_MCReconBlock   (6.2.5.5.1)
   2180  *
   2181  * Description:
   2182  * Performs motion compensation prediction for an 8x8 block using
   2183  * interpolation described in [ISO14496-2], subclause 7.6.2.
   2184  *
   2185  * Input Arguments:
   2186  *
   2187  *   pSrc - pointer to the block in the reference plane.
   2188  *   srcStep - distance between the start of consecutive lines in the
   2189  *            reference plane, in bytes; must be a multiple of 8.
   2190  *   dstStep - distance between the start of consecutive lines in the
   2191  *            destination plane, in bytes; must be a multiple of 8.
   2192  *   pSrcResidue - pointer to a buffer containing the 16-bit prediction
   2193  *            residuals; must be 16-byte aligned. If the pointer is NULL, then
   2194  *            no prediction is done, only motion compensation, i.e., the block
   2195  *            is moved with interpolation.
   2196  *   predictType - bilinear interpolation type, as defined in section
   2197  *            6.2.1.2.
   2198  *   rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
   2199  *
   2200  * Output Arguments:
   2201  *
   2202  *   pDst - pointer to the destination buffer; must be 8-byte aligned.  If
   2203  *            prediction residuals are added then output intensities are
   2204  *            clipped to the range [0,255].
   2205  *
   2206  * Return Value:
   2207  *
   2208  *    OMX_Sts_NoErr - no error
   2209  *    OMX_Sts_BadArgErr - bad arguments; returned under any of the following
   2210  *              conditions:
   2211  *    -    pDst is not 8-byte aligned.
   2212  *    -    pSrcResidue is not 16-byte aligned.
   2213  *    -    one or more of the following pointers is NULL: pSrc or pDst.
   2214  *    -    either srcStep or dstStep is not a multiple of 8.
   2215  *    -    invalid type specified for the parameter predictType.
   2216  *    -    the parameter rndVal is not equal either to 0 or 1.
   2217  *
   2218  */
   2219 OMXResult omxVCM4P2_MCReconBlock (
   2220     const OMX_U8 *pSrc,
   2221     OMX_INT srcStep,
   2222     const OMX_S16 *pSrcResidue,
   2223     OMX_U8 *pDst,
   2224     OMX_INT dstStep,
   2225     OMX_INT predictType,
   2226     OMX_INT rndVal
   2227 );
   2228 
   2229 
   2230 
   2231 /* 6.3.1.1 Intra 16x16 Prediction Modes  */
   2232 /* A data type that enumerates intra_16x16 macroblock prediction modes is defined as follows:  */
   2233 
   2234 typedef enum {
   2235     OMX_VC_16X16_VERT = 0,  /** Intra_16x16_Vertical */
   2236     OMX_VC_16X16_HOR = 1,   /** Intra_16x16_Horizontal */
   2237     OMX_VC_16X16_DC = 2,    /** Intra_16x16_DC */
   2238     OMX_VC_16X16_PLANE = 3  /** Intra_16x16_Plane */
   2239 } OMXVCM4P10Intra16x16PredMode;
   2240 
   2241 
   2242 
   2243 /* 6.3.1.2 Intra 4x4 Prediction Modes  */
   2244 /* A data type that enumerates intra_4x4 macroblock prediction modes is defined as follows:  */
   2245 
   2246 typedef enum {
   2247     OMX_VC_4X4_VERT = 0,     /** Intra_4x4_Vertical */
   2248     OMX_VC_4X4_HOR = 1,      /** Intra_4x4_Horizontal */
   2249     OMX_VC_4X4_DC = 2,       /** Intra_4x4_DC */
   2250     OMX_VC_4X4_DIAG_DL = 3,  /** Intra_4x4_Diagonal_Down_Left */
   2251     OMX_VC_4X4_DIAG_DR = 4,  /** Intra_4x4_Diagonal_Down_Right */
   2252     OMX_VC_4X4_VR = 5,       /** Intra_4x4_Vertical_Right */
   2253     OMX_VC_4X4_HD = 6,       /** Intra_4x4_Horizontal_Down */
   2254     OMX_VC_4X4_VL = 7,       /** Intra_4x4_Vertical_Left */
   2255     OMX_VC_4X4_HU = 8        /** Intra_4x4_Horizontal_Up */
   2256 } OMXVCM4P10Intra4x4PredMode;
   2257 
   2258 
   2259 
   2260 /* 6.3.1.3 Chroma Prediction Modes  */
   2261 /* A data type that enumerates intra chroma prediction modes is defined as follows:  */
   2262 
   2263 typedef enum {
   2264     OMX_VC_CHROMA_DC = 0,    /** Intra_Chroma_DC */
   2265     OMX_VC_CHROMA_HOR = 1,   /** Intra_Chroma_Horizontal */
   2266     OMX_VC_CHROMA_VERT = 2,  /** Intra_Chroma_Vertical */
   2267     OMX_VC_CHROMA_PLANE = 3  /** Intra_Chroma_Plane */
   2268 } OMXVCM4P10IntraChromaPredMode;
   2269 
   2270 
   2271 
   2272 /* 6.3.1.4 Motion Estimation Modes  */
   2273 /* A data type that enumerates H.264 motion estimation modes is defined as follows:  */
   2274 
   2275 typedef enum {
   2276     OMX_VC_M4P10_FAST_SEARCH = 0, /** Fast motion search */
   2277     OMX_VC_M4P10_FULL_SEARCH = 1  /** Full motion search */
   2278 } OMXVCM4P10MEMode;
   2279 
   2280 
   2281 
   2282 /* 6.3.1.5 Macroblock Types  */
   2283 /* A data type that enumerates H.264 macroblock types is defined as follows:  */
   2284 
   2285 typedef enum {
   2286     OMX_VC_P_16x16  = 0, /* defined by [ISO14496-10] */
   2287     OMX_VC_P_16x8  = 1,
   2288     OMX_VC_P_8x16  = 2,
   2289     OMX_VC_P_8x8  = 3,
   2290     OMX_VC_PREF0_8x8  = 4,
   2291     OMX_VC_INTER_SKIP  = 5,
   2292     OMX_VC_INTRA_4x4  = 8,
   2293     OMX_VC_INTRA_16x16  = 9,
   2294     OMX_VC_INTRA_PCM = 10
   2295 } OMXVCM4P10MacroblockType;
   2296 
   2297 
   2298 
   2299 /* 6.3.1.6 Sub-Macroblock Types  */
   2300 /* A data type that enumerates H.264 sub-macroblock types is defined as follows:  */
   2301 
   2302 typedef enum {
   2303     OMX_VC_SUB_P_8x8 = 0, /* defined by [ISO14496-10] */
   2304     OMX_VC_SUB_P_8x4 = 1,
   2305     OMX_VC_SUB_P_4x8 = 2,
   2306     OMX_VC_SUB_P_4x4 = 3
   2307 } OMXVCM4P10SubMacroblockType;
   2308 
   2309 
   2310 
   2311 /* 6.3.1.7 Variable Length Coding (VLC) Information  */
   2312 
   2313 typedef struct {
   2314     OMX_U8 uTrailing_Ones;      /* Trailing ones; 3 at most */
   2315     OMX_U8 uTrailing_One_Signs; /* Trailing ones signal */
   2316     OMX_U8 uNumCoeffs;          /* Total number of non-zero coefs, including trailing ones */
   2317     OMX_U8 uTotalZeros;         /* Total number of zero coefs */
   2318     OMX_S16 iLevels[16];        /* Levels of non-zero coefs, in reverse zig-zag order */
   2319     OMX_U8 uRuns[16];           /* Runs for levels and trailing ones, in reverse zig-zag order */
   2320 } OMXVCM4P10VLCInfo;
   2321 
   2322 
   2323 
   2324 /* 6.3.1.8 Macroblock Information  */
   2325 
   2326 typedef struct {
   2327     OMX_S32 sliceId;                          /* slice number */
   2328     OMXVCM4P10MacroblockType mbType;          /* MB type */
   2329     OMXVCM4P10SubMacroblockType subMBType[4]; /* sub-block type */
   2330     OMX_S32 qpy;                              /* qp for luma */
   2331     OMX_S32 qpc;                              /* qp for chroma */
   2332     OMX_U32 cbpy;                             /* CBP Luma */
   2333     OMX_U32 cbpc;                             /* CBP Chroma */
   2334     OMXVCMotionVector pMV0[4][4]; /* motion vector, represented using 1/4-pel units, pMV0[blocky][blockx] (blocky = 0~3, blockx =0~3) */
   2335     OMXVCMotionVector pMVPred[4][4]; /* motion vector prediction, Represented using 1/4-pel units, pMVPred[blocky][blockx] (blocky = 0~3, blockx = 0~3) */
   2336     OMX_U8 pRefL0Idx[4];                      /* reference picture indices */
   2337     OMXVCM4P10Intra16x16PredMode Intra16x16PredMode; /* best intra 16x16 prediction mode */
   2338     OMXVCM4P10Intra4x4PredMode pIntra4x4PredMode[16]; /* best intra 4x4 prediction mode for each block, pMV0 indexed as above */
   2339 } OMXVCM4P10MBInfo, *OMXVCM4P10MBInfoPtr;
   2340 
   2341 
   2342 
   2343 /* 6.3.1.9 Motion Estimation Parameters  */
   2344 
   2345 typedef struct {
   2346     OMX_S32 blockSplitEnable8x8; /* enables 16x8, 8x16, 8x8 */
   2347     OMX_S32 blockSplitEnable4x4; /* enable splitting of 8x4, 4x8, 4x4 blocks */
   2348     OMX_S32 halfSearchEnable;
   2349     OMX_S32 quarterSearchEnable;
   2350     OMX_S32 intraEnable4x4;      /* 1=enable, 0=disable */
   2351     OMX_S32 searchRange16x16;    /* integer pixel units */
   2352     OMX_S32 searchRange8x8;
   2353     OMX_S32 searchRange4x4;
   2354 } OMXVCM4P10MEParams;
   2355 
   2356 
   2357 
   2358 /**
   2359  * Function:  omxVCM4P10_PredictIntra_4x4   (6.3.3.1.1)
   2360  *
   2361  * Description:
   2362  * Perform Intra_4x4 prediction for luma samples. If the upper-right block is
   2363  * not available, then duplication work should be handled inside the function.
   2364  * Users need not define them outside.
   2365  *
   2366  * Input Arguments:
   2367  *
   2368  *   pSrcLeft -  Pointer to the buffer of 4 left pixels:
   2369  *                  p[x, y] (x = -1, y = 0..3)
   2370  *   pSrcAbove - Pointer to the buffer of 8 above pixels:
   2371  *                  p[x,y] (x = 0..7, y =-1);
   2372  *               must be aligned on a 4-byte boundary.
   2373  *   pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
   2374  *   leftStep - Step of left pixel buffer; must be a multiple of 4.
   2375  *   dstStep - Step of the destination buffer; must be a multiple of 4.
   2376  *   predMode - Intra_4x4 prediction mode.
   2377  *   availability - Neighboring 4x4 block availability flag, refer to
   2378  *             "Neighboring Macroblock Availability" .
   2379  *
   2380  * Output Arguments:
   2381  *
   2382  *   pDst - Pointer to the destination buffer; must be aligned on a 4-byte
   2383  *            boundary.
   2384  *
   2385  * Return Value:
   2386  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2387  *    If one of the following cases occurs, the function returns
   2388  *              OMX_Sts_BadArgErr:
   2389  *    pDst is NULL.
   2390  *    dstStep < 4, or dstStep is not a multiple of 4.
   2391  *    leftStep is not a multiple of 4.
   2392  *    predMode is not in the valid range of enumeration
   2393  *              OMXVCM4P10Intra4x4PredMode.
   2394  *    predMode is OMX_VC_4x4_VERT, but availability doesn't set OMX_VC_UPPER
   2395  *              indicating p[x,-1] (x = 0..3) is not available.
   2396  *    predMode is OMX_VC_4x4_HOR, but availability doesn't set OMX_VC_LEFT
   2397  *              indicating p[-1,y] (y = 0..3) is not available.
   2398  *    predMode is OMX_VC_4x4_DIAG_DL, but availability doesn't set
   2399  *              OMX_VC_UPPER indicating p[x, -1] (x = 0..3) is not available.
   2400  *    predMode is OMX_VC_4x4_DIAG_DR, but availability doesn't set
   2401  *              OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
   2402  *              p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
   2403  *              available.
   2404  *    predMode is OMX_VC_4x4_VR, but availability doesn't set
   2405  *              OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
   2406  *              p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
   2407  *              available.
   2408  *    predMode is OMX_VC_4x4_HD, but availability doesn't set
   2409  *              OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
   2410  *              p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
   2411  *              available.
   2412  *    predMode is OMX_VC_4x4_VL, but availability doesn't set OMX_VC_UPPER
   2413  *              indicating p[x,-1] (x = 0..3) is not available.
   2414  *    predMode is OMX_VC_4x4_HU, but availability doesn't set OMX_VC_LEFT
   2415  *              indicating p[-1,y] (y = 0..3) is not available.
   2416  *    availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
   2417  *    availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
   2418  *    availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
   2419  *    either pSrcAbove or pDst is not aligned on a 4-byte boundary.
   2420  *
   2421  * Note:
   2422  *     pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointers if
   2423  *     they are not used by intra prediction as implied in predMode.
   2424  *
   2425  */
   2426 OMXResult omxVCM4P10_PredictIntra_4x4 (
   2427     const OMX_U8 *pSrcLeft,
   2428     const OMX_U8 *pSrcAbove,
   2429     const OMX_U8 *pSrcAboveLeft,
   2430     OMX_U8 *pDst,
   2431     OMX_INT leftStep,
   2432     OMX_INT dstStep,
   2433     OMXVCM4P10Intra4x4PredMode predMode,
   2434     OMX_S32 availability
   2435 );
   2436 
   2437 
   2438 
   2439 /**
   2440  * Function:  omxVCM4P10_PredictIntra_16x16   (6.3.3.1.2)
   2441  *
   2442  * Description:
   2443  * Perform Intra_16x16 prediction for luma samples. If the upper-right block
   2444  * is not available, then duplication work should be handled inside the
   2445  * function. Users need not define them outside.
   2446  *
   2447  * Input Arguments:
   2448  *
   2449  *   pSrcLeft - Pointer to the buffer of 16 left pixels: p[x, y] (x = -1, y =
   2450  *            0..15)
   2451  *   pSrcAbove - Pointer to the buffer of 16 above pixels: p[x,y] (x = 0..15,
   2452  *            y= -1); must be aligned on a 16-byte boundary.
   2453  *   pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
   2454  *   leftStep - Step of left pixel buffer; must be a multiple of 16.
   2455  *   dstStep - Step of the destination buffer; must be a multiple of 16.
   2456  *   predMode - Intra_16x16 prediction mode, please refer to section 3.4.1.
   2457  *   availability - Neighboring 16x16 MB availability flag. Refer to
   2458  *                  section 3.4.4.
   2459  *
   2460  * Output Arguments:
   2461  *
   2462  *   pDst -Pointer to the destination buffer; must be aligned on a 16-byte
   2463  *            boundary.
   2464  *
   2465  * Return Value:
   2466  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2467  *    If one of the following cases occurs, the function returns
   2468  *              OMX_Sts_BadArgErr:
   2469  *    pDst is NULL.
   2470  *    dstStep < 16. or dstStep is not a multiple of 16.
   2471  *    leftStep is not a multiple of 16.
   2472  *    predMode is not in the valid range of enumeration
   2473  *              OMXVCM4P10Intra16x16PredMode
   2474  *    predMode is OMX_VC_16X16_VERT, but availability doesn't set
   2475  *              OMX_VC_UPPER indicating p[x,-1] (x = 0..15) is not available.
   2476  *    predMode is OMX_VC_16X16_HOR, but availability doesn't set OMX_VC_LEFT
   2477  *              indicating p[-1,y] (y = 0..15) is not available.
   2478  *    predMode is OMX_VC_16X16_PLANE, but availability doesn't set
   2479  *              OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
   2480  *              p[x,-1](x = 0..15), or p[-1,y] (y = 0..15), or p[-1,-1] is not
   2481  *              available.
   2482  *    availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
   2483  *    availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
   2484  *    availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
   2485  *    either pSrcAbove or pDst is not aligned on a 16-byte boundary.
   2486  *
   2487  * Note:
   2488  *     pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointers if
   2489  *     they are not used by intra prediction implied in predMode.
   2490  * Note:
   2491  *     OMX_VC_UPPER_RIGHT is not used in intra_16x16 luma prediction.
   2492  *
   2493  */
   2494 OMXResult omxVCM4P10_PredictIntra_16x16 (
   2495     const OMX_U8 *pSrcLeft,
   2496     const OMX_U8 *pSrcAbove,
   2497     const OMX_U8 *pSrcAboveLeft,
   2498     OMX_U8 *pDst,
   2499     OMX_INT leftStep,
   2500     OMX_INT dstStep,
   2501     OMXVCM4P10Intra16x16PredMode predMode,
   2502     OMX_S32 availability
   2503 );
   2504 
   2505 
   2506 
   2507 /**
   2508  * Function:  omxVCM4P10_PredictIntraChroma_8x8   (6.3.3.1.3)
   2509  *
   2510  * Description:
   2511  * Performs intra prediction for chroma samples.
   2512  *
   2513  * Input Arguments:
   2514  *
   2515  *   pSrcLeft - Pointer to the buffer of 8 left pixels: p[x, y] (x = -1, y=
   2516  *            0..7).
   2517  *   pSrcAbove - Pointer to the buffer of 8 above pixels: p[x,y] (x = 0..7, y
   2518  *            = -1); must be aligned on an 8-byte boundary.
   2519  *   pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
   2520  *   leftStep - Step of left pixel buffer; must be a multiple of 8.
   2521  *   dstStep - Step of the destination buffer; must be a multiple of 8.
   2522  *   predMode - Intra chroma prediction mode, please refer to section 3.4.3.
   2523  *   availability - Neighboring chroma block availability flag, please refer
   2524  *            to  "Neighboring Macroblock Availability".
   2525  *
   2526  * Output Arguments:
   2527  *
   2528  *   pDst - Pointer to the destination buffer; must be aligned on an 8-byte
   2529  *            boundary.
   2530  *
   2531  * Return Value:
   2532  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2533  *    If any of the following cases occurs, the function returns
   2534  *              OMX_Sts_BadArgErr:
   2535  *    pDst is NULL.
   2536  *    dstStep < 8 or dstStep is not a multiple of 8.
   2537  *    leftStep is not a multiple of 8.
   2538  *    predMode is not in the valid range of enumeration
   2539  *              OMXVCM4P10IntraChromaPredMode.
   2540  *    predMode is OMX_VC_CHROMA_VERT, but availability doesn't set
   2541  *              OMX_VC_UPPER indicating p[x,-1] (x = 0..7) is not available.
   2542  *    predMode is OMX_VC_CHROMA_HOR, but availability doesn't set OMX_VC_LEFT
   2543  *              indicating p[-1,y] (y = 0..7) is not available.
   2544  *    predMode is OMX_VC_CHROMA_PLANE, but availability doesn't set
   2545  *              OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
   2546  *              p[x,-1](x = 0..7), or p[-1,y] (y = 0..7), or p[-1,-1] is not
   2547  *              available.
   2548  *    availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
   2549  *    availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
   2550  *    availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
   2551  *    either pSrcAbove or pDst is not aligned on a 8-byte boundary.
   2552  *
   2553  *  Note: pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointer if
   2554  *  they are not used by intra prediction implied in predMode.
   2555  *
   2556  *  Note: OMX_VC_UPPER_RIGHT is not used in intra chroma prediction.
   2557  *
   2558  */
   2559 OMXResult omxVCM4P10_PredictIntraChroma_8x8 (
   2560     const OMX_U8 *pSrcLeft,
   2561     const OMX_U8 *pSrcAbove,
   2562     const OMX_U8 *pSrcAboveLeft,
   2563     OMX_U8 *pDst,
   2564     OMX_INT leftStep,
   2565     OMX_INT dstStep,
   2566     OMXVCM4P10IntraChromaPredMode predMode,
   2567     OMX_S32 availability
   2568 );
   2569 
   2570 
   2571 
   2572 /**
   2573  * Function:  omxVCM4P10_InterpolateLuma   (6.3.3.2.1)
   2574  *
   2575  * Description:
   2576  * Performs quarter-pixel interpolation for inter luma MB. It is assumed that
   2577  * the frame is already padded when calling this function.
   2578  *
   2579  * Input Arguments:
   2580  *
   2581  *   pSrc - Pointer to the source reference frame buffer
   2582  *   srcStep - reference frame step, in bytes; must be a multiple of roi.width
   2583  *   dstStep - destination frame step, in bytes; must be a multiple of
   2584  *            roi.width
   2585  *   dx - Fractional part of horizontal motion vector component in 1/4 pixel
   2586  *            unit; valid in the range [0,3]
   2587  *   dy - Fractional part of vertical motion vector y component in 1/4 pixel
   2588  *            unit; valid in the range [0,3]
   2589  *   roi - Dimension of the interpolation region; the parameters roi.width and
   2590  *            roi.height must be equal to either 4, 8, or 16.
   2591  *
   2592  * Output Arguments:
   2593  *
   2594  *   pDst - Pointer to the destination frame buffer:
   2595  *          if roi.width==4,  4-byte alignment required
   2596  *          if roi.width==8,  8-byte alignment required
   2597  *          if roi.width==16, 16-byte alignment required
   2598  *
   2599  * Return Value:
   2600  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2601  *    If one of the following cases occurs, the function returns
   2602  *              OMX_Sts_BadArgErr:
   2603  *    pSrc or pDst is NULL.
   2604  *    srcStep or dstStep < roi.width.
   2605  *    dx or dy is out of range [0,3].
   2606  *    roi.width or roi.height is out of range {4, 8, 16}.
   2607  *    roi.width is equal to 4, but pDst is not 4 byte aligned.
   2608  *    roi.width is equal to 8 or 16, but pDst is not 8 byte aligned.
   2609  *    srcStep or dstStep is not a multiple of 8.
   2610  *
   2611  */
   2612 OMXResult omxVCM4P10_InterpolateLuma (
   2613     const OMX_U8 *pSrc,
   2614     OMX_S32 srcStep,
   2615     OMX_U8 *pDst,
   2616     OMX_S32 dstStep,
   2617     OMX_S32 dx,
   2618     OMX_S32 dy,
   2619     OMXSize roi
   2620 );
   2621 
   2622 
   2623 
   2624 /**
   2625  * Function:  omxVCM4P10_InterpolateChroma   (6.3.3.2.2)
   2626  *
   2627  * Description:
   2628  * Performs 1/8-pixel interpolation for inter chroma MB.
   2629  *
   2630  * Input Arguments:
   2631  *
   2632  *   pSrc -Pointer to the source reference frame buffer
   2633  *   srcStep -Reference frame step in bytes
   2634  *   dstStep -Destination frame step in bytes; must be a multiple of
   2635  *            roi.width.
   2636  *   dx -Fractional part of horizontal motion vector component in 1/8 pixel
   2637  *            unit; valid in the range [0,7]
   2638  *   dy -Fractional part of vertical motion vector component in 1/8 pixel
   2639  *            unit; valid in the range [0,7]
   2640  *   roi -Dimension of the interpolation region; the parameters roi.width and
   2641  *            roi.height must be equal to either 2, 4, or 8.
   2642  *
   2643  * Output Arguments:
   2644  *
   2645  *   pDst -Pointer to the destination frame buffer:
   2646  *         if roi.width==2,  2-byte alignment required
   2647  *         if roi.width==4,  4-byte alignment required
   2648  *         if roi.width==8, 8-byte alignment required
   2649  *
   2650  * Return Value:
   2651  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2652  *    If one of the following cases occurs, the function returns
   2653  *              OMX_Sts_BadArgErr:
   2654  *    pSrc or pDst is NULL.
   2655  *    srcStep or dstStep < 8.
   2656  *    dx or dy is out of range [0-7].
   2657  *    roi.width or roi.height is out of range {2,4,8}.
   2658  *    roi.width is equal to 2, but pDst is not 2-byte aligned.
   2659  *    roi.width is equal to 4, but pDst is not 4-byte aligned.
   2660  *    roi.width is equal to 8, but pDst is not 8 byte aligned.
   2661  *    srcStep or dstStep is not a multiple of 8.
   2662  *
   2663  */
   2664 OMXResult omxVCM4P10_InterpolateChroma (
   2665     const OMX_U8 *pSrc,
   2666     OMX_S32 srcStep,
   2667     OMX_U8 *pDst,
   2668     OMX_S32 dstStep,
   2669     OMX_S32 dx,
   2670     OMX_S32 dy,
   2671     OMXSize roi
   2672 );
   2673 
   2674 
   2675 
   2676 /**
   2677  * Function:  omxVCM4P10_FilterDeblockingLuma_VerEdge_I   (6.3.3.3.1)
   2678  *
   2679  * Description:
   2680  * Performs in-place deblock filtering on four vertical edges of the luma
   2681  * macroblock (16x16).
   2682  *
   2683  * Input Arguments:
   2684  *
   2685  *   pSrcDst - Pointer to the input macroblock; must be 16-byte aligned.
   2686  *   srcdstStep -Step of the arrays; must be a multiple of 16.
   2687  *   pAlpha -Array of size 2 of alpha thresholds (the first item is the alpha
   2688  *            threshold for the external vertical edge, and the second item is
   2689  *            for the internal vertical edge); per [ISO14496-10] alpha values
   2690  *            must be in the range [0,255].
   2691  *   pBeta -Array of size 2 of beta thresholds (the first item is the beta
   2692  *            threshold for the external vertical edge, and the second item is
   2693  *            for the internal vertical edge); per [ISO14496-10] beta values
   2694  *            must be in the range [0,18].
   2695  *   pThresholds -Array of size 16 of Thresholds (TC0) (values for the left
   2696  *            edge of each 4x4 block, arranged in vertical block order); must
   2697  *            be aligned on a 4-byte boundary..  Per [ISO14496-10] values must
   2698  *            be in the range [0,25].
   2699  *   pBS -Array of size 16 of BS parameters (arranged in vertical block
   2700  *            order); valid in the range [0,4] with the following
   2701  *            restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii)
   2702  *            pBS[i]== 4 if and only if pBS[i^3]== 4.  Must be 4-byte aligned.
   2703  *
   2704  * Output Arguments:
   2705  *
   2706  *   pSrcDst -Pointer to filtered output macroblock.
   2707  *
   2708  * Return Value:
   2709  *    If the function runs without error, it returns OMX_Sts_NoErr.
   2710  *    If one of the following cases occurs, the function returns
   2711  *              OMX_Sts_BadArgErr:
   2712  *    Either of the pointers in pSrcDst, pAlpha, pBeta, pThresholds, or pBS
   2713  *              is NULL.
   2714  *    Either pThresholds or pBS is not aligned on a 4-byte boundary.
   2715  *    pSrcDst is not 16-byte aligned.
   2716  *    srcdstStep is not a multiple of 16.
   2717  *    pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
   2718  *    pBeta[0] and/or pBeta[1] is outside the range [0,18].
   2719  *    One or more entries in the table pThresholds[0..15]is outside of the
   2720  *              range [0,25].
   2721  *    pBS is out of range, i.e., one of the following conditions is true:
   2722  *              pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or (pBS[i]==4 &&
   2723  *              pBS[i^3]!=4) for 0<=i<=3.
   2724  *
   2725  */
   2726 OMXResult omxVCM4P10_FilterDeblockingLuma_VerEdge_I (
   2727     OMX_U8 *pSrcDst,
   2728     OMX_S32 srcdstStep,
   2729     const OMX_U8 *pAlpha,
   2730     const OMX_U8 *pBeta,
   2731     const OMX_U8 *pThresholds,
   2732     const OMX_U8 *pBS
   2733 );
   2734 
   2735 
   2736 
   2737 /**
   2738  * Function:  omxVCM4P10_FilterDeblockingLuma_HorEdge_I   (6.3.3.3.2)
   2739  *
   2740  * Description:
   2741  * Performs in-place deblock filtering on four horizontal edges of the luma
   2742  * macroblock (16x16).
   2743  *
   2744  * Input Arguments:
   2745  *
   2746  *   pSrcDst - pointer to the input macroblock; must be 16-byte aligned.
   2747  *   srcdstStep - step of the arrays; must be a multiple of 16.
   2748  *   pAlpha - array of size 2 of alpha thresholds (the first item is the alpha
   2749  *            threshold for the external vertical edge, and the second item is
   2750  *            for the internal horizontal edge); per [ISO14496-10] alpha
   2751  *            values must be in the range [0,255].
   2752  *   pBeta - array of size 2 of beta thresholds (the first item is the beta
   2753  *            threshold for the external horizontal edge, and the second item
   2754  *            is for the internal horizontal edge). Per [ISO14496-10] beta
   2755  *            values must be in the range [0,18].
   2756  *   pThresholds - array of size 16 containing thresholds, TC0, for the top
   2757  *            horizontal edge of each 4x4 block, arranged in horizontal block
   2758  *            order; must be aligned on a 4-byte boundary.  Per [ISO14496 10]
   2759  *            values must be in the range [0,25].
   2760  *   pBS - array of size 16 of BS parameters (arranged in horizontal block
   2761  *            order); valid in the range [0,4] with the following
   2762  *            restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii)
   2763  *            pBS[i]== 4 if and only if pBS[i^3]== 4.  Must be 4-byte aligned.
   2764  *
   2765  * Output Arguments:
   2766  *
   2767  *   pSrcDst -Pointer to filtered output macroblock.
   2768  *
   2769  * Return Value:
   2770  *
   2771  *    OMX_Sts_NoErr, if the function runs without error.
   2772  *
   2773  *    OMX_Sts_BadArgErr, if one of the following cases occurs:
   2774  *    -    one or more of the following pointers is NULL: pSrcDst, pAlpha,
   2775  *              pBeta, pThresholds, or pBS.
   2776  *    -    either pThresholds or pBS is not aligned on a 4-byte boundary.
   2777  *    -    pSrcDst is not 16-byte aligned.
   2778  *    -    srcdstStep is not a multiple of 16.
   2779  *    -    pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
   2780  *    -    pBeta[0] and/or pBeta[1] is outside the range [0,18].
   2781  *    -    One or more entries in the table pThresholds[0..15] is
   2782  *         outside of the range [0,25].
   2783  *    -    pBS is out of range, i.e., one of the following conditions is true:
   2784  *              pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
   2785  *              (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
   2786  *
   2787  */
   2788 OMXResult omxVCM4P10_FilterDeblockingLuma_HorEdge_I (
   2789     OMX_U8 *pSrcDst,
   2790     OMX_S32 srcdstStep,
   2791     const OMX_U8 *pAlpha,
   2792     const OMX_U8 *pBeta,
   2793     const OMX_U8 *pThresholds,
   2794     const OMX_U8 *pBS
   2795 );
   2796 
   2797 
   2798 
   2799 /**
   2800  * Function:  omxVCM4P10_FilterDeblockingChroma_VerEdge_I   (6.3.3.3.3)
   2801  *
   2802  * Description:
   2803  * Performs in-place deblock filtering on four vertical edges of the chroma
   2804  * macroblock (8x8).
   2805  *
   2806  * Input Arguments:
   2807  *
   2808  *   pSrcDst - Pointer to the input macroblock; must be 8-byte aligned.
   2809  *   srcdstStep - Step of the arrays; must be a multiple of 8.
   2810  *   pAlpha - Array of size 2 of alpha thresholds (the first item is alpha
   2811  *            threshold for external vertical edge, and the second item is for
   2812  *            internal vertical edge); per [ISO14496-10] alpha values must be
   2813  *            in the range [0,255].
   2814  *   pBeta - Array of size 2 of beta thresholds (the first item is the beta
   2815  *            threshold for the external vertical edge, and the second item is
   2816  *            for the internal vertical edge); per [ISO14496-10] beta values
   2817  *            must be in the range [0,18].
   2818  *   pThresholds - Array of size 8 containing thresholds, TC0, for the left
   2819  *            vertical edge of each 4x2 chroma block, arranged in vertical
   2820  *            block order; must be aligned on a 4-byte boundary.  Per
   2821  *            [ISO14496-10] values must be in the range [0,25].
   2822  *   pBS - Array of size 16 of BS parameters (values for each 2x2 chroma
   2823  *            block, arranged in vertical block order). This parameter is the
   2824  *            same as the pBS parameter passed into FilterDeblockLuma_VerEdge;
   2825  *            valid in the range [0,4] with the following restrictions: i)
   2826  *            pBS[i]== 4 may occur only for 0<=i<=3, ii) pBS[i]== 4 if and
   2827  *            only if pBS[i^3]== 4.  Must be 4 byte aligned.
   2828  *
   2829  * Output Arguments:
   2830  *
   2831  *   pSrcDst -Pointer to filtered output macroblock.
   2832  *
   2833  * Return Value:
   2834  *
   2835  *    OMX_Sts_NoErr, if the function runs without error.
   2836  *
   2837  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   2838  *    -    one or more of the following pointers is NULL: pSrcDst, pAlpha,
   2839  *              pBeta, pThresholds, or pBS.
   2840  *    -    pSrcDst is not 8-byte aligned.
   2841  *    -    srcdstStep is not a multiple of 8.
   2842  *    -    pThresholds is not 4-byte aligned.
   2843  *    -    pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
   2844  *    -    pBeta[0] and/or pBeta[1] is outside the range [0,18].
   2845  *    -    One or more entries in the table pThresholds[0..7] is outside
   2846  *         of the range [0,25].
   2847  *    -    pBS is out of range, i.e., one of the following conditions is true:
   2848  *         pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
   2849  *         (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
   2850  *    -    pBS is not 4-byte aligned.
   2851  *
   2852  */
   2853 OMXResult omxVCM4P10_FilterDeblockingChroma_VerEdge_I (
   2854     OMX_U8 *pSrcDst,
   2855     OMX_S32 srcdstStep,
   2856     const OMX_U8 *pAlpha,
   2857     const OMX_U8 *pBeta,
   2858     const OMX_U8 *pThresholds,
   2859     const OMX_U8 *pBS
   2860 );
   2861 
   2862 
   2863 
   2864 /**
   2865  * Function:  omxVCM4P10_FilterDeblockingChroma_HorEdge_I   (6.3.3.3.4)
   2866  *
   2867  * Description:
   2868  * Performs in-place deblock filtering on the horizontal edges of the chroma
   2869  * macroblock (8x8).
   2870  *
   2871  * Input Arguments:
   2872  *
   2873  *   pSrcDst - pointer to the input macroblock; must be 8-byte aligned.
   2874  *   srcdstStep - array step; must be a multiple of 8.
   2875  *   pAlpha - array of size 2 containing alpha thresholds; the first element
   2876  *            contains the threshold for the external horizontal edge, and the
   2877  *            second element contains the threshold for internal horizontal
   2878  *            edge.  Per [ISO14496-10] alpha values must be in the range
   2879  *            [0,255].
   2880  *   pBeta - array of size 2 containing beta thresholds; the first element
   2881  *            contains the threshold for the external horizontal edge, and the
   2882  *            second element contains the threshold for the internal
   2883  *            horizontal edge.  Per [ISO14496-10] beta values must be in the
   2884  *            range [0,18].
   2885  *   pThresholds - array of size 8 containing thresholds, TC0, for the top
   2886  *            horizontal edge of each 2x4 chroma block, arranged in horizontal
   2887  *            block order; must be aligned on a 4-byte boundary.  Per
   2888  *            [ISO14496-10] values must be in the range [0,25].
   2889  *   pBS - array of size 16 containing BS parameters for each 2x2 chroma
   2890  *            block, arranged in horizontal block order; valid in the range
   2891  *            [0,4] with the following restrictions: i) pBS[i]== 4 may occur
   2892  *            only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]== 4.
   2893  *            Must be 4-byte aligned.
   2894  *
   2895  * Output Arguments:
   2896  *
   2897  *   pSrcDst -Pointer to filtered output macroblock.
   2898  *
   2899  * Return Value:
   2900  *
   2901  *    OMX_Sts_NoErr, if the function runs without error.
   2902  *
   2903  *    OMX_Sts_BadArgErr, if one of the following cases occurs:
   2904  *    -    any of the following pointers is NULL:
   2905  *         pSrcDst, pAlpha, pBeta, pThresholds, or pBS.
   2906  *    -    pSrcDst is not 8-byte aligned.
   2907  *    -    srcdstStep is not a multiple of 8.
   2908  *    -    pThresholds is not 4-byte aligned.
   2909  *    -    pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
   2910  *    -    pBeta[0] and/or pBeta[1] is outside the range [0,18].
   2911  *    -    One or more entries in the table pThresholds[0..7] is outside
   2912  *         of the range [0,25].
   2913  *    -    pBS is out of range, i.e., one of the following conditions is true:
   2914  *              pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
   2915  *              (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
   2916  *    -    pBS is not 4-byte aligned.
   2917  *
   2918  */
   2919 OMXResult omxVCM4P10_FilterDeblockingChroma_HorEdge_I (
   2920     OMX_U8 *pSrcDst,
   2921     OMX_S32 srcdstStep,
   2922     const OMX_U8 *pAlpha,
   2923     const OMX_U8 *pBeta,
   2924     const OMX_U8 *pThresholds,
   2925     const OMX_U8 *pBS
   2926 );
   2927 
   2928 
   2929 
   2930 /**
   2931  * Function:  omxVCM4P10_DeblockLuma_I   (6.3.3.3.5)
   2932  *
   2933  * Description:
   2934  * This function performs in-place deblock filtering the horizontal and
   2935  * vertical edges of a luma macroblock (16x16).
   2936  *
   2937  * Input Arguments:
   2938  *
   2939  *   pSrcDst - pointer to the input macroblock; must be 16-byte aligned.
   2940  *   srcdstStep - image width; must be a multiple of 16.
   2941  *   pAlpha - pointer to a 2x2 table of alpha thresholds, organized as
   2942  *            follows: {external vertical edge, internal vertical edge,
   2943  *            external horizontal edge, internal horizontal edge }.  Per
   2944  *            [ISO14496-10] alpha values must be in the range [0,255].
   2945  *   pBeta - pointer to a 2x2 table of beta thresholds, organized as follows:
   2946  *            {external vertical edge, internal vertical edge, external
   2947  *            horizontal edge, internal horizontal edge }.  Per [ISO14496-10]
   2948  *            beta values must be in the range [0,18].
   2949  *   pThresholds - pointer to a 16x2 table of threshold (TC0), organized as
   2950  *            follows: {values for the left or above edge of each 4x4 block,
   2951  *            arranged in vertical block order and then in horizontal block
   2952  *            order}; must be aligned on a 4-byte boundary.  Per [ISO14496-10]
   2953  *            values must be in the range [0,25].
   2954  *   pBS - pointer to a 16x2 table of BS parameters arranged in scan block
   2955  *            order for vertical edges and then horizontal edges; valid in the
   2956  *            range [0,4] with the following restrictions: i) pBS[i]== 4 may
   2957  *            occur only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]==
   2958  *            4. Must be 4-byte aligned.
   2959  *
   2960  * Output Arguments:
   2961  *
   2962  *   pSrcDst - pointer to filtered output macroblock.
   2963  *
   2964  * Return Value:
   2965  *
   2966  *    OMX_Sts_NoErr - no error
   2967  *    OMX_Sts_BadArgErr - bad arguments
   2968  *    -     one or more of the following pointers is NULL: pSrcDst, pAlpha,
   2969  *              pBeta, pThresholds or pBS.
   2970  *    -    pSrcDst is not 16-byte aligned.
   2971  *    -    either pThresholds or pBS is not aligned on a 4-byte boundary.
   2972  *    -    one or more entries in the table pAlpha[0..3] is outside the range
   2973  *              [0,255].
   2974  *    -    one or more entries in the table pBeta[0..3] is outside the range
   2975  *              [0,18].
   2976  *    -    one or more entries in the table pThresholds[0..31]is outside of
   2977  *              the range [0,25].
   2978  *    -    pBS is out of range, i.e., one of the following conditions is true:
   2979  *              pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
   2980  *             (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
   2981  *    -    srcdstStep is not a multiple of 16.
   2982  *
   2983  */
   2984 OMXResult omxVCM4P10_DeblockLuma_I (
   2985     OMX_U8 *pSrcDst,
   2986     OMX_S32 srcdstStep,
   2987     const OMX_U8 *pAlpha,
   2988     const OMX_U8 *pBeta,
   2989     const OMX_U8 *pThresholds,
   2990     const OMX_U8 *pBS
   2991 );
   2992 
   2993 
   2994 
   2995 /**
   2996  * Function:  omxVCM4P10_DeblockChroma_I   (6.3.3.3.6)
   2997  *
   2998  * Description:
   2999  * Performs in-place deblocking filtering on all edges of the chroma
   3000  * macroblock (16x16).
   3001  *
   3002  * Input Arguments:
   3003  *
   3004  *   pSrcDst - pointer to the input macroblock; must be 8-byte aligned.
   3005  *   srcdstStep - step of the arrays; must be a multiple of 8.
   3006  *   pAlpha - pointer to a 2x2 array of alpha thresholds, organized as
   3007  *            follows: {external vertical edge, internal vertical edge,
   3008  *            external horizontal edge, internal horizontal edge }.  Per
   3009  *            [ISO14496-10] alpha values must be in the range [0,255].
   3010  *   pBeta - pointer to a 2x2 array of Beta Thresholds, organized as follows:
   3011  *            { external vertical edge, internal vertical edge, external
   3012  *            horizontal edge, internal horizontal edge }.  Per [ISO14496-10]
   3013  *            beta values must be in the range [0,18].
   3014  *   pThresholds - array of size 8x2 of Thresholds (TC0) (values for the left
   3015  *            or above edge of each 4x2 or 2x4 block, arranged in vertical
   3016  *            block order and then in horizontal block order); must be aligned
   3017  *            on a 4-byte boundary. Per [ISO14496-10] values must be in the
   3018  *            range [0,25].
   3019  *   pBS - array of size 16x2 of BS parameters (arranged in scan block order
   3020  *            for vertical edges and then horizontal edges); valid in the
   3021  *            range [0,4] with the following restrictions: i) pBS[i]== 4 may
   3022  *            occur only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]==
   3023  *            4.  Must be 4-byte aligned.
   3024  *
   3025  * Output Arguments:
   3026  *
   3027  *   pSrcDst - pointer to filtered output macroblock.
   3028  *
   3029  * Return Value:
   3030  *
   3031  *    OMX_Sts_NoErr - no error
   3032  *    OMX_Sts_BadArgErr - bad arguments
   3033  *    -   one or more of the following pointers is NULL: pSrcDst, pAlpha,
   3034  *              pBeta, pThresholds, or pBS.
   3035  *    -   pSrcDst is not 8-byte aligned.
   3036  *    -   either pThresholds or pBS is not 4-byte aligned.
   3037  *    -   one or more entries in the table pAlpha[0..3] is outside the range
   3038  *              [0,255].
   3039  *    -   one or more entries in the table pBeta[0..3] is outside the range
   3040  *              [0,18].
   3041  *    -   one or more entries in the table pThresholds[0..15]is outside of
   3042  *              the range [0,25].
   3043  *    -   pBS is out of range, i.e., one of the following conditions is true:
   3044  *            pBS[i]<0, pBS[i]>4, pBS[i]==4  for i>=4, or
   3045  *            (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
   3046  *    -   srcdstStep is not a multiple of 8.
   3047  *
   3048  */
   3049 OMXResult omxVCM4P10_DeblockChroma_I (
   3050     OMX_U8 *pSrcDst,
   3051     OMX_S32 srcdstStep,
   3052     const OMX_U8 *pAlpha,
   3053     const OMX_U8 *pBeta,
   3054     const OMX_U8 *pThresholds,
   3055     const OMX_U8 *pBS
   3056 );
   3057 
   3058 
   3059 
   3060 /**
   3061  * Function:  omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC   (6.3.4.1.1)
   3062  *
   3063  * Description:
   3064  * Performs CAVLC decoding and inverse raster scan for a 2x2 block of
   3065  * ChromaDCLevel.  The decoded coefficients in the packed position-coefficient
   3066  * buffer are stored in reverse zig-zag order, i.e., the first buffer element
   3067  * contains the last non-zero postion-coefficient pair of the block. Within
   3068  * each position-coefficient pair, the position entry indicates the
   3069  * raster-scan position of the coefficient, while the coefficient entry
   3070  * contains the coefficient value.
   3071  *
   3072  * Input Arguments:
   3073  *
   3074  *   ppBitStream - Double pointer to current byte in bit stream buffer
   3075  *   pOffset - Pointer to current bit position in the byte pointed to by
   3076  *            *ppBitStream; valid in the range [0,7].
   3077  *
   3078  * Output Arguments:
   3079  *
   3080  *   ppBitStream - *ppBitStream is updated after each block is decoded
   3081  *   pOffset - *pOffset is updated after each block is decoded
   3082  *   pNumCoeff - Pointer to the number of nonzero coefficients in this block
   3083  *   ppPosCoefBuf - Double pointer to destination residual
   3084  *            coefficient-position pair buffer.  Buffer position
   3085  *            (*ppPosCoefBuf) is updated upon return, unless there are only
   3086  *            zero coefficients in the currently decoded block.  In this case
   3087  *            the caller is expected to bypass the transform/dequantization of
   3088  *            the empty blocks.
   3089  *
   3090  * Return Value:
   3091  *
   3092  *    OMX_Sts_NoErr, if the function runs without error.
   3093  *
   3094  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3095  *    -    ppBitStream or pOffset is NULL.
   3096  *    -    ppPosCoefBuf or pNumCoeff is NULL.
   3097  *    OMX_Sts_Err - if one of the following is true:
   3098  *    -    an illegal code is encountered in the bitstream
   3099  *
   3100  */
   3101 OMXResult omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC (
   3102     const OMX_U8 **ppBitStream,
   3103     OMX_S32*pOffset,
   3104     OMX_U8 *pNumCoeff,
   3105     OMX_U8 **ppPosCoefbuf
   3106 );
   3107 
   3108 
   3109 
   3110 /**
   3111  * Function:  omxVCM4P10_DecodeCoeffsToPairCAVLC   (6.3.4.1.2)
   3112  *
   3113  * Description:
   3114  * Performs CAVLC decoding and inverse zigzag scan for 4x4 block of
   3115  * Intra16x16DCLevel, Intra16x16ACLevel, LumaLevel, and ChromaACLevel. Inverse
   3116  * field scan is not supported. The decoded coefficients in the packed
   3117  * position-coefficient buffer are stored in reverse zig-zag order, i.e., the
   3118  * first buffer element contains the last non-zero postion-coefficient pair of
   3119  * the block. Within each position-coefficient pair, the position entry
   3120  * indicates the raster-scan position of the coefficient, while the
   3121  * coefficient entry contains the coefficient value.
   3122  *
   3123  * Input Arguments:
   3124  *
   3125  *   ppBitStream -Double pointer to current byte in bit stream buffer
   3126  *   pOffset - Pointer to current bit position in the byte pointed to by
   3127  *            *ppBitStream; valid in the range [0,7].
   3128  *   sMaxNumCoeff - Maximum the number of non-zero coefficients in current
   3129  *            block
   3130  *   sVLCSelect - VLC table selector, obtained from the number of non-zero
   3131  *            coefficients contained in the above and left 4x4 blocks.  It is
   3132  *            equivalent to the variable nC described in H.264 standard table
   3133  *            9 5, except its value can t be less than zero.
   3134  *
   3135  * Output Arguments:
   3136  *
   3137  *   ppBitStream - *ppBitStream is updated after each block is decoded.
   3138  *            Buffer position (*ppPosCoefBuf) is updated upon return, unless
   3139  *            there are only zero coefficients in the currently decoded block.
   3140  *             In this case the caller is expected to bypass the
   3141  *            transform/dequantization of the empty blocks.
   3142  *   pOffset - *pOffset is updated after each block is decoded
   3143  *   pNumCoeff - Pointer to the number of nonzero coefficients in this block
   3144  *   ppPosCoefBuf - Double pointer to destination residual
   3145  *            coefficient-position pair buffer
   3146  *
   3147  * Return Value:
   3148  *    OMX_Sts_NoErr, if the function runs without error.
   3149  *
   3150  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3151  *    -    ppBitStream or pOffset is NULL.
   3152  *    -    ppPosCoefBuf or pNumCoeff is NULL.
   3153  *    -    sMaxNumCoeff is not equal to either 15 or 16.
   3154  *    -    sVLCSelect is less than 0.
   3155  *
   3156  *    OMX_Sts_Err - if one of the following is true:
   3157  *    -    an illegal code is encountered in the bitstream
   3158  *
   3159  */
   3160 OMXResult omxVCM4P10_DecodeCoeffsToPairCAVLC (
   3161     const OMX_U8 **ppBitStream,
   3162     OMX_S32 *pOffset,
   3163     OMX_U8 *pNumCoeff,
   3164     OMX_U8 **ppPosCoefbuf,
   3165     OMX_INT sVLCSelect,
   3166     OMX_INT sMaxNumCoeff
   3167 );
   3168 
   3169 
   3170 
   3171 /**
   3172  * Function:  omxVCM4P10_TransformDequantLumaDCFromPair   (6.3.4.2.1)
   3173  *
   3174  * Description:
   3175  * Reconstructs the 4x4 LumaDC block from the coefficient-position pair
   3176  * buffer, performs integer inverse, and dequantization for 4x4 LumaDC
   3177  * coefficients, and updates the pair buffer pointer to the next non-empty
   3178  * block.
   3179  *
   3180  * Input Arguments:
   3181  *
   3182  *   ppSrc - Double pointer to residual coefficient-position pair buffer
   3183  *            output by CALVC decoding
   3184  *   QP - Quantization parameter QpY
   3185  *
   3186  * Output Arguments:
   3187  *
   3188  *   ppSrc - *ppSrc is updated to the start of next non empty block
   3189  *   pDst - Pointer to the reconstructed 4x4 LumaDC coefficients buffer; must
   3190  *            be aligned on a 8-byte boundary.
   3191  *
   3192  * Return Value:
   3193  *    OMX_Sts_NoErr, if the function runs without error.
   3194  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3195  *    -    ppSrc or pDst is NULL.
   3196  *    -    pDst is not 8 byte aligned.
   3197  *    -    QP is not in the range of [0-51].
   3198  *
   3199  */
   3200 OMXResult omxVCM4P10_TransformDequantLumaDCFromPair (
   3201     const OMX_U8 **ppSrc,
   3202     OMX_S16 *pDst,
   3203     OMX_INT QP
   3204 );
   3205 
   3206 
   3207 
   3208 /**
   3209  * Function:  omxVCM4P10_TransformDequantChromaDCFromPair   (6.3.4.2.2)
   3210  *
   3211  * Description:
   3212  * Reconstruct the 2x2 ChromaDC block from coefficient-position pair buffer,
   3213  * perform integer inverse transformation, and dequantization for 2x2 chroma
   3214  * DC coefficients, and update the pair buffer pointer to next non-empty
   3215  * block.
   3216  *
   3217  * Input Arguments:
   3218  *
   3219  *   ppSrc - Double pointer to residual coefficient-position pair buffer
   3220  *            output by CALVC decoding
   3221  *   QP - Quantization parameter QpC
   3222  *
   3223  * Output Arguments:
   3224  *
   3225  *   ppSrc - *ppSrc is updated to the start of next non empty block
   3226  *   pDst - Pointer to the reconstructed 2x2 ChromaDC coefficients buffer;
   3227  *            must be aligned on a 4-byte boundary.
   3228  *
   3229  * Return Value:
   3230  *    OMX_Sts_NoErr, if the function runs without error.
   3231  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3232  *    -    ppSrc or pDst is NULL.
   3233  *    -    pDst is not 4-byte aligned.
   3234  *    -    QP is not in the range of [0-51].
   3235  *
   3236  */
   3237 OMXResult omxVCM4P10_TransformDequantChromaDCFromPair (
   3238     const OMX_U8 **ppSrc,
   3239     OMX_S16 *pDst,
   3240     OMX_INT QP
   3241 );
   3242 
   3243 
   3244 
   3245 /**
   3246  * Function:  omxVCM4P10_DequantTransformResidualFromPairAndAdd   (6.3.4.2.3)
   3247  *
   3248  * Description:
   3249  * Reconstruct the 4x4 residual block from coefficient-position pair buffer,
   3250  * perform dequantization and integer inverse transformation for 4x4 block of
   3251  * residuals with previous intra prediction or motion compensation data, and
   3252  * update the pair buffer pointer to next non-empty block. If pDC == NULL,
   3253  * there re 16 non-zero AC coefficients at most in the packed buffer starting
   3254  * from 4x4 block position 0; If pDC != NULL, there re 15 non-zero AC
   3255  * coefficients at most in the packet buffer starting from 4x4 block position
   3256  * 1.
   3257  *
   3258  * Input Arguments:
   3259  *
   3260  *   ppSrc - Double pointer to residual coefficient-position pair buffer
   3261  *            output by CALVC decoding
   3262  *   pPred - Pointer to the predicted 4x4 block; must be aligned on a 4-byte
   3263  *            boundary
   3264  *   predStep - Predicted frame step size in bytes; must be a multiple of 4
   3265  *   dstStep - Destination frame step in bytes; must be a multiple of 4
   3266  *   pDC - Pointer to the DC coefficient of this block, NULL if it doesn't
   3267  *            exist
   3268  *   QP - QP Quantization parameter.  It should be QpC in chroma 4x4 block
   3269  *            decoding, otherwise it should be QpY.
   3270  *   AC - Flag indicating if at least one non-zero AC coefficient exists
   3271  *
   3272  * Output Arguments:
   3273  *
   3274  *   pDst - pointer to the reconstructed 4x4 block data; must be aligned on a
   3275  *            4-byte boundary
   3276  *
   3277  * Return Value:
   3278  *    OMX_Sts_NoErr, if the function runs without error.
   3279  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3280  *    -    pPred or pDst is NULL.
   3281  *    -    pPred or pDst is not 4-byte aligned.
   3282  *    -    predStep or dstStep is not a multiple of 4.
   3283  *    -    AC !=0 and Qp is not in the range of [0-51] or ppSrc == NULL.
   3284  *    -    AC ==0 && pDC ==NULL.
   3285  *
   3286  */
   3287 OMXResult omxVCM4P10_DequantTransformResidualFromPairAndAdd (
   3288     const OMX_U8 **ppSrc,
   3289     const OMX_U8 *pPred,
   3290     const OMX_S16 *pDC,
   3291     OMX_U8 *pDst,
   3292     OMX_INT predStep,
   3293     OMX_INT dstStep,
   3294     OMX_INT QP,
   3295     OMX_INT AC
   3296 );
   3297 
   3298 
   3299 
   3300 /**
   3301  * Function:  omxVCM4P10_MEGetBufSize   (6.3.5.1.1)
   3302  *
   3303  * Description:
   3304  * Computes the size, in bytes, of the vendor-specific specification
   3305  * structure for the omxVCM4P10 motion estimation functions BlockMatch_Integer
   3306  * and MotionEstimationMB.
   3307  *
   3308  * Input Arguments:
   3309  *
   3310  *   MEmode - motion estimation mode; available modes are defined by the
   3311  *            enumerated type OMXVCM4P10MEMode
   3312  *   pMEParams -motion estimation parameters
   3313  *
   3314  * Output Arguments:
   3315  *
   3316  *   pSize - pointer to the number of bytes required for the motion
   3317  *            estimation specification structure
   3318  *
   3319  * Return Value:
   3320  *    OMX_Sts_NoErr, if the function runs without error.
   3321  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3322  *    -    pMEParams or pSize is NULL.
   3323  *    -    an invalid MEMode is specified.
   3324  *
   3325  */
   3326 OMXResult omxVCM4P10_MEGetBufSize (
   3327     OMXVCM4P10MEMode MEmode,
   3328     const OMXVCM4P10MEParams *pMEParams,
   3329     OMX_U32 *pSize
   3330 );
   3331 
   3332 
   3333 
   3334 /**
   3335  * Function:  omxVCM4P10_MEInit   (6.3.5.1.2)
   3336  *
   3337  * Description:
   3338  * Initializes the vendor-specific specification structure required for the
   3339  * omxVCM4P10 motion estimation functions:  BlockMatch_Integer and
   3340  * MotionEstimationMB. Memory for the specification structure *pMESpec must be
   3341  * allocated prior to calling the function, and should be aligned on a 4-byte
   3342  * boundary.  The number of bytes required for the specification structure can
   3343  * be determined using the function omxVCM4P10_MEGetBufSize. Following
   3344  * initialization by this function, the vendor-specific structure *pMESpec
   3345  * should contain an implementation-specific representation of all motion
   3346  * estimation parameters received via the structure pMEParams, for example
   3347  * searchRange16x16, searchRange8x8, etc.
   3348  *
   3349  * Input Arguments:
   3350  *
   3351  *   MEmode - motion estimation mode; available modes are defined by the
   3352  *            enumerated type OMXVCM4P10MEMode
   3353  *   pMEParams - motion estimation parameters
   3354  *   pMESpec - pointer to the uninitialized ME specification structure
   3355  *
   3356  * Output Arguments:
   3357  *
   3358  *   pMESpec - pointer to the initialized ME specification structure
   3359  *
   3360  * Return Value:
   3361  *    OMX_Sts_NoErr, if the function runs without error.
   3362  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3363  *    -    pMEParams or pSize is NULL.
   3364  *    -    an invalid value was specified for the parameter MEmode
   3365  *    -    a negative or zero value was specified for one of the search ranges
   3366  *         (e.g.,  pMBParams >searchRange8x8, pMEParams->searchRange16x16, etc.)
   3367  *    -    either in isolation or in combination, one or more of the enables or
   3368  *         search ranges in the structure *pMEParams were configured such
   3369  *         that the requested behavior fails to comply with [ISO14496-10].
   3370  *
   3371  */
   3372 OMXResult omxVCM4P10_MEInit (
   3373     OMXVCM4P10MEMode MEmode,
   3374     const OMXVCM4P10MEParams *pMEParams,
   3375     void *pMESpec
   3376 );
   3377 
   3378 
   3379 
   3380 /**
   3381  * Function:  omxVCM4P10_BlockMatch_Integer   (6.3.5.2.1)
   3382  *
   3383  * Description:
   3384  * Performs integer block match.  Returns best MV and associated cost.
   3385  *
   3386  * Input Arguments:
   3387  *
   3388  *   pSrcOrgY - Pointer to the top-left corner of the current block:
   3389  *            If iBlockWidth==4,  4-byte alignment required.
   3390  *            If iBlockWidth==8,  8-byte alignment required.
   3391  *            If iBlockWidth==16, 16-byte alignment required.
   3392  *   pSrcRefY - Pointer to the top-left corner of the co-located block in the
   3393  *            reference picture:
   3394  *            If iBlockWidth==4,  4-byte alignment required.
   3395  *            If iBlockWidth==8,  8-byte alignment required.
   3396  *            If iBlockWidth==16, 16-byte alignment required.
   3397  *   nSrcOrgStep - Stride of the original picture plane, expressed in terms
   3398  *            of integer pixels; must be a multiple of iBlockWidth.
   3399  *   nSrcRefStep - Stride of the reference picture plane, expressed in terms
   3400  *            of integer pixels
   3401  *   pRefRect - pointer to the valid reference rectangle inside the reference
   3402  *            picture plane
   3403  *   nCurrPointPos - position of the current block in the current plane
   3404  *   iBlockWidth - Width of the current block, expressed in terms of integer
   3405  *            pixels; must be equal to either 4, 8, or 16.
   3406  *   iBlockHeight - Height of the current block, expressed in terms of
   3407  *            integer pixels; must be equal to either 4, 8, or 16.
   3408  *   nLamda - Lamda factor; used to compute motion cost
   3409  *   pMVPred - Predicted MV; used to compute motion cost, expressed in terms
   3410  *            of 1/4-pel units
   3411  *   pMVCandidate - Candidate MV; used to initialize the motion search,
   3412  *            expressed in terms of integer pixels
   3413  *   pMESpec - pointer to the ME specification structure
   3414  *
   3415  * Output Arguments:
   3416  *
   3417  *   pDstBestMV - Best MV resulting from integer search, expressed in terms
   3418  *            of 1/4-pel units
   3419  *   pBestCost - Motion cost associated with the best MV; computed as
   3420  *            SAD+Lamda*BitsUsedByMV
   3421  *
   3422  * Return Value:
   3423  *    OMX_Sts_NoErr, if the function runs without error.
   3424  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3425  *    -    any of the following pointers are NULL:
   3426  *         pSrcOrgY, pSrcRefY, pRefRect, pMVPred, pMVCandidate, or pMESpec.
   3427  *    -    Either iBlockWidth or iBlockHeight are values other than 4, 8, or 16.
   3428  *    -    Any alignment restrictions are violated
   3429  *
   3430  */
   3431 OMXResult omxVCM4P10_BlockMatch_Integer (
   3432     const OMX_U8 *pSrcOrgY,
   3433     OMX_S32 nSrcOrgStep,
   3434     const OMX_U8 *pSrcRefY,
   3435     OMX_S32 nSrcRefStep,
   3436     const OMXRect *pRefRect,
   3437     const OMXVCM4P2Coordinate *pCurrPointPos,
   3438     OMX_U8 iBlockWidth,
   3439     OMX_U8 iBlockHeight,
   3440     OMX_U32 nLamda,
   3441     const OMXVCMotionVector *pMVPred,
   3442     const OMXVCMotionVector *pMVCandidate,
   3443     OMXVCMotionVector *pBestMV,
   3444     OMX_S32 *pBestCost,
   3445     void *pMESpec
   3446 );
   3447 
   3448 
   3449 
   3450 /**
   3451  * Function:  omxVCM4P10_BlockMatch_Half   (6.3.5.2.2)
   3452  *
   3453  * Description:
   3454  * Performs a half-pel block match using results from a prior integer search.
   3455  *  Returns the best MV and associated cost.  This function estimates the
   3456  * half-pixel motion vector by interpolating the integer resolution motion
   3457  * vector referenced by the input parameter pSrcDstBestMV, i.e., the initial
   3458  * integer MV is generated externally.  The function
   3459  * omxVCM4P10_BlockMatch_Integer may be used for integer motion estimation.
   3460  *
   3461  * Input Arguments:
   3462  *
   3463  *   pSrcOrgY - Pointer to the current position in original picture plane:
   3464  *              If iBlockWidth==4,  4-byte alignment required.
   3465  *              If iBlockWidth==8,  8-byte alignment required.
   3466  *              If iBlockWidth==16, 16-byte alignment required.
   3467  *   pSrcRefY - Pointer to the top-left corner of the co-located block in the
   3468  *            reference picture:
   3469  *              If iBlockWidth==4,  4-byte alignment required.
   3470  *              If iBlockWidth==8,  8-byte alignment required.
   3471  *              If iBlockWidth==16, 16-byte alignment required.
   3472  *   nSrcOrgStep - Stride of the original picture plane in terms of full
   3473  *            pixels; must be a multiple of iBlockWidth.
   3474  *   nSrcRefStep - Stride of the reference picture plane in terms of full
   3475  *            pixels
   3476  *   iBlockWidth - Width of the current block in terms of full pixels; must
   3477  *            be equal to either 4, 8, or 16.
   3478  *   iBlockHeight - Height of the current block in terms of full pixels; must
   3479  *            be equal to either 4, 8, or 16.
   3480  *   nLamda - Lamda factor, used to compute motion cost
   3481  *   pMVPred - Predicted MV, represented in terms of 1/4-pel units; used to
   3482  *            compute motion cost
   3483  *   pSrcDstBestMV - The best MV resulting from a prior integer search,
   3484  *            represented in terms of 1/4-pel units
   3485  *
   3486  * Output Arguments:
   3487  *
   3488  *   pSrcDstBestMV - Best MV resulting from the half-pel search, expressed in
   3489  *            terms of 1/4-pel units
   3490  *   pBestCost - Motion cost associated with the best MV; computed as
   3491  *            SAD+Lamda*BitsUsedByMV
   3492  *
   3493  * Return Value:
   3494  *    OMX_Sts_NoErr, if the function runs without error.
   3495  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3496  *    -    any of the following pointers is NULL: pSrcOrgY, pSrcRefY,
   3497  *              pSrcDstBestMV, pMVPred, pBestCost
   3498  *    -    iBlockWidth or iBlockHeight are equal to values other than 4, 8, or 16.
   3499  *    -    Any alignment restrictions are violated
   3500  *
   3501  */
   3502 OMXResult omxVCM4P10_BlockMatch_Half (
   3503     const OMX_U8 *pSrcOrgY,
   3504     OMX_S32 nSrcOrgStep,
   3505     const OMX_U8 *pSrcRefY,
   3506     OMX_S32 nSrcRefStep,
   3507     OMX_U8 iBlockWidth,
   3508     OMX_U8 iBlockHeight,
   3509     OMX_U32 nLamda,
   3510     const OMXVCMotionVector *pMVPred,
   3511     OMXVCMotionVector *pSrcDstBestMV,
   3512     OMX_S32 *pBestCost
   3513 );
   3514 
   3515 
   3516 
   3517 /**
   3518  * Function:  omxVCM4P10_BlockMatch_Quarter   (6.3.5.2.3)
   3519  *
   3520  * Description:
   3521  * Performs a quarter-pel block match using results from a prior half-pel
   3522  * search.  Returns the best MV and associated cost.  This function estimates
   3523  * the quarter-pixel motion vector by interpolating the half-pel resolution
   3524  * motion vector referenced by the input parameter pSrcDstBestMV, i.e., the
   3525  * initial half-pel MV is generated externally.  The function
   3526  * omxVCM4P10_BlockMatch_Half may be used for half-pel motion estimation.
   3527  *
   3528  * Input Arguments:
   3529  *
   3530  *   pSrcOrgY - Pointer to the current position in original picture plane:
   3531  *            If iBlockWidth==4,  4-byte alignment required.
   3532  *            If iBlockWidth==8,  8-byte alignment required.
   3533  *            If iBlockWidth==16, 16-byte alignment required.
   3534  *   pSrcRefY - Pointer to the top-left corner of the co-located block in the
   3535  *            reference picture:
   3536  *            If iBlockWidth==4,  4-byte alignment required.
   3537  *            If iBlockWidth==8,  8-byte alignment required.
   3538  *            If iBlockWidth==16, 16-byte alignment required.
   3539  *   nSrcOrgStep - Stride of the original picture plane in terms of full
   3540  *            pixels; must be a multiple of iBlockWidth.
   3541  *   nSrcRefStep - Stride of the reference picture plane in terms of full
   3542  *            pixels
   3543  *   iBlockWidth - Width of the current block in terms of full pixels; must
   3544  *            be equal to either 4, 8, or 16.
   3545  *   iBlockHeight - Height of the current block in terms of full pixels; must
   3546  *            be equal to either 4, 8, or 16.
   3547  *   nLamda - Lamda factor, used to compute motion cost
   3548  *   pMVPred - Predicted MV, represented in terms of 1/4-pel units; used to
   3549  *            compute motion cost
   3550  *   pSrcDstBestMV - The best MV resulting from a prior half-pel search,
   3551  *            represented in terms of 1/4 pel units
   3552  *
   3553  * Output Arguments:
   3554  *
   3555  *   pSrcDstBestMV - Best MV resulting from the quarter-pel search, expressed
   3556  *            in terms of 1/4-pel units
   3557  *   pBestCost - Motion cost associated with the best MV; computed as
   3558  *            SAD+Lamda*BitsUsedByMV
   3559  *
   3560  * Return Value:
   3561  *    OMX_Sts_NoErr, if the function runs without error.
   3562  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3563  *    -    One or more of the following pointers is NULL:
   3564  *         pSrcOrgY, pSrcRefY, pSrcDstBestMV, pMVPred, pBestCost
   3565  *    -    iBlockWidth or iBlockHeight are equal to values other than 4, 8, or 16.
   3566  *    -    Any alignment restrictions are violated
   3567  *
   3568  */
   3569 OMXResult omxVCM4P10_BlockMatch_Quarter (
   3570     const OMX_U8 *pSrcOrgY,
   3571     OMX_S32 nSrcOrgStep,
   3572     const OMX_U8 *pSrcRefY,
   3573     OMX_S32 nSrcRefStep,
   3574     OMX_U8 iBlockWidth,
   3575     OMX_U8 iBlockHeight,
   3576     OMX_U32 nLamda,
   3577     const OMXVCMotionVector *pMVPred,
   3578     OMXVCMotionVector *pSrcDstBestMV,
   3579     OMX_S32 *pBestCost
   3580 );
   3581 
   3582 
   3583 
   3584 /**
   3585  * Function:  omxVCM4P10_MotionEstimationMB   (6.3.5.3.1)
   3586  *
   3587  * Description:
   3588  * Performs MB-level motion estimation and selects best motion estimation
   3589  * strategy from the set of modes supported in baseline profile [ISO14496-10].
   3590  *
   3591  * Input Arguments:
   3592  *
   3593  *   pSrcCurrBuf - Pointer to the current position in original picture plane;
   3594  *            16-byte alignment required
   3595  *   pSrcRefBufList - Pointer to an array with 16 entries.  Each entry points
   3596  *            to the top-left corner of the co-located MB in a reference
   3597  *            picture.  The array is filled from low-to-high with valid
   3598  *            reference frame pointers; the unused high entries should be set
   3599  *            to NULL.  Ordering of the reference frames should follow
   3600  *            [ISO14496-10] subclause 8.2.4  Decoding Process for Reference
   3601  *            Picture Lists.   The entries must be 16-byte aligned.
   3602  *   pSrcRecBuf - Pointer to the top-left corner of the co-located MB in the
   3603  *            reconstructed picture; must be 16-byte aligned.
   3604  *   SrcCurrStep - Width of the original picture plane in terms of full
   3605  *            pixels; must be a multiple of 16.
   3606  *   SrcRefStep - Width of the reference picture plane in terms of full
   3607  *            pixels; must be a multiple of 16.
   3608  *   SrcRecStep - Width of the reconstructed picture plane in terms of full
   3609  *            pixels; must be a multiple of 16.
   3610  *   pRefRect - Pointer to the valid reference rectangle; relative to the
   3611  *            image origin.
   3612  *   pCurrPointPos - Position of the current macroblock in the current plane.
   3613  *   Lambda - Lagrange factor for computing the cost function
   3614  *   pMESpec - Pointer to the motion estimation specification structure; must
   3615  *            have been allocated and initialized prior to calling this
   3616  *            function.
   3617  *   pMBInter - Array, of dimension four, containing pointers to information
   3618  *            associated with four adjacent type INTER MBs (Left, Top,
   3619  *            Top-Left, Top-Right). Any pointer in the array may be set equal
   3620  *            to NULL if the corresponding MB doesn t exist or is not of type
   3621  *            INTER.
   3622  *            -  pMBInter[0] - Pointer to left MB information
   3623  *            -  pMBInter[1] - Pointer to top MB information
   3624  *            -  pMBInter[2] - Pointer to top-left MB information
   3625  *            -  pMBInter[3] - Pointer to top-right MB information
   3626  *   pMBIntra - Array, of dimension four, containing pointers to information
   3627  *            associated with four adjacent type INTRA MBs (Left, Top,
   3628  *            Top-Left, Top-Right). Any pointer in the array may be set equal
   3629  *            to NULL if the corresponding MB doesn t exist or is not of type
   3630  *            INTRA.
   3631  *            -  pMBIntra[0] - Pointer to left MB information
   3632  *            -  pMBIntra[1] - Pointer to top MB information
   3633  *            -  pMBIntra[2] - Pointer to top-left MB information
   3634  *            -  pMBIntra[3] - Pointer to top-right MB information
   3635  *   pSrcDstMBCurr - Pointer to information structure for the current MB.
   3636  *            The following entries should be set prior to calling the
   3637  *            function:  sliceID - the number of the slice the to which the
   3638  *            current MB belongs.
   3639  *
   3640  * Output Arguments:
   3641  *
   3642  *   pDstCost - Pointer to the minimum motion cost for the current MB.
   3643  *   pDstBlockSAD - Pointer to the array of SADs for each of the sixteen luma
   3644  *            4x4 blocks in each MB.  The block SADs are in scan order for
   3645  *            each MB.  For implementations that cannot compute the SAD values
   3646  *            individually, the maximum possible value (0xffff) is returned
   3647  *            for each of the 16 block SAD entries.
   3648  *   pSrcDstMBCurr - Pointer to updated information structure for the current
   3649  *            MB after MB-level motion estimation has been completed.  The
   3650  *            following fields are updated by the ME function.   The following
   3651  *            parameter set quantifies the MB-level ME search results:
   3652  *            -  MbType
   3653  *            -  subMBType[4]
   3654  *            -  pMV0[4][4]
   3655  *            -  pMVPred[4][4]
   3656  *            -  pRefL0Idx[4]
   3657  *            -  Intra16x16PredMode
   3658  *            -  pIntra4x4PredMode[4][4]
   3659  *
   3660  * Return Value:
   3661  *    OMX_Sts_NoErr, if the function runs without error.
   3662  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3663  *    -   One or more of the following pointers is NULL: pSrcCurrBuf,
   3664  *           pSrcRefBufList, pSrcRecBuf, pRefRect, pCurrPointPos, pMESpec,
   3665  *           pMBInter, pMBIntra,pSrcDstMBCurr, pDstCost, pSrcRefBufList[0]
   3666  *    -    SrcRefStep, SrcRecStep are not multiples of 16
   3667  *    -    iBlockWidth or iBlockHeight are values other than 4, 8, or 16.
   3668  *    -    Any alignment restrictions are violated
   3669  *
   3670  */
   3671 OMXResult omxVCM4P10_MotionEstimationMB (
   3672     const OMX_U8 *pSrcCurrBuf,
   3673     OMX_S32 SrcCurrStep,
   3674     const OMX_U8 *pSrcRefBufList[15],
   3675     OMX_S32 SrcRefStep,
   3676     const OMX_U8 *pSrcRecBuf,
   3677     OMX_S32 SrcRecStep,
   3678     const OMXRect *pRefRect,
   3679     const OMXVCM4P2Coordinate *pCurrPointPos,
   3680     OMX_U32 Lambda,
   3681     void *pMESpec,
   3682     const OMXVCM4P10MBInfoPtr *pMBInter,
   3683     const OMXVCM4P10MBInfoPtr *pMBIntra,
   3684     OMXVCM4P10MBInfoPtr pSrcDstMBCurr,
   3685     OMX_INT *pDstCost,
   3686     OMX_U16 *pDstBlockSAD
   3687 );
   3688 
   3689 
   3690 
   3691 /**
   3692  * Function:  omxVCM4P10_SAD_4x   (6.3.5.4.1)
   3693  *
   3694  * Description:
   3695  * This function calculates the SAD for 4x8 and 4x4 blocks.
   3696  *
   3697  * Input Arguments:
   3698  *
   3699  *   pSrcOrg -Pointer to the original block; must be aligned on a 4-byte
   3700  *            boundary.
   3701  *   iStepOrg -Step of the original block buffer; must be a multiple of 4.
   3702  *   pSrcRef -Pointer to the reference block
   3703  *   iStepRef -Step of the reference block buffer
   3704  *   iHeight -Height of the block; must be equal to either 4 or 8.
   3705  *
   3706  * Output Arguments:
   3707  *
   3708  *   pDstSAD -Pointer of result SAD
   3709  *
   3710  * Return Value:
   3711  *    OMX_Sts_NoErr, if the function runs without error.
   3712  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3713  *    -    One or more of the following pointers is NULL:
   3714  *         pSrcOrg, pSrcRef, or pDstSAD
   3715  *    -    iHeight is not equal to either 4 or 8.
   3716  *    -    iStepOrg is not a multiple of 4
   3717  *    -    Any alignment restrictions are violated
   3718  *
   3719  */
   3720 OMXResult omxVCM4P10_SAD_4x (
   3721     const OMX_U8 *pSrcOrg,
   3722     OMX_U32 iStepOrg,
   3723     const OMX_U8 *pSrcRef,
   3724     OMX_U32 iStepRef,
   3725     OMX_S32 *pDstSAD,
   3726     OMX_U32 iHeight
   3727 );
   3728 
   3729 
   3730 
   3731 /**
   3732  * Function:  omxVCM4P10_SADQuar_4x   (6.3.5.4.2)
   3733  *
   3734  * Description:
   3735  * This function calculates the SAD between one block (pSrc) and the average
   3736  * of the other two (pSrcRef0 and pSrcRef1) for 4x8 or 4x4 blocks.  Rounding
   3737  * is applied according to the convention (a+b+1)>>1.
   3738  *
   3739  * Input Arguments:
   3740  *
   3741  *   pSrc - Pointer to the original block; must be aligned on a 4-byte
   3742  *            boundary.
   3743  *   pSrcRef0 - Pointer to reference block 0
   3744  *   pSrcRef1 - Pointer to reference block 1
   3745  *   iSrcStep - Step of the original block buffer; must be a multiple of 4.
   3746  *   iRefStep0 - Step of reference block 0
   3747  *   iRefStep1 - Step of reference block 1
   3748  *   iHeight - Height of the block; must be equal to either 4 or 8.
   3749  *
   3750  * Output Arguments:
   3751  *
   3752  *   pDstSAD - Pointer of result SAD
   3753  *
   3754  * Return Value:
   3755  *    OMX_Sts_NoErr, if the function runs without error.
   3756  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3757  *    -    iHeight is not equal to either 4 or 8.
   3758  *    -    One or more of the following pointers is NULL: pSrc, pSrcRef0,
   3759  *              pSrcRef1, pDstSAD.
   3760  *    -    iSrcStep is not a multiple of 4
   3761  *    -    Any alignment restrictions are violated
   3762  *
   3763  */
   3764 OMXResult omxVCM4P10_SADQuar_4x (
   3765     const OMX_U8 *pSrc,
   3766     const OMX_U8 *pSrcRef0,
   3767     const OMX_U8 *pSrcRef1,
   3768     OMX_U32 iSrcStep,
   3769     OMX_U32 iRefStep0,
   3770     OMX_U32 iRefStep1,
   3771     OMX_U32 *pDstSAD,
   3772     OMX_U32 iHeight
   3773 );
   3774 
   3775 
   3776 
   3777 /**
   3778  * Function:  omxVCM4P10_SADQuar_8x   (6.3.5.4.3)
   3779  *
   3780  * Description:
   3781  * This function calculates the SAD between one block (pSrc) and the average
   3782  * of the other two (pSrcRef0 and pSrcRef1) for 8x16, 8x8, or 8x4 blocks.
   3783  * Rounding is applied according to the convention (a+b+1)>>1.
   3784  *
   3785  * Input Arguments:
   3786  *
   3787  *   pSrc - Pointer to the original block; must be aligned on an 8-byte
   3788  *            boundary.
   3789  *   pSrcRef0 - Pointer to reference block 0
   3790  *   pSrcRef1 - Pointer to reference block 1
   3791  *   iSrcStep - Step of the original block buffer; must be a multiple of 8.
   3792  *   iRefStep0 - Step of reference block 0
   3793  *   iRefStep1 - Step of reference block 1
   3794  *   iHeight - Height of the block; must be equal either 4, 8, or 16.
   3795  *
   3796  * Output Arguments:
   3797  *
   3798  *   pDstSAD - Pointer of result SAD
   3799  *
   3800  * Return Value:
   3801  *    OMX_Sts_NoErr, if the function runs without error.
   3802  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3803  *    -    iHeight is not equal to either 4, 8, or 16.
   3804  *    -    One or more of the following pointers is NULL: pSrc, pSrcRef0,
   3805  *              pSrcRef1, pDstSAD.
   3806  *    -    iSrcStep is not a multiple of 8
   3807  *    -    Any alignment restrictions are violated
   3808  *
   3809  */
   3810 OMXResult omxVCM4P10_SADQuar_8x (
   3811     const OMX_U8 *pSrc,
   3812     const OMX_U8 *pSrcRef0,
   3813     const OMX_U8 *pSrcRef1,
   3814     OMX_U32 iSrcStep,
   3815     OMX_U32 iRefStep0,
   3816     OMX_U32 iRefStep1,
   3817     OMX_U32 *pDstSAD,
   3818     OMX_U32 iHeight
   3819 );
   3820 
   3821 
   3822 
   3823 /**
   3824  * Function:  omxVCM4P10_SADQuar_16x   (6.3.5.4.4)
   3825  *
   3826  * Description:
   3827  * This function calculates the SAD between one block (pSrc) and the average
   3828  * of the other two (pSrcRef0 and pSrcRef1) for 16x16 or 16x8 blocks.
   3829  * Rounding is applied according to the convention (a+b+1)>>1.
   3830  *
   3831  * Input Arguments:
   3832  *
   3833  *   pSrc - Pointer to the original block; must be aligned on a 16-byte
   3834  *            boundary.
   3835  *   pSrcRef0 - Pointer to reference block 0
   3836  *   pSrcRef1 - Pointer to reference block 1
   3837  *   iSrcStep - Step of the original block buffer; must be a multiple of 16
   3838  *   iRefStep0 - Step of reference block 0
   3839  *   iRefStep1 - Step of reference block 1
   3840  *   iHeight - Height of the block; must be equal to either 8 or 16
   3841  *
   3842  * Output Arguments:
   3843  *
   3844  *   pDstSAD -Pointer of result SAD
   3845  *
   3846  * Return Value:
   3847  *    OMX_Sts_NoErr, if the function runs without error.
   3848  *    OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
   3849  *    -    iHeight is not equal to either 8 or 16.
   3850  *    -    One or more of the following pointers is NULL: pSrc, pSrcRef0,
   3851  *              pSrcRef1, pDstSAD.
   3852  *    -    iSrcStep is not a multiple of 16
   3853  *    -    Any alignment restrictions are violated
   3854  *
   3855  */
   3856 OMXResult omxVCM4P10_SADQuar_16x (
   3857     const OMX_U8 *pSrc,
   3858     const OMX_U8 *pSrcRef0,
   3859     const OMX_U8 *pSrcRef1,
   3860     OMX_U32 iSrcStep,
   3861     OMX_U32 iRefStep0,
   3862     OMX_U32 iRefStep1,
   3863     OMX_U32 *pDstSAD,
   3864     OMX_U32 iHeight
   3865 );
   3866 
   3867 
   3868 
   3869 /**
   3870  * Function:  omxVCM4P10_SATD_4x4   (6.3.5.4.5)
   3871  *
   3872  * Description:
   3873  * This function calculates the sum of absolute transform differences (SATD)
   3874  * for a 4x4 block by applying a Hadamard transform to the difference block
   3875  * and then calculating the sum of absolute coefficient values.
   3876  *
   3877  * Input Arguments:
   3878  *
   3879  *   pSrcOrg - Pointer to the original block; must be aligned on a 4-byte
   3880  *            boundary
   3881  *   iStepOrg - Step of the original block buffer; must be a multiple of 4
   3882  *   pSrcRef - Pointer to the reference block; must be aligned on a 4-byte
   3883  *            boundary
   3884  *   iStepRef - Step of the reference block buffer; must be a multiple of 4
   3885  *
   3886  * Output Arguments:
   3887  *
   3888  *   pDstSAD - pointer to the resulting SAD
   3889  *
   3890  * Return Value:
   3891  *
   3892  *    OMX_Sts_NoErr - no error
   3893  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   3894  *              conditions are true:
   3895  *    -    at least one of the following pointers is NULL:
   3896  *         pSrcOrg, pSrcRef, or pDstSAD either pSrcOrg
   3897  *    -    pSrcRef is not aligned on a 4-byte boundary
   3898  *    -    iStepOrg <= 0 or iStepOrg is not a multiple of 4
   3899  *    -    iStepRef <= 0 or iStepRef is not a multiple of 4
   3900  *
   3901  */
   3902 OMXResult omxVCM4P10_SATD_4x4 (
   3903     const OMX_U8 *pSrcOrg,
   3904     OMX_U32 iStepOrg,
   3905     const OMX_U8 *pSrcRef,
   3906     OMX_U32 iStepRef,
   3907     OMX_U32 *pDstSAD
   3908 );
   3909 
   3910 
   3911 
   3912 /**
   3913  * Function:  omxVCM4P10_InterpolateHalfHor_Luma   (6.3.5.5.1)
   3914  *
   3915  * Description:
   3916  * This function performs interpolation for two horizontal 1/2-pel positions
   3917  * (-1/2,0) and (1/2, 0) - around a full-pel position.
   3918  *
   3919  * Input Arguments:
   3920  *
   3921  *   pSrc - Pointer to the top-left corner of the block used to interpolate in
   3922  *            the reconstruction frame plane.
   3923  *   iSrcStep - Step of the source buffer.
   3924  *   iDstStep - Step of the destination(interpolation) buffer; must be a
   3925  *            multiple of iWidth.
   3926  *   iWidth - Width of the current block; must be equal to either 4, 8, or 16
   3927  *   iHeight - Height of the current block; must be equal to 4, 8, or 16
   3928  *
   3929  * Output Arguments:
   3930  *
   3931  *   pDstLeft -Pointer to the interpolation buffer of the left -pel position
   3932  *            (-1/2, 0)
   3933  *                 If iWidth==4,  4-byte alignment required.
   3934  *                 If iWidth==8,  8-byte alignment required.
   3935  *                 If iWidth==16, 16-byte alignment required.
   3936  *   pDstRight -Pointer to the interpolation buffer of the right -pel
   3937  *            position (1/2, 0)
   3938  *                 If iWidth==4,  4-byte alignment required.
   3939  *                 If iWidth==8,  8-byte alignment required.
   3940  *                 If iWidth==16, 16-byte alignment required.
   3941  *
   3942  * Return Value:
   3943  *
   3944  *    OMX_Sts_NoErr - no error
   3945  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   3946  *              conditions are true:
   3947  *    -    at least one of the following pointers is NULL:
   3948  *             pSrc, pDstLeft, or pDstRight
   3949  *    -    iWidth or iHeight have values other than 4, 8, or 16
   3950  *    -    iWidth==4 but pDstLeft and/or pDstRight is/are not aligned on a 4-byte boundary
   3951  *    -    iWidth==8 but pDstLeft and/or pDstRight is/are not aligned on a 8-byte boundary
   3952  *    -    iWidth==16 but pDstLeft and/or pDstRight is/are not aligned on a 16-byte boundary
   3953  *    -    any alignment restrictions are violated
   3954  *
   3955  */
   3956 OMXResult omxVCM4P10_InterpolateHalfHor_Luma (
   3957     const OMX_U8 *pSrc,
   3958     OMX_U32 iSrcStep,
   3959     OMX_U8 *pDstLeft,
   3960     OMX_U8 *pDstRight,
   3961     OMX_U32 iDstStep,
   3962     OMX_U32 iWidth,
   3963     OMX_U32 iHeight
   3964 );
   3965 
   3966 
   3967 
   3968 /**
   3969  * Function:  omxVCM4P10_InterpolateHalfVer_Luma   (6.3.5.5.2)
   3970  *
   3971  * Description:
   3972  * This function performs interpolation for two vertical 1/2-pel positions -
   3973  * (0, -1/2) and (0, 1/2) - around a full-pel position.
   3974  *
   3975  * Input Arguments:
   3976  *
   3977  *   pSrc - Pointer to top-left corner of block used to interpolate in the
   3978  *            reconstructed frame plane
   3979  *   iSrcStep - Step of the source buffer.
   3980  *   iDstStep - Step of the destination (interpolation) buffer; must be a
   3981  *            multiple of iWidth.
   3982  *   iWidth - Width of the current block; must be equal to either 4, 8, or 16
   3983  *   iHeight - Height of the current block; must be equal to either 4, 8, or 16
   3984  *
   3985  * Output Arguments:
   3986  *
   3987  *   pDstUp -Pointer to the interpolation buffer of the -pel position above
   3988  *            the current full-pel position (0, -1/2)
   3989  *                If iWidth==4, 4-byte alignment required.
   3990  *                If iWidth==8, 8-byte alignment required.
   3991  *                If iWidth==16, 16-byte alignment required.
   3992  *   pDstDown -Pointer to the interpolation buffer of the -pel position below
   3993  *            the current full-pel position (0, 1/2)
   3994  *                If iWidth==4, 4-byte alignment required.
   3995  *                If iWidth==8, 8-byte alignment required.
   3996  *                If iWidth==16, 16-byte alignment required.
   3997  *
   3998  * Return Value:
   3999  *
   4000  *    OMX_Sts_NoErr - no error
   4001  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4002  *              conditions are true:
   4003  *    -    at least one of the following pointers is NULL:
   4004  *            pSrc, pDstUp, or pDstDown
   4005  *    -    iWidth or iHeight have values other than 4, 8, or 16
   4006  *    -    iWidth==4 but pDstUp and/or pDstDown is/are not aligned on a 4-byte boundary
   4007  *    -    iWidth==8 but pDstUp and/or pDstDown is/are not aligned on a 8-byte boundary
   4008  *    -    iWidth==16 but pDstUp and/or pDstDown is/are not aligned on a 16-byte boundary
   4009  *
   4010  */
   4011 OMXResult omxVCM4P10_InterpolateHalfVer_Luma (
   4012     const OMX_U8 *pSrc,
   4013     OMX_U32 iSrcStep,
   4014     OMX_U8 *pDstUp,
   4015     OMX_U8 *pDstDown,
   4016     OMX_U32 iDstStep,
   4017     OMX_U32 iWidth,
   4018     OMX_U32 iHeight
   4019 );
   4020 
   4021 
   4022 
   4023 /**
   4024  * Function:  omxVCM4P10_Average_4x   (6.3.5.5.3)
   4025  *
   4026  * Description:
   4027  * This function calculates the average of two 4x4, 4x8 blocks.  The result
   4028  * is rounded according to (a+b+1)/2.
   4029  *
   4030  * Input Arguments:
   4031  *
   4032  *   pPred0 - Pointer to the top-left corner of reference block 0
   4033  *   pPred1 - Pointer to the top-left corner of reference block 1
   4034  *   iPredStep0 - Step of reference block 0; must be a multiple of 4.
   4035  *   iPredStep1 - Step of reference block 1; must be a multiple of 4.
   4036  *   iDstStep - Step of the destination buffer; must be a multiple of 4.
   4037  *   iHeight - Height of the blocks; must be either 4 or 8.
   4038  *
   4039  * Output Arguments:
   4040  *
   4041  *   pDstPred - Pointer to the destination buffer. 4-byte alignment required.
   4042  *
   4043  * Return Value:
   4044  *
   4045  *    OMX_Sts_NoErr - no error
   4046  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4047  *              conditions are true:
   4048  *    -    at least one of the following pointers is NULL:
   4049  *           pPred0, pPred1, or pDstPred
   4050  *    -    pDstPred is not aligned on a 4-byte boundary
   4051  *    -    iPredStep0 <= 0 or iPredStep0 is not a multiple of 4
   4052  *    -    iPredStep1 <= 0 or iPredStep1 is not a multiple of 4
   4053  *    -    iDstStep <= 0 or iDstStep is not a multiple of 4
   4054  *    -    iHeight is not equal to either 4 or 8
   4055  *
   4056  */
   4057 OMXResult omxVCM4P10_Average_4x (
   4058     const OMX_U8 *pPred0,
   4059     const OMX_U8 *pPred1,
   4060     OMX_U32 iPredStep0,
   4061     OMX_U32 iPredStep1,
   4062     OMX_U8 *pDstPred,
   4063     OMX_U32 iDstStep,
   4064     OMX_U32 iHeight
   4065 );
   4066 
   4067 
   4068 
   4069 /**
   4070  * Function:  omxVCM4P10_TransformQuant_ChromaDC   (6.3.5.6.1)
   4071  *
   4072  * Description:
   4073  * This function performs 2x2 Hadamard transform of chroma DC coefficients
   4074  * and then quantizes the coefficients.
   4075  *
   4076  * Input Arguments:
   4077  *
   4078  *   pSrcDst - Pointer to the 2x2 array of chroma DC coefficients.  8-byte
   4079  *            alignment required.
   4080  *   iQP - Quantization parameter; must be in the range [0,51].
   4081  *   bIntra - Indicate whether this is an INTRA block. 1-INTRA, 0-INTER
   4082  *
   4083  * Output Arguments:
   4084  *
   4085  *   pSrcDst - Pointer to transformed and quantized coefficients.  8-byte
   4086  *            alignment required.
   4087  *
   4088  * Return Value:
   4089  *
   4090  *    OMX_Sts_NoErr - no error
   4091  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4092  *              conditions are true:
   4093  *    -    at least one of the following pointers is NULL:
   4094  *             pSrcDst
   4095  *    -    pSrcDst is not aligned on an 8-byte boundary
   4096  *
   4097  */
   4098 OMXResult omxVCM4P10_TransformQuant_ChromaDC (
   4099     OMX_S16 *pSrcDst,
   4100     OMX_U32 iQP,
   4101     OMX_U8 bIntra
   4102 );
   4103 
   4104 
   4105 
   4106 /**
   4107  * Function:  omxVCM4P10_TransformQuant_LumaDC   (6.3.5.6.2)
   4108  *
   4109  * Description:
   4110  * This function performs a 4x4 Hadamard transform of luma DC coefficients
   4111  * and then quantizes the coefficients.
   4112  *
   4113  * Input Arguments:
   4114  *
   4115  *   pSrcDst - Pointer to the 4x4 array of luma DC coefficients.  16-byte
   4116  *            alignment required.
   4117  *   iQP - Quantization parameter; must be in the range [0,51].
   4118  *
   4119  * Output Arguments:
   4120  *
   4121  *   pSrcDst - Pointer to transformed and quantized coefficients.  16-byte
   4122  *             alignment required.
   4123  *
   4124  * Return Value:
   4125  *
   4126  *    OMX_Sts_NoErr - no error
   4127  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4128  *              conditions are true:
   4129  *    -    at least one of the following pointers is NULL: pSrcDst
   4130  *    -    pSrcDst is not aligned on an 16-byte boundary
   4131  *
   4132  */
   4133 OMXResult omxVCM4P10_TransformQuant_LumaDC (
   4134     OMX_S16 *pSrcDst,
   4135     OMX_U32 iQP
   4136 );
   4137 
   4138 
   4139 
   4140 /**
   4141  * Function:  omxVCM4P10_InvTransformDequant_LumaDC   (6.3.5.6.3)
   4142  *
   4143  * Description:
   4144  * This function performs inverse 4x4 Hadamard transform and then dequantizes
   4145  * the coefficients.
   4146  *
   4147  * Input Arguments:
   4148  *
   4149  *   pSrc - Pointer to the 4x4 array of the 4x4 Hadamard-transformed and
   4150  *            quantized coefficients.  16 byte alignment required.
   4151  *   iQP - Quantization parameter; must be in the range [0,51].
   4152  *
   4153  * Output Arguments:
   4154  *
   4155  *   pDst - Pointer to inverse-transformed and dequantized coefficients.
   4156  *            16-byte alignment required.
   4157  *
   4158  * Return Value:
   4159  *
   4160  *    OMX_Sts_NoErr - no error
   4161  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4162  *              conditions are true:
   4163  *    -    at least one of the following pointers is NULL: pSrc
   4164  *    -    pSrc or pDst is not aligned on a 16-byte boundary
   4165  *
   4166  */
   4167 OMXResult omxVCM4P10_InvTransformDequant_LumaDC (
   4168     const OMX_S16 *pSrc,
   4169     OMX_S16 *pDst,
   4170     OMX_U32 iQP
   4171 );
   4172 
   4173 
   4174 
   4175 /**
   4176  * Function:  omxVCM4P10_InvTransformDequant_ChromaDC   (6.3.5.6.4)
   4177  *
   4178  * Description:
   4179  * This function performs inverse 2x2 Hadamard transform and then dequantizes
   4180  * the coefficients.
   4181  *
   4182  * Input Arguments:
   4183  *
   4184  *   pSrc - Pointer to the 2x2 array of the 2x2 Hadamard-transformed and
   4185  *            quantized coefficients.  8 byte alignment required.
   4186  *   iQP - Quantization parameter; must be in the range [0,51].
   4187  *
   4188  * Output Arguments:
   4189  *
   4190  *   pDst - Pointer to inverse-transformed and dequantized coefficients.
   4191  *            8-byte alignment required.
   4192  *
   4193  * Return Value:
   4194  *
   4195  *    OMX_Sts_NoErr - no error
   4196  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4197  *              conditions are true:
   4198  *    -    at least one of the following pointers is NULL: pSrc
   4199  *    -    pSrc or pDst is not aligned on an 8-byte boundary
   4200  *
   4201  */
   4202 OMXResult omxVCM4P10_InvTransformDequant_ChromaDC (
   4203     const OMX_S16 *pSrc,
   4204     OMX_S16 *pDst,
   4205     OMX_U32 iQP
   4206 );
   4207 
   4208 
   4209 
   4210 /**
   4211  * Function:  omxVCM4P10_InvTransformResidualAndAdd   (6.3.5.7.1)
   4212  *
   4213  * Description:
   4214  * This function performs inverse an 4x4 integer transformation to produce
   4215  * the difference signal and then adds the difference to the prediction to get
   4216  * the reconstructed signal.
   4217  *
   4218  * Input Arguments:
   4219  *
   4220  *   pSrcPred - Pointer to prediction signal.  4-byte alignment required.
   4221  *   pDequantCoeff - Pointer to the transformed coefficients.  8-byte
   4222  *            alignment required.
   4223  *   iSrcPredStep - Step of the prediction buffer; must be a multiple of 4.
   4224  *   iDstReconStep - Step of the destination reconstruction buffer; must be a
   4225  *            multiple of 4.
   4226  *   bAC - Indicate whether there is AC coefficients in the coefficients
   4227  *            matrix.
   4228  *
   4229  * Output Arguments:
   4230  *
   4231  *   pDstRecon -Pointer to the destination reconstruction buffer.  4-byte
   4232  *            alignment required.
   4233  *
   4234  * Return Value:
   4235  *
   4236  *    OMX_Sts_NoErr - no error
   4237  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4238  *              conditions are true:
   4239  *    -    at least one of the following pointers is NULL:
   4240  *            pSrcPred, pDequantCoeff, pDstRecon
   4241  *    -    pSrcPred is not aligned on a 4-byte boundary
   4242  *    -    iSrcPredStep or iDstReconStep is not a multiple of 4.
   4243  *    -    pDequantCoeff is not aligned on an 8-byte boundary
   4244  *
   4245  */
   4246 OMXResult omxVCM4P10_InvTransformResidualAndAdd (
   4247     const OMX_U8 *pSrcPred,
   4248     const OMX_S16 *pDequantCoeff,
   4249     OMX_U8 *pDstRecon,
   4250     OMX_U32 iSrcPredStep,
   4251     OMX_U32 iDstReconStep,
   4252     OMX_U8 bAC
   4253 );
   4254 
   4255 
   4256 
   4257 /**
   4258  * Function:  omxVCM4P10_SubAndTransformQDQResidual   (6.3.5.8.1)
   4259  *
   4260  * Description:
   4261  * This function subtracts the prediction signal from the original signal to
   4262  * produce the difference signal and then performs a 4x4 integer transform and
   4263  * quantization. The quantized transformed coefficients are stored as
   4264  * pDstQuantCoeff. This function can also output dequantized coefficients or
   4265  * unquantized DC coefficients optionally by setting the pointers
   4266  * pDstDeQuantCoeff, pDCCoeff.
   4267  *
   4268  * Input Arguments:
   4269  *
   4270  *   pSrcOrg - Pointer to original signal. 4-byte alignment required.
   4271  *   pSrcPred - Pointer to prediction signal. 4-byte alignment required.
   4272  *   iSrcOrgStep - Step of the original signal buffer; must be a multiple of
   4273  *            4.
   4274  *   iSrcPredStep - Step of the prediction signal buffer; must be a multiple
   4275  *            of 4.
   4276  *   pNumCoeff -Number of non-zero coefficients after quantization. If this
   4277  *            parameter is not required, it is set to NULL.
   4278  *   nThreshSAD - Zero-block early detection threshold. If this parameter is
   4279  *            not required, it is set to 0.
   4280  *   iQP - Quantization parameter; must be in the range [0,51].
   4281  *   bIntra - Indicates whether this is an INTRA block, either 1-INTRA or
   4282  *            0-INTER
   4283  *
   4284  * Output Arguments:
   4285  *
   4286  *   pDstQuantCoeff - Pointer to the quantized transformed coefficients.
   4287  *            8-byte alignment required.
   4288  *   pDstDeQuantCoeff - Pointer to the dequantized transformed coefficients
   4289  *            if this parameter is not equal to NULL.  8-byte alignment
   4290  *            required.
   4291  *   pDCCoeff - Pointer to the unquantized DC coefficient if this parameter
   4292  *            is not equal to NULL.
   4293  *
   4294  * Return Value:
   4295  *
   4296  *    OMX_Sts_NoErr - no error
   4297  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4298  *              conditions are true:
   4299  *    -    at least one of the following pointers is NULL:
   4300  *            pSrcOrg, pSrcPred, pNumCoeff, pDstQuantCoeff,
   4301  *            pDstDeQuantCoeff, pDCCoeff
   4302  *    -    pSrcOrg is not aligned on a 4-byte boundary
   4303  *    -    pSrcPred is not aligned on a 4-byte boundary
   4304  *    -    iSrcOrgStep is not a multiple of 4
   4305  *    -    iSrcPredStep is not a multiple of 4
   4306  *    -    pDstQuantCoeff or pDstDeQuantCoeff is not aligned on an 8-byte boundary
   4307  *
   4308  */
   4309 OMXResult omxVCM4P10_SubAndTransformQDQResidual (
   4310     const OMX_U8 *pSrcOrg,
   4311     const OMX_U8 *pSrcPred,
   4312     OMX_U32 iSrcOrgStep,
   4313     OMX_U32 iSrcPredStep,
   4314     OMX_S16 *pDstQuantCoeff,
   4315     OMX_S16 *pDstDeQuantCoeff,
   4316     OMX_S16 *pDCCoeff,
   4317     OMX_S8 *pNumCoeff,
   4318     OMX_U32 nThreshSAD,
   4319     OMX_U32 iQP,
   4320     OMX_U8 bIntra
   4321 );
   4322 
   4323 
   4324 
   4325 /**
   4326  * Function:  omxVCM4P10_GetVLCInfo   (6.3.5.9.1)
   4327  *
   4328  * Description:
   4329  * This function extracts run-length encoding (RLE) information from the
   4330  * coefficient matrix.  The results are returned in an OMXVCM4P10VLCInfo
   4331  * structure.
   4332  *
   4333  * Input Arguments:
   4334  *
   4335  *   pSrcCoeff - pointer to the transform coefficient matrix.  8-byte
   4336  *            alignment required.
   4337  *   pScanMatrix - pointer to the scan order definition matrix.  For a luma
   4338  *            block the scan matrix should follow [ISO14496-10] section 8.5.4,
   4339  *            and should contain the values 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13,
   4340  *            10, 7, 11, 14, 15.  For a chroma block, the scan matrix should
   4341  *            contain the values 0, 1, 2, 3.
   4342  *   bAC - indicates presence of a DC coefficient; 0 = DC coefficient
   4343  *            present, 1= DC coefficient absent.
   4344  *   MaxNumCoef - specifies the number of coefficients contained in the
   4345  *            transform coefficient matrix, pSrcCoeff. The value should be 16
   4346  *            for blocks of type LUMADC, LUMAAC, LUMALEVEL, and CHROMAAC. The
   4347  *            value should be 4 for blocks of type CHROMADC.
   4348  *
   4349  * Output Arguments:
   4350  *
   4351  *   pDstVLCInfo - pointer to structure that stores information for
   4352  *            run-length coding.
   4353  *
   4354  * Return Value:
   4355  *
   4356  *    OMX_Sts_NoErr - no error
   4357  *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
   4358  *              conditions are true:
   4359  *    -    at least one of the following pointers is NULL:
   4360  *            pSrcCoeff, pScanMatrix, pDstVLCInfo
   4361  *    -    pSrcCoeff is not aligned on an 8-byte boundary
   4362  *
   4363  */
   4364 OMXResult omxVCM4P10_GetVLCInfo (
   4365     const OMX_S16 *pSrcCoeff,
   4366     const OMX_U8 *pScanMatrix,
   4367     OMX_U8 bAC,
   4368     OMX_U32 MaxNumCoef,
   4369     OMXVCM4P10VLCInfo*pDstVLCInfo
   4370 );
   4371 
   4372 
   4373 
   4374 #ifdef __cplusplus
   4375 }
   4376 #endif
   4377 
   4378 #endif /** end of #define _OMXVC_H_ */
   4379 
   4380 /** EOF */
   4381 
   4382