PageRenderTime 56ms CodeModel.GetById 20ms app.highlight 9ms RepoModel.GetById 21ms app.codeStats 3ms

/H264Dec/source/h264bsd_util.c

http://github.com/mbebenita/Broadway
C | 286 lines | 82 code | 51 blank | 153 comment | 15 complexity | dd5fc818d3a2fb25519e6d6b03f9ddb0 MD5 | raw file
  1/*
  2 * Copyright (C) 2009 The Android Open Source Project
  3 *
  4 * Licensed under the Apache License, Version 2.0 (the "License");
  5 * you may not use this file except in compliance with the License.
  6 * You may obtain a copy of the License at
  7 *
  8 *      http://www.apache.org/licenses/LICENSE-2.0
  9 *
 10 * Unless required by applicable law or agreed to in writing, software
 11 * distributed under the License is distributed on an "AS IS" BASIS,
 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 * See the License for the specific language governing permissions and
 14 * limitations under the License.
 15 */
 16
 17/*------------------------------------------------------------------------------
 18
 19    Table of contents
 20
 21     1. Include headers
 22     2. External compiler flags
 23     3. Module defines
 24     4. Local function prototypes
 25     5. Functions
 26          h264bsdCountLeadingZeros
 27          h264bsdRbspTrailingBits
 28          h264bsdMoreRbspData
 29          h264bsdNextMbAddress
 30          h264bsdSetCurrImageMbPointers
 31
 32------------------------------------------------------------------------------*/
 33
 34/*------------------------------------------------------------------------------
 35    1. Include headers
 36------------------------------------------------------------------------------*/
 37
 38#include "h264bsd_util.h"
 39
 40/*------------------------------------------------------------------------------
 41    2. External compiler flags
 42--------------------------------------------------------------------------------
 43
 44--------------------------------------------------------------------------------
 45    3. Module defines
 46------------------------------------------------------------------------------*/
 47
 48/* look-up table for expected values of stuffing bits */
 49static const u32 stuffingTable[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
 50
 51/* look-up table for chroma quantization parameter as a function of luma QP */
 52const u32 h264bsdQpC[52] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
 53    20,21,22,23,24,25,26,27,28,29,29,30,31,32,32,33,34,34,35,35,36,36,37,37,37,
 54    38,38,38,39,39,39,39};
 55
 56/*------------------------------------------------------------------------------
 57    4. Local function prototypes
 58------------------------------------------------------------------------------*/
 59
 60/*------------------------------------------------------------------------------
 61
 62   5.1  Function: h264bsdCountLeadingZeros
 63
 64        Functional description:
 65            Count leading zeros in a code word. Code word is assumed to be
 66            right-aligned, last bit of the code word in the lsb of the value.
 67
 68        Inputs:
 69            value   code word
 70            length  number of bits in the code word
 71
 72        Outputs:
 73            none
 74
 75        Returns:
 76            number of leading zeros in the code word
 77
 78------------------------------------------------------------------------------*/
 79#ifndef H264DEC_NEON
 80u32 h264bsdCountLeadingZeros(u32 value, u32 length)
 81{
 82
 83/* Variables */
 84
 85    u32 zeros = 0;
 86    u32 mask = 1 << (length - 1);
 87
 88/* Code */
 89
 90    ASSERT(length <= 32);
 91
 92    while (mask && !(value & mask))
 93    {
 94        zeros++;
 95        mask >>= 1;
 96    }
 97    return(zeros);
 98
 99}
