armVCM4P2_PutVLCBits.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/**
2 *
3 * File Name:  armVCM4P2_PutVLCBits.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 module for VLC put bits to bitstream
14 *
15 */
16
17#include "omxtypes.h"
18#include "armOMX.h"
19
20#include "armVC.h"
21#include "armCOMM.h"
22#include "armCOMM_Bitstream.h"
23#include "armVCM4P2_ZigZag_Tables.h"
24#include "armVCM4P2_Huff_Tables_VLC.h"
25
26
27/**
28 * Function: armVCM4P2_PutVLCBits
29 *
30 * Description:
31 * Checks the type of Escape Mode and put encoded bits for
32 * quantized DCT coefficients.
33 *
34 * Remarks:
35 *
36 * Parameters:
37 * [in]	 ppBitStream      pointer to the pointer to the current byte in
38 *						  the bit stream
39 * [in]	 pBitOffset       pointer to the bit position in the byte pointed
40 *                        by *ppBitStream. Valid within 0 to 7
41 * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
42 *                           and escape mode 4 is used when shortVideoHeader==1.
43 * [in]  start            start indicates whether the encoding begins with
44 *                        0th element or 1st.
45 * [in]  maxStoreRunL0    Max store possible (considering last and inter/intra)
46 *                        for last = 0
47 * [in]  maxStoreRunL1    Max store possible (considering last and inter/intra)
48 *                        for last = 1
49 * [in]  maxRunForMultipleEntriesL0
50 *                        The run value after which level
51 *                        will be equal to 1:
52 *                        (considering last and inter/intra status) for last = 0
53 * [in]  maxRunForMultipleEntriesL1
54 *                        The run value after which level
55 *                        will be equal to 1:
56 *                        (considering last and inter/intra status) for last = 1
57 * [in]  pRunIndexTableL0 Run Index table defined in
58 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
59 * [in]  pVlcTableL0      VLC table for last == 0
60 * [in]  pRunIndexTableL1 Run Index table defined in
61 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
62 * [in]  pVlcTableL1      VLC table for last == 1
63 * [in]  pLMAXTableL0     Level MAX table defined in
64 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
65 * [in]  pLMAXTableL1     Level MAX table defined in
66 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
67 * [in]  pRMAXTableL0     Run MAX table defined in
68 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
69 * [in]  pRMAXTableL1     Run MAX table defined in
70 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
71 * [out] pQDctBlkCoef     pointer to the quantized DCT coefficient
72 * [out] ppBitStream      *ppBitStream is updated after the block is encoded
73 *                        so that it points to the current byte in the bit
74 *                        stream buffer.
75 * [out] pBitOffset       *pBitOffset is updated so that it points to the
76 *                        current bit position in the byte pointed by
77 *                        *ppBitStream.
78 *
79 * Return Value:
80 * Standard OMXResult result. See enumeration for possible result codes.
81 *
82 */
83
84
85OMXResult armVCM4P2_PutVLCBits (
86              OMX_U8 **ppBitStream,
87              OMX_INT * pBitOffset,
88              const OMX_S16 *pQDctBlkCoef,
89              OMX_INT shortVideoHeader,
90              OMX_U8 start,
91              OMX_U8 maxStoreRunL0,
92              OMX_U8 maxStoreRunL1,
93              OMX_U8  maxRunForMultipleEntriesL0,
94              OMX_U8  maxRunForMultipleEntriesL1,
95              const OMX_U8  * pRunIndexTableL0,
96              const ARM_VLC32 *pVlcTableL0,
97			  const OMX_U8  * pRunIndexTableL1,
98              const ARM_VLC32 *pVlcTableL1,
99              const OMX_U8  * pLMAXTableL0,
100              const OMX_U8  * pLMAXTableL1,
101              const OMX_U8  * pRMAXTableL0,
102              const OMX_U8  * pRMAXTableL1,
103              const OMX_U8  * pZigzagTable
104)
105{
106
107    OMX_U32 storeRun = 0, run, storeRunPlus;
108    OMX_U8  last = 0, first = 1, fMode;
109    OMX_S16 level, storeLevel = 0, storeLevelPlus;
110    OMX_INT i;
111
112        /* RLE encoding and packing the bits into the streams */
113        for (i = start, run=0; i < 64; i++)
114        {
115            level   = pQDctBlkCoef[pZigzagTable[i]];
116
117            /* Counting the run */
118            if (level == 0)
119            {
120                run++;
121            }
122
123            /* Found a non-zero coeff */
124            else
125            {
126                if (first == 0)
127                {
128                    last = 0;
129
130                    /* Check for a valid entry in the VLC table */
131                    storeLevelPlus = armSignCheck(storeLevel) *
132                      (armAbs(storeLevel) - pLMAXTableL0[storeRun]);
133                    storeRunPlus = storeRun -
134                                  (pRMAXTableL0[armAbs(storeLevel) - 1] + 1);
135
136                    fMode = armVCM4P2_CheckVLCEscapeMode(
137                                             storeRun,
138                                             storeRunPlus,
139                                             storeLevel,
140                                             storeLevelPlus,
141                                             maxStoreRunL0,
142                                             maxRunForMultipleEntriesL0,
143                                             shortVideoHeader,
144                                             pRunIndexTableL0);
145
146                    armVCM4P2_FillVLCBuffer (
147                                      ppBitStream,
148                                      pBitOffset,
149                                      storeRun,
150                                      storeLevel,
151									  storeRunPlus,
152                                      storeLevelPlus,
153                                      fMode,
154									  last,
155                                      maxRunForMultipleEntriesL0,
156                                      pRunIndexTableL0,
157                                      pVlcTableL0);
158                }
159                storeLevel = level;
160                storeRun   = run;
161                first = 0;
162                run = 0;
163            }
164
165        } /* end of for loop for 64 elements */
166
167        /* writing the last element */
168        last = 1;
169
170        /* Check for a valid entry in the VLC table */
171        storeLevelPlus = armSignCheck(storeLevel) *
172                        (armAbs(storeLevel) - pLMAXTableL1[run]);
173        storeRunPlus = storeRun -
174                      (pRMAXTableL1[armAbs(storeLevel) - 1] + 1);
175        fMode = armVCM4P2_CheckVLCEscapeMode(
176                                 storeRun,
177                                 storeRunPlus,
178                                 storeLevel,
179                                 storeLevelPlus,
180                                 maxStoreRunL1,
181                                 maxRunForMultipleEntriesL1,
182                                 shortVideoHeader,
183                                 pRunIndexTableL1);
184
185        armVCM4P2_FillVLCBuffer (
186                          ppBitStream,
187                          pBitOffset,
188                          storeRun,
189                          storeLevel,
190						  storeRunPlus,
191                          storeLevelPlus,
192                          fMode,
193						  last,
194                          maxRunForMultipleEntriesL1,
195                          pRunIndexTableL1,
196                          pVlcTableL1);
197	return OMX_Sts_NoErr;
198}
199
200/* End of File */
201