/src/libavc/encoder/ih264e_bitstream.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | |
21 | | /** |
22 | | ****************************************************************************** |
23 | | * @file |
24 | | * ih264e_bitstream.c |
25 | | * |
26 | | * @brief |
27 | | * This file contains function definitions related to bitstream generation |
28 | | * |
29 | | * @author |
30 | | * ittiam |
31 | | * |
32 | | * @par List of Functions: |
33 | | * - ih264e_bitstrm_init |
34 | | * - ih264e_put_bits |
35 | | * - ih264e_put_bit |
36 | | * - ih264e_put_rbsp_trailing_bits |
37 | | * - ih264e_put_uev |
38 | | * - ih264e_put_sev |
39 | | * - ih264e_put_nal_start_code_prefix |
40 | | * |
41 | | ****************************************************************************** |
42 | | */ |
43 | | |
44 | | /*****************************************************************************/ |
45 | | /* File Includes */ |
46 | | /*****************************************************************************/ |
47 | | |
48 | | /* System Include Files */ |
49 | | #include <stdio.h> |
50 | | #include <string.h> |
51 | | #include <stdlib.h> |
52 | | #include <assert.h> |
53 | | #include <stdarg.h> |
54 | | #include <math.h> |
55 | | |
56 | | /* User Include Files */ |
57 | | #include "ih264e_config.h" |
58 | | #include "ih264_typedefs.h" |
59 | | |
60 | | #include "ih264_debug.h" |
61 | | #include "ih264_macros.h" |
62 | | #include "ih264_defs.h" |
63 | | #include "ih264_platform_macros.h" |
64 | | |
65 | | #include "ih264e_error.h" |
66 | | #include "ih264e_bitstream.h" |
67 | | |
68 | | /*****************************************************************************/ |
69 | | /* Function Definitions */ |
70 | | /*****************************************************************************/ |
71 | | |
72 | | /** |
73 | | ****************************************************************************** |
74 | | * |
75 | | * @brief Initializes the encoder bitstream engine |
76 | | * |
77 | | * @par Description |
78 | | * This routine needs to be called at start of slice/frame encode |
79 | | * |
80 | | * @param[in] ps_bitstrm |
81 | | * pointer to bitstream context (handle) |
82 | | * |
83 | | * @param[in] p1_bitstrm_buf |
84 | | * bitstream buffer pointer where the encoded stream is generated in byte order |
85 | | * |
86 | | * @param[in] u4_max_bitstrm_size |
87 | | * indicates maximum bitstream buffer size. (in bytes) |
88 | | * If actual stream size exceeds the maximum size, encoder should |
89 | | * 1. Not corrupt data beyond u4_max_bitstrm_size bytes |
90 | | * 2. Report an error back to application indicating overflow |
91 | | * |
92 | | * @return success or failure error code |
93 | | * |
94 | | ****************************************************************************** |
95 | | */ |
96 | | IH264E_ERROR_T ih264e_bitstrm_init(bitstrm_t *ps_bitstrm, |
97 | | UWORD8 *pu1_bitstrm_buf, |
98 | | UWORD32 u4_max_bitstrm_size) |
99 | 117k | { |
100 | 117k | ps_bitstrm->pu1_strm_buffer = pu1_bitstrm_buf; |
101 | 117k | ps_bitstrm->u4_max_strm_size = u4_max_bitstrm_size; |
102 | | |
103 | | /* Default init values for other members of bitstream context */ |
104 | 117k | ps_bitstrm->u4_strm_buf_offset = 0; |
105 | 117k | ps_bitstrm->u4_cur_word = 0; |
106 | 117k | ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE; |
107 | 117k | ps_bitstrm->i4_zero_bytes_run = 0; |
108 | | |
109 | 117k | return(IH264E_SUCCESS); |
110 | 117k | } |
111 | | |
112 | | /** |
113 | | ****************************************************************************** |
114 | | * |
115 | | * @brief puts a code with specified number of bits into the bitstream |
116 | | * |
117 | | * @par Description |
118 | | * inserts code_len number of bits from lsb of code_val into the |
119 | | * bitstream. updates context members like u4_cur_word, u4_strm_buf_offset and |
120 | | * i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max |
121 | | * available size (u4_max_strm_size), returns error without corrupting data |
122 | | * beyond it |
123 | | * |
124 | | * @param[in] ps_bitstrm |
125 | | * pointer to bitstream context (handle) |
126 | | * |
127 | | * @param[in] u4_code_val |
128 | | * code value that needs to be inserted in the stream. |
129 | | * |
130 | | * @param[in] code_len |
131 | | * indicates code length (in bits) of code_val that would be inserted in |
132 | | * bitstream buffer size. Range of length[1:WORD_SIZE] |
133 | | * |
134 | | * @remarks Assumptions: all bits from bit position code_len to msb of |
135 | | * code_val shall be zero |
136 | | * |
137 | | * @return success or failure error code |
138 | | * |
139 | | ****************************************************************************** |
140 | | */ |
141 | | IH264E_ERROR_T ih264e_put_bits(bitstrm_t *ps_bitstrm, |
142 | | UWORD32 u4_code_val, |
143 | | WORD32 code_len) |
144 | 189M | { |
145 | 189M | UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word; |
146 | 189M | WORD32 bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw; |
147 | | |
148 | | |
149 | | /* check assumptions made in the module */ |
150 | 189M | ASSERT(code_len > 0 && code_len <= WORD_SIZE); |
151 | | |
152 | 189M | if(code_len < WORD_SIZE) |
153 | 189M | ASSERT((u4_code_val >> code_len) == 0); |
154 | | |
155 | | /* sanity check on the bitstream engine state */ |
156 | 189M | ASSERT(bits_left_in_cw > 0 && bits_left_in_cw <= WORD_SIZE); |
157 | | |
158 | 189M | ASSERT(ps_bitstrm->i4_zero_bytes_run <= EPB_ZERO_BYTES); |
159 | | |
160 | 189M | ASSERT(ps_bitstrm->pu1_strm_buffer != NULL); |
161 | | |
162 | | |
163 | 189M | if(bits_left_in_cw > code_len) |
164 | 153M | { |
165 | | /*******************************************************************/ |
166 | | /* insert the code in local bitstream word and return */ |
167 | | /* code is inserted in position of bits left (post decrement) */ |
168 | | /*******************************************************************/ |
169 | 153M | bits_left_in_cw -= code_len; |
170 | 153M | u4_cur_word |= (u4_code_val << bits_left_in_cw); |
171 | | |
172 | 153M | ps_bitstrm->u4_cur_word = u4_cur_word; |
173 | 153M | ps_bitstrm->i4_bits_left_in_cw = bits_left_in_cw; |
174 | | |
175 | 153M | return(IH264E_SUCCESS); |
176 | 153M | } |
177 | 36.4M | else |
178 | 36.4M | { |
179 | | /********************************************************************/ |
180 | | /* 1. insert partial code corresponding to bits left in cur word */ |
181 | | /* 2. flush all the bits of cur word to bitstream */ |
182 | | /* 3. insert emulation prevention bytes while flushing the bits */ |
183 | | /* 4. insert remaining bits of code starting from msb of cur word */ |
184 | | /* 5. update bitsleft in current word and stream buffer offset */ |
185 | | /********************************************************************/ |
186 | 36.4M | WORD32 i, rem_bits = (code_len - bits_left_in_cw); |
187 | | |
188 | | /* insert parital code corresponding to bits left in cur word */ |
189 | 36.4M | u4_cur_word |= u4_code_val >> rem_bits; |
190 | | |
191 | 179M | for(i = WORD_SIZE; i > 0; i -= 8) |
192 | 143M | { |
193 | | /* flush the bits in cur word byte by byte and copy to stream */ |
194 | 143M | UWORD8 u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF; |
195 | | |
196 | 143M | IH264E_ERROR_T status = ih264e_put_byte_epb(ps_bitstrm, u1_next_byte); |
197 | 143M | if (status != IH264E_SUCCESS) return status; |
198 | 143M | } |
199 | | |
200 | | /* insert the remaining bits from code val into current word */ |
201 | 35.6M | u4_cur_word = rem_bits ? (u4_code_val << (WORD_SIZE - rem_bits)) : 0; |
202 | | |
203 | | /* update the state variables and return success */ |
204 | 35.6M | ps_bitstrm->u4_cur_word = u4_cur_word; |
205 | 35.6M | ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE - rem_bits; |
206 | 35.6M | return (IH264E_SUCCESS); |
207 | | |
208 | 36.4M | } |
209 | 189M | } |
210 | | |
211 | | /** |
212 | | ****************************************************************************** |
213 | | * |
214 | | * @brief inserts a 1-bit code into the bitstream |
215 | | * |
216 | | * @par Description |
217 | | * inserts 1bit lsb of code_val into the bitstream |
218 | | * updates context members like u4_cur_word, u4_strm_buf_offset and |
219 | | * i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max |
220 | | * available size (u4_max_strm_size), returns error without corrupting data |
221 | | * beyond it |
222 | | * |
223 | | * @param[in] ps_bitstrm |
224 | | * pointer to bitstream context (handle) |
225 | | * |
226 | | * @param[in] u4_code_val |
227 | | * code value that needs to be inserted in the stream. |
228 | | * |
229 | | * @remarks Assumptions: all bits from bit position 1 to msb of code_val |
230 | | * shall be zero |
231 | | * |
232 | | * @return success or failure error code |
233 | | * |
234 | | ****************************************************************************** |
235 | | */ |
236 | | IH264E_ERROR_T ih264e_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val) |
237 | 0 | { |
238 | | /* call the put bits function for 1 bit and return */ |
239 | 0 | return(ih264e_put_bits(ps_bitstrm, u4_code_val, 1)); |
240 | 0 | } |
241 | | |
242 | | /** |
243 | | ****************************************************************************** |
244 | | * |
245 | | * @brief inserts rbsp trailing bits at the end of stream buffer (NAL) |
246 | | * |
247 | | * @par Description |
248 | | * inserts rbsp trailing bits, updates context members like u4_cur_word and |
249 | | * i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the |
250 | | * total words (u4_strm_buf_offset) exceeds max available size |
251 | | * (u4_max_strm_size), returns error without corrupting data beyond it |
252 | | * |
253 | | * @param[in] ps_bitstrm |
254 | | * pointer to bitstream context (handle) |
255 | | * |
256 | | * @return success or failure error code |
257 | | * |
258 | | ****************************************************************************** |
259 | | */ |
260 | | IH264E_ERROR_T ih264e_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm) |
261 | 193k | { |
262 | 193k | WORD32 i; |
263 | 193k | UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word; |
264 | 193k | WORD32 bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw; |
265 | 193k | WORD32 bytes_left_in_cw = (bits_left_in_cw - 1) >> 3; |
266 | | |
267 | | /* insert a 1 at the end of current word and flush all the bits */ |
268 | 193k | u4_cur_word |= (1 << (bits_left_in_cw - 1)); |
269 | | |
270 | | /* get the bits to be inserted in msbdb of the word */ |
271 | | //u4_cur_word <<= (WORD_SIZE - bytes_left_in_cw + 1); |
272 | | |
273 | 638k | for(i = WORD_SIZE; i > (bytes_left_in_cw*8); i -= 8) |
274 | 445k | { |
275 | | /* flush the bits in cur word byte by byte and copy to stream */ |
276 | 445k | UWORD8 u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF; |
277 | | |
278 | 445k | IH264E_ERROR_T status = ih264e_put_byte_epb(ps_bitstrm, u1_next_byte); |
279 | 445k | if (status != IH264E_SUCCESS) return status; |
280 | 445k | } |
281 | | |
282 | | /* Default init values for scratch variables of bitstream context */ |
283 | 193k | ps_bitstrm->u4_cur_word = 0; |
284 | 193k | ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE; |
285 | 193k | ps_bitstrm->i4_zero_bytes_run = 0; |
286 | | |
287 | 193k | return (IH264E_SUCCESS); |
288 | 193k | } |
289 | | |
290 | | /** |
291 | | ****************************************************************************** |
292 | | * |
293 | | * @brief puts exponential golomb code of a unsigned integer into bitstream |
294 | | * |
295 | | * @par Description |
296 | | * computes uev code for given syntax element and inserts the same into |
297 | | * bitstream by calling ih264e_put_bits() interface. |
298 | | * |
299 | | * @param[in] ps_bitstrm |
300 | | * pointer to bitstream context (handle) |
301 | | * |
302 | | * @param[in] u4_code_num |
303 | | * unsigned integer input whose golomb code is written in stream |
304 | | * |
305 | | * @remarks Assumptions: code value can be represented in less than 16bits |
306 | | * |
307 | | * @return success or failure error code |
308 | | * |
309 | | ****************************************************************************** |
310 | | */ |
311 | | IH264E_ERROR_T ih264e_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num) |
312 | 21.1M | { |
313 | 21.1M | UWORD32 u4_bit_str, u4_range; |
314 | 21.1M | IH264E_ERROR_T e_error; |
315 | | |
316 | | /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */ |
317 | 21.1M | u4_bit_str = u4_code_num + 1; |
318 | | |
319 | | /* get range of the bit string and put using put_bits() */ |
320 | 21.1M | GETRANGE(u4_range, u4_bit_str); |
321 | | |
322 | 21.1M | e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1)); |
323 | | |
324 | 21.1M | return(e_error); |
325 | 21.1M | } |
326 | | |
327 | | /** |
328 | | ****************************************************************************** |
329 | | * |
330 | | * @brief puts exponential golomb code of a signed integer into bitstream |
331 | | * |
332 | | * @par Description |
333 | | * computes sev code for given syntax element and inserts the same into |
334 | | * bitstream by calling ih264e_put_bits() interface. |
335 | | * |
336 | | * @param[in] ps_bitstrm |
337 | | * pointer to bitstream context (handle) |
338 | | * |
339 | | * @param[in] syntax_elem |
340 | | * signed integer input whose golomb code is written in stream |
341 | | * |
342 | | * @remarks Assumptions: code value can be represented in less than 16bits |
343 | | * |
344 | | * @return success or failure error code |
345 | | * |
346 | | ****************************************************************************** |
347 | | */ |
348 | | IH264E_ERROR_T ih264e_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem) |
349 | 7.28M | { |
350 | 7.28M | UWORD32 u4_code_num, u4_bit_str, u4_range; |
351 | 7.28M | IH264E_ERROR_T e_error; |
352 | | |
353 | | /************************************************************************/ |
354 | | /* convert the codenum to exp-golomb bit code for signed syntax element */ |
355 | | /* See Table9-2 and Table 9-3 of standard JCTVC-J1003_d7 */ |
356 | | /************************************************************************/ |
357 | 7.28M | if(syntax_elem <= 0) |
358 | 6.98M | { |
359 | | /* codeNum for non-positive integer = 2*abs(x) : Table9-3 */ |
360 | 6.98M | u4_code_num = ((-syntax_elem) << 1); |
361 | 6.98M | } |
362 | 295k | else |
363 | 295k | { |
364 | | /* codeNum for positive integer = 2x-1 : Table9-3 */ |
365 | 295k | u4_code_num = (syntax_elem << 1) - 1; |
366 | 295k | } |
367 | | |
368 | | /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */ |
369 | 7.28M | u4_bit_str = u4_code_num + 1; |
370 | | |
371 | | /* get range of the bit string and put using put_bits() */ |
372 | 7.28M | GETRANGE(u4_range, u4_bit_str); |
373 | | |
374 | 7.28M | e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1)); |
375 | | |
376 | 7.28M | return(e_error); |
377 | 7.28M | } |
378 | | |
379 | | /** |
380 | | ****************************************************************************** |
381 | | * |
382 | | * @brief insert NAL start code prefix (0x000001) into bitstream with an option |
383 | | * of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001) |
384 | | * |
385 | | * @par Description |
386 | | * Although start code prefix could have been put by calling ih264e_put_bits(), |
387 | | * ih264e_put_nal_start_code_prefix() is specially added to make sure emulation |
388 | | * prevention insertion is not done for the NAL start code prefix which will |
389 | | * surely happen otherwise by calling ih264e_put_bits() interface. |
390 | | * |
391 | | * @param[in] ps_bitstrm |
392 | | * pointer to bitstream context (handle) |
393 | | * |
394 | | * @param[in] insert_leading_zero_8bits |
395 | | * flag indicating if one more zero bytes needs to prefixed before start code |
396 | | * |
397 | | * @return success or failure error code |
398 | | * |
399 | | ****************************************************************************** |
400 | | */ |
401 | | IH264E_ERROR_T ih264e_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm, |
402 | | WORD32 insert_leading_zero_8bits) |
403 | 197k | { |
404 | 197k | UWORD32 u4_strm_buf_offset = ps_bitstrm->u4_strm_buf_offset; |
405 | 197k | UWORD8* pu1_strm_buf = ps_bitstrm->pu1_strm_buffer; |
406 | | |
407 | | /* Bitstream buffer overflow check assuming worst case of 4 bytes */ |
408 | 197k | if((u4_strm_buf_offset + 4) >= ps_bitstrm->u4_max_strm_size) |
409 | 1 | { |
410 | 1 | return(IH264E_BITSTREAM_BUFFER_OVERFLOW); |
411 | 1 | } |
412 | | |
413 | | /* Insert leading zero 8 bits conditionally */ |
414 | 197k | if(insert_leading_zero_8bits) |
415 | 197k | { |
416 | 197k | pu1_strm_buf[u4_strm_buf_offset] = 0x00; |
417 | 197k | u4_strm_buf_offset++; |
418 | 197k | } |
419 | | |
420 | | /* Insert NAL start code prefix 0x00 00 01 */ |
421 | 197k | pu1_strm_buf[u4_strm_buf_offset] = 0x00; |
422 | 197k | u4_strm_buf_offset++; |
423 | | |
424 | 197k | pu1_strm_buf[u4_strm_buf_offset] = 0x00; |
425 | 197k | u4_strm_buf_offset++; |
426 | | |
427 | 197k | pu1_strm_buf[u4_strm_buf_offset] = 0x01; |
428 | 197k | u4_strm_buf_offset++; |
429 | | |
430 | | /* update the stream offset */ |
431 | 197k | ps_bitstrm->u4_strm_buf_offset = u4_strm_buf_offset; |
432 | | |
433 | 197k | return (IH264E_SUCCESS); |
434 | 197k | } |
435 | | |