armVCM4P2_FillVLCBuffer.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/**
2 *
3 * File Name:  armVCM4P2_FillVLCBuffer.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 putting VLC bits
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
24/**
25 * Function: armVCM4P2_FillVLCBuffer
26 *
27 * Description:
28 * Performs calculating the VLC bits depending on the escape type and insert
29 * the same in the bitstream
30 *
31 * Remarks:
32 *
33 * Parameters:
34 * [in]	 ppBitStream		pointer to the pointer to the current byte in
35 *	                        the bit stream
36 * [in]	 pBitOffset         pointer to the bit position in the byte pointed
37 *                          by *ppBitStream. Valid within 0 to 7
38 * [in]  run                Run value (count of zeros) to be encoded
39 * [in]  level              Level value (non-zero value) to be encoded
40 * [in]  runPlus            Calculated as runPlus = run - (RMAX + 1)
41 * [in]  levelPlus          Calculated as
42 *                          levelPlus = sign(level)*[abs(level) - LMAX]
43 * [in]  fMode              Flag indicating the escape modes
44 * [in]  last               status of the last flag
45 * [in]  maxRunForMultipleEntries
46 *                          The run value after which level will be equal to 1:
47 *                          (considering last and inter/intra status)
48 * [in]  pRunIndexTable     Run Index table defined in
49 *                          armVCM4P2_Huff_Tables_VLC.h
50 * [in]  pVlcTable          VLC table defined in armVCM4P2_Huff_Tables_VLC.h
51 * [out] ppBitStream		*ppBitStream is updated after the block is encoded
52 *                          so that it points to the current byte in the bit
53 *                          stream buffer.
54 * [out] pBitOffset         *pBitOffset is updated so that it points to the
55 *                          current bit position in the byte pointed by
56 *                          *ppBitStream.
57 *
58 * Return Value:
59 * Standard OMXResult result. See enumeration for possible result codes.
60 *
61 */
62
63OMXResult armVCM4P2_FillVLCBuffer (
64              OMX_U8 **ppBitStream,
65              OMX_INT * pBitOffset,
66              OMX_U32 run,
67              OMX_S16 level,
68			  OMX_U32 runPlus,
69              OMX_S16 levelPlus,
70              OMX_U8  fMode,
71			  OMX_U8  last,
72              OMX_U8  maxRunForMultipleEntries,
73              const OMX_U8  *pRunIndexTable,
74              const ARM_VLC32 *pVlcTable
75)
76{
77    OMX_INT tempIndex;
78	OMX_U32 tempRun = run, sign = 0;
79    OMX_S16 tempLevel = level;
80
81    /* Escape sequence addition */
82    if (fMode == 1)
83    {
84        armPackBits(ppBitStream, pBitOffset, 3, 7);
85        armPackBits(ppBitStream, pBitOffset, 0, 1);
86		tempLevel = levelPlus;
87
88    }
89    else if(fMode == 2)
90    {
91        armPackBits(ppBitStream, pBitOffset, 3, 7);
92        armPackBits(ppBitStream, pBitOffset, 2, 2);
93		tempRun = runPlus;
94    }
95    else if (fMode == 3)
96    {
97        armPackBits(ppBitStream, pBitOffset, 3, 7);
98        armPackBits(ppBitStream, pBitOffset, 3, 2);
99    }
100    else if (fMode == 4)
101    {
102        armPackBits(ppBitStream, pBitOffset, 3, 7);
103        armPackBits(ppBitStream, pBitOffset, (OMX_U32)last, 1);
104		armPackBits(ppBitStream, pBitOffset, tempRun, 6);
105		if((tempLevel != 0) && (tempLevel != -128))
106		{
107		    armPackBits(ppBitStream, pBitOffset,
108			   (OMX_U32) tempLevel, 8);
109		}
110		return OMX_Sts_NoErr;
111    }
112
113    if (tempLevel < 0)
114    {
115        sign = 1;
116        tempLevel = armAbs(tempLevel);
117    }
118    /* Putting VLC bits in the stream */
119	if (fMode < 3)
120	{
121		if (tempRun > maxRunForMultipleEntries)
122		{
123			tempIndex = pRunIndexTable [maxRunForMultipleEntries + 1] +
124						(tempRun - maxRunForMultipleEntries - 1);
125		}
126		else
127		{
128			tempIndex = pRunIndexTable [tempRun] + (tempLevel -1);
129		}
130
131		armPackVLC32 (ppBitStream, pBitOffset,
132					  pVlcTable [tempIndex]);
133		armPackBits(ppBitStream, pBitOffset, (OMX_U32)sign, 1);
134	}
135    else
136	{
137		if (sign)
138		{
139			tempLevel = -tempLevel;
140		}
141		tempRun  = run;
142		armPackBits(ppBitStream, pBitOffset, (OMX_U32)last, 1);
143		armPackBits(ppBitStream, pBitOffset, tempRun, 6);
144		armPackBits(ppBitStream, pBitOffset, 1, 1);
145		armPackBits(ppBitStream, pBitOffset,
146			   (OMX_U32) tempLevel, 12);
147		armPackBits(ppBitStream, pBitOffset, 1, 1);
148	}
149    return OMX_Sts_NoErr;
150}
151
152/*End of File*/
153
154