omxVCM4P2_DecodeBlockCoef_Intra.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/**
2 *
3 * File Name:  omxVCM4P2_DecodeBlockCoef_Intra.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 *
12 * Description:
13 * Contains modules for intra reconstruction
14 *
15 */
16
17#include "omxtypes.h"
18#include "armOMX.h"
19#include "omxVC.h"
20
21#include "armCOMM.h"
22#include "armVC.h"
23
24/**
25 * Function: omxVCM4P2_DecodeBlockCoef_Intra
26 *
27 * Description:
28 * Decodes the INTRA block coefficients. Inverse quantization, inversely zigzag
29 * positioning, and IDCT, with appropriate clipping on each step, are performed
30 * on the coefficients. The results are then placed in the output frame/plane on
31 * a pixel basis. For INTRA block, the output values are clipped to [0, 255] and
32 * written to corresponding block buffer within the destination plane.
33 *
34 * Remarks:
35 *
36 * Parameters:
37 * [in]	ppBitStream		pointer to the pointer to the current byte in
38 *								the bit stream buffer. There is no boundary
39 *								check for the bit stream buffer.
40 * [in]	pBitOffset		pointer to the bit position in the byte pointed
41 *								to by *ppBitStream. *pBitOffset is valid within
42 *								[0-7].
43 * [in]	step			width of the destination plane
44 * [in/out]	pCoefBufRow		[in]  pointer to the coefficient row buffer
45 *                        [out] updated coefficient rwo buffer
46 * [in/out]	pCoefBufCol		[in]  pointer to the coefficient column buffer
47 *                        [out] updated coefficient column buffer
48 * [in]	curQP			quantization parameter of the macroblock which
49 *								the current block belongs to
50 * [in]	pQpBuf		 Pointer to a 2-element QP array. pQpBuf[0] holds the QP of the 8x8 block left to
51 *                   the current block(QPa). pQpBuf[1] holds the QP of the 8x8 block just above the
52 *                   current block(QPc).
53 *                   Note, in case the corresponding block is out of VOP bound, the QP value will have
54 *                   no effect to the intra-prediction process. Refer to subclause  "7.4.3.3 Adaptive
55 *                   ac coefficient prediction" of ISO/IEC 14496-2(MPEG4 Part2) for accurate description.
56 * [in]	blockIndex		block index indicating the component type and
57 *								position as defined in subclause 6.1.3.8,
58 *								Figure 6-5 of ISO/IEC 14496-2.
59 * [in]	intraDCVLC		a code determined by intra_dc_vlc_thr and QP.
60 *								This allows a mechanism to switch between two VLC
61 *								for coding of Intra DC coefficients as per Table
62 *								6-21 of ISO/IEC 14496-2.
63 * [in]	ACPredFlag		a flag equal to ac_pred_flag (of luminance) indicating
64 *								if the ac coefficients of the first row or first
65 *								column are differentially coded for intra coded
66 *								macroblock.
67 * [in] shortVideoHeader    a flag indicating presence of short_video_header;
68 *                           shortVideoHeader==1 selects linear intra DC mode,
69 *							and shortVideoHeader==0 selects nonlinear intra DC mode.
70 * [out]	ppBitStream		*ppBitStream is updated after the block is
71 *								decoded, so that it points to the current byte
72 *								in the bit stream buffer
73 * [out]	pBitOffset		*pBitOffset is updated so that it points to the
74 *								current bit position in the byte pointed by
75 *								*ppBitStream
76 * [out]	pDst			pointer to the block in the destination plane.
77 *								pDst should be 16-byte aligned.
78 * [out]	pCoefBufRow		pointer to the updated coefficient row buffer.
79 *
80 * Return Value:
81 * OMX_Sts_NoErr - no error
82 * OMX_Sts_BadArgErr - bad arguments
83 *   -	At least one of the following pointers is NULL: ppBitStream, *ppBitStream, pBitOffset,
84 *                                                      pCoefBufRow, pCoefBufCol, pQPBuf, pDst.
85 *      or
86 *   -  At least one of the below case: *pBitOffset exceeds [0,7], curQP exceeds (1, 31),
87 *      blockIndex exceeds [0,9], step is not the multiple of 8, intraDCVLC is zero while
88 *      blockIndex greater than 5.
89 *      or
90 *   -	pDst is not 16-byte aligned
91 * OMX_Sts_Err - status error
92 *
93 */
94
95OMXResult omxVCM4P2_DecodeBlockCoef_Intra(
96     const OMX_U8 ** ppBitStream,
97     OMX_INT *pBitOffset,
98     OMX_U8 *pDst,
99     OMX_INT step,
100     OMX_S16 *pCoefBufRow,
101     OMX_S16 *pCoefBufCol,
102     OMX_U8 curQP,
103     const OMX_U8 *pQPBuf,
104     OMX_INT blockIndex,
105     OMX_INT intraDCVLC,
106     OMX_INT ACPredFlag,
107	 OMX_INT shortVideoHeader
108 )
109{
110    OMX_S16 tempBuf1[79], tempBuf2[79];
111    OMX_S16 *pTempBuf1, *pTempBuf2;
112    OMX_INT predDir, predACDir;
113    OMX_INT  predQP;
114    OMXVCM4P2VideoComponent videoComp;
115    OMXResult errorCode;
116
117
118    /* Aligning the local buffers */
119    pTempBuf1 = armAlignTo16Bytes(tempBuf1);
120    pTempBuf2 = armAlignTo16Bytes(tempBuf2);
121
122    /* Setting the AC prediction direction and prediction direction */
123    armVCM4P2_SetPredDir(
124        blockIndex,
125        pCoefBufRow,
126        pCoefBufCol,
127        &predDir,
128        &predQP,
129        pQPBuf);
130
131    predACDir = predDir;
132
133
134    if (ACPredFlag == 0)
135    {
136        predACDir = OMX_VC_NONE;
137    }
138
139    /* Setting the videoComp */
140    if (blockIndex <= 3)
141    {
142        videoComp = OMX_VC_LUMINANCE;
143    }
144    else
145    {
146        videoComp = OMX_VC_CHROMINANCE;
147    }
148
149
150    /* VLD and zigzag */
151    if (intraDCVLC == 1)
152    {
153        errorCode = omxVCM4P2_DecodeVLCZigzag_IntraDCVLC(
154            ppBitStream,
155            pBitOffset,
156            pTempBuf1,
157            predACDir,
158            shortVideoHeader,
159            videoComp);
160        armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
161    }
162    else
163    {
164        errorCode = omxVCM4P2_DecodeVLCZigzag_IntraACVLC(
165            ppBitStream,
166            pBitOffset,
167            pTempBuf1,
168            predACDir,
169            shortVideoHeader);
170        armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
171    }
172
173    /* AC DC prediction */
174    errorCode = omxVCM4P2_PredictReconCoefIntra(
175        pTempBuf1,
176        pCoefBufRow,
177        pCoefBufCol,
178        curQP,
179        predQP,
180        predDir,
181        ACPredFlag,
182        videoComp);
183    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
184
185    /* Dequantization */
186    errorCode = omxVCM4P2_QuantInvIntra_I(
187     pTempBuf1,
188     curQP,
189     videoComp,
190     shortVideoHeader);
191    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
192
193    /* Inverse transform */
194    errorCode = omxVCM4P2_IDCT8x8blk (pTempBuf1, pTempBuf2);
195    armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
196
197    /* Placing the linear array into the destination plane and clipping
198       it to 0 to 255 */
199
200	armVCM4P2_Clip8(pTempBuf2,pDst,step);
201
202
203    return OMX_Sts_NoErr;
204}
205
206/* End of file */
207
208
209