blob: 7b3cc7289554a10744eacffc0d0af5ef39d61e8c [file] [log] [blame]
/**
* File: omxVC.h
* Brief: OpenMAX DL v1.0.2 - Video Coding library
*
* Copyright © 2005-2008 The Khronos Group Inc. All Rights Reserved.
*
* These materials are protected by copyright laws and contain material
* proprietary to the Khronos Group, Inc. You may use these materials
* for implementing Khronos specifications, without altering or removing
* any trademark, copyright or other notice from the specification.
*
* Khronos Group makes no, and expressly disclaims any, representations
* or warranties, express or implied, regarding these materials, including,
* without limitation, any implied warranties of merchantability or fitness
* for a particular purpose or non-infringement of any intellectual property.
* Khronos Group makes no, and expressly disclaims any, warranties, express
* or implied, regarding the correctness, accuracy, completeness, timeliness,
* and reliability of these materials.
*
* Under no circumstances will the Khronos Group, or any of its Promoters,
* Contributors or Members or their respective partners, officers, directors,
* employees, agents or representatives be liable for any damages, whether
* direct, indirect, special or consequential damages for lost revenues,
* lost profits, or otherwise, arising from or in connection with these
* materials.
*
* Khronos and OpenMAX are trademarks of the Khronos Group Inc.
*
*/
/* *****************************************************************************************/
#ifndef _OMXVC_H_
#define _OMXVC_H_
#include "omxtypes.h"
#ifdef __cplusplus
extern "C" {
#endif
/* 6.1.1.1 Motion Vectors */
/* In omxVC, motion vectors are represented as follows: */
typedef struct {
OMX_S16 dx;
OMX_S16 dy;
} OMXVCMotionVector;
/**
* Function: omxVCCOMM_Average_8x (6.1.3.1.1)
*
* Description:
* This function calculates the average of two 8x4, 8x8, or 8x16 blocks. The
* result is rounded according to (a+b+1)/2. The block average function can
* be used in conjunction with half-pixel interpolation to obtain quarter
* pixel motion estimates, as described in [ISO14496-10], subclause 8.4.2.2.1.
*
* Input Arguments:
*
* pPred0 - Pointer to the top-left corner of reference block 0
* pPred1 - Pointer to the top-left corner of reference block 1
* iPredStep0 - Step of reference block 0
* iPredStep1 - Step of reference block 1
* iDstStep - Step of the destination buffer.
* iHeight - Height of the blocks
*
* Output Arguments:
*
* pDstPred - Pointer to the destination buffer. 8-byte aligned.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - one or more of the following pointers is NULL: pPred0, pPred1, or
* pDstPred.
* - pDstPred is not aligned on an 8-byte boundary.
* - iPredStep0 <= 0 or iPredStep0 is not a multiple of 8.
* - iPredStep1 <= 0 or iPredStep1 is not a multiple of 8.
* - iDstStep <= 0 or iDstStep is not a multiple of 8.
* - iHeight is not 4, 8, or 16.
*
*/
OMXResult omxVCCOMM_Average_8x (
const OMX_U8 *pPred0,
const OMX_U8 *pPred1,
OMX_U32 iPredStep0,
OMX_U32 iPredStep1,
OMX_U8 *pDstPred,
OMX_U32 iDstStep,
OMX_U32 iHeight
);
/**
* Function: omxVCCOMM_Average_16x (6.1.3.1.2)
*
* Description:
* This function calculates the average of two 16x16 or 16x8 blocks. The
* result is rounded according to (a+b+1)/2. The block average function can
* be used in conjunction with half-pixel interpolation to obtain quarter
* pixel motion estimates, as described in [ISO14496-10], subclause 8.4.2.2.1.
*
* Input Arguments:
*
* pPred0 - Pointer to the top-left corner of reference block 0
* pPred1 - Pointer to the top-left corner of reference block 1
* iPredStep0 - Step of reference block 0
* iPredStep1 - Step of reference block 1
* iDstStep - Step of the destination buffer
* iHeight - Height of the blocks
*
* Output Arguments:
*
* pDstPred - Pointer to the destination buffer. 16-byte aligned.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - one or more of the following pointers is NULL: pPred0, pPred1, or
* pDstPred.
* - pDstPred is not aligned on a 16-byte boundary.
* - iPredStep0 <= 0 or iPredStep0 is not a multiple of 16.
* - iPredStep1 <= 0 or iPredStep1 is not a multiple of 16.
* - iDstStep <= 0 or iDstStep is not a multiple of 16.
* - iHeight is not 8 or 16.
*
*/
OMXResult omxVCCOMM_Average_16x (
const OMX_U8 *pPred0,
const OMX_U8 *pPred1,
OMX_U32 iPredStep0,
OMX_U32 iPredStep1,
OMX_U8 *pDstPred,
OMX_U32 iDstStep,
OMX_U32 iHeight
);
/**
* Function: omxVCCOMM_ExpandFrame_I (6.1.3.2.1)
*
* Description:
* This function expands a reconstructed frame in-place. The unexpanded
* source frame should be stored in a plane buffer with sufficient space
* pre-allocated for edge expansion, and the input frame should be located in
* the plane buffer center. This function executes the pixel expansion by
* replicating source frame edge pixel intensities in the empty pixel
* locations (expansion region) between the source frame edge and the plane
* buffer edge. The width/height of the expansion regions on the
* horizontal/vertical edges is controlled by the parameter iExpandPels.
*
* Input Arguments:
*
* pSrcDstPlane - pointer to the top-left corner of the frame to be
* expanded; must be aligned on an 8-byte boundary.
* iFrameWidth - frame width; must be a multiple of 8.
* iFrameHeight -frame height; must be a multiple of 8.
* iExpandPels - number of pixels to be expanded in the horizontal and
* vertical directions; must be a multiple of 8.
* iPlaneStep - distance, in bytes, between the start of consecutive lines
* in the plane buffer; must be larger than or equal to
* (iFrameWidth + 2 * iExpandPels).
*
* Output Arguments:
*
* pSrcDstPlane -Pointer to the top-left corner of the frame (NOT the
* top-left corner of the plane); must be aligned on an 8-byte
* boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - pSrcDstPlane is NULL.
* - pSrcDstPlane is not aligned on an 8-byte boundary.
* - one of the following parameters is either equal to zero or is a
* non-multiple of 8: iFrameHeight, iFrameWidth, iPlaneStep, or
* iExpandPels.
* - iPlaneStep < (iFrameWidth + 2 * iExpandPels).
*
*/
OMXResult omxVCCOMM_ExpandFrame_I (
OMX_U8 *pSrcDstPlane,
OMX_U32 iFrameWidth,
OMX_U32 iFrameHeight,
OMX_U32 iExpandPels,
OMX_U32 iPlaneStep
);
/**
* Function: omxVCCOMM_Copy8x8 (6.1.3.3.1)
*
* Description:
* Copies the reference 8x8 block to the current block.
*
* Input Arguments:
*
* pSrc - pointer to the reference block in the source frame; must be
* aligned on an 8-byte boundary.
* step - distance between the starts of consecutive lines in the reference
* frame, in bytes; must be a multiple of 8 and must be larger than
* or equal to 8.
*
* Output Arguments:
*
* pDst - pointer to the destination block; must be aligned on an 8-byte
* boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - one or more of the following pointers is NULL: pSrc, pDst
* - one or more of the following pointers is not aligned on an 8-byte
* boundary: pSrc, pDst
* - step <8 or step is not a multiple of 8.
*
*/
OMXResult omxVCCOMM_Copy8x8 (
const OMX_U8 *pSrc,
OMX_U8 *pDst,
OMX_INT step
);
/**
* Function: omxVCCOMM_Copy16x16 (6.1.3.3.2)
*
* Description:
* Copies the reference 16x16 macroblock to the current macroblock.
*
* Input Arguments:
*
* pSrc - pointer to the reference macroblock in the source frame; must be
* aligned on a 16-byte boundary.
* step - distance between the starts of consecutive lines in the reference
* frame, in bytes; must be a multiple of 16 and must be larger
* than or equal to 16.
*
* Output Arguments:
*
* pDst - pointer to the destination macroblock; must be aligned on a
* 16-byte boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - one or more of the following pointers is NULL: pSrc, pDst
* - one or more of the following pointers is not aligned on a 16-byte
* boundary: pSrc, pDst
* - step <16 or step is not a multiple of 16.
*
*/
OMXResult omxVCCOMM_Copy16x16 (
const OMX_U8 *pSrc,
OMX_U8 *pDst,
OMX_INT step
);
/**
* Function: omxVCCOMM_ComputeTextureErrorBlock_SAD (6.1.4.1.1)
*
* Description:
* Computes texture error of the block; also returns SAD.
*
* Input Arguments:
*
* pSrc - pointer to the source plane; must be aligned on an 8-byte
* boundary.
* srcStep - step of the source plane
* pSrcRef - pointer to the reference buffer, an 8x8 block; must be aligned
* on an 8-byte boundary.
*
* Output Arguments:
*
* pDst - pointer to the destination buffer, an 8x8 block; must be aligned
* on an 8-byte boundary.
* pDstSAD - pointer to the Sum of Absolute Differences (SAD) value
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments
* - At least one of the following
* pointers is NULL: pSrc, pSrcRef, pDst and pDstSAD.
* - pSrc is not 8-byte aligned.
* - SrcStep <= 0 or srcStep is not a multiple of 8.
* - pSrcRef is not 8-byte aligned.
* - pDst is not 8-byte aligned.
*
*/
OMXResult omxVCCOMM_ComputeTextureErrorBlock_SAD (
const OMX_U8 *pSrc,
OMX_INT srcStep,
const OMX_U8 *pSrcRef,
OMX_S16 *pDst,
OMX_INT *pDstSAD
);
/**
* Function: omxVCCOMM_ComputeTextureErrorBlock (6.1.4.1.2)
*
* Description:
* Computes the texture error of the block.
*
* Input Arguments:
*
* pSrc - pointer to the source plane. This should be aligned on an 8-byte
* boundary.
* srcStep - step of the source plane
* pSrcRef - pointer to the reference buffer, an 8x8 block. This should be
* aligned on an 8-byte boundary.
*
* Output Arguments:
*
* pDst - pointer to the destination buffer, an 8x8 block. This should be
* aligned on an 8-byte boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - At least one of the following pointers is NULL:
* pSrc, pSrcRef, pDst.
* - pSrc is not 8-byte aligned.
* - SrcStep <= 0 or srcStep is not a multiple of 8.
* - pSrcRef is not 8-byte aligned.
* - pDst is not 8-byte aligned
*
*/
OMXResult omxVCCOMM_ComputeTextureErrorBlock (
const OMX_U8 *pSrc,
OMX_INT srcStep,
const OMX_U8 *pSrcRef,
OMX_S16 *pDst
);
/**
* Function: omxVCCOMM_LimitMVToRect (6.1.4.1.3)
*
* Description:
* Limits the motion vector associated with the current block/macroblock to
* prevent the motion compensated block/macroblock from moving outside a
* bounding rectangle as shown in Figure 6-1.
*
* Input Arguments:
*
* pSrcMV - pointer to the motion vector associated with the current block
* or macroblock
* pRectVOPRef - pointer to the bounding rectangle
* Xcoord, Ycoord - coordinates of the current block or macroblock
* size - size of the current block or macroblock; must be equal to 8 or
* 16.
*
* Output Arguments:
*
* pDstMV - pointer to the limited motion vector
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one or more of the
* following conditions is true:
* - at least one of the following pointers is NULL:
* pSrcMV, pDstMV, or pRectVOPRef.
* - size is not equal to either 8 or 16.
* - the width or height of the bounding rectangle is less than
* twice the block size.
*/
OMXResult omxVCCOMM_LimitMVToRect (
const OMXVCMotionVector *pSrcMV,
OMXVCMotionVector *pDstMV,
const OMXRect *pRectVOPRef,
OMX_INT Xcoord,
OMX_INT Ycoord,
OMX_INT size
);
/**
* Function: omxVCCOMM_SAD_16x (6.1.4.1.4)
*
* Description:
* This function calculates the SAD for 16x16 and 16x8 blocks.
*
* Input Arguments:
*
* pSrcOrg - Pointer to the original block; must be aligned on a 16-byte
* boundary.
* iStepOrg - Step of the original block buffer
* pSrcRef - Pointer to the reference block
* iStepRef - Step of the reference block buffer
* iHeight - Height of the block
*
* Output Arguments:
*
* pDstSAD - Pointer of result SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one or more of the
* following conditions is true:
* - at least one of the following pointers is NULL:
* pSrcOrg, pDstSAD, or pSrcRef
* - pSrcOrg is not 16-byte aligned.
* - iStepOrg <= 0 or iStepOrg is not a multiple of 16
* - iStepRef <= 0 or iStepRef is not a multiple of 16
* - iHeight is not 8 or 16
*
*/
OMXResult omxVCCOMM_SAD_16x (
const OMX_U8 *pSrcOrg,
OMX_U32 iStepOrg,
const OMX_U8 *pSrcRef,
OMX_U32 iStepRef,
OMX_S32 *pDstSAD,
OMX_U32 iHeight
);
/**
* Function: omxVCCOMM_SAD_8x (6.1.4.1.5)
*
* Description:
* This function calculates the SAD for 8x16, 8x8, 8x4 blocks.
*
* Input Arguments:
*
* pSrcOrg - Pointer to the original block; must be aligned on a 8-byte
* boundary.
* iStepOrg - Step of the original block buffer
* pSrcRef - Pointer to the reference block
* iStepRef - Step of the reference block buffer
* iHeight - Height of the block
*
* Output Arguments:
*
* pDstSAD -Pointer of result SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one or more of the
* following conditions is true:
* - at least one of the following pointers is NULL:
* pSrcOrg, pDstSAD, or pSrcRef
* - pSrcOrg is not 8-byte aligned.
* - iStepOrg <= 0 or iStepOrg is not a multiple of 8
* - iStepRef <= 0 or iStepRef is not a multiple of 8
* - iHeight is not 4, 8 or 16
*
*/
OMXResult omxVCCOMM_SAD_8x (
const OMX_U8 *pSrcOrg,
OMX_U32 iStepOrg,
const OMX_U8 *pSrcRef,
OMX_U32 iStepRef,
OMX_S32*pDstSAD,
OMX_U32 iHeight
);
/* 6.2.1.1 Direction */
/* The direction enumerator is used with functions that perform AC/DC prediction and zig-zag scan. */
enum {
OMX_VC_NONE = 0,
OMX_VC_HORIZONTAL = 1,
OMX_VC_VERTICAL = 2
};
/* 6.2.1.2 Bilinear Interpolation */
/* The bilinear interpolation enumerator is used with motion estimation, motion compensation, and reconstruction functions. */
enum {
OMX_VC_INTEGER_PIXEL = 0, /* case a */
OMX_VC_HALF_PIXEL_X = 1, /* case b */
OMX_VC_HALF_PIXEL_Y = 2, /* case c */
OMX_VC_HALF_PIXEL_XY = 3 /* case d */
};
/* 6.2.1.3 Neighboring Macroblock Availability */
/* Neighboring macroblock availability is indicated using the following flags: */
enum {
OMX_VC_UPPER = 1, /** above macroblock is available */
OMX_VC_LEFT = 2, /** left macroblock is available */
OMX_VC_CENTER = 4,
OMX_VC_RIGHT = 8,
OMX_VC_LOWER = 16,
OMX_VC_UPPER_LEFT = 32, /** above-left macroblock is available */
OMX_VC_UPPER_RIGHT = 64, /** above-right macroblock is available */
OMX_VC_LOWER_LEFT = 128,
OMX_VC_LOWER_RIGHT = 256
};
/* 6.2.1.4 Video Components */
/* A data type that enumerates video components is defined as follows: */
typedef enum {
OMX_VC_LUMINANCE, /** Luminance component */
OMX_VC_CHROMINANCE /** chrominance component */
} OMXVCM4P2VideoComponent;
/* 6.2.1.5 MacroblockTypes */
/* A data type that enumerates macroblock types is defined as follows: */
typedef enum {
OMX_VC_INTER = 0, /** P picture or P-VOP */
OMX_VC_INTER_Q = 1, /** P picture or P-VOP */
OMX_VC_INTER4V = 2, /** P picture or P-VOP */
OMX_VC_INTRA = 3, /** I and P picture, I- and P-VOP */
OMX_VC_INTRA_Q = 4, /** I and P picture, I- and P-VOP */
OMX_VC_INTER4V_Q = 5 /** P picture or P-VOP (H.263)*/
} OMXVCM4P2MacroblockType;
/* 6.2.1.6 Coordinates */
/* Coordinates are represented as follows: */
typedef struct {
OMX_INT x;
OMX_INT y;
} OMXVCM4P2Coordinate;
/* 6.2.1.7 Motion Estimation Algorithms */
/* A data type that enumerates motion estimation search methods is defined as follows: */
typedef enum {
OMX_VC_M4P2_FAST_SEARCH = 0, /** Fast motion search */
OMX_VC_M4P2_FULL_SEARCH = 1 /** Full motion search */
} OMXVCM4P2MEMode;
/* 6.2.1.8 Motion Estimation Parameters */
/* A data structure containing control parameters for
* motion estimation functions is defined as follows:
*/
typedef struct {
OMX_INT searchEnable8x8; /** enables 8x8 search */
OMX_INT halfPelSearchEnable; /** enables half-pel resolution */
OMX_INT searchRange; /** search range */
OMX_INT rndVal; /** rounding control; 0-disabled, 1-enabled*/
} OMXVCM4P2MEParams;
/* 6.2.1.9 Macroblock Information */
/* A data structure containing macroblock parameters for
* motion estimation functions is defined as follows:
*/
typedef struct {
OMX_S32 sliceId; /* slice number */
OMXVCM4P2MacroblockType mbType; /* MB type: OMX_VC_INTRA, OMX_VC_INTER, or OMX_VC_INTER4 */
OMX_S32 qp; /* quantization parameter*/
OMX_U32 cbpy; /* CBP Luma */
OMX_U32 cbpc; /* CBP Chroma */
OMXVCMotionVector pMV0[2][2]; /* motion vector, represented using 1/2-pel units,
* pMV0[blocky][blockx] (blocky = 0~1, blockx =0~1)
*/
OMXVCMotionVector pMVPred[2][2]; /* motion vector prediction, represented using 1/2-pel units,
* pMVPred[blocky][blockx] (blocky = 0~1, blockx = 0~1)
*/
OMX_U8 pPredDir[2][2]; /* AC prediction direction:
* OMX_VC_NONE, OMX_VC_VERTICAL, OMX_VC_HORIZONTAL
*/
} OMXVCM4P2MBInfo, *OMXVCM4P2MBInfoPtr;
/**
* Function: omxVCM4P2_FindMVpred (6.2.3.1.1)
*
* Description:
* Predicts a motion vector for the current block using the procedure
* specified in [ISO14496-2], subclause 7.6.5. The resulting predicted MV is
* returned in pDstMVPred. If the parameter pDstMVPredME if is not NULL then
* the set of three MV candidates used for prediction is also returned,
* otherwise pDstMVPredMEis NULL upon return.
*
* Input Arguments:
*
* pSrcMVCurMB - pointer to the MV buffer associated with the current Y
* macroblock; a value of NULL indicates unavailability.
* pSrcCandMV1 - pointer to the MV buffer containing the 4 MVs associated
* with the MB located to the left of the current MB; set to NULL
* if there is no MB to the left.
* pSrcCandMV2 - pointer to the MV buffer containing the 4 MVs associated
* with the MB located above the current MB; set to NULL if there
* is no MB located above the current MB.
* pSrcCandMV3 - pointer to the MV buffer containing the 4 MVs associated
* with the MB located to the right and above the current MB; set
* to NULL if there is no MB located to the above-right.
* iBlk - the index of block in the current macroblock
* pDstMVPredME - MV candidate return buffer; if set to NULL then
* prediction candidate MVs are not returned and pDstMVPredME will
* be NULL upon function return; if pDstMVPredME is non-NULL then it
* must point to a buffer containing sufficient space for three
* return MVs.
*
* Output Arguments:
*
* pDstMVPred - pointer to the predicted motion vector
* pDstMVPredME - if non-NULL upon input then pDstMVPredME points upon
* return to a buffer containing the three motion vector candidates
* used for prediction as specified in [ISO14496-2], subclause
* 7.6.5, otherwise if NULL upon input then pDstMVPredME is NULL
* upon output.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - the pointer pDstMVPred is NULL
* - the parameter iBlk does not fall into the range 0 <= iBlk<=3
*
*/
OMXResult omxVCM4P2_FindMVpred (
const OMXVCMotionVector *pSrcMVCurMB,
const OMXVCMotionVector *pSrcCandMV1,
const OMXVCMotionVector *pSrcCandMV2,
const OMXVCMotionVector *pSrcCandMV3,
OMXVCMotionVector *pDstMVPred,
OMXVCMotionVector *pDstMVPredME,
OMX_INT iBlk
);
/**
* Function: omxVCM4P2_IDCT8x8blk (6.2.3.2.1)
*
* Description:
* Computes a 2D inverse DCT for a single 8x8 block, as defined in
* [ISO14496-2].
*
* Input Arguments:
*
* pSrc - pointer to the start of the linearly arranged IDCT input buffer;
* must be aligned on a 16-byte boundary. According to
* [ISO14496-2], the input coefficient values should lie within the
* range [-2048, 2047].
*
* Output Arguments:
*
* pDst - pointer to the start of the linearly arranged IDCT output buffer;
* must be aligned on a 16-byte boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - pSrc or pDst is NULL.
* - pSrc or pDst is not 16-byte aligned.
*
*/
OMXResult omxVCM4P2_IDCT8x8blk (
const OMX_S16 *pSrc,
OMX_S16 *pDst
);
/**
* Function: omxVCM4P2_MEGetBufSize (6.2.4.1.1)
*
* Description:
* Computes the size, in bytes, of the vendor-specific specification
* structure for the following motion estimation functions:
* BlockMatch_Integer_8x8, BlockMatch_Integer_16x16, and MotionEstimationMB.
*
* Input Arguments:
*
* MEmode - motion estimation mode; available modes are defined by the
* enumerated type OMXVCM4P2MEMode
* pMEParams - motion estimation parameters
*
* Output Arguments:
*
* pSize - pointer to the number of bytes required for the specification
* structure
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - one or more of the following is true:
* - an invalid value was specified for the parameter MEmode
* - a negative or zero value was specified for the
* parameter pMEParams->searchRange
*
*/
OMXResult omxVCM4P2_MEGetBufSize (
OMXVCM4P2MEMode MEmode,
const OMXVCM4P2MEParams *pMEParams,
OMX_U32 *pSize
);
/**
* Function: omxVCM4P2_MEInit (6.2.4.1.2)
*
* Description:
* Initializes the vendor-specific specification structure required for the
* following motion estimation functions: BlockMatch_Integer_8x8,
* BlockMatch_Integer_16x16, and MotionEstimationMB. Memory for the
* specification structure *pMESpec must be allocated prior to calling the
* function, and should be aligned on a 4-byte boundary. Following
* initialization by this function, the vendor-specific structure *pMESpec
* should contain an implementation-specific representation of all motion
* estimation parameters received via the structure pMEParams, for example
* rndVal, searchRange, etc. The number of bytes required for the
* specification structure can be determined using the function
* omxVCM4P2_MEGetBufSize.
*
* Input Arguments:
*
* MEmode - motion estimation mode; available modes are defined by the
* enumerated type OMXVCM4P2MEMode
* pMEParams - motion estimation parameters
* pMESpec - pointer to the uninitialized ME specification structure
*
* Output Arguments:
*
* pMESpec - pointer to the initialized ME specification structure
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - one or more of the following is true:
* - an invalid value was specified for the parameter MEmode
* - a negative or zero value was specified for the
* parameter pMEParams->searchRange
*
*/
OMXResult omxVCM4P2_MEInit (
OMXVCM4P2MEMode MEmode,
const OMXVCM4P2MEParams*pMEParams,
void *pMESpec
);
/**
* Function: omxVCM4P2_BlockMatch_Integer_16x16 (6.2.4.2.1)
*
* Description:
* Performs a 16x16 block search; estimates motion vector and associated
* minimum SAD. Both the input and output motion vectors are represented using
* half-pixel units, and therefore a shift left or right by 1 bit may be
* required, respectively, to match the input or output MVs with other
* functions that either generate output MVs or expect input MVs represented
* using integer pixel units.
*
* Input Arguments:
*
* pSrcRefBuf - pointer to the reference Y plane; points to the reference
* MB that corresponds to the location of the current macroblock in
* the current plane.
* refWidth - width of the reference plane
* pRefRect - pointer to the valid reference plane rectangle; coordinates
* are specified relative to the image origin. Rectangle
* boundaries may extend beyond image boundaries if the image has
* been padded. For example, if padding extends 4 pixels beyond
* frame border, then the value for the left border could be set to
* -4.
* pSrcCurrBuf - pointer to the current block in the current macroblock
* buffer extracted from the original plane (linear array, 256
* entries); must be aligned on a 16-byte boundary. The number of
* bytes between lines (step) is 16.
* pCurrPointPos - position of the current macroblock in the current plane
* pSrcPreMV - pointer to predicted motion vector; NULL indicates no
* predicted MV
* pSrcPreSAD - pointer to SAD associated with the predicted MV (referenced
* by pSrcPreMV); may be set to NULL if unavailable.
* pMESpec - vendor-specific motion estimation specification structure;
* must have been allocated and then initialized using
* omxVCM4P2_MEInit prior to calling the block matching function.
*
* Output Arguments:
*
* pDstMV - pointer to estimated MV
* pDstSAD - pointer to minimum SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one of the following
* conditions is true:
* - at least one of the following pointers is NULL: pSrcRefBuf,
* pRefRect, pSrcCurrBuff, pCurrPointPos, pDstMV, pDstSAD or
* pMESpec, or
* - pSrcCurrBuf is not 16-byte aligned
*
*/
OMXResult omxVCM4P2_BlockMatch_Integer_16x16 (
const OMX_U8 *pSrcRefBuf,
OMX_INT refWidth,
const OMXRect *pRefRect,
const OMX_U8 *pSrcCurrBuf,
const OMXVCM4P2Coordinate *pCurrPointPos,
const OMXVCMotionVector*pSrcPreMV,
const OMX_INT *pSrcPreSAD,
void *pMESpec,
OMXVCMotionVector*pDstMV,
OMX_INT *pDstSAD
);
/**
* Function: omxVCM4P2_BlockMatch_Integer_8x8 (6.2.4.2.2)
*
* Description:
* Performs an 8x8 block search; estimates motion vector and associated
* minimum SAD. Both the input and output motion vectors are represented
* using half-pixel units, and therefore a shift left or right by 1 bit may be
* required, respectively, to match the input or output MVs with other
* functions that either generate output MVs or expect input MVs represented
* using integer pixel units.
*
* Input Arguments:
*
* pSrcRefBuf - pointer to the reference Y plane; points to the reference
* block that corresponds to the location of the current 8x8 block
* in the current plane.
* refWidth - width of the reference plane
* pRefRect - pointer to the valid reference plane rectangle; coordinates
* are specified relative to the image origin. Rectangle
* boundaries may extend beyond image boundaries if the image has
* been padded.
* pSrcCurrBuf - pointer to the current block in the current macroblock
* buffer extracted from the original plane (linear array, 128
* entries); must be aligned on an 8-byte boundary. The number of
* bytes between lines (step) is 16 bytes.
* pCurrPointPos - position of the current block in the current plane
* pSrcPreMV - pointer to predicted motion vector; NULL indicates no
* predicted MV
* pSrcPreSAD - pointer to SAD associated with the predicted MV (referenced
* by pSrcPreMV); may be set to NULL if unavailable.
* pMESpec - vendor-specific motion estimation specification structure;
* must have been allocated and then initialized using
* omxVCM4P2_MEInit prior to calling the block matching function.
*
* Output Arguments:
*
* pDstMV - pointer to estimated MV
* pDstSAD - pointer to minimum SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one of the following
* conditions is true:
* - at least one of the following pointers is NULL: pSrcRefBuf,
* pRefRect, pSrcCurrBuff, pCurrPointPos, pDstMV, pDstSAD or
* pMESpec, or
* - pSrcCurrBuf is not 8-byte aligned
*
*/
OMXResult omxVCM4P2_BlockMatch_Integer_8x8 (
const OMX_U8 *pSrcRefBuf,
OMX_INT refWidth,
const OMXRect *pRefRect,
const OMX_U8 *pSrcCurrBuf,
const OMXVCM4P2Coordinate *pCurrPointPos,
const OMXVCMotionVector *pSrcPreMV,
const OMX_INT *pSrcPreSAD,
void *pMESpec,
OMXVCMotionVector *pDstMV,
OMX_INT *pDstSAD
);
/**
* Function: omxVCM4P2_BlockMatch_Half_16x16 (6.2.4.2.3)
*
* Description:
* Performs a 16x16 block match with half-pixel resolution. Returns the
* estimated motion vector and associated minimum SAD. This function
* estimates the half-pixel motion vector by interpolating the integer
* resolution motion vector referenced by the input parameter pSrcDstMV, i.e.,
* the initial integer MV is generated externally. The input parameters
* pSrcRefBuf and pSearchPointRefPos should be shifted by the winning MV of
* 16x16 integer search prior to calling BlockMatch_Half_16x16. The function
* BlockMatch_Integer_16x16 may be used for integer motion estimation.
*
* Input Arguments:
*
* pSrcRefBuf - pointer to the reference Y plane; points to the reference
* macroblock that corresponds to the location of the current
* macroblock in the current plane.
* refWidth - width of the reference plane
* pRefRect - reference plane valid region rectangle
* pSrcCurrBuf - pointer to the current block in the current macroblock
* buffer extracted from the original plane (linear array, 256
* entries); must be aligned on a 16-byte boundary. The number of
* bytes between lines (step) is 16.
* pSearchPointRefPos - position of the starting point for half pixel
* search (specified in terms of integer pixel units) in the
* reference plane, i.e., the reference position pointed to by the
* predicted motion vector.
* rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
* pSrcDstMV - pointer to the initial MV estimate; typically generated
* during a prior 16X16 integer search; specified in terms of
* half-pixel units.
*
* Output Arguments:
*
* pSrcDstMV - pointer to estimated MV
* pDstSAD - pointer to minimum SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one of the following
* conditions is true:
* - at least one of the following pointers is NULL: pSrcRefBuf,
* pRefRect, pSrcCurrBuff, pSearchPointRefPos, pSrcDstMV.
* - pSrcCurrBuf is not 16-byte aligned, or
*
*/
OMXResult omxVCM4P2_BlockMatch_Half_16x16 (
const OMX_U8 *pSrcRefBuf,
OMX_INT refWidth,
const OMXRect *pRefRect,
const OMX_U8 *pSrcCurrBuf,
const OMXVCM4P2Coordinate *pSearchPointRefPos,
OMX_INT rndVal,
OMXVCMotionVector *pSrcDstMV,
OMX_INT *pDstSAD
);
/**
* Function: omxVCM4P2_BlockMatch_Half_8x8 (6.2.4.2.4)
*
* Description:
* Performs an 8x8 block match with half-pixel resolution. Returns the
* estimated motion vector and associated minimum SAD. This function
* estimates the half-pixel motion vector by interpolating the integer
* resolution motion vector referenced by the input parameter pSrcDstMV, i.e.,
* the initial integer MV is generated externally. The input parameters
* pSrcRefBuf and pSearchPointRefPos should be shifted by the winning MV of
* 8x8 integer search prior to calling BlockMatch_Half_8x8. The function
* BlockMatch_Integer_8x8 may be used for integer motion estimation.
*
* Input Arguments:
*
* pSrcRefBuf - pointer to the reference Y plane; points to the reference
* block that corresponds to the location of the current 8x8 block
* in the current plane.
* refWidth - width of the reference plane
* pRefRect - reference plane valid region rectangle
* pSrcCurrBuf - pointer to the current block in the current macroblock
* buffer extracted from the original plane (linear array, 128
* entries); must be aligned on a 8-byte boundary. The number of
* bytes between lines (step) is 16.
* pSearchPointRefPos - position of the starting point for half pixel
* search (specified in terms of integer pixel units) in the
* reference plane.
* rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
* pSrcDstMV - pointer to the initial MV estimate; typically generated
* during a prior 8x8 integer search, specified in terms of
* half-pixel units.
*
* Output Arguments:
*
* pSrcDstMV - pointer to estimated MV
* pDstSAD - pointer to minimum SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one of the following
* conditions is true:
* - at least one of the following pointers is NULL:
* pSrcRefBuf, pRefRect, pSrcCurrBuff, pSearchPointRefPos, pSrcDstMV
* - pSrcCurrBuf is not 8-byte aligned
*
*/
OMXResult omxVCM4P2_BlockMatch_Half_8x8 (
const OMX_U8 *pSrcRefBuf,
OMX_INT refWidth,
const OMXRect *pRefRect,
const OMX_U8 *pSrcCurrBuf,
const OMXVCM4P2Coordinate *pSearchPointRefPos,
OMX_INT rndVal,
OMXVCMotionVector *pSrcDstMV,
OMX_INT *pDstSAD
);
/**
* Function: omxVCM4P2_MotionEstimationMB (6.2.4.3.1)
*
* Description:
* Performs motion search for a 16x16 macroblock. Selects best motion search
* strategy from among inter-1MV, inter-4MV, and intra modes. Supports
* integer and half pixel resolution.
*
* Input Arguments:
*
* pSrcCurrBuf - pointer to the top-left corner of the current MB in the
* original picture plane; must be aligned on a 16-byte boundary.
* The function does not expect source data outside the region
* bounded by the MB to be available; for example it is not
* necessary for the caller to guarantee the availability of
* pSrcCurrBuf[-SrcCurrStep], i.e., the row of pixels above the MB
* to be processed.
* srcCurrStep - width of the original picture plane, in terms of full
* pixels; must be a multiple of 16.
* pSrcRefBuf - pointer to the reference Y plane; points to the reference
* plane location corresponding to the location of the current
* macroblock in the current plane; must be aligned on a 16-byte
* boundary.
* srcRefStep - width of the reference picture plane, in terms of full
* pixels; must be a multiple of 16.
* pRefRect - reference plane valid region rectangle, specified relative to
* the image origin
* pCurrPointPos - position of the current macroblock in the current plane
* pMESpec - pointer to the vendor-specific motion estimation specification
* structure; must be allocated and then initialized using
* omxVCM4P2_MEInit prior to calling this function.
* pMBInfo - array, of dimension four, containing pointers to information
* associated with four nearby MBs:
* - pMBInfo[0] - pointer to left MB information
* - pMBInfo[1] - pointer to top MB information
* - pMBInfo[2] - pointer to top-left MB information
* - pMBInfo[3] - pointer to top-right MB information
* Any pointer in the array may be set equal to NULL if the
* corresponding MB doesn't exist. For each MB, the following structure
* members are used:
* - mbType - macroblock type, either OMX_VC_INTRA, OMX_VC_INTER, or
* OMX_VC_INTER4V
* - pMV0[2][2] - estimated motion vectors; represented
* in 1/2 pixel units
* - sliceID - number of the slice to which the MB belongs
* pSrcDstMBCurr - pointer to information structure for the current MB.
* The following entries should be set prior to calling the
* function: sliceID - the number of the slice the to which the
* current MB belongs. The structure elements cbpy and cbpc are
* ignored.
*
* Output Arguments:
*
* pSrcDstMBCurr - pointer to updated information structure for the current
* MB after MB-level motion estimation has been completed. The
* following structure members are updated by the ME function:
* - mbType - macroblock type: OMX_VC_INTRA, OMX_VC_INTER, or
* OMX_VC_INTER4V.
* - pMV0[2][2] - estimated motion vectors; represented in
* terms of 1/2 pel units.
* - pMVPred[2][2] - predicted motion vectors; represented
* in terms of 1/2 pel units.
* The structure members cbpy and cbpc are not updated by the function.
* pDstSAD - pointer to the minimum SAD for INTER1V, or sum of minimum SADs
* for INTER4V
* pDstBlockSAD - pointer to an array of SAD values for each of the four
* 8x8 luma blocks in the MB. The block SADs are in scan order for
* each MB.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments. Returned if one or more of the
* following conditions is true:
* - at least one of the following pointers is NULL: pSrcCurrBuf,
* pSrcRefBuf, pRefRect, pCurrPointPos, pMBInter, pMBIntra,
* pSrcDstMBCurr, or pDstSAD.
*
*/
OMXResult omxVCM4P2_MotionEstimationMB (
const OMX_U8 *pSrcCurrBuf,
OMX_S32 srcCurrStep,
const OMX_U8 *pSrcRefBuf,
OMX_S32 srcRefStep,
const OMXRect*pRefRect,
const OMXVCM4P2Coordinate *pCurrPointPos,
void *pMESpec,
const OMXVCM4P2MBInfoPtr *pMBInfo,
OMXVCM4P2MBInfo *pSrcDstMBCurr,
OMX_U16 *pDstSAD,
OMX_U16 *pDstBlockSAD
);
/**
* Function: omxVCM4P2_DCT8x8blk (6.2.4.4.1)
*
* Description:
* Computes a 2D forward DCT for a single 8x8 block, as defined in
* [ISO14496-2].
*
* Input Arguments:
*
* pSrc - pointer to the start of the linearly arranged input buffer; must
* be aligned on a 16-byte boundary. Input values (pixel
* intensities) are valid in the range [-255,255].
*
* Output Arguments:
*
* pDst - pointer to the start of the linearly arranged output buffer; must
* be aligned on a 16-byte boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments, returned if:
* - pSrc or pDst is NULL.
* - pSrc or pDst is not 16-byte aligned.
*
*/
OMXResult omxVCM4P2_DCT8x8blk (
const OMX_S16 *pSrc,
OMX_S16 *pDst
);
/**
* Function: omxVCM4P2_QuantIntra_I (6.2.4.4.2)
*
* Description:
* Performs quantization on intra block coefficients. This function supports
* bits_per_pixel == 8.
*
* Input Arguments:
*
* pSrcDst - pointer to the input intra block coefficients; must be aligned
* on a 16-byte boundary.
* QP - quantization parameter (quantizer_scale).
* blockIndex - block index indicating the component type and position,
* valid in the range 0 to 5, as defined in [ISO14496-2], subclause
* 6.1.3.8.
* shortVideoHeader - binary flag indicating presence of
* short_video_header; shortVideoHeader==1 selects linear intra DC
* mode, and shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* pSrcDst - pointer to the output (quantized) interblock coefficients.
* When shortVideoHeader==1, AC coefficients are saturated on the
* interval [-127, 127], and DC coefficients are saturated on the
* interval [1, 254]. When shortVideoHeader==0, AC coefficients
* are saturated on the interval [-2047, 2047].
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - pSrcDst is NULL.
* - blockIndex < 0 or blockIndex >= 10
* - QP <= 0 or QP >= 32.
*
*/
OMXResult omxVCM4P2_QuantIntra_I (
OMX_S16 *pSrcDst,
OMX_U8 QP,
OMX_INT blockIndex,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_QuantInter_I (6.2.4.4.3)
*
* Description:
* Performs quantization on an inter coefficient block; supports
* bits_per_pixel == 8.
*
* Input Arguments:
*
* pSrcDst - pointer to the input inter block coefficients; must be aligned
* on a 16-byte boundary.
* QP - quantization parameter (quantizer_scale)
* shortVideoHeader - binary flag indicating presence of short_video_header;
* shortVideoHeader==1 selects linear intra DC mode, and
* shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* pSrcDst - pointer to the output (quantized) interblock coefficients.
* When shortVideoHeader==1, AC coefficients are saturated on the
* interval [-127, 127], and DC coefficients are saturated on the
* interval [1, 254]. When shortVideoHeader==0, AC coefficients
* are saturated on the interval [-2047, 2047].
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - pSrcDst is NULL.
* - QP <= 0 or QP >= 32.
*
*/
OMXResult omxVCM4P2_QuantInter_I (
OMX_S16 *pSrcDst,
OMX_U8 QP,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_TransRecBlockCoef_intra (6.2.4.4.4)
*
* Description:
* Quantizes the DCT coefficients, implements intra block AC/DC coefficient
* prediction, and reconstructs the current intra block texture for prediction
* on the next frame. Quantized row and column coefficients are returned in
* the updated coefficient buffers.
*
* Input Arguments:
*
* pSrc - pointer to the pixels of current intra block; must be aligned on
* an 8-byte boundary.
* pPredBufRow - pointer to the coefficient row buffer containing
* ((num_mb_per_row * 2 + 1) * 8) elements of type OMX_S16.
* Coefficients are organized into blocks of eight as described
* below (Internal Prediction Coefficient Update Procedures). The
* DC coefficient is first, and the remaining buffer locations
* contain the quantized AC coefficients. Each group of eight row
* buffer elements combined with one element eight elements ahead
* contains the coefficient predictors of the neighboring block
* that is spatially above or to the left of the block currently to
* be decoded. A negative-valued DC coefficient indicates that this
* neighboring block is not INTRA-coded or out of bounds, and
* therefore the AC and DC coefficients are invalid. Pointer must
* be aligned on an 8-byte boundary.
* pPredBufCol - pointer to the prediction coefficient column buffer
* containing 16 elements of type OMX_S16. Coefficients are
* organized as described in section 6.2.2.5. Pointer must be
* aligned on an 8-byte boundary.
* pSumErr - pointer to a flag indicating whether or not AC prediction is
* required; AC prediction is enabled if *pSumErr >=0, but the
* value is not used for coefficient prediction, i.e., the sum of
* absolute differences starts from 0 for each call to this
* function. Otherwise AC prediction is disabled if *pSumErr < 0 .
* blockIndex - block index indicating the component type and position, as
* defined in [ISO14496-2], subclause 6.1.3.8.
* curQp - quantization parameter of the macroblock to which the current
* block belongs
* pQpBuf - pointer to a 2-element quantization parameter buffer; pQpBuf[0]
* contains the quantization parameter associated with the 8x8
* block left of the current block (QPa), and pQpBuf[1] contains
* the quantization parameter associated with the 8x8 block above
* the current block (QPc). In the event that the corresponding
* block is outside of the VOP bound, the Qp value will not affect
* the intra prediction process, as described in [ISO14496-2],
* sub-clause 7.4.3.3, Adaptive AC Coefficient Prediction.
* srcStep - width of the source buffer; must be a multiple of 8.
* dstStep - width of the reconstructed destination buffer; must be a
* multiple of 16.
* shortVideoHeader - binary flag indicating presence of
* short_video_header; shortVideoHeader==1 selects linear intra DC
* mode, and shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* pDst - pointer to the quantized DCT coefficient buffer; pDst[0] contains
* the predicted DC coefficient; the remaining entries contain the
* quantized AC coefficients (without prediction). The pointer
* pDstmust be aligned on a 16-byte boundary.
* pRec - pointer to the reconstructed texture; must be aligned on an
* 8-byte boundary.
* pPredBufRow - pointer to the updated coefficient row buffer
* pPredBufCol - pointer to the updated coefficient column buffer
* pPreACPredict - if prediction is enabled, the parameter points to the
* start of the buffer containing the coefficient differences for
* VLC encoding. The entry pPreACPredict[0]indicates prediction
* direction for the current block and takes one of the following
* values: OMX_VC_NONE (prediction disabled), OMX_VC_HORIZONTAL, or
* OMX_VC_VERTICAL. The entries
* pPreACPredict[1]-pPreACPredict[7]contain predicted AC
* coefficients. If prediction is disabled (*pSumErr<0) then the
* contents of this buffer are undefined upon return from the
* function
* pSumErr - pointer to the value of the accumulated AC coefficient errors,
* i.e., sum of the absolute differences between predicted and
* unpredicted AC coefficients
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - Bad arguments:
* - At least one of the following pointers is NULL: pSrc, pDst, pRec,
* pCoefBufRow, pCoefBufCol, pQpBuf, pPreACPredict, pSumErr.
* - blockIndex < 0 or blockIndex >= 10;
* - curQP <= 0 or curQP >= 32.
* - srcStep, or dstStep <= 0 or not a multiple of 8.
* - pDst is not 16-byte aligned: .
* - At least one of the following pointers is not 8-byte aligned:
* pSrc, pRec.
*
* Note: The coefficient buffers must be updated in accordance with the
* update procedures defined in section in 6.2.2.
*
*/
OMXResult omxVCM4P2_TransRecBlockCoef_intra (
const OMX_U8 *pSrc,
OMX_S16 *pDst,
OMX_U8 *pRec,
OMX_S16 *pPredBufRow,
OMX_S16 *pPredBufCol,
OMX_S16 *pPreACPredict,
OMX_INT *pSumErr,
OMX_INT blockIndex,
OMX_U8 curQp,
const OMX_U8 *pQpBuf,
OMX_INT srcStep,
OMX_INT dstStep,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_TransRecBlockCoef_inter (6.2.4.4.5)
*
* Description:
* Implements DCT, and quantizes the DCT coefficients of the inter block
* while reconstructing the texture residual. There is no boundary check for
* the bit stream buffer.
*
* Input Arguments:
*
* pSrc -pointer to the residuals to be encoded; must be aligned on an
* 16-byte boundary.
* QP - quantization parameter.
* shortVideoHeader - binary flag indicating presence of short_video_header;
* shortVideoHeader==1 selects linear intra DC mode, and
* shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* pDst - pointer to the quantized DCT coefficients buffer; must be aligned
* on a 16-byte boundary.
* pRec - pointer to the reconstructed texture residuals; must be aligned
* on a 16-byte boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - At least one of the following pointers is either NULL or
* not 16-byte aligned:
* - pSrc
* - pDst
* - pRec
* - QP <= 0 or QP >= 32.
*
*/
OMXResult omxVCM4P2_TransRecBlockCoef_inter (
const OMX_S16 *pSrc,
OMX_S16 *pDst,
OMX_S16 *pRec,
OMX_U8 QP,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_EncodeVLCZigzag_IntraDCVLC (6.2.4.5.2)
*
* Description:
* Performs zigzag scan and VLC encoding of AC and DC coefficients for one
* intra block. Two versions of the function (DCVLC and ACVLC) are provided
* in order to support the two different methods of processing DC
* coefficients, as described in [ISO14496-2], subclause 7.4.1.4, "Intra DC
* Coefficient Decoding for the Case of Switched VLC Encoding".
*
* Input Arguments:
*
* ppBitStream - double pointer to the current byte in the bitstream
* pBitOffset - pointer to the bit position in the byte pointed by
* *ppBitStream. Valid within 0 to 7.
* pQDctBlkCoef - pointer to the quantized DCT coefficient
* predDir - AC prediction direction, which is used to decide the zigzag
* scan pattern; takes one of the following values:
* - OMX_VC_NONE - AC prediction not used.
* Performs classical zigzag scan.
* - OMX_VC_HORIZONTAL - Horizontal prediction.
* Performs alternate-vertical zigzag scan.
* - OMX_VC_VERTICAL - Vertical prediction.
* Performs alternate-horizontal zigzag scan.
* pattern - block pattern which is used to decide whether this block is
* encoded
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
* videoComp - video component type (luminance, chrominance) of the current
* block
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is encoded, so
* that it points to the current byte in the bit stream buffer.
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - Bad arguments:
* - At least one of the following pointers is NULL: ppBitStream,
* *ppBitStream, pBitOffset, pQDctBlkCoef.
* - *pBitOffset < 0, or *pBitOffset >7.
* - PredDir is not one of: OMX_VC_NONE, OMX_VC_HORIZONTAL, or
* OMX_VC_VERTICAL.
* - VideoComp is not one component of enum OMXVCM4P2VideoComponent.
*
*/
OMXResult omxVCM4P2_EncodeVLCZigzag_IntraDCVLC (
OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
const OMX_S16 *pQDctBlkCoef,
OMX_U8 predDir,
OMX_U8 pattern,
OMX_INT shortVideoHeader,
OMXVCM4P2VideoComponent videoComp
);
/**
* Function: omxVCM4P2_EncodeVLCZigzag_IntraACVLC (6.2.4.5.2)
*
* Description:
* Performs zigzag scan and VLC encoding of AC and DC coefficients for one
* intra block. Two versions of the function (DCVLC and ACVLC) are provided
* in order to support the two different methods of processing DC
* coefficients, as described in [ISO14496-2], subclause 7.4.1.4, Intra DC
* Coefficient Decoding for the Case of Switched VLC Encoding.
*
* Input Arguments:
*
* ppBitStream - double pointer to the current byte in the bitstream
* pBitOffset - pointer to the bit position in the byte pointed by
* *ppBitStream. Valid within 0 to 7.
* pQDctBlkCoef - pointer to the quantized DCT coefficient
* predDir - AC prediction direction, which is used to decide the zigzag
* scan pattern; takes one of the following values:
* - OMX_VC_NONE - AC prediction not used.
* Performs classical zigzag scan.
* - OMX_VC_HORIZONTAL - Horizontal prediction.
* Performs alternate-vertical zigzag scan.
* - OMX_VC_VERTICAL - Vertical prediction.
* Performs alternate-horizontal zigzag scan.
* pattern - block pattern which is used to decide whether this block is
* encoded
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is encoded, so
* that it points to the current byte in the bit stream buffer.
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - Bad arguments:
* - At least one of the following pointers is NULL: ppBitStream,
* *ppBitStream, pBitOffset, pQDctBlkCoef.
* - *pBitOffset < 0, or *pBitOffset >7.
* - PredDir is not one of: OMX_VC_NONE, OMX_VC_HORIZONTAL, or
* OMX_VC_VERTICAL.
* - VideoComp is not one component of enum OMXVCM4P2VideoComponent.
*
*/
OMXResult omxVCM4P2_EncodeVLCZigzag_IntraACVLC (
OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
const OMX_S16 *pQDctBlkCoef,
OMX_U8 predDir,
OMX_U8 pattern,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_EncodeVLCZigzag_Inter (6.2.4.5.3)
*
* Description:
* Performs classical zigzag scanning and VLC encoding for one inter block.
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the bit
* stream
* pBitOffset - pointer to the bit position in the byte pointed by
* *ppBitStream. Valid within 0 to 7
* pQDctBlkCoef - pointer to the quantized DCT coefficient
* pattern - block pattern which is used to decide whether this block is
* encoded
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is encoded so that
* it points to the current byte in the bit stream buffer.
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - Bad arguments
* - At least one of the pointers: is NULL: ppBitStream, *ppBitStream,
* pBitOffset, pQDctBlkCoef
* - *pBitOffset < 0, or *pBitOffset >7.
*
*/
OMXResult omxVCM4P2_EncodeVLCZigzag_Inter (
OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
const OMX_S16 *pQDctBlkCoef,
OMX_U8 pattern,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_EncodeMV (6.2.4.5.4)
*
* Description:
* Predicts a motion vector for the current macroblock, encodes the
* difference, and writes the output to the stream buffer. The input MVs
* pMVCurMB, pSrcMVLeftMB, pSrcMVUpperMB, and pSrcMVUpperRightMB should lie
* within the ranges associated with the input parameter fcodeForward, as
* described in [ISO14496-2], subclause 7.6.3. This function provides a
* superset of the functionality associated with the function
* omxVCM4P2_FindMVpred.
*
* Input Arguments:
*
* ppBitStream - double pointer to the current byte in the bitstream buffer
* pBitOffset - index of the first free (next available) bit in the stream
* buffer referenced by *ppBitStream, valid in the range 0 to 7.
* pMVCurMB - pointer to the current macroblock motion vector; a value of
* NULL indicates unavailability.
* pSrcMVLeftMB - pointer to the source left macroblock motion vector; a
* value of NULLindicates unavailability.
* pSrcMVUpperMB - pointer to source upper macroblock motion vector; a
* value of NULL indicates unavailability.
* pSrcMVUpperRightMB - pointer to source upper right MB motion vector; a
* value of NULL indicates unavailability.
* fcodeForward - an integer with values from 1 to 7; used in encoding
* motion vectors related to search range, as described in
* [ISO14496-2], subclause 7.6.3.
* MBType - macro block type, valid in the range 0 to 5
*
* Output Arguments:
*
* ppBitStream - updated pointer to the current byte in the bit stream
* buffer
* pBitOffset - updated index of the next available bit position in stream
* buffer referenced by *ppBitStream
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments
* - At least one of the following pointers is NULL: ppBitStream,
* *ppBitStream, pBitOffset, pMVCurMB
* - *pBitOffset < 0, or *pBitOffset >7.
* - fcodeForward <= 0, or fcodeForward > 7, or MBType < 0.
*
*/
OMXResult omxVCM4P2_EncodeMV (
OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
const OMXVCMotionVector *pMVCurMB,
const OMXVCMotionVector*pSrcMVLeftMB,
const OMXVCMotionVector *pSrcMVUpperMB,
const OMXVCMotionVector *pSrcMVUpperRightMB,
OMX_INT fcodeForward,
OMXVCM4P2MacroblockType MBType
);
/**
* Function: omxVCM4P2_DecodePadMV_PVOP (6.2.5.1.1)
*
* Description:
* Decodes and pads the four motion vectors associated with a non-intra P-VOP
* macroblock. For macroblocks of type OMX_VC_INTER4V, the output MV is
* padded as specified in [ISO14496-2], subclause 7.6.1.6. Otherwise, for
* macroblocks of types other than OMX_VC_INTER4V, the decoded MV is copied to
* all four output MV buffer entries.
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the bit
* stream buffer
* pBitOffset - pointer to the bit position in the byte pointed to by
* *ppBitStream. *pBitOffset is valid within [0-7].
* pSrcMVLeftMB, pSrcMVUpperMB, and pSrcMVUpperRightMB - pointers to the
* motion vector buffers of the macroblocks specially at the left,
* upper, and upper-right side of the current macroblock,
* respectively; a value of NULL indicates unavailability. Note:
* Any neighborhood macroblock outside the current VOP or video
* packet or outside the current GOB (when short_video_header is
* 1 ) for which gob_header_empty is 0 is treated as
* transparent, according to [ISO14496-2], subclause 7.6.5.
* fcodeForward - a code equal to vop_fcode_forward in MPEG-4 bit stream
* syntax
* MBType - the type of the current macroblock. If MBType is not equal to
* OMX_VC_INTER4V, the destination motion vector buffer is still
* filled with the same decoded vector.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded, so
* that it points to the current byte in the bit stream buffer
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream
* pDstMVCurMB - pointer to the motion vector buffer for the current
* macroblock; contains four decoded motion vectors
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments:
* - At least one of the following pointers is NULL:
* ppBitStream, *ppBitStream, pBitOffset, pDstMVCurMB
* - *pBitOffset exceeds [0,7]
* - fcodeForward exceeds (0,7]
* - MBType less than zero
* - motion vector buffer is not 4-byte aligned.
* OMX_Sts_Err - status error
*
*/
OMXResult omxVCM4P2_DecodePadMV_PVOP (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMXVCMotionVector *pSrcMVLeftMB,
OMXVCMotionVector*pSrcMVUpperMB,
OMXVCMotionVector *pSrcMVUpperRightMB,
OMXVCMotionVector*pDstMVCurMB,
OMX_INT fcodeForward,
OMXVCM4P2MacroblockType MBType
);
/**
* Function: omxVCM4P2_DecodeVLCZigzag_IntraDCVLC (6.2.5.2.2)
*
* Description:
* Performs VLC decoding and inverse zigzag scan of AC and DC coefficients
* for one intra block. Two versions of the function (DCVLC and ACVLC) are
* provided in order to support the two different methods of processing DC
* coefficients, as described in [ISO14496-2], subclause 7.4.1.4, Intra DC
* Coefficient Decoding for the Case of Switched VLC Encoding.
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the
* bitstream buffer
* pBitOffset - pointer to the bit position in the current byte referenced
* by *ppBitStream. The parameter *pBitOffset is valid in the
* range [0-7].
* Bit Position in one byte: |Most Least|
* *pBitOffset |0 1 2 3 4 5 6 7|
* predDir - AC prediction direction; used to select the zigzag scan
* pattern; takes one of the following values:
* - OMX_VC_NONE - AC prediction not used;
* performs classical zigzag scan.
* - OMX_VC_HORIZONTAL - Horizontal prediction;
* performs alternate-vertical zigzag scan;
* - OMX_VC_VERTICAL - Vertical prediction;
* performs alternate-horizontal zigzag scan.
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
* videoComp - video component type (luminance or chrominance) of the
* current block
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded such
* that it points to the current byte in the bit stream buffer
* pBitOffset - *pBitOffset is updated such that it points to the current
* bit position in the byte pointed by *ppBitStream
* pDst - pointer to the coefficient buffer of current block; must be
* 4-byte aligned.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments, if:
* - At least one of the following pointers is NULL:
* ppBitStream, *ppBitStream, pBitOffset, pDst
* - *pBitOffset exceeds [0,7]
* - preDir exceeds [0,2]
* - pDst is not 4-byte aligned
* OMX_Sts_Err - if:
* - In DecodeVLCZigzag_IntraDCVLC, dc_size > 12
* - At least one of mark bits equals zero
* - Illegal stream encountered; code cannot be located in VLC table
* - Forbidden code encountered in the VLC FLC table.
* - The number of coefficients is greater than 64
*
*/
OMXResult omxVCM4P2_DecodeVLCZigzag_IntraDCVLC (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMX_S16 *pDst,
OMX_U8 predDir,
OMX_INT shortVideoHeader,
OMXVCM4P2VideoComponent videoComp
);
/**
* Function: omxVCM4P2_DecodeVLCZigzag_IntraACVLC (6.2.5.2.2)
*
* Description:
* Performs VLC decoding and inverse zigzag scan of AC and DC coefficients
* for one intra block. Two versions of the function (DCVLC and ACVLC) are
* provided in order to support the two different methods of processing DC
* coefficients, as described in [ISO14496-2], subclause 7.4.1.4, Intra DC
* Coefficient Decoding for the Case of Switched VLC Encoding.
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the
* bitstream buffer
* pBitOffset - pointer to the bit position in the current byte referenced
* by *ppBitStream. The parameter *pBitOffset is valid in the
* range [0-7]. Bit Position in one byte: |Most Least| *pBitOffset
* |0 1 2 3 4 5 6 7|
* predDir - AC prediction direction; used to select the zigzag scan
* pattern; takes one of the following values: OMX_VC_NONE - AC
* prediction not used; performs classical zigzag scan.
* OMX_VC_HORIZONTAL - Horizontal prediction; performs
* alternate-vertical zigzag scan; OMX_VC_VERTICAL - Vertical
* prediction; performs alternate-horizontal zigzag scan.
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
* videoComp - video component type (luminance or chrominance) of the
* current block
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded such
* that it points to the current byte in the bit stream buffer
* pBitOffset - *pBitOffset is updated such that it points to the current
* bit position in the byte pointed by *ppBitStream
* pDst - pointer to the coefficient buffer of current block; must be
* 4-byte aligned.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments At least one of the following
* pointers is NULL: ppBitStream, *ppBitStream, pBitOffset, pDst,
* or At least one of the following conditions is true:
* *pBitOffset exceeds [0,7], preDir exceeds [0,2], or pDst is
* not 4-byte aligned
* OMX_Sts_Err In DecodeVLCZigzag_IntraDCVLC, dc_size > 12 At least one of
* mark bits equals zero Illegal stream encountered; code cannot
* be located in VLC table Forbidden code encountered in the VLC
* FLC table The number of coefficients is greater than 64
*
*/
OMXResult omxVCM4P2_DecodeVLCZigzag_IntraACVLC (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMX_S16 *pDst,
OMX_U8 predDir,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_DecodeVLCZigzag_Inter (6.2.5.2.3)
*
* Description:
* Performs VLC decoding and inverse zigzag scan for one inter-coded block.
*
* Input Arguments:
*
* ppBitStream - double pointer to the current byte in the stream buffer
* pBitOffset - pointer to the next available bit in the current stream
* byte referenced by *ppBitStream. The parameter *pBitOffset is
* valid within the range [0-7].
* shortVideoHeader - binary flag indicating presence of
* short_video_header; escape modes 0-3 are used if
* shortVideoHeader==0, and escape mode 4 is used when
* shortVideoHeader==1.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded such
* that it points to the current byte in the stream buffer
* pBitOffset - *pBitOffset is updated after decoding such that it points
* to the next available bit in the stream byte referenced by
* *ppBitStream
* pDst - pointer to the coefficient buffer of current block; must be
* 4-byte aligned.
*
* Return Value:
*
* OMX_Sts_BadArgErr - bad arguments:
* - At least one of the following pointers is NULL:
* ppBitStream, *ppBitStream, pBitOffset, pDst
* - pDst is not 4-byte aligned
* - *pBitOffset exceeds [0,7]
* OMX_Sts_Err - status error, if:
* - At least one mark bit is equal to zero
* - Encountered an illegal stream code that cannot be found in the VLC table
* - Encountered an illegal code in the VLC FLC table
* - The number of coefficients is greater than 64
*
*/
OMXResult omxVCM4P2_DecodeVLCZigzag_Inter (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMX_S16 *pDst,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_QuantInvIntra_I (6.2.5.3.2)
*
* Description:
* Performs the second inverse quantization mode on an intra/inter coded
* block. Supports bits_per_pixel = 8. The output coefficients are clipped to
* the range [-2048, 2047].
*
* Input Arguments:
*
* pSrcDst - pointer to the input (quantized) intra/inter block; must be
* aligned on a 16-byte boundary.
* QP - quantization parameter (quantizer_scale)
* videoComp - video component type of the current block. Takes one of the
* following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra
* version only).
* shortVideoHeader - binary flag indicating presence of short_video_header
* (intra version only).
*
* Output Arguments:
*
* pSrcDst - pointer to the output (dequantized) intra/inter block
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; one or more of the following is
* true:
* - pSrcDst is NULL
* - QP <= 0 or QP >=31
* - videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE.
*
*/
OMXResult omxVCM4P2_QuantInvIntra_I (
OMX_S16 *pSrcDst,
OMX_INT QP,
OMXVCM4P2VideoComponent videoComp,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_QuantInvInter_I (6.2.5.3.2)
*
* Description:
* Performs the second inverse quantization mode on an intra/inter coded
* block. Supports bits_per_pixel = 8. The output coefficients are clipped to
* the range [-2048, 2047].
*
* Input Arguments:
*
* pSrcDst - pointer to the input (quantized) intra/inter block; must be
* aligned on a 16-byte boundary.
* QP - quantization parameter (quantizer_scale)
* videoComp - video component type of the current block. Takes one of the
* following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra
* version only).
* shortVideoHeader - binary flag indicating presence of short_video_header
* (intra version only).
*
* Output Arguments:
*
* pSrcDst - pointer to the output (dequantized) intra/inter block
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; one or more of the following is
* true:
* - pSrcDst is NULL
* - QP <= 0 or QP >=31
* - videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE.
*
*/
OMXResult omxVCM4P2_QuantInvInter_I (
OMX_S16 *pSrcDst,
OMX_INT QP
);
/**
* Function: omxVCM4P2_DecodeBlockCoef_Intra (6.2.5.4.1)
*
* Description:
* Decodes the INTRA block coefficients. Inverse quantization, inversely
* zigzag positioning, and IDCT, with appropriate clipping on each step, are
* performed on the coefficients. The results are then placed in the output
* frame/plane on a pixel basis. Note: This function will be used only when
* at least one non-zero AC coefficient of current block exists in the bit
* stream. The DC only condition will be handled in another function.
*
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the bit
* stream buffer. There is no boundary check for the bit stream
* buffer.
* pBitOffset - pointer to the bit position in the byte pointed to by
* *ppBitStream. *pBitOffset is valid within [0-7].
* step - width of the destination plane
* pCoefBufRow - pointer to the coefficient row buffer; must be aligned on
* an 8-byte boundary.
* pCoefBufCol - pointer to the coefficient column buffer; must be aligned
* on an 8-byte boundary.
* curQP - quantization parameter of the macroblock which the current block
* belongs to
* pQPBuf - pointer to the quantization parameter buffer
* blockIndex - block index indicating the component type and position as
* defined in [ISO14496-2], subclause 6.1.3.8, Figure 6-5.
* intraDCVLC - a code determined by intra_dc_vlc_thr and QP. This allows a
* mechanism to switch between two VLC for coding of Intra DC
* coefficients as per [ISO14496-2], Table 6-21.
* ACPredFlag - a flag equal to ac_pred_flag (of luminance) indicating if
* the ac coefficients of the first row or first column are
* differentially coded for intra coded macroblock.
* shortVideoHeader - binary flag indicating presence of
* short_video_header; shortVideoHeader==1 selects linear intra DC
* mode, and shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded, so
* that it points to the current byte in the bit stream buffer
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream
* pDst - pointer to the block in the destination plane; must be aligned on
* an 8-byte boundary.
* pCoefBufRow - pointer to the updated coefficient row buffer.
* pCoefBufCol - pointer to the updated coefficient column buffer Note:
* The coefficient buffers must be updated in accordance with the
* update procedure defined in section 6.2.2.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments, if:
* - At least one of the following pointers is NULL:
* ppBitStream, *ppBitStream, pBitOffset, pCoefBufRow, pCoefBufCol,
* pQPBuf, pDst.
* - *pBitOffset exceeds [0,7]
* - curQP exceeds (1, 31)
* - blockIndex exceeds [0,5]
* - step is not the multiple of 8
* - a pointer alignment requirement was violated.
* OMX_Sts_Err - status error. Refer to OMX_Sts_Err of DecodeVLCZigzag_Intra.
*
*/
OMXResult omxVCM4P2_DecodeBlockCoef_Intra (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMX_U8 *pDst,
OMX_INT step,
OMX_S16 *pCoefBufRow,
OMX_S16 *pCoefBufCol,
OMX_U8 curQP,
const OMX_U8 *pQPBuf,
OMX_INT blockIndex,
OMX_INT intraDCVLC,
OMX_INT ACPredFlag,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_DecodeBlockCoef_Inter (6.2.5.4.2)
*
* Description:
* Decodes the INTER block coefficients. This function performs inverse
* quantization, inverse zigzag positioning, and IDCT (with appropriate
* clipping on each step) on the coefficients. The results (residuals) are
* placed in a contiguous array of 64 elements. For INTER block, the output
* buffer holds the residuals for further reconstruction.
*
* Input Arguments:
*
* ppBitStream - pointer to the pointer to the current byte in the bit
* stream buffer. There is no boundary check for the bit stream
* buffer.
* pBitOffset - pointer to the bit position in the byte pointed to by
* *ppBitStream. *pBitOffset is valid within [0-7]
* QP - quantization parameter
* shortVideoHeader - binary flag indicating presence of
* short_video_header; shortVideoHeader==1 selects linear intra DC
* mode, and shortVideoHeader==0 selects non linear intra DC mode.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after the block is decoded, so
* that it points to the current byte in the bit stream buffer
* pBitOffset - *pBitOffset is updated so that it points to the current bit
* position in the byte pointed by *ppBitStream
* pDst - pointer to the decoded residual buffer (a contiguous array of 64
* elements of OMX_S16 data type); must be aligned on a 16-byte
* boundary.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments, if:
* - At least one of the following pointers is Null:
* ppBitStream, *ppBitStream, pBitOffset , pDst
* - *pBitOffset exceeds [0,7]
* - QP <= 0.
* - pDst is not 16-byte aligned
* OMX_Sts_Err - status error. Refer to OMX_Sts_Err of DecodeVLCZigzag_Inter .
*
*/
OMXResult omxVCM4P2_DecodeBlockCoef_Inter (
const OMX_U8 **ppBitStream,
OMX_INT *pBitOffset,
OMX_S16 *pDst,
OMX_INT QP,
OMX_INT shortVideoHeader
);
/**
* Function: omxVCM4P2_PredictReconCoefIntra (6.2.5.4.3)
*
* Description:
* Performs adaptive DC/AC coefficient prediction for an intra block. Prior
* to the function call, prediction direction (predDir) should be selected as
* specified in [ISO14496-2], subclause 7.4.3.1.
*
* Input Arguments:
*
* pSrcDst - pointer to the coefficient buffer which contains the quantized
* coefficient residuals (PQF) of the current block; must be
* aligned on a 4-byte boundary. The output coefficients are
* saturated to the range [-2048, 2047].
* pPredBufRow - pointer to the coefficient row buffer; must be aligned on
* a 4-byte boundary.
* pPredBufCol - pointer to the coefficient column buffer; must be aligned
* on a 4-byte boundary.
* curQP - quantization parameter of the current block. curQP may equal to
* predQP especially when the current block and the predictor block
* are in the same macroblock.
* predQP - quantization parameter of the predictor block
* predDir - indicates the prediction direction which takes one of the
* following values: OMX_VC_HORIZONTAL - predict horizontally
* OMX_VC_VERTICAL - predict vertically
* ACPredFlag - a flag indicating if AC prediction should be performed. It
* is equal to ac_pred_flag in the bit stream syntax of MPEG-4
* videoComp - video component type (luminance or chrominance) of the
* current block
*
* Output Arguments:
*
* pSrcDst - pointer to the coefficient buffer which contains the quantized
* coefficients (QF) of the current block
* pPredBufRow - pointer to the updated coefficient row buffer
* pPredBufCol - pointer to the updated coefficient column buffer Note:
* Buffer update: Update the AC prediction buffer (both row and
* column buffer).
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments, if:
* - At least one of the pointers is NULL:
* pSrcDst, pPredBufRow, or pPredBufCol.
* - curQP <= 0,
* - predQP <= 0,
* - curQP >31,
* - predQP > 31,
* - preDir exceeds [1,2]
* - pSrcDst, pPredBufRow, or pPredBufCol is not 4-byte aligned.
*
*/
OMXResult omxVCM4P2_PredictReconCoefIntra (
OMX_S16 *pSrcDst,
OMX_S16 *pPredBufRow,
OMX_S16 *pPredBufCol,
OMX_INT curQP,
OMX_INT predQP,
OMX_INT predDir,
OMX_INT ACPredFlag,
OMXVCM4P2VideoComponent videoComp
);
/**
* Function: omxVCM4P2_MCReconBlock (6.2.5.5.1)
*
* Description:
* Performs motion compensation prediction for an 8x8 block using
* interpolation described in [ISO14496-2], subclause 7.6.2.
*
* Input Arguments:
*
* pSrc - pointer to the block in the reference plane.
* srcStep - distance between the start of consecutive lines in the
* reference plane, in bytes; must be a multiple of 8.
* dstStep - distance between the start of consecutive lines in the
* destination plane, in bytes; must be a multiple of 8.
* pSrcResidue - pointer to a buffer containing the 16-bit prediction
* residuals; must be 16-byte aligned. If the pointer is NULL, then
* no prediction is done, only motion compensation, i.e., the block
* is moved with interpolation.
* predictType - bilinear interpolation type, as defined in section
* 6.2.1.2.
* rndVal - rounding control parameter: 0 - disabled; 1 - enabled.
*
* Output Arguments:
*
* pDst - pointer to the destination buffer; must be 8-byte aligned. If
* prediction residuals are added then output intensities are
* clipped to the range [0,255].
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned under any of the following
* conditions:
* - pDst is not 8-byte aligned.
* - pSrcResidue is not 16-byte aligned.
* - one or more of the following pointers is NULL: pSrc or pDst.
* - either srcStep or dstStep is not a multiple of 8.
* - invalid type specified for the parameter predictType.
* - the parameter rndVal is not equal either to 0 or 1.
*
*/
OMXResult omxVCM4P2_MCReconBlock (
const OMX_U8 *pSrc,
OMX_INT srcStep,
const OMX_S16 *pSrcResidue,
OMX_U8 *pDst,
OMX_INT dstStep,
OMX_INT predictType,
OMX_INT rndVal
);
/* 6.3.1.1 Intra 16x16 Prediction Modes */
/* A data type that enumerates intra_16x16 macroblock prediction modes is defined as follows: */
typedef enum {
OMX_VC_16X16_VERT = 0, /** Intra_16x16_Vertical */
OMX_VC_16X16_HOR = 1, /** Intra_16x16_Horizontal */
OMX_VC_16X16_DC = 2, /** Intra_16x16_DC */
OMX_VC_16X16_PLANE = 3 /** Intra_16x16_Plane */
} OMXVCM4P10Intra16x16PredMode;
/* 6.3.1.2 Intra 4x4 Prediction Modes */
/* A data type that enumerates intra_4x4 macroblock prediction modes is defined as follows: */
typedef enum {
OMX_VC_4X4_VERT = 0, /** Intra_4x4_Vertical */
OMX_VC_4X4_HOR = 1, /** Intra_4x4_Horizontal */
OMX_VC_4X4_DC = 2, /** Intra_4x4_DC */
OMX_VC_4X4_DIAG_DL = 3, /** Intra_4x4_Diagonal_Down_Left */
OMX_VC_4X4_DIAG_DR = 4, /** Intra_4x4_Diagonal_Down_Right */
OMX_VC_4X4_VR = 5, /** Intra_4x4_Vertical_Right */
OMX_VC_4X4_HD = 6, /** Intra_4x4_Horizontal_Down */
OMX_VC_4X4_VL = 7, /** Intra_4x4_Vertical_Left */
OMX_VC_4X4_HU = 8 /** Intra_4x4_Horizontal_Up */
} OMXVCM4P10Intra4x4PredMode;
/* 6.3.1.3 Chroma Prediction Modes */
/* A data type that enumerates intra chroma prediction modes is defined as follows: */
typedef enum {
OMX_VC_CHROMA_DC = 0, /** Intra_Chroma_DC */
OMX_VC_CHROMA_HOR = 1, /** Intra_Chroma_Horizontal */
OMX_VC_CHROMA_VERT = 2, /** Intra_Chroma_Vertical */
OMX_VC_CHROMA_PLANE = 3 /** Intra_Chroma_Plane */
} OMXVCM4P10IntraChromaPredMode;
/* 6.3.1.4 Motion Estimation Modes */
/* A data type that enumerates H.264 motion estimation modes is defined as follows: */
typedef enum {
OMX_VC_M4P10_FAST_SEARCH = 0, /** Fast motion search */
OMX_VC_M4P10_FULL_SEARCH = 1 /** Full motion search */
} OMXVCM4P10MEMode;
/* 6.3.1.5 Macroblock Types */
/* A data type that enumerates H.264 macroblock types is defined as follows: */
typedef enum {
OMX_VC_P_16x16 = 0, /* defined by [ISO14496-10] */
OMX_VC_P_16x8 = 1,
OMX_VC_P_8x16 = 2,
OMX_VC_P_8x8 = 3,
OMX_VC_PREF0_8x8 = 4,
OMX_VC_INTER_SKIP = 5,
OMX_VC_INTRA_4x4 = 8,
OMX_VC_INTRA_16x16 = 9,
OMX_VC_INTRA_PCM = 10
} OMXVCM4P10MacroblockType;
/* 6.3.1.6 Sub-Macroblock Types */
/* A data type that enumerates H.264 sub-macroblock types is defined as follows: */
typedef enum {
OMX_VC_SUB_P_8x8 = 0, /* defined by [ISO14496-10] */
OMX_VC_SUB_P_8x4 = 1,
OMX_VC_SUB_P_4x8 = 2,
OMX_VC_SUB_P_4x4 = 3
} OMXVCM4P10SubMacroblockType;
/* 6.3.1.7 Variable Length Coding (VLC) Information */
typedef struct {
OMX_U8 uTrailing_Ones; /* Trailing ones; 3 at most */
OMX_U8 uTrailing_One_Signs; /* Trailing ones signal */
OMX_U8 uNumCoeffs; /* Total number of non-zero coefs, including trailing ones */
OMX_U8 uTotalZeros; /* Total number of zero coefs */
OMX_S16 iLevels[16]; /* Levels of non-zero coefs, in reverse zig-zag order */
OMX_U8 uRuns[16]; /* Runs for levels and trailing ones, in reverse zig-zag order */
} OMXVCM4P10VLCInfo;
/* 6.3.1.8 Macroblock Information */
typedef struct {
OMX_S32 sliceId; /* slice number */
OMXVCM4P10MacroblockType mbType; /* MB type */
OMXVCM4P10SubMacroblockType subMBType[4]; /* sub-block type */
OMX_S32 qpy; /* qp for luma */
OMX_S32 qpc; /* qp for chroma */
OMX_U32 cbpy; /* CBP Luma */
OMX_U32 cbpc; /* CBP Chroma */
OMXVCMotionVector pMV0[4][4]; /* motion vector, represented using 1/4-pel units, pMV0[blocky][blockx] (blocky = 0~3, blockx =0~3) */
OMXVCMotionVector pMVPred[4][4]; /* motion vector prediction, Represented using 1/4-pel units, pMVPred[blocky][blockx] (blocky = 0~3, blockx = 0~3) */
OMX_U8 pRefL0Idx[4]; /* reference picture indices */
OMXVCM4P10Intra16x16PredMode Intra16x16PredMode; /* best intra 16x16 prediction mode */
OMXVCM4P10Intra4x4PredMode pIntra4x4PredMode[16]; /* best intra 4x4 prediction mode for each block, pMV0 indexed as above */
} OMXVCM4P10MBInfo, *OMXVCM4P10MBInfoPtr;
/* 6.3.1.9 Motion Estimation Parameters */
typedef struct {
OMX_S32 blockSplitEnable8x8; /* enables 16x8, 8x16, 8x8 */
OMX_S32 blockSplitEnable4x4; /* enable splitting of 8x4, 4x8, 4x4 blocks */
OMX_S32 halfSearchEnable;
OMX_S32 quarterSearchEnable;
OMX_S32 intraEnable4x4; /* 1=enable, 0=disable */
OMX_S32 searchRange16x16; /* integer pixel units */
OMX_S32 searchRange8x8;
OMX_S32 searchRange4x4;
} OMXVCM4P10MEParams;
/**
* Function: omxVCM4P10_PredictIntra_4x4 (6.3.3.1.1)
*
* Description:
* Perform Intra_4x4 prediction for luma samples. If the upper-right block is
* not available, then duplication work should be handled inside the function.
* Users need not define them outside.
*
* Input Arguments:
*
* pSrcLeft - Pointer to the buffer of 4 left pixels:
* p[x, y] (x = -1, y = 0..3)
* pSrcAbove - Pointer to the buffer of 8 above pixels:
* p[x,y] (x = 0..7, y =-1);
* must be aligned on a 4-byte boundary.
* pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
* leftStep - Step of left pixel buffer; must be a multiple of 4.
* dstStep - Step of the destination buffer; must be a multiple of 4.
* predMode - Intra_4x4 prediction mode.
* availability - Neighboring 4x4 block availability flag, refer to
* "Neighboring Macroblock Availability" .
*
* Output Arguments:
*
* pDst - Pointer to the destination buffer; must be aligned on a 4-byte
* boundary.
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If one of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* pDst is NULL.
* dstStep < 4, or dstStep is not a multiple of 4.
* leftStep is not a multiple of 4.
* predMode is not in the valid range of enumeration
* OMXVCM4P10Intra4x4PredMode.
* predMode is OMX_VC_4x4_VERT, but availability doesn't set OMX_VC_UPPER
* indicating p[x,-1] (x = 0..3) is not available.
* predMode is OMX_VC_4x4_HOR, but availability doesn't set OMX_VC_LEFT
* indicating p[-1,y] (y = 0..3) is not available.
* predMode is OMX_VC_4x4_DIAG_DL, but availability doesn't set
* OMX_VC_UPPER indicating p[x, -1] (x = 0..3) is not available.
* predMode is OMX_VC_4x4_DIAG_DR, but availability doesn't set
* OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
* p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
* available.
* predMode is OMX_VC_4x4_VR, but availability doesn't set
* OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
* p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
* available.
* predMode is OMX_VC_4x4_HD, but availability doesn't set
* OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
* p[x,-1] (x = 0..3), or p[-1,y] (y = 0..3) or p[-1,-1] is not
* available.
* predMode is OMX_VC_4x4_VL, but availability doesn't set OMX_VC_UPPER
* indicating p[x,-1] (x = 0..3) is not available.
* predMode is OMX_VC_4x4_HU, but availability doesn't set OMX_VC_LEFT
* indicating p[-1,y] (y = 0..3) is not available.
* availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
* availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
* availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
* either pSrcAbove or pDst is not aligned on a 4-byte boundary.
*
* Note:
* pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointers if
* they are not used by intra prediction as implied in predMode.
*
*/
OMXResult omxVCM4P10_PredictIntra_4x4 (
const OMX_U8 *pSrcLeft,
const OMX_U8 *pSrcAbove,
const OMX_U8 *pSrcAboveLeft,
OMX_U8 *pDst,
OMX_INT leftStep,
OMX_INT dstStep,
OMXVCM4P10Intra4x4PredMode predMode,
OMX_S32 availability
);
/**
* Function: omxVCM4P10_PredictIntra_16x16 (6.3.3.1.2)
*
* Description:
* Perform Intra_16x16 prediction for luma samples. If the upper-right block
* is not available, then duplication work should be handled inside the
* function. Users need not define them outside.
*
* Input Arguments:
*
* pSrcLeft - Pointer to the buffer of 16 left pixels: p[x, y] (x = -1, y =
* 0..15)
* pSrcAbove - Pointer to the buffer of 16 above pixels: p[x,y] (x = 0..15,
* y= -1); must be aligned on a 16-byte boundary.
* pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
* leftStep - Step of left pixel buffer; must be a multiple of 16.
* dstStep - Step of the destination buffer; must be a multiple of 16.
* predMode - Intra_16x16 prediction mode, please refer to section 3.4.1.
* availability - Neighboring 16x16 MB availability flag. Refer to
* section 3.4.4.
*
* Output Arguments:
*
* pDst -Pointer to the destination buffer; must be aligned on a 16-byte
* boundary.
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If one of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* pDst is NULL.
* dstStep < 16. or dstStep is not a multiple of 16.
* leftStep is not a multiple of 16.
* predMode is not in the valid range of enumeration
* OMXVCM4P10Intra16x16PredMode
* predMode is OMX_VC_16X16_VERT, but availability doesn't set
* OMX_VC_UPPER indicating p[x,-1] (x = 0..15) is not available.
* predMode is OMX_VC_16X16_HOR, but availability doesn't set OMX_VC_LEFT
* indicating p[-1,y] (y = 0..15) is not available.
* predMode is OMX_VC_16X16_PLANE, but availability doesn't set
* OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
* p[x,-1](x = 0..15), or p[-1,y] (y = 0..15), or p[-1,-1] is not
* available.
* availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
* availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
* availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
* either pSrcAbove or pDst is not aligned on a 16-byte boundary.
*
* Note:
* pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointers if
* they are not used by intra prediction implied in predMode.
* Note:
* OMX_VC_UPPER_RIGHT is not used in intra_16x16 luma prediction.
*
*/
OMXResult omxVCM4P10_PredictIntra_16x16 (
const OMX_U8 *pSrcLeft,
const OMX_U8 *pSrcAbove,
const OMX_U8 *pSrcAboveLeft,
OMX_U8 *pDst,
OMX_INT leftStep,
OMX_INT dstStep,
OMXVCM4P10Intra16x16PredMode predMode,
OMX_S32 availability
);
/**
* Function: omxVCM4P10_PredictIntraChroma_8x8 (6.3.3.1.3)
*
* Description:
* Performs intra prediction for chroma samples.
*
* Input Arguments:
*
* pSrcLeft - Pointer to the buffer of 8 left pixels: p[x, y] (x = -1, y=
* 0..7).
* pSrcAbove - Pointer to the buffer of 8 above pixels: p[x,y] (x = 0..7, y
* = -1); must be aligned on an 8-byte boundary.
* pSrcAboveLeft - Pointer to the above left pixels: p[x,y] (x = -1, y = -1)
* leftStep - Step of left pixel buffer; must be a multiple of 8.
* dstStep - Step of the destination buffer; must be a multiple of 8.
* predMode - Intra chroma prediction mode, please refer to section 3.4.3.
* availability - Neighboring chroma block availability flag, please refer
* to "Neighboring Macroblock Availability".
*
* Output Arguments:
*
* pDst - Pointer to the destination buffer; must be aligned on an 8-byte
* boundary.
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If any of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* pDst is NULL.
* dstStep < 8 or dstStep is not a multiple of 8.
* leftStep is not a multiple of 8.
* predMode is not in the valid range of enumeration
* OMXVCM4P10IntraChromaPredMode.
* predMode is OMX_VC_CHROMA_VERT, but availability doesn't set
* OMX_VC_UPPER indicating p[x,-1] (x = 0..7) is not available.
* predMode is OMX_VC_CHROMA_HOR, but availability doesn't set OMX_VC_LEFT
* indicating p[-1,y] (y = 0..7) is not available.
* predMode is OMX_VC_CHROMA_PLANE, but availability doesn't set
* OMX_VC_UPPER_LEFT or OMX_VC_UPPER or OMX_VC_LEFT indicating
* p[x,-1](x = 0..7), or p[-1,y] (y = 0..7), or p[-1,-1] is not
* available.
* availability sets OMX_VC_UPPER, but pSrcAbove is NULL.
* availability sets OMX_VC_LEFT, but pSrcLeft is NULL.
* availability sets OMX_VC_UPPER_LEFT, but pSrcAboveLeft is NULL.
* either pSrcAbove or pDst is not aligned on a 8-byte boundary.
*
* Note: pSrcAbove, pSrcAbove, pSrcAboveLeft may be invalid pointer if
* they are not used by intra prediction implied in predMode.
*
* Note: OMX_VC_UPPER_RIGHT is not used in intra chroma prediction.
*
*/
OMXResult omxVCM4P10_PredictIntraChroma_8x8 (
const OMX_U8 *pSrcLeft,
const OMX_U8 *pSrcAbove,
const OMX_U8 *pSrcAboveLeft,
OMX_U8 *pDst,
OMX_INT leftStep,
OMX_INT dstStep,
OMXVCM4P10IntraChromaPredMode predMode,
OMX_S32 availability
);
/**
* Function: omxVCM4P10_InterpolateLuma (6.3.3.2.1)
*
* Description:
* Performs quarter-pixel interpolation for inter luma MB. It is assumed that
* the frame is already padded when calling this function.
*
* Input Arguments:
*
* pSrc - Pointer to the source reference frame buffer
* srcStep - reference frame step, in bytes; must be a multiple of roi.width
* dstStep - destination frame step, in bytes; must be a multiple of
* roi.width
* dx - Fractional part of horizontal motion vector component in 1/4 pixel
* unit; valid in the range [0,3]
* dy - Fractional part of vertical motion vector y component in 1/4 pixel
* unit; valid in the range [0,3]
* roi - Dimension of the interpolation region; the parameters roi.width and
* roi.height must be equal to either 4, 8, or 16.
*
* Output Arguments:
*
* pDst - Pointer to the destination frame buffer:
* if roi.width==4, 4-byte alignment required
* if roi.width==8, 8-byte alignment required
* if roi.width==16, 16-byte alignment required
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If one of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* pSrc or pDst is NULL.
* srcStep or dstStep < roi.width.
* dx or dy is out of range [0,3].
* roi.width or roi.height is out of range {4, 8, 16}.
* roi.width is equal to 4, but pDst is not 4 byte aligned.
* roi.width is equal to 8 or 16, but pDst is not 8 byte aligned.
* srcStep or dstStep is not a multiple of 8.
*
*/
OMXResult omxVCM4P10_InterpolateLuma (
const OMX_U8 *pSrc,
OMX_S32 srcStep,
OMX_U8 *pDst,
OMX_S32 dstStep,
OMX_S32 dx,
OMX_S32 dy,
OMXSize roi
);
/**
* Function: omxVCM4P10_InterpolateChroma (6.3.3.2.2)
*
* Description:
* Performs 1/8-pixel interpolation for inter chroma MB.
*
* Input Arguments:
*
* pSrc -Pointer to the source reference frame buffer
* srcStep -Reference frame step in bytes
* dstStep -Destination frame step in bytes; must be a multiple of
* roi.width.
* dx -Fractional part of horizontal motion vector component in 1/8 pixel
* unit; valid in the range [0,7]
* dy -Fractional part of vertical motion vector component in 1/8 pixel
* unit; valid in the range [0,7]
* roi -Dimension of the interpolation region; the parameters roi.width and
* roi.height must be equal to either 2, 4, or 8.
*
* Output Arguments:
*
* pDst -Pointer to the destination frame buffer:
* if roi.width==2, 2-byte alignment required
* if roi.width==4, 4-byte alignment required
* if roi.width==8, 8-byte alignment required
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If one of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* pSrc or pDst is NULL.
* srcStep or dstStep < 8.
* dx or dy is out of range [0-7].
* roi.width or roi.height is out of range {2,4,8}.
* roi.width is equal to 2, but pDst is not 2-byte aligned.
* roi.width is equal to 4, but pDst is not 4-byte aligned.
* roi.width is equal to 8, but pDst is not 8 byte aligned.
* srcStep or dstStep is not a multiple of 8.
*
*/
OMXResult omxVCM4P10_InterpolateChroma (
const OMX_U8 *pSrc,
OMX_S32 srcStep,
OMX_U8 *pDst,
OMX_S32 dstStep,
OMX_S32 dx,
OMX_S32 dy,
OMXSize roi
);
/**
* Function: omxVCM4P10_FilterDeblockingLuma_VerEdge_I (6.3.3.3.1)
*
* Description:
* Performs in-place deblock filtering on four vertical edges of the luma
* macroblock (16x16).
*
* Input Arguments:
*
* pSrcDst - Pointer to the input macroblock; must be 16-byte aligned.
* srcdstStep -Step of the arrays; must be a multiple of 16.
* pAlpha -Array of size 2 of alpha thresholds (the first item is the alpha
* threshold for the external vertical edge, and the second item is
* for the internal vertical edge); per [ISO14496-10] alpha values
* must be in the range [0,255].
* pBeta -Array of size 2 of beta thresholds (the first item is the beta
* threshold for the external vertical edge, and the second item is
* for the internal vertical edge); per [ISO14496-10] beta values
* must be in the range [0,18].
* pThresholds -Array of size 16 of Thresholds (TC0) (values for the left
* edge of each 4x4 block, arranged in vertical block order); must
* be aligned on a 4-byte boundary.. Per [ISO14496-10] values must
* be in the range [0,25].
* pBS -Array of size 16 of BS parameters (arranged in vertical block
* order); valid in the range [0,4] with the following
* restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii)
* pBS[i]== 4 if and only if pBS[i^3]== 4. Must be 4-byte aligned.
*
* Output Arguments:
*
* pSrcDst -Pointer to filtered output macroblock.
*
* Return Value:
* If the function runs without error, it returns OMX_Sts_NoErr.
* If one of the following cases occurs, the function returns
* OMX_Sts_BadArgErr:
* Either of the pointers in pSrcDst, pAlpha, pBeta, pThresholds, or pBS
* is NULL.
* Either pThresholds or pBS is not aligned on a 4-byte boundary.
* pSrcDst is not 16-byte aligned.
* srcdstStep is not a multiple of 16.
* pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
* pBeta[0] and/or pBeta[1] is outside the range [0,18].
* One or more entries in the table pThresholds[0..15]is outside of the
* range [0,25].
* pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or (pBS[i]==4 &&
* pBS[i^3]!=4) for 0<=i<=3.
*
*/
OMXResult omxVCM4P10_FilterDeblockingLuma_VerEdge_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_FilterDeblockingLuma_HorEdge_I (6.3.3.3.2)
*
* Description:
* Performs in-place deblock filtering on four horizontal edges of the luma
* macroblock (16x16).
*
* Input Arguments:
*
* pSrcDst - pointer to the input macroblock; must be 16-byte aligned.
* srcdstStep - step of the arrays; must be a multiple of 16.
* pAlpha - array of size 2 of alpha thresholds (the first item is the alpha
* threshold for the external vertical edge, and the second item is
* for the internal horizontal edge); per [ISO14496-10] alpha
* values must be in the range [0,255].
* pBeta - array of size 2 of beta thresholds (the first item is the beta
* threshold for the external horizontal edge, and the second item
* is for the internal horizontal edge). Per [ISO14496-10] beta
* values must be in the range [0,18].
* pThresholds - array of size 16 containing thresholds, TC0, for the top
* horizontal edge of each 4x4 block, arranged in horizontal block
* order; must be aligned on a 4-byte boundary. Per [ISO14496 10]
* values must be in the range [0,25].
* pBS - array of size 16 of BS parameters (arranged in horizontal block
* order); valid in the range [0,4] with the following
* restrictions: i) pBS[i]== 4 may occur only for 0<=i<=3, ii)
* pBS[i]== 4 if and only if pBS[i^3]== 4. Must be 4-byte aligned.
*
* Output Arguments:
*
* pSrcDst -Pointer to filtered output macroblock.
*
* Return Value:
*
* OMX_Sts_NoErr, if the function runs without error.
*
* OMX_Sts_BadArgErr, if one of the following cases occurs:
* - one or more of the following pointers is NULL: pSrcDst, pAlpha,
* pBeta, pThresholds, or pBS.
* - either pThresholds or pBS is not aligned on a 4-byte boundary.
* - pSrcDst is not 16-byte aligned.
* - srcdstStep is not a multiple of 16.
* - pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
* - pBeta[0] and/or pBeta[1] is outside the range [0,18].
* - One or more entries in the table pThresholds[0..15] is
* outside of the range [0,25].
* - pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
* (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
*
*/
OMXResult omxVCM4P10_FilterDeblockingLuma_HorEdge_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_FilterDeblockingChroma_VerEdge_I (6.3.3.3.3)
*
* Description:
* Performs in-place deblock filtering on four vertical edges of the chroma
* macroblock (8x8).
*
* Input Arguments:
*
* pSrcDst - Pointer to the input macroblock; must be 8-byte aligned.
* srcdstStep - Step of the arrays; must be a multiple of 8.
* pAlpha - Array of size 2 of alpha thresholds (the first item is alpha
* threshold for external vertical edge, and the second item is for
* internal vertical edge); per [ISO14496-10] alpha values must be
* in the range [0,255].
* pBeta - Array of size 2 of beta thresholds (the first item is the beta
* threshold for the external vertical edge, and the second item is
* for the internal vertical edge); per [ISO14496-10] beta values
* must be in the range [0,18].
* pThresholds - Array of size 8 containing thresholds, TC0, for the left
* vertical edge of each 4x2 chroma block, arranged in vertical
* block order; must be aligned on a 4-byte boundary. Per
* [ISO14496-10] values must be in the range [0,25].
* pBS - Array of size 16 of BS parameters (values for each 2x2 chroma
* block, arranged in vertical block order). This parameter is the
* same as the pBS parameter passed into FilterDeblockLuma_VerEdge;
* valid in the range [0,4] with the following restrictions: i)
* pBS[i]== 4 may occur only for 0<=i<=3, ii) pBS[i]== 4 if and
* only if pBS[i^3]== 4. Must be 4 byte aligned.
*
* Output Arguments:
*
* pSrcDst -Pointer to filtered output macroblock.
*
* Return Value:
*
* OMX_Sts_NoErr, if the function runs without error.
*
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - one or more of the following pointers is NULL: pSrcDst, pAlpha,
* pBeta, pThresholds, or pBS.
* - pSrcDst is not 8-byte aligned.
* - srcdstStep is not a multiple of 8.
* - pThresholds is not 4-byte aligned.
* - pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
* - pBeta[0] and/or pBeta[1] is outside the range [0,18].
* - One or more entries in the table pThresholds[0..7] is outside
* of the range [0,25].
* - pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
* (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
* - pBS is not 4-byte aligned.
*
*/
OMXResult omxVCM4P10_FilterDeblockingChroma_VerEdge_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_FilterDeblockingChroma_HorEdge_I (6.3.3.3.4)
*
* Description:
* Performs in-place deblock filtering on the horizontal edges of the chroma
* macroblock (8x8).
*
* Input Arguments:
*
* pSrcDst - pointer to the input macroblock; must be 8-byte aligned.
* srcdstStep - array step; must be a multiple of 8.
* pAlpha - array of size 2 containing alpha thresholds; the first element
* contains the threshold for the external horizontal edge, and the
* second element contains the threshold for internal horizontal
* edge. Per [ISO14496-10] alpha values must be in the range
* [0,255].
* pBeta - array of size 2 containing beta thresholds; the first element
* contains the threshold for the external horizontal edge, and the
* second element contains the threshold for the internal
* horizontal edge. Per [ISO14496-10] beta values must be in the
* range [0,18].
* pThresholds - array of size 8 containing thresholds, TC0, for the top
* horizontal edge of each 2x4 chroma block, arranged in horizontal
* block order; must be aligned on a 4-byte boundary. Per
* [ISO14496-10] values must be in the range [0,25].
* pBS - array of size 16 containing BS parameters for each 2x2 chroma
* block, arranged in horizontal block order; valid in the range
* [0,4] with the following restrictions: i) pBS[i]== 4 may occur
* only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]== 4.
* Must be 4-byte aligned.
*
* Output Arguments:
*
* pSrcDst -Pointer to filtered output macroblock.
*
* Return Value:
*
* OMX_Sts_NoErr, if the function runs without error.
*
* OMX_Sts_BadArgErr, if one of the following cases occurs:
* - any of the following pointers is NULL:
* pSrcDst, pAlpha, pBeta, pThresholds, or pBS.
* - pSrcDst is not 8-byte aligned.
* - srcdstStep is not a multiple of 8.
* - pThresholds is not 4-byte aligned.
* - pAlpha[0] and/or pAlpha[1] is outside the range [0,255].
* - pBeta[0] and/or pBeta[1] is outside the range [0,18].
* - One or more entries in the table pThresholds[0..7] is outside
* of the range [0,25].
* - pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
* (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
* - pBS is not 4-byte aligned.
*
*/
OMXResult omxVCM4P10_FilterDeblockingChroma_HorEdge_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_DeblockLuma_I (6.3.3.3.5)
*
* Description:
* This function performs in-place deblock filtering the horizontal and
* vertical edges of a luma macroblock (16x16).
*
* Input Arguments:
*
* pSrcDst - pointer to the input macroblock; must be 16-byte aligned.
* srcdstStep - image width; must be a multiple of 16.
* pAlpha - pointer to a 2x2 table of alpha thresholds, organized as
* follows: {external vertical edge, internal vertical edge,
* external horizontal edge, internal horizontal edge }. Per
* [ISO14496-10] alpha values must be in the range [0,255].
* pBeta - pointer to a 2x2 table of beta thresholds, organized as follows:
* {external vertical edge, internal vertical edge, external
* horizontal edge, internal horizontal edge }. Per [ISO14496-10]
* beta values must be in the range [0,18].
* pThresholds - pointer to a 16x2 table of threshold (TC0), organized as
* follows: {values for the left or above edge of each 4x4 block,
* arranged in vertical block order and then in horizontal block
* order}; must be aligned on a 4-byte boundary. Per [ISO14496-10]
* values must be in the range [0,25].
* pBS - pointer to a 16x2 table of BS parameters arranged in scan block
* order for vertical edges and then horizontal edges; valid in the
* range [0,4] with the following restrictions: i) pBS[i]== 4 may
* occur only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]==
* 4. Must be 4-byte aligned.
*
* Output Arguments:
*
* pSrcDst - pointer to filtered output macroblock.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments
* - one or more of the following pointers is NULL: pSrcDst, pAlpha,
* pBeta, pThresholds or pBS.
* - pSrcDst is not 16-byte aligned.
* - either pThresholds or pBS is not aligned on a 4-byte boundary.
* - one or more entries in the table pAlpha[0..3] is outside the range
* [0,255].
* - one or more entries in the table pBeta[0..3] is outside the range
* [0,18].
* - one or more entries in the table pThresholds[0..31]is outside of
* the range [0,25].
* - pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
* (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
* - srcdstStep is not a multiple of 16.
*
*/
OMXResult omxVCM4P10_DeblockLuma_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_DeblockChroma_I (6.3.3.3.6)
*
* Description:
* Performs in-place deblocking filtering on all edges of the chroma
* macroblock (16x16).
*
* Input Arguments:
*
* pSrcDst - pointer to the input macroblock; must be 8-byte aligned.
* srcdstStep - step of the arrays; must be a multiple of 8.
* pAlpha - pointer to a 2x2 array of alpha thresholds, organized as
* follows: {external vertical edge, internal vertical edge,
* external horizontal edge, internal horizontal edge }. Per
* [ISO14496-10] alpha values must be in the range [0,255].
* pBeta - pointer to a 2x2 array of Beta Thresholds, organized as follows:
* { external vertical edge, internal vertical edge, external
* horizontal edge, internal horizontal edge }. Per [ISO14496-10]
* beta values must be in the range [0,18].
* pThresholds - array of size 8x2 of Thresholds (TC0) (values for the left
* or above edge of each 4x2 or 2x4 block, arranged in vertical
* block order and then in horizontal block order); must be aligned
* on a 4-byte boundary. Per [ISO14496-10] values must be in the
* range [0,25].
* pBS - array of size 16x2 of BS parameters (arranged in scan block order
* for vertical edges and then horizontal edges); valid in the
* range [0,4] with the following restrictions: i) pBS[i]== 4 may
* occur only for 0<=i<=3, ii) pBS[i]== 4 if and only if pBS[i^3]==
* 4. Must be 4-byte aligned.
*
* Output Arguments:
*
* pSrcDst - pointer to filtered output macroblock.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments
* - one or more of the following pointers is NULL: pSrcDst, pAlpha,
* pBeta, pThresholds, or pBS.
* - pSrcDst is not 8-byte aligned.
* - either pThresholds or pBS is not 4-byte aligned.
* - one or more entries in the table pAlpha[0..3] is outside the range
* [0,255].
* - one or more entries in the table pBeta[0..3] is outside the range
* [0,18].
* - one or more entries in the table pThresholds[0..15]is outside of
* the range [0,25].
* - pBS is out of range, i.e., one of the following conditions is true:
* pBS[i]<0, pBS[i]>4, pBS[i]==4 for i>=4, or
* (pBS[i]==4 && pBS[i^3]!=4) for 0<=i<=3.
* - srcdstStep is not a multiple of 8.
*
*/
OMXResult omxVCM4P10_DeblockChroma_I (
OMX_U8 *pSrcDst,
OMX_S32 srcdstStep,
const OMX_U8 *pAlpha,
const OMX_U8 *pBeta,
const OMX_U8 *pThresholds,
const OMX_U8 *pBS
);
/**
* Function: omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC (6.3.4.1.1)
*
* Description:
* Performs CAVLC decoding and inverse raster scan for a 2x2 block of
* ChromaDCLevel. The decoded coefficients in the packed position-coefficient
* buffer are stored in reverse zig-zag order, i.e., the first buffer element
* contains the last non-zero postion-coefficient pair of the block. Within
* each position-coefficient pair, the position entry indicates the
* raster-scan position of the coefficient, while the coefficient entry
* contains the coefficient value.
*
* Input Arguments:
*
* ppBitStream - Double pointer to current byte in bit stream buffer
* pOffset - Pointer to current bit position in the byte pointed to by
* *ppBitStream; valid in the range [0,7].
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after each block is decoded
* pOffset - *pOffset is updated after each block is decoded
* pNumCoeff - Pointer to the number of nonzero coefficients in this block
* ppPosCoefBuf - Double pointer to destination residual
* coefficient-position pair buffer. Buffer position
* (*ppPosCoefBuf) is updated upon return, unless there are only
* zero coefficients in the currently decoded block. In this case
* the caller is expected to bypass the transform/dequantization of
* the empty blocks.
*
* Return Value:
*
* OMX_Sts_NoErr, if the function runs without error.
*
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - ppBitStream or pOffset is NULL.
* - ppPosCoefBuf or pNumCoeff is NULL.
* OMX_Sts_Err - if one of the following is true:
* - an illegal code is encountered in the bitstream
*
*/
OMXResult omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC (
const OMX_U8 **ppBitStream,
OMX_S32*pOffset,
OMX_U8 *pNumCoeff,
OMX_U8 **ppPosCoefbuf
);
/**
* Function: omxVCM4P10_DecodeCoeffsToPairCAVLC (6.3.4.1.2)
*
* Description:
* Performs CAVLC decoding and inverse zigzag scan for 4x4 block of
* Intra16x16DCLevel, Intra16x16ACLevel, LumaLevel, and ChromaACLevel. Inverse
* field scan is not supported. The decoded coefficients in the packed
* position-coefficient buffer are stored in reverse zig-zag order, i.e., the
* first buffer element contains the last non-zero postion-coefficient pair of
* the block. Within each position-coefficient pair, the position entry
* indicates the raster-scan position of the coefficient, while the
* coefficient entry contains the coefficient value.
*
* Input Arguments:
*
* ppBitStream -Double pointer to current byte in bit stream buffer
* pOffset - Pointer to current bit position in the byte pointed to by
* *ppBitStream; valid in the range [0,7].
* sMaxNumCoeff - Maximum the number of non-zero coefficients in current
* block
* sVLCSelect - VLC table selector, obtained from the number of non-zero
* coefficients contained in the above and left 4x4 blocks. It is
* equivalent to the variable nC described in H.264 standard table
* 9 5, except its value can t be less than zero.
*
* Output Arguments:
*
* ppBitStream - *ppBitStream is updated after each block is decoded.
* Buffer position (*ppPosCoefBuf) is updated upon return, unless
* there are only zero coefficients in the currently decoded block.
* In this case the caller is expected to bypass the
* transform/dequantization of the empty blocks.
* pOffset - *pOffset is updated after each block is decoded
* pNumCoeff - Pointer to the number of nonzero coefficients in this block
* ppPosCoefBuf - Double pointer to destination residual
* coefficient-position pair buffer
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
*
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - ppBitStream or pOffset is NULL.
* - ppPosCoefBuf or pNumCoeff is NULL.
* - sMaxNumCoeff is not equal to either 15 or 16.
* - sVLCSelect is less than 0.
*
* OMX_Sts_Err - if one of the following is true:
* - an illegal code is encountered in the bitstream
*
*/
OMXResult omxVCM4P10_DecodeCoeffsToPairCAVLC (
const OMX_U8 **ppBitStream,
OMX_S32 *pOffset,
OMX_U8 *pNumCoeff,
OMX_U8 **ppPosCoefbuf,
OMX_INT sVLCSelect,
OMX_INT sMaxNumCoeff
);
/**
* Function: omxVCM4P10_TransformDequantLumaDCFromPair (6.3.4.2.1)
*
* Description:
* Reconstructs the 4x4 LumaDC block from the coefficient-position pair
* buffer, performs integer inverse, and dequantization for 4x4 LumaDC
* coefficients, and updates the pair buffer pointer to the next non-empty
* block.
*
* Input Arguments:
*
* ppSrc - Double pointer to residual coefficient-position pair buffer
* output by CALVC decoding
* QP - Quantization parameter QpY
*
* Output Arguments:
*
* ppSrc - *ppSrc is updated to the start of next non empty block
* pDst - Pointer to the reconstructed 4x4 LumaDC coefficients buffer; must
* be aligned on a 8-byte boundary.
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - ppSrc or pDst is NULL.
* - pDst is not 8 byte aligned.
* - QP is not in the range of [0-51].
*
*/
OMXResult omxVCM4P10_TransformDequantLumaDCFromPair (
const OMX_U8 **ppSrc,
OMX_S16 *pDst,
OMX_INT QP
);
/**
* Function: omxVCM4P10_TransformDequantChromaDCFromPair (6.3.4.2.2)
*
* Description:
* Reconstruct the 2x2 ChromaDC block from coefficient-position pair buffer,
* perform integer inverse transformation, and dequantization for 2x2 chroma
* DC coefficients, and update the pair buffer pointer to next non-empty
* block.
*
* Input Arguments:
*
* ppSrc - Double pointer to residual coefficient-position pair buffer
* output by CALVC decoding
* QP - Quantization parameter QpC
*
* Output Arguments:
*
* ppSrc - *ppSrc is updated to the start of next non empty block
* pDst - Pointer to the reconstructed 2x2 ChromaDC coefficients buffer;
* must be aligned on a 4-byte boundary.
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - ppSrc or pDst is NULL.
* - pDst is not 4-byte aligned.
* - QP is not in the range of [0-51].
*
*/
OMXResult omxVCM4P10_TransformDequantChromaDCFromPair (
const OMX_U8 **ppSrc,
OMX_S16 *pDst,
OMX_INT QP
);
/**
* Function: omxVCM4P10_DequantTransformResidualFromPairAndAdd (6.3.4.2.3)
*
* Description:
* Reconstruct the 4x4 residual block from coefficient-position pair buffer,
* perform dequantization and integer inverse transformation for 4x4 block of
* residuals with previous intra prediction or motion compensation data, and
* update the pair buffer pointer to next non-empty block. If pDC == NULL,
* there re 16 non-zero AC coefficients at most in the packed buffer starting
* from 4x4 block position 0; If pDC != NULL, there re 15 non-zero AC
* coefficients at most in the packet buffer starting from 4x4 block position
* 1.
*
* Input Arguments:
*
* ppSrc - Double pointer to residual coefficient-position pair buffer
* output by CALVC decoding
* pPred - Pointer to the predicted 4x4 block; must be aligned on a 4-byte
* boundary
* predStep - Predicted frame step size in bytes; must be a multiple of 4
* dstStep - Destination frame step in bytes; must be a multiple of 4
* pDC - Pointer to the DC coefficient of this block, NULL if it doesn't
* exist
* QP - QP Quantization parameter. It should be QpC in chroma 4x4 block
* decoding, otherwise it should be QpY.
* AC - Flag indicating if at least one non-zero AC coefficient exists
*
* Output Arguments:
*
* pDst - pointer to the reconstructed 4x4 block data; must be aligned on a
* 4-byte boundary
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - pPred or pDst is NULL.
* - pPred or pDst is not 4-byte aligned.
* - predStep or dstStep is not a multiple of 4.
* - AC !=0 and Qp is not in the range of [0-51] or ppSrc == NULL.
* - AC ==0 && pDC ==NULL.
*
*/
OMXResult omxVCM4P10_DequantTransformResidualFromPairAndAdd (
const OMX_U8 **ppSrc,
const OMX_U8 *pPred,
const OMX_S16 *pDC,
OMX_U8 *pDst,
OMX_INT predStep,
OMX_INT dstStep,
OMX_INT QP,
OMX_INT AC
);
/**
* Function: omxVCM4P10_MEGetBufSize (6.3.5.1.1)
*
* Description:
* Computes the size, in bytes, of the vendor-specific specification
* structure for the omxVCM4P10 motion estimation functions BlockMatch_Integer
* and MotionEstimationMB.
*
* Input Arguments:
*
* MEmode - motion estimation mode; available modes are defined by the
* enumerated type OMXVCM4P10MEMode
* pMEParams -motion estimation parameters
*
* Output Arguments:
*
* pSize - pointer to the number of bytes required for the motion
* estimation specification structure
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - pMEParams or pSize is NULL.
* - an invalid MEMode is specified.
*
*/
OMXResult omxVCM4P10_MEGetBufSize (
OMXVCM4P10MEMode MEmode,
const OMXVCM4P10MEParams *pMEParams,
OMX_U32 *pSize
);
/**
* Function: omxVCM4P10_MEInit (6.3.5.1.2)
*
* Description:
* Initializes the vendor-specific specification structure required for the
* omxVCM4P10 motion estimation functions: BlockMatch_Integer and
* MotionEstimationMB. Memory for the specification structure *pMESpec must be
* allocated prior to calling the function, and should be aligned on a 4-byte
* boundary. The number of bytes required for the specification structure can
* be determined using the function omxVCM4P10_MEGetBufSize. Following
* initialization by this function, the vendor-specific structure *pMESpec
* should contain an implementation-specific representation of all motion
* estimation parameters received via the structure pMEParams, for example
* searchRange16x16, searchRange8x8, etc.
*
* Input Arguments:
*
* MEmode - motion estimation mode; available modes are defined by the
* enumerated type OMXVCM4P10MEMode
* pMEParams - motion estimation parameters
* pMESpec - pointer to the uninitialized ME specification structure
*
* Output Arguments:
*
* pMESpec - pointer to the initialized ME specification structure
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - pMEParams or pSize is NULL.
* - an invalid value was specified for the parameter MEmode
* - a negative or zero value was specified for one of the search ranges
* (e.g., pMBParams >searchRange8x8, pMEParams->searchRange16x16, etc.)
* - either in isolation or in combination, one or more of the enables or
* search ranges in the structure *pMEParams were configured such
* that the requested behavior fails to comply with [ISO14496-10].
*
*/
OMXResult omxVCM4P10_MEInit (
OMXVCM4P10MEMode MEmode,
const OMXVCM4P10MEParams *pMEParams,
void *pMESpec
);
/**
* Function: omxVCM4P10_BlockMatch_Integer (6.3.5.2.1)
*
* Description:
* Performs integer block match. Returns best MV and associated cost.
*
* Input Arguments:
*
* pSrcOrgY - Pointer to the top-left corner of the current block:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* pSrcRefY - Pointer to the top-left corner of the co-located block in the
* reference picture:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* nSrcOrgStep - Stride of the original picture plane, expressed in terms
* of integer pixels; must be a multiple of iBlockWidth.
* nSrcRefStep - Stride of the reference picture plane, expressed in terms
* of integer pixels
* pRefRect - pointer to the valid reference rectangle inside the reference
* picture plane
* nCurrPointPos - position of the current block in the current plane
* iBlockWidth - Width of the current block, expressed in terms of integer
* pixels; must be equal to either 4, 8, or 16.
* iBlockHeight - Height of the current block, expressed in terms of
* integer pixels; must be equal to either 4, 8, or 16.
* nLamda - Lamda factor; used to compute motion cost
* pMVPred - Predicted MV; used to compute motion cost, expressed in terms
* of 1/4-pel units
* pMVCandidate - Candidate MV; used to initialize the motion search,
* expressed in terms of integer pixels
* pMESpec - pointer to the ME specification structure
*
* Output Arguments:
*
* pDstBestMV - Best MV resulting from integer search, expressed in terms
* of 1/4-pel units
* pBestCost - Motion cost associated with the best MV; computed as
* SAD+Lamda*BitsUsedByMV
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - any of the following pointers are NULL:
* pSrcOrgY, pSrcRefY, pRefRect, pMVPred, pMVCandidate, or pMESpec.
* - Either iBlockWidth or iBlockHeight are values other than 4, 8, or 16.
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_BlockMatch_Integer (
const OMX_U8 *pSrcOrgY,
OMX_S32 nSrcOrgStep,
const OMX_U8 *pSrcRefY,
OMX_S32 nSrcRefStep,
const OMXRect *pRefRect,
const OMXVCM4P2Coordinate *pCurrPointPos,
OMX_U8 iBlockWidth,
OMX_U8 iBlockHeight,
OMX_U32 nLamda,
const OMXVCMotionVector *pMVPred,
const OMXVCMotionVector *pMVCandidate,
OMXVCMotionVector *pBestMV,
OMX_S32 *pBestCost,
void *pMESpec
);
/**
* Function: omxVCM4P10_BlockMatch_Half (6.3.5.2.2)
*
* Description:
* Performs a half-pel block match using results from a prior integer search.
* Returns the best MV and associated cost. This function estimates the
* half-pixel motion vector by interpolating the integer resolution motion
* vector referenced by the input parameter pSrcDstBestMV, i.e., the initial
* integer MV is generated externally. The function
* omxVCM4P10_BlockMatch_Integer may be used for integer motion estimation.
*
* Input Arguments:
*
* pSrcOrgY - Pointer to the current position in original picture plane:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* pSrcRefY - Pointer to the top-left corner of the co-located block in the
* reference picture:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* nSrcOrgStep - Stride of the original picture plane in terms of full
* pixels; must be a multiple of iBlockWidth.
* nSrcRefStep - Stride of the reference picture plane in terms of full
* pixels
* iBlockWidth - Width of the current block in terms of full pixels; must
* be equal to either 4, 8, or 16.
* iBlockHeight - Height of the current block in terms of full pixels; must
* be equal to either 4, 8, or 16.
* nLamda - Lamda factor, used to compute motion cost
* pMVPred - Predicted MV, represented in terms of 1/4-pel units; used to
* compute motion cost
* pSrcDstBestMV - The best MV resulting from a prior integer search,
* represented in terms of 1/4-pel units
*
* Output Arguments:
*
* pSrcDstBestMV - Best MV resulting from the half-pel search, expressed in
* terms of 1/4-pel units
* pBestCost - Motion cost associated with the best MV; computed as
* SAD+Lamda*BitsUsedByMV
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - any of the following pointers is NULL: pSrcOrgY, pSrcRefY,
* pSrcDstBestMV, pMVPred, pBestCost
* - iBlockWidth or iBlockHeight are equal to values other than 4, 8, or 16.
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_BlockMatch_Half (
const OMX_U8 *pSrcOrgY,
OMX_S32 nSrcOrgStep,
const OMX_U8 *pSrcRefY,
OMX_S32 nSrcRefStep,
OMX_U8 iBlockWidth,
OMX_U8 iBlockHeight,
OMX_U32 nLamda,
const OMXVCMotionVector *pMVPred,
OMXVCMotionVector *pSrcDstBestMV,
OMX_S32 *pBestCost
);
/**
* Function: omxVCM4P10_BlockMatch_Quarter (6.3.5.2.3)
*
* Description:
* Performs a quarter-pel block match using results from a prior half-pel
* search. Returns the best MV and associated cost. This function estimates
* the quarter-pixel motion vector by interpolating the half-pel resolution
* motion vector referenced by the input parameter pSrcDstBestMV, i.e., the
* initial half-pel MV is generated externally. The function
* omxVCM4P10_BlockMatch_Half may be used for half-pel motion estimation.
*
* Input Arguments:
*
* pSrcOrgY - Pointer to the current position in original picture plane:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* pSrcRefY - Pointer to the top-left corner of the co-located block in the
* reference picture:
* If iBlockWidth==4, 4-byte alignment required.
* If iBlockWidth==8, 8-byte alignment required.
* If iBlockWidth==16, 16-byte alignment required.
* nSrcOrgStep - Stride of the original picture plane in terms of full
* pixels; must be a multiple of iBlockWidth.
* nSrcRefStep - Stride of the reference picture plane in terms of full
* pixels
* iBlockWidth - Width of the current block in terms of full pixels; must
* be equal to either 4, 8, or 16.
* iBlockHeight - Height of the current block in terms of full pixels; must
* be equal to either 4, 8, or 16.
* nLamda - Lamda factor, used to compute motion cost
* pMVPred - Predicted MV, represented in terms of 1/4-pel units; used to
* compute motion cost
* pSrcDstBestMV - The best MV resulting from a prior half-pel search,
* represented in terms of 1/4 pel units
*
* Output Arguments:
*
* pSrcDstBestMV - Best MV resulting from the quarter-pel search, expressed
* in terms of 1/4-pel units
* pBestCost - Motion cost associated with the best MV; computed as
* SAD+Lamda*BitsUsedByMV
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - One or more of the following pointers is NULL:
* pSrcOrgY, pSrcRefY, pSrcDstBestMV, pMVPred, pBestCost
* - iBlockWidth or iBlockHeight are equal to values other than 4, 8, or 16.
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_BlockMatch_Quarter (
const OMX_U8 *pSrcOrgY,
OMX_S32 nSrcOrgStep,
const OMX_U8 *pSrcRefY,
OMX_S32 nSrcRefStep,
OMX_U8 iBlockWidth,
OMX_U8 iBlockHeight,
OMX_U32 nLamda,
const OMXVCMotionVector *pMVPred,
OMXVCMotionVector *pSrcDstBestMV,
OMX_S32 *pBestCost
);
/**
* Function: omxVCM4P10_MotionEstimationMB (6.3.5.3.1)
*
* Description:
* Performs MB-level motion estimation and selects best motion estimation
* strategy from the set of modes supported in baseline profile [ISO14496-10].
*
* Input Arguments:
*
* pSrcCurrBuf - Pointer to the current position in original picture plane;
* 16-byte alignment required
* pSrcRefBufList - Pointer to an array with 16 entries. Each entry points
* to the top-left corner of the co-located MB in a reference
* picture. The array is filled from low-to-high with valid
* reference frame pointers; the unused high entries should be set
* to NULL. Ordering of the reference frames should follow
* [ISO14496-10] subclause 8.2.4 Decoding Process for Reference
* Picture Lists. The entries must be 16-byte aligned.
* pSrcRecBuf - Pointer to the top-left corner of the co-located MB in the
* reconstructed picture; must be 16-byte aligned.
* SrcCurrStep - Width of the original picture plane in terms of full
* pixels; must be a multiple of 16.
* SrcRefStep - Width of the reference picture plane in terms of full
* pixels; must be a multiple of 16.
* SrcRecStep - Width of the reconstructed picture plane in terms of full
* pixels; must be a multiple of 16.
* pRefRect - Pointer to the valid reference rectangle; relative to the
* image origin.
* pCurrPointPos - Position of the current macroblock in the current plane.
* Lambda - Lagrange factor for computing the cost function
* pMESpec - Pointer to the motion estimation specification structure; must
* have been allocated and initialized prior to calling this
* function.
* pMBInter - Array, of dimension four, containing pointers to information
* associated with four adjacent type INTER MBs (Left, Top,
* Top-Left, Top-Right). Any pointer in the array may be set equal
* to NULL if the corresponding MB doesn t exist or is not of type
* INTER.
* - pMBInter[0] - Pointer to left MB information
* - pMBInter[1] - Pointer to top MB information
* - pMBInter[2] - Pointer to top-left MB information
* - pMBInter[3] - Pointer to top-right MB information
* pMBIntra - Array, of dimension four, containing pointers to information
* associated with four adjacent type INTRA MBs (Left, Top,
* Top-Left, Top-Right). Any pointer in the array may be set equal
* to NULL if the corresponding MB doesn t exist or is not of type
* INTRA.
* - pMBIntra[0] - Pointer to left MB information
* - pMBIntra[1] - Pointer to top MB information
* - pMBIntra[2] - Pointer to top-left MB information
* - pMBIntra[3] - Pointer to top-right MB information
* pSrcDstMBCurr - Pointer to information structure for the current MB.
* The following entries should be set prior to calling the
* function: sliceID - the number of the slice the to which the
* current MB belongs.
*
* Output Arguments:
*
* pDstCost - Pointer to the minimum motion cost for the current MB.
* pDstBlockSAD - Pointer to the array of SADs for each of the sixteen luma
* 4x4 blocks in each MB. The block SADs are in scan order for
* each MB. For implementations that cannot compute the SAD values
* individually, the maximum possible value (0xffff) is returned
* for each of the 16 block SAD entries.
* pSrcDstMBCurr - Pointer to updated information structure for the current
* MB after MB-level motion estimation has been completed. The
* following fields are updated by the ME function. The following
* parameter set quantifies the MB-level ME search results:
* - MbType
* - subMBType[4]
* - pMV0[4][4]
* - pMVPred[4][4]
* - pRefL0Idx[4]
* - Intra16x16PredMode
* - pIntra4x4PredMode[4][4]
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - One or more of the following pointers is NULL: pSrcCurrBuf,
* pSrcRefBufList, pSrcRecBuf, pRefRect, pCurrPointPos, pMESpec,
* pMBInter, pMBIntra,pSrcDstMBCurr, pDstCost, pSrcRefBufList[0]
* - SrcRefStep, SrcRecStep are not multiples of 16
* - iBlockWidth or iBlockHeight are values other than 4, 8, or 16.
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_MotionEstimationMB (
const OMX_U8 *pSrcCurrBuf,
OMX_S32 SrcCurrStep,
const OMX_U8 *pSrcRefBufList[15],
OMX_S32 SrcRefStep,
const OMX_U8 *pSrcRecBuf,
OMX_S32 SrcRecStep,
const OMXRect *pRefRect,
const OMXVCM4P2Coordinate *pCurrPointPos,
OMX_U32 Lambda,
void *pMESpec,
const OMXVCM4P10MBInfoPtr *pMBInter,
const OMXVCM4P10MBInfoPtr *pMBIntra,
OMXVCM4P10MBInfoPtr pSrcDstMBCurr,
OMX_INT *pDstCost,
OMX_U16 *pDstBlockSAD
);
/**
* Function: omxVCM4P10_SAD_4x (6.3.5.4.1)
*
* Description:
* This function calculates the SAD for 4x8 and 4x4 blocks.
*
* Input Arguments:
*
* pSrcOrg -Pointer to the original block; must be aligned on a 4-byte
* boundary.
* iStepOrg -Step of the original block buffer; must be a multiple of 4.
* pSrcRef -Pointer to the reference block
* iStepRef -Step of the reference block buffer
* iHeight -Height of the block; must be equal to either 4 or 8.
*
* Output Arguments:
*
* pDstSAD -Pointer of result SAD
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - One or more of the following pointers is NULL:
* pSrcOrg, pSrcRef, or pDstSAD
* - iHeight is not equal to either 4 or 8.
* - iStepOrg is not a multiple of 4
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_SAD_4x (
const OMX_U8 *pSrcOrg,
OMX_U32 iStepOrg,
const OMX_U8 *pSrcRef,
OMX_U32 iStepRef,
OMX_S32 *pDstSAD,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_SADQuar_4x (6.3.5.4.2)
*
* Description:
* This function calculates the SAD between one block (pSrc) and the average
* of the other two (pSrcRef0 and pSrcRef1) for 4x8 or 4x4 blocks. Rounding
* is applied according to the convention (a+b+1)>>1.
*
* Input Arguments:
*
* pSrc - Pointer to the original block; must be aligned on a 4-byte
* boundary.
* pSrcRef0 - Pointer to reference block 0
* pSrcRef1 - Pointer to reference block 1
* iSrcStep - Step of the original block buffer; must be a multiple of 4.
* iRefStep0 - Step of reference block 0
* iRefStep1 - Step of reference block 1
* iHeight - Height of the block; must be equal to either 4 or 8.
*
* Output Arguments:
*
* pDstSAD - Pointer of result SAD
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - iHeight is not equal to either 4 or 8.
* - One or more of the following pointers is NULL: pSrc, pSrcRef0,
* pSrcRef1, pDstSAD.
* - iSrcStep is not a multiple of 4
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_SADQuar_4x (
const OMX_U8 *pSrc,
const OMX_U8 *pSrcRef0,
const OMX_U8 *pSrcRef1,
OMX_U32 iSrcStep,
OMX_U32 iRefStep0,
OMX_U32 iRefStep1,
OMX_U32 *pDstSAD,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_SADQuar_8x (6.3.5.4.3)
*
* Description:
* This function calculates the SAD between one block (pSrc) and the average
* of the other two (pSrcRef0 and pSrcRef1) for 8x16, 8x8, or 8x4 blocks.
* Rounding is applied according to the convention (a+b+1)>>1.
*
* Input Arguments:
*
* pSrc - Pointer to the original block; must be aligned on an 8-byte
* boundary.
* pSrcRef0 - Pointer to reference block 0
* pSrcRef1 - Pointer to reference block 1
* iSrcStep - Step of the original block buffer; must be a multiple of 8.
* iRefStep0 - Step of reference block 0
* iRefStep1 - Step of reference block 1
* iHeight - Height of the block; must be equal either 4, 8, or 16.
*
* Output Arguments:
*
* pDstSAD - Pointer of result SAD
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - iHeight is not equal to either 4, 8, or 16.
* - One or more of the following pointers is NULL: pSrc, pSrcRef0,
* pSrcRef1, pDstSAD.
* - iSrcStep is not a multiple of 8
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_SADQuar_8x (
const OMX_U8 *pSrc,
const OMX_U8 *pSrcRef0,
const OMX_U8 *pSrcRef1,
OMX_U32 iSrcStep,
OMX_U32 iRefStep0,
OMX_U32 iRefStep1,
OMX_U32 *pDstSAD,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_SADQuar_16x (6.3.5.4.4)
*
* Description:
* This function calculates the SAD between one block (pSrc) and the average
* of the other two (pSrcRef0 and pSrcRef1) for 16x16 or 16x8 blocks.
* Rounding is applied according to the convention (a+b+1)>>1.
*
* Input Arguments:
*
* pSrc - Pointer to the original block; must be aligned on a 16-byte
* boundary.
* pSrcRef0 - Pointer to reference block 0
* pSrcRef1 - Pointer to reference block 1
* iSrcStep - Step of the original block buffer; must be a multiple of 16
* iRefStep0 - Step of reference block 0
* iRefStep1 - Step of reference block 1
* iHeight - Height of the block; must be equal to either 8 or 16
*
* Output Arguments:
*
* pDstSAD -Pointer of result SAD
*
* Return Value:
* OMX_Sts_NoErr, if the function runs without error.
* OMX_Sts_BadArgErr - bad arguments: if one of the following cases occurs:
* - iHeight is not equal to either 8 or 16.
* - One or more of the following pointers is NULL: pSrc, pSrcRef0,
* pSrcRef1, pDstSAD.
* - iSrcStep is not a multiple of 16
* - Any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_SADQuar_16x (
const OMX_U8 *pSrc,
const OMX_U8 *pSrcRef0,
const OMX_U8 *pSrcRef1,
OMX_U32 iSrcStep,
OMX_U32 iRefStep0,
OMX_U32 iRefStep1,
OMX_U32 *pDstSAD,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_SATD_4x4 (6.3.5.4.5)
*
* Description:
* This function calculates the sum of absolute transform differences (SATD)
* for a 4x4 block by applying a Hadamard transform to the difference block
* and then calculating the sum of absolute coefficient values.
*
* Input Arguments:
*
* pSrcOrg - Pointer to the original block; must be aligned on a 4-byte
* boundary
* iStepOrg - Step of the original block buffer; must be a multiple of 4
* pSrcRef - Pointer to the reference block; must be aligned on a 4-byte
* boundary
* iStepRef - Step of the reference block buffer; must be a multiple of 4
*
* Output Arguments:
*
* pDstSAD - pointer to the resulting SAD
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrcOrg, pSrcRef, or pDstSAD either pSrcOrg
* - pSrcRef is not aligned on a 4-byte boundary
* - iStepOrg <= 0 or iStepOrg is not a multiple of 4
* - iStepRef <= 0 or iStepRef is not a multiple of 4
*
*/
OMXResult omxVCM4P10_SATD_4x4 (
const OMX_U8 *pSrcOrg,
OMX_U32 iStepOrg,
const OMX_U8 *pSrcRef,
OMX_U32 iStepRef,
OMX_U32 *pDstSAD
);
/**
* Function: omxVCM4P10_InterpolateHalfHor_Luma (6.3.5.5.1)
*
* Description:
* This function performs interpolation for two horizontal 1/2-pel positions
* (-1/2,0) and (1/2, 0) - around a full-pel position.
*
* Input Arguments:
*
* pSrc - Pointer to the top-left corner of the block used to interpolate in
* the reconstruction frame plane.
* iSrcStep - Step of the source buffer.
* iDstStep - Step of the destination(interpolation) buffer; must be a
* multiple of iWidth.
* iWidth - Width of the current block; must be equal to either 4, 8, or 16
* iHeight - Height of the current block; must be equal to 4, 8, or 16
*
* Output Arguments:
*
* pDstLeft -Pointer to the interpolation buffer of the left -pel position
* (-1/2, 0)
* If iWidth==4, 4-byte alignment required.
* If iWidth==8, 8-byte alignment required.
* If iWidth==16, 16-byte alignment required.
* pDstRight -Pointer to the interpolation buffer of the right -pel
* position (1/2, 0)
* If iWidth==4, 4-byte alignment required.
* If iWidth==8, 8-byte alignment required.
* If iWidth==16, 16-byte alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrc, pDstLeft, or pDstRight
* - iWidth or iHeight have values other than 4, 8, or 16
* - iWidth==4 but pDstLeft and/or pDstRight is/are not aligned on a 4-byte boundary
* - iWidth==8 but pDstLeft and/or pDstRight is/are not aligned on a 8-byte boundary
* - iWidth==16 but pDstLeft and/or pDstRight is/are not aligned on a 16-byte boundary
* - any alignment restrictions are violated
*
*/
OMXResult omxVCM4P10_InterpolateHalfHor_Luma (
const OMX_U8 *pSrc,
OMX_U32 iSrcStep,
OMX_U8 *pDstLeft,
OMX_U8 *pDstRight,
OMX_U32 iDstStep,
OMX_U32 iWidth,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_InterpolateHalfVer_Luma (6.3.5.5.2)
*
* Description:
* This function performs interpolation for two vertical 1/2-pel positions -
* (0, -1/2) and (0, 1/2) - around a full-pel position.
*
* Input Arguments:
*
* pSrc - Pointer to top-left corner of block used to interpolate in the
* reconstructed frame plane
* iSrcStep - Step of the source buffer.
* iDstStep - Step of the destination (interpolation) buffer; must be a
* multiple of iWidth.
* iWidth - Width of the current block; must be equal to either 4, 8, or 16
* iHeight - Height of the current block; must be equal to either 4, 8, or 16
*
* Output Arguments:
*
* pDstUp -Pointer to the interpolation buffer of the -pel position above
* the current full-pel position (0, -1/2)
* If iWidth==4, 4-byte alignment required.
* If iWidth==8, 8-byte alignment required.
* If iWidth==16, 16-byte alignment required.
* pDstDown -Pointer to the interpolation buffer of the -pel position below
* the current full-pel position (0, 1/2)
* If iWidth==4, 4-byte alignment required.
* If iWidth==8, 8-byte alignment required.
* If iWidth==16, 16-byte alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrc, pDstUp, or pDstDown
* - iWidth or iHeight have values other than 4, 8, or 16
* - iWidth==4 but pDstUp and/or pDstDown is/are not aligned on a 4-byte boundary
* - iWidth==8 but pDstUp and/or pDstDown is/are not aligned on a 8-byte boundary
* - iWidth==16 but pDstUp and/or pDstDown is/are not aligned on a 16-byte boundary
*
*/
OMXResult omxVCM4P10_InterpolateHalfVer_Luma (
const OMX_U8 *pSrc,
OMX_U32 iSrcStep,
OMX_U8 *pDstUp,
OMX_U8 *pDstDown,
OMX_U32 iDstStep,
OMX_U32 iWidth,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_Average_4x (6.3.5.5.3)
*
* Description:
* This function calculates the average of two 4x4, 4x8 blocks. The result
* is rounded according to (a+b+1)/2.
*
* Input Arguments:
*
* pPred0 - Pointer to the top-left corner of reference block 0
* pPred1 - Pointer to the top-left corner of reference block 1
* iPredStep0 - Step of reference block 0; must be a multiple of 4.
* iPredStep1 - Step of reference block 1; must be a multiple of 4.
* iDstStep - Step of the destination buffer; must be a multiple of 4.
* iHeight - Height of the blocks; must be either 4 or 8.
*
* Output Arguments:
*
* pDstPred - Pointer to the destination buffer. 4-byte alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pPred0, pPred1, or pDstPred
* - pDstPred is not aligned on a 4-byte boundary
* - iPredStep0 <= 0 or iPredStep0 is not a multiple of 4
* - iPredStep1 <= 0 or iPredStep1 is not a multiple of 4
* - iDstStep <= 0 or iDstStep is not a multiple of 4
* - iHeight is not equal to either 4 or 8
*
*/
OMXResult omxVCM4P10_Average_4x (
const OMX_U8 *pPred0,
const OMX_U8 *pPred1,
OMX_U32 iPredStep0,
OMX_U32 iPredStep1,
OMX_U8 *pDstPred,
OMX_U32 iDstStep,
OMX_U32 iHeight
);
/**
* Function: omxVCM4P10_TransformQuant_ChromaDC (6.3.5.6.1)
*
* Description:
* This function performs 2x2 Hadamard transform of chroma DC coefficients
* and then quantizes the coefficients.
*
* Input Arguments:
*
* pSrcDst - Pointer to the 2x2 array of chroma DC coefficients. 8-byte
* alignment required.
* iQP - Quantization parameter; must be in the range [0,51].
* bIntra - Indicate whether this is an INTRA block. 1-INTRA, 0-INTER
*
* Output Arguments:
*
* pSrcDst - Pointer to transformed and quantized coefficients. 8-byte
* alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrcDst
* - pSrcDst is not aligned on an 8-byte boundary
*
*/
OMXResult omxVCM4P10_TransformQuant_ChromaDC (
OMX_S16 *pSrcDst,
OMX_U32 iQP,
OMX_U8 bIntra
);
/**
* Function: omxVCM4P10_TransformQuant_LumaDC (6.3.5.6.2)
*
* Description:
* This function performs a 4x4 Hadamard transform of luma DC coefficients
* and then quantizes the coefficients.
*
* Input Arguments:
*
* pSrcDst - Pointer to the 4x4 array of luma DC coefficients. 16-byte
* alignment required.
* iQP - Quantization parameter; must be in the range [0,51].
*
* Output Arguments:
*
* pSrcDst - Pointer to transformed and quantized coefficients. 16-byte
* alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL: pSrcDst
* - pSrcDst is not aligned on an 16-byte boundary
*
*/
OMXResult omxVCM4P10_TransformQuant_LumaDC (
OMX_S16 *pSrcDst,
OMX_U32 iQP
);
/**
* Function: omxVCM4P10_InvTransformDequant_LumaDC (6.3.5.6.3)
*
* Description:
* This function performs inverse 4x4 Hadamard transform and then dequantizes
* the coefficients.
*
* Input Arguments:
*
* pSrc - Pointer to the 4x4 array of the 4x4 Hadamard-transformed and
* quantized coefficients. 16 byte alignment required.
* iQP - Quantization parameter; must be in the range [0,51].
*
* Output Arguments:
*
* pDst - Pointer to inverse-transformed and dequantized coefficients.
* 16-byte alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL: pSrc
* - pSrc or pDst is not aligned on a 16-byte boundary
*
*/
OMXResult omxVCM4P10_InvTransformDequant_LumaDC (
const OMX_S16 *pSrc,
OMX_S16 *pDst,
OMX_U32 iQP
);
/**
* Function: omxVCM4P10_InvTransformDequant_ChromaDC (6.3.5.6.4)
*
* Description:
* This function performs inverse 2x2 Hadamard transform and then dequantizes
* the coefficients.
*
* Input Arguments:
*
* pSrc - Pointer to the 2x2 array of the 2x2 Hadamard-transformed and
* quantized coefficients. 8 byte alignment required.
* iQP - Quantization parameter; must be in the range [0,51].
*
* Output Arguments:
*
* pDst - Pointer to inverse-transformed and dequantized coefficients.
* 8-byte alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL: pSrc
* - pSrc or pDst is not aligned on an 8-byte boundary
*
*/
OMXResult omxVCM4P10_InvTransformDequant_ChromaDC (
const OMX_S16 *pSrc,
OMX_S16 *pDst,
OMX_U32 iQP
);
/**
* Function: omxVCM4P10_InvTransformResidualAndAdd (6.3.5.7.1)
*
* Description:
* This function performs inverse an 4x4 integer transformation to produce
* the difference signal and then adds the difference to the prediction to get
* the reconstructed signal.
*
* Input Arguments:
*
* pSrcPred - Pointer to prediction signal. 4-byte alignment required.
* pDequantCoeff - Pointer to the transformed coefficients. 8-byte
* alignment required.
* iSrcPredStep - Step of the prediction buffer; must be a multiple of 4.
* iDstReconStep - Step of the destination reconstruction buffer; must be a
* multiple of 4.
* bAC - Indicate whether there is AC coefficients in the coefficients
* matrix.
*
* Output Arguments:
*
* pDstRecon -Pointer to the destination reconstruction buffer. 4-byte
* alignment required.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrcPred, pDequantCoeff, pDstRecon
* - pSrcPred is not aligned on a 4-byte boundary
* - iSrcPredStep or iDstReconStep is not a multiple of 4.
* - pDequantCoeff is not aligned on an 8-byte boundary
*
*/
OMXResult omxVCM4P10_InvTransformResidualAndAdd (
const OMX_U8 *pSrcPred,
const OMX_S16 *pDequantCoeff,
OMX_U8 *pDstRecon,
OMX_U32 iSrcPredStep,
OMX_U32 iDstReconStep,
OMX_U8 bAC
);
/**
* Function: omxVCM4P10_SubAndTransformQDQResidual (6.3.5.8.1)
*
* Description:
* This function subtracts the prediction signal from the original signal to
* produce the difference signal and then performs a 4x4 integer transform and
* quantization. The quantized transformed coefficients are stored as
* pDstQuantCoeff. This function can also output dequantized coefficients or
* unquantized DC coefficients optionally by setting the pointers
* pDstDeQuantCoeff, pDCCoeff.
*
* Input Arguments:
*
* pSrcOrg - Pointer to original signal. 4-byte alignment required.
* pSrcPred - Pointer to prediction signal. 4-byte alignment required.
* iSrcOrgStep - Step of the original signal buffer; must be a multiple of
* 4.
* iSrcPredStep - Step of the prediction signal buffer; must be a multiple
* of 4.
* pNumCoeff -Number of non-zero coefficients after quantization. If this
* parameter is not required, it is set to NULL.
* nThreshSAD - Zero-block early detection threshold. If this parameter is
* not required, it is set to 0.
* iQP - Quantization parameter; must be in the range [0,51].
* bIntra - Indicates whether this is an INTRA block, either 1-INTRA or
* 0-INTER
*
* Output Arguments:
*
* pDstQuantCoeff - Pointer to the quantized transformed coefficients.
* 8-byte alignment required.
* pDstDeQuantCoeff - Pointer to the dequantized transformed coefficients
* if this parameter is not equal to NULL. 8-byte alignment
* required.
* pDCCoeff - Pointer to the unquantized DC coefficient if this parameter
* is not equal to NULL.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrcOrg, pSrcPred, pNumCoeff, pDstQuantCoeff,
* pDstDeQuantCoeff, pDCCoeff
* - pSrcOrg is not aligned on a 4-byte boundary
* - pSrcPred is not aligned on a 4-byte boundary
* - iSrcOrgStep is not a multiple of 4
* - iSrcPredStep is not a multiple of 4
* - pDstQuantCoeff or pDstDeQuantCoeff is not aligned on an 8-byte boundary
*
*/
OMXResult omxVCM4P10_SubAndTransformQDQResidual (
const OMX_U8 *pSrcOrg,
const OMX_U8 *pSrcPred,
OMX_U32 iSrcOrgStep,
OMX_U32 iSrcPredStep,
OMX_S16 *pDstQuantCoeff,
OMX_S16 *pDstDeQuantCoeff,
OMX_S16 *pDCCoeff,
OMX_S8 *pNumCoeff,
OMX_U32 nThreshSAD,
OMX_U32 iQP,
OMX_U8 bIntra
);
/**
* Function: omxVCM4P10_GetVLCInfo (6.3.5.9.1)
*
* Description:
* This function extracts run-length encoding (RLE) information from the
* coefficient matrix. The results are returned in an OMXVCM4P10VLCInfo
* structure.
*
* Input Arguments:
*
* pSrcCoeff - pointer to the transform coefficient matrix. 8-byte
* alignment required.
* pScanMatrix - pointer to the scan order definition matrix. For a luma
* block the scan matrix should follow [ISO14496-10] section 8.5.4,
* and should contain the values 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13,
* 10, 7, 11, 14, 15. For a chroma block, the scan matrix should
* contain the values 0, 1, 2, 3.
* bAC - indicates presence of a DC coefficient; 0 = DC coefficient
* present, 1= DC coefficient absent.
* MaxNumCoef - specifies the number of coefficients contained in the
* transform coefficient matrix, pSrcCoeff. The value should be 16
* for blocks of type LUMADC, LUMAAC, LUMALEVEL, and CHROMAAC. The
* value should be 4 for blocks of type CHROMADC.
*
* Output Arguments:
*
* pDstVLCInfo - pointer to structure that stores information for
* run-length coding.
*
* Return Value:
*
* OMX_Sts_NoErr - no error
* OMX_Sts_BadArgErr - bad arguments; returned if any of the following
* conditions are true:
* - at least one of the following pointers is NULL:
* pSrcCoeff, pScanMatrix, pDstVLCInfo
* - pSrcCoeff is not aligned on an 8-byte boundary
*
*/
OMXResult omxVCM4P10_GetVLCInfo (
const OMX_S16 *pSrcCoeff,
const OMX_U8 *pScanMatrix,
OMX_U8 bAC,
OMX_U32 MaxNumCoef,
OMXVCM4P10VLCInfo*pDstVLCInfo
);
#ifdef __cplusplus
}
#endif
#endif /** end of #define _OMXVC_H_ */
/** EOF */