100#endif
101/*------------------------------------------------------------------------------
102
103   5.2  Function: h264bsdRbspTrailingBits
104
105        Functional description:
106            Check Raw Byte Stream Payload (RBSP) trailing bits, i.e. stuffing.
107            Rest of the current byte (whole byte if allready byte aligned)
108            in the stream buffer shall contain a '1' bit followed by zero or
109            more '0' bits.
110
111        Inputs:
112            pStrmData   pointer to stream data structure
113
114        Outputs:
115            none
116
117        Returns:
118            HANTRO_OK      RBSP trailing bits found
119            HANTRO_NOK     otherwise
120
121------------------------------------------------------------------------------*/
122
123u32 h264bsdRbspTrailingBits(strmData_t *pStrmData)
124{
125
126/* Variables */
127
128    u32 stuffing;
129    u32 stuffingLength;
130
131/* Code */
132
133    ASSERT(pStrmData);
134    ASSERT(pStrmData->bitPosInWord < 8);
135
136    stuffingLength = 8 - pStrmData->bitPosInWord;
137
138    stuffing = h264bsdGetBits(pStrmData, stuffingLength);
139    if (stuffing == END_OF_STREAM)
140        return(HANTRO_NOK);
141
142    if (stuffing != stuffingTable[stuffingLength - 1])
143        return(HANTRO_NOK);
144    else
145        return(HANTRO_OK);
146
147}
148
149/*------------------------------------------------------------------------------
150
151   5.3  Function: h264bsdMoreRbspData
152
153        Functional description:
154            Check if there is more data in the current RBSP. The standard
155            defines this function so that there is more data if
156                -more than 8 bits left or
157                -last bits are not RBSP trailing bits
158
159        Inputs:
160            pStrmData   pointer to stream data structure
161
162        Outputs:
163            none
164
165        Returns:
166            HANTRO_TRUE    there is more data
167            HANTRO_FALSE   no more data
168
169------------------------------------------------------------------------------*/
170
171u32 h264bsdMoreRbspData(strmData_t *pStrmData)
172{
173
174/* Variables */
175
176    u32 bits;
177
178/* Code */
179
180    ASSERT(pStrmData);
181    ASSERT(pStrmData->strmBuffReadBits <= 8 * pStrmData->strmBuffSize);
182
183    bits = pStrmData->strmBuffSize * 8 - pStrmData->strmBuffReadBits;
184
185    if (bits == 0)
186        return(HANTRO_FALSE);
187
188    if ( (bits > 8) ||
189         ((h264bsdShowBits32(pStrmData)>>(32-bits)) != (1 << (bits-1))) )
190        return(HANTRO_TRUE);
191    else
192        return(HANTRO_FALSE);
193
194}
195
196/*------------------------------------------------------------------------------
197
198   5.4  Function: h264bsdNextMbAddress
199
200        Functional description:
201            Get address of the next macroblock in the current slice group.
202
203        Inputs:
204            pSliceGroupMap      slice group for each macroblock
205            picSizeInMbs        size of the picture
206            currMbAddr          where to start
207
208        Outputs:
209            none
210
211        Returns:
212            address of the next macroblock
213            0   if none of the following macroblocks belong to same slice
214                group as currMbAddr
215
216------------------------------------------------------------------------------*/
217
218u32 h264bsdNextMbAddress(u32 *pSliceGroupMap, u32 picSizeInMbs, u32 currMbAddr)
219{
220
221/* Variables */
222
223    u32 i, sliceGroup, tmp;
224
225/* Code */
226
227    ASSERT(pSliceGroupMap);
228    ASSERT(picSizeInMbs);
229    ASSERT(currMbAddr < picSizeInMbs);
230
231    sliceGroup = pSliceGroupMap[currMbAddr];
232
233    i = currMbAddr + 1;
234    tmp = pSliceGroupMap[i];
235    while ((i < picSizeInMbs) && (tmp != sliceGroup))
236    {
237        i++;
238        tmp = pSliceGroupMap[i];
239    }
240
241    if (i == picSizeInMbs)
242        i = 0;
243
244    return(i);
245
246}
247
248
249/*------------------------------------------------------------------------------
250
251   5.5  Function: h264bsdSetCurrImageMbPointers
252
253        Functional description:
254            Set luma and chroma pointers in image_t for current MB
255
256        Inputs:
257            image       Current image
258            mbNum       number of current MB
259
260        Outputs:
261            none
262
263        Returns:
264            none
265------------------------------------------------------------------------------*/
266void h264bsdSetCurrImageMbPointers(image_t *image, u32 mbNum)
267{
268    u32 width, height;
269    u32 picSize;
270    u32 row, col;
271    u32 tmp;
272
273    width = image->width;
274    height = image->height;
275    row = mbNum / width;
276    col = mbNum % width;
277
278    tmp = row * width;
279    picSize = width * height;
280
281    image->luma = (u8*)(image->data + col * 16 + tmp * 256);
282    image->cb = (u8*)(image->data + picSize * 256 + tmp * 64 + col * 8);
283    image->cr = (u8*)(image->cb + picSize * 64);
284}
285
286