• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.h
25 *
26 * @brief
27 *  This file contains encoder bitstream engine related structures and
28 *  interface prototypes
29 *
30 * @author
31 *  ittiam
32 *
33 * @remarks
34 *  none
35 *
36 *******************************************************************************
37 */
38 
39 #ifndef IH264E_BITSTREAM_H_
40 #define IH264E_BITSTREAM_H_
41 
42 /*****************************************************************************/
43 /* Constant Macros                                                           */
44 /*****************************************************************************/
45 
46 /**
47 ******************************************************************************
48  *  @brief      defines the maximum number of bits in a bitstream word
49 ******************************************************************************
50  */
51 #define WORD_SIZE         32
52 
53 /**
54 ******************************************************************************
55  *  @brief  The number of consecutive zero bytes for emulation prevention check
56 ******************************************************************************
57  */
58 #define EPB_ZERO_BYTES      2
59 
60 /**
61 ******************************************************************************
62  *  @brief  Emulation prevention insertion byte
63 ******************************************************************************
64  */
65 #define EPB_BYTE            0x03
66 
67 
68 /**
69 ******************************************************************************
70  *  @brief  Stream buffer allocated per frame should be atleast MIN_STREAM_SIZE
71 ******************************************************************************
72  */
73 #define MIN_STREAM_SIZE            0x800
74 
75 
76 /*****************************************************************************/
77 /* Function Macros                                                           */
78 /*****************************************************************************/
79 
80 /**
81 ******************************************************************************
82  *  @brief   Macro to check if emulation prevention byte insertion is required
83 ******************************************************************************
84  */
85 #define SHOULD_INSERT_EPB(zero_run, next_byte)                                \
86     ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte) & 0xFC))
87 
88 /**
89 ******************************************************************************
90  *  @brief   returns the bit position of a leading 1 (msb) in a code value
91 ******************************************************************************
92  */
93 #if !MSVC
94 #define GETRANGE(r,value)   \
95 {                           \
96     r = 0;                  \
97     if(0 == value)          \
98         r = 1;              \
99     else                    \
100     {                       \
101         r = 32-CLZ(value);  \
102     }\
103 }
104 #else
105 #define GETRANGE(r,value)                 \
106 {                                         \
107     unsigned long  msb_one_bit = 0;       \
108     r = _BitScanReverse(&msb_one_bit, value) ? (UWORD32)(msb_one_bit + 1) : 1 ; \
109 }
110 #endif
111 
112 /**
113 ******************************************************************************
114  *  @brief   returns bits required to code a value
115 ******************************************************************************
116  */
117 #define UE_LENGTH(bits,x)        \
118 {                                \
119     UWORD32 r_bit;               \
120     GETRANGE(r_bit,x+1)          \
121     bits =(((r_bit - 1) << 1)+1);\
122 }                                \
123 
124 /**
125 ******************************************************************************
126  *  @brief  Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
127  *          Increments the stream offset and zero run correspondingly
128 ******************************************************************************
129  */
130 #define PUTBYTE_EPB(ptr,off,byte,zero_run)                      \
131 {                                                               \
132     if( SHOULD_INSERT_EPB(zero_run, byte) )                     \
133     {                                                           \
134         ptr[off] = EPB_BYTE;                                    \
135         off++;                                                  \
136         zero_run = 0;                                           \
137     }                                                           \
138                                                                 \
139     ptr[off] = byte;                                            \
140     off++;                                                      \
141     zero_run = byte ? 0 : zero_run+1;                           \
142 }                                                               \
143 
144 /**
145 ******************************************************************************
146  *  @brief  Ensures Byte alignment of the slice header
147 ******************************************************************************
148  */
149 #define BYTE_ALIGNMENT(ps_bitstrm) ih264e_put_rbsp_trailing_bits(ps_bitstrm)
150 
151 /**
152 ******************************************************************************
153  *  @brief  Gets number of  bits coded
154 ******************************************************************************
155  */
156 
157 #define GET_NUM_BITS(ps_bitstream) ((ps_bitstream->u4_strm_buf_offset << 3) \
158                                     + 32 - ps_bitstream->i4_bits_left_in_cw);
159 
160 
161 
162 /**
163 ******************************************************************************
164  *  @macro Align bitstream to byte - Remainig bits are filled with '1'
165 ******************************************************************************
166 */
167 #define BITSTREAM_BYTE_ALIGN(ps_bitstrm)                                    \
168    if (ps_bitstrm->i4_bits_left_in_cw & 0x07)                               \
169    {                                                                        \
170        const WORD32 len = (WORD32)((ps_bitstrm->i4_bits_left_in_cw) & 0x07);\
171        ih264e_put_bits(ps_bitstrm, (UWORD32)((1 << len) - 1), len);         \
172    }                                                                        \
173 
174 
175 /*****************************************************************************/
176 /* Structures                                                                */
177 /*****************************************************************************/
178 
179 /**
180 ******************************************************************************
181  *  @brief      Bitstream context for encoder
182 ******************************************************************************
183  */
184 typedef struct bitstrm
185 {
186     /** points to start of stream buffer.    */
187     UWORD8  *pu1_strm_buffer;
188 
189     /**
190      *  max bitstream size (in bytes).
191      *  Encoded stream shall not exceed this size.
192      */
193     UWORD32 u4_max_strm_size;
194 
195     /**
196      *  byte offset (w.r.t pu1_strm_buffer) where next byte would be written
197      *  Bitstream engine makes sure it would not corrupt data beyond
198      *  u4_max_strm_size bytes
199                                  */
200     UWORD32 u4_strm_buf_offset;
201 
202     /**
203      *  current bitstream word; It is a scratch word containing max of
204      *  WORD_SIZE bits. Will be copied to stream buffer when the word is
205      *  full
206                                  */
207     UWORD32 u4_cur_word;
208 
209     /**
210      *  signifies number of bits available in u4_cur_word
211      *  bits from msb to i4_bits_left_in_cw of u4_cur_word have already been
212      *  inserted next bits would be inserted from pos [i4_bits_left_in_cw-1]
213      *  Range of this variable [1 : WORD_SIZE]
214                                  */
215     WORD32  i4_bits_left_in_cw;
216 
217     /**
218      *  signifies the number of consecutive zero bytes propogated from previous
219      *  word. It is used for emulation prevention byte insertion in the stream
220                                  */
221     WORD32  i4_zero_bytes_run;
222 
223 } bitstrm_t;
224 
225 
226 /**
227 ******************************************************************************
228 *  @brief  Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
229 *          Increments the stream offset and zero run correspondingly
230 ******************************************************************************
231 */
ih264e_put_byte_epb(bitstrm_t * ps_bitstrm,UWORD8 byte)232 static inline IH264E_ERROR_T ih264e_put_byte_epb(bitstrm_t *ps_bitstrm, UWORD8 byte)
233 {
234     if (SHOULD_INSERT_EPB(ps_bitstrm->i4_zero_bytes_run, byte))
235     {
236         if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
237         {
238             return IH264E_BITSTREAM_BUFFER_OVERFLOW;
239         }
240         ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = EPB_BYTE;
241         ps_bitstrm->i4_zero_bytes_run = 0;
242     }
243 
244     if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
245     {
246         return IH264E_BITSTREAM_BUFFER_OVERFLOW;
247     }
248     ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = byte;
249     ps_bitstrm->i4_zero_bytes_run = byte ? 0 : ps_bitstrm->i4_zero_bytes_run + 1;
250 
251     return IH264E_SUCCESS;
252 }
253 
254 /**
255 ******************************************************************************
256 * flush the bits in cur word byte by byte  and copy to stream                *
257 * (current word is assumed to be byte aligned)                               *
258 ******************************************************************************
259 */
260 #define  BITSTREAM_FLUSH(ps_bitstrm, err)                                      \
261 {                                                                              \
262     WORD32 i;                                                                  \
263     for (i = WORD_SIZE; i > ps_bitstrm->i4_bits_left_in_cw; i -= 8)            \
264     {                                                                          \
265        UWORD8 u1_next_byte = (ps_bitstrm->u4_cur_word >> (i - 8)) & 0xFF;      \
266        err |= ih264e_put_byte_epb(ps_bitstrm, u1_next_byte);                   \
267     }                                                                          \
268     ps_bitstrm->u4_cur_word = 0;                                               \
269     ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE;                                \
270 }                                                                              \
271 
272 
273 
274 /*****************************************************************************/
275 /* Extern Function Declarations                                              */
276 /*****************************************************************************/
277 
278 /**
279 ******************************************************************************
280 *
281 *  @brief Initializes the encoder bitstream engine
282 *
283 *  @par   Description
284 *  This routine needs to be called at start of slice/frame encode
285 *
286 *  @param[in]   ps_bitstrm
287 *  pointer to bitstream context (handle)
288 *
289 *  @param[in]   p1_bitstrm_buf
290 *  bitstream buffer pointer where the encoded stream is generated in byte order
291 *
292 *  @param[in]   u4_max_bitstrm_size
293 *  indicates maximum bitstream buffer size. (in bytes)
294 *  If actual stream size exceeds the maximum size, encoder should
295 *   1. Not corrupt data beyond u4_max_bitstrm_size bytes
296 *   2. Report an error back to application indicating overflow
297 *
298 *  @return      success or failure error code
299 *
300 ******************************************************************************
301 */
302 IH264E_ERROR_T    ih264e_bitstrm_init
303         (
304             bitstrm_t   *ps_bitstrm,
305             UWORD8      *pu1_bitstrm_buf,
306             UWORD32     u4_max_bitstrm_size
307         );
308 
309 /**
310 ******************************************************************************
311 *
312 *  @brief puts a code with specified number of bits into the bitstream
313 *
314 *  @par   Description
315 *  inserts code_len number of bits from lsb of code_val into the
316 *  bitstream.  If the total bytes (u4_strm_buf_offset) exceeds max
317 *  available size (u4_max_strm_size), returns error without corrupting data
318 *  beyond it
319 *
320 *  @param[in]    ps_bitstrm
321 *  pointer to bitstream context (handle)
322 *
323 *  @param[in]    u4_code_val
324 *  code value that needs to be inserted in the stream.
325 *
326 *  @param[in]    code_len
327 *  indicates code length (in bits) of code_val that would be inserted in
328 *  bitstream buffer size.
329 *
330 *  @remarks     Assumptions: all bits from bit position code_len to msb of
331 *   code_val shall be zero
332 *
333 *  @return      success or failure error code
334 *
335 ******************************************************************************
336 */
337 IH264E_ERROR_T    ih264e_put_bits
338         (
339             bitstrm_t   *ps_bitstrm,
340             UWORD32     u4_code_val,
341             WORD32      code_len
342         );
343 
344 /**
345 ******************************************************************************
346 *
347 *  @brief inserts a 1-bit code into the bitstream
348 *
349 *  @par   Description
350 *  inserts 1bit lsb of code_val into the bitstream
351 *  updates context members like u4_cur_word, u4_strm_buf_offset and
352 *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
353 *  available size (u4_max_strm_size), returns error without corrupting data
354 *  beyond it
355 *
356 *  @param[in]    ps_bitstrm
357 *  pointer to bitstream context (handle)
358 *
359 *  @param[in]    u4_code_val
360 *  code value that needs to be inserted in the stream.
361 *
362 *  @remarks     Assumptions: all bits from bit position 1 to msb of code_val
363 *  shall be zero
364 *
365 *  @return      success or failure error code
366 *
367 ******************************************************************************
368 */
369 IH264E_ERROR_T    ih264e_put_bit
370         (
371             bitstrm_t   *ps_bitstrm,
372             UWORD32     u4_code_val
373         );
374 
375 /**
376 ******************************************************************************
377 *
378 *  @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
379 *
380 *  @par   Description
381 *  inserts rbsp trailing bits, updates context members like u4_cur_word and
382 *  i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
383 *  total words (u4_strm_buf_offset) exceeds max available size
384 *  (u4_max_strm_size), returns error without corrupting data beyond it
385 *
386 *  @param[in]    ps_bitstrm
387 *  pointer to bitstream context (handle)
388 *
389 *  @return      success or failure error code
390 *
391 ******************************************************************************
392 */
393 IH264E_ERROR_T    ih264e_put_rbsp_trailing_bits
394         (
395             bitstrm_t   *ps_bitstrm
396         );
397 
398 /**
399 ******************************************************************************
400 *
401 *  @brief puts exponential golomb code of a unsigned integer into bitstream
402 *
403 *  @par   Description
404 *  computes uev code for given syntax element and inserts the same into
405 *  bitstream by calling ih264e_put_bits() interface.
406 *
407 *  @param[in]    ps_bitstrm
408 *  pointer to bitstream context (handle)
409 *
410 *  @param[in]    u4_code_num
411 *  unsigned integer input whose golomb code is written in stream
412 *
413 *  @remarks     Assumptions: code value can be represented in less than 16bits
414 *
415 *  @return      success or failure error code
416 *
417 ******************************************************************************
418 */
419 IH264E_ERROR_T    ih264e_put_uev
420         (
421             bitstrm_t   *ps_bitstrm,
422             UWORD32     u4_code_num
423         );
424 
425 /**
426 ******************************************************************************
427 *
428 *  @brief puts exponential golomb code of a signed integer into bitstream
429 *
430 *  @par   Description
431 *  computes sev code for given syntax element and inserts the same into
432 *  bitstream by calling ih264e_put_bits() interface.
433 *
434 *  @param[in]    ps_bitstrm
435 *  pointer to bitstream context (handle)
436 *
437 *  @param[in]    syntax_elem
438 *  signed integer input whose golomb code is written in stream
439 *
440 *  @remarks     Assumptions: code value can be represented in less than 16bits
441 *
442 *  @return      success or failure error code
443 *
444 ******************************************************************************
445 */
446 IH264E_ERROR_T    ih264e_put_sev
447         (
448             bitstrm_t   *ps_bitstrm,
449             WORD32      syntax_elem
450         );
451 
452 /**
453 ******************************************************************************
454 *
455 *  @brief insert NAL start code prefix (0x000001) into bitstream with an option
456 *  of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
457 *
458 *  @par   Description
459 *  Although start code prefix could have been put by calling ih264e_put_bits(),
460 *  ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
461 *  prevention insertion is not done for the NAL start code prefix which will
462 *  surely happen otherwise by calling ih264e_put_bits() interface.
463 *
464 *  @param[in]    ps_bitstrm
465 *  pointer to bitstream context (handle)
466 *
467 *  @param[in]    insert_leading_zero_8bits
468 *  flag indicating if one more zero bytes needs to prefixed before start code
469 *
470 *  @return      success or failure error code
471 *
472 ******************************************************************************
473 */
474 IH264E_ERROR_T    ih264e_put_nal_start_code_prefix
475         (
476             bitstrm_t   *ps_bitstrm,
477             WORD32      insert_leading_zero_8bits
478         );
479 
480 #endif /* IH264E_BITSTREAM_H_ */
481