omxVCM4P10_InvTransformResidualAndAdd.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/**
2 *
3 * File Name:  omxVCM4P10_InvTransformResidualAndAdd.c
4 * OpenMAX DL: v1.0.2
5 * Revision:   9641
6 * Date:       Thursday, February 7, 2008
7 *
8 * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9 *
10 *
11 * Description:
12 * This function will inverse integer 4x4 transform
13 *
14 */
15
16#include "omxtypes.h"
17#include "armOMX.h"
18#include "omxVC.h"
19
20#include "armCOMM.h"
21#include "armVC.h"
22
23/**
24 * Function:  omxVCM4P10_InvTransformResidualAndAdd   (6.3.5.7.1)
25 *
26 * Description:
27 * This function performs inverse an 4x4 integer transformation to produce
28 * the difference signal and then adds the difference to the prediction to get
29 * the reconstructed signal.
30 *
31 * Input Arguments:
32 *
33 *   pSrcPred - Pointer to prediction signal.  4-byte alignment required.
34 *   pDequantCoeff - Pointer to the transformed coefficients.  8-byte
35 *            alignment required.
36 *   iSrcPredStep - Step of the prediction buffer; must be a multiple of 4.
37 *   iDstReconStep - Step of the destination reconstruction buffer; must be a
38 *            multiple of 4.
39 *   bAC - Indicate whether there is AC coefficients in the coefficients
40 *            matrix.
41 *
42 * Output Arguments:
43 *
44 *   pDstRecon -Pointer to the destination reconstruction buffer.  4-byte
45 *            alignment required.
46 *
47 * Return Value:
48 *
49 *    OMX_Sts_NoErr - no error
50 *    OMX_Sts_BadArgErr - bad arguments; returned if any of the following
51 *              conditions are true:
52 *    -    at least one of the following pointers is NULL:
53 *            pSrcPred, pDequantCoeff, pDstRecon
54 *    -    pSrcPred is not aligned on a 4-byte boundary
55 *    -    iSrcPredStep or iDstReconStep is not a multiple of 4.
56 *    -    pDequantCoeff is not aligned on an 8-byte boundary
57 *
58 */
59OMXResult omxVCM4P10_InvTransformResidualAndAdd(
60	const OMX_U8* 	pSrcPred,
61	const OMX_S16* 	pDequantCoeff,
62	OMX_U8* 	pDstRecon,
63	OMX_U32 	iSrcPredStep,
64	OMX_U32		iDstReconStep,
65	OMX_U8		bAC
66)
67{
68    OMX_INT     i, j;
69    OMX_S16     In[16], Out[16];
70    OMX_S32     Value;
71
72    /* check for argument error */
73    armRetArgErrIf(pSrcPred == NULL, OMX_Sts_BadArgErr)
74    armRetArgErrIf(armNot4ByteAligned(pSrcPred), OMX_Sts_BadArgErr)
75    armRetArgErrIf(pDequantCoeff == NULL, OMX_Sts_BadArgErr)
76    armRetArgErrIf(armNot8ByteAligned(pDequantCoeff), OMX_Sts_BadArgErr)
77    armRetArgErrIf(pDstRecon == NULL, OMX_Sts_BadArgErr)
78    armRetArgErrIf(armNot4ByteAligned(pDstRecon), OMX_Sts_BadArgErr)
79    armRetArgErrIf(bAC > 1, OMX_Sts_BadArgErr)
80    armRetArgErrIf(iSrcPredStep == 0 || iSrcPredStep & 3, OMX_Sts_BadArgErr)
81    armRetArgErrIf(iDstReconStep == 0 || iDstReconStep & 3, OMX_Sts_BadArgErr)
82
83    if (bAC)
84    {
85        for (i = 0; i < 16; i++)
86        {
87            In[i] = pDequantCoeff [i];
88        }
89    }
90    else
91    {
92        /* Copy DC */
93        In[0] = pDequantCoeff [0];
94
95        for (i = 1; i < 16; i++)
96        {
97            In[i] = 0;
98        }
99    }
100
101    /* Residual Transform */
102    armVCM4P10_TransformResidual4x4 (Out, In);
103
104    for (j = 0; j < 4; j++)
105    {
106        for (i = 0; i < 4; i++)
107        {
108            /* Add predition */
109            Value = (OMX_S32) Out [j * 4 + i] + pSrcPred [j * iSrcPredStep + i];
110
111            /* Saturate Value to OMX_U8 */
112            Value = armClip (0, 255, Value);
113
114            pDstRecon[j * iDstReconStep + i] = (OMX_U8) Value;
115        }
116    }
117
118    return OMX_Sts_NoErr;
119}
120
121/*****************************************************************************
122 *                              END OF FILE
123 *****************************************************************************/
124
125