Home | History | Annotate | Download | only in encoder
      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 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( 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 ******************************************************************************
    177 * flush the bits in cur word byte by byte  and copy to stream                *
    178 * (current word is assumed to be byte aligned)                               *
    179 ******************************************************************************
    180 */
    181 #define  BITSTREAM_FLUSH(ps_bitstrm)                                           \
    182 {                                                                              \
    183     WORD32 i;                                                                  \
    184     for (i = WORD_SIZE; i > ps_bitstrm->i4_bits_left_in_cw; i -= 8)            \
    185     {                                                                          \
    186        UWORD8 u1_next_byte = (ps_bitstrm->u4_cur_word >> (i - 8)) & 0xFF;      \
    187        PUTBYTE_EPB(ps_bitstrm->pu1_strm_buffer, ps_bitstrm->u4_strm_buf_offset,\
    188                    u1_next_byte, ps_bitstrm->i4_zero_bytes_run);               \
    189     }                                                                          \
    190     ps_bitstrm->u4_cur_word = 0;                                               \
    191     ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE;                                \
    192 }                                                                              \
    193 
    194 
    195 
    196 
    197 /*****************************************************************************/
    198 /* Structures                                                                */
    199 /*****************************************************************************/
    200 
    201 /**
    202 ******************************************************************************
    203  *  @brief      Bitstream context for encoder
    204 ******************************************************************************
    205  */
    206 typedef struct bitstrm
    207 {
    208     /** points to start of stream buffer.    */
    209     UWORD8  *pu1_strm_buffer;
    210 
    211     /**
    212      *  max bitstream size (in bytes).
    213      *  Encoded stream shall not exceed this size.
    214      */
    215     UWORD32 u4_max_strm_size;
    216 
    217     /**
    218      *  byte offset (w.r.t pu1_strm_buffer) where next byte would be written
    219      *  Bitstream engine makes sure it would not corrupt data beyond
    220      *  u4_max_strm_size bytes
    221                                  */
    222     UWORD32 u4_strm_buf_offset;
    223 
    224     /**
    225      *  current bitstream word; It is a scratch word containing max of
    226      *  WORD_SIZE bits. Will be copied to stream buffer when the word is
    227      *  full
    228                                  */
    229     UWORD32 u4_cur_word;
    230 
    231     /**
    232      *  signifies number of bits available in u4_cur_word
    233      *  bits from msb to i4_bits_left_in_cw of u4_cur_word have already been
    234      *  inserted next bits would be inserted from pos [i4_bits_left_in_cw-1]
    235      *  Range of this variable [1 : WORD_SIZE]
    236                                  */
    237     WORD32  i4_bits_left_in_cw;
    238 
    239     /**
    240      *  signifies the number of consecutive zero bytes propogated from previous
    241      *  word. It is used for emulation prevention byte insertion in the stream
    242                                  */
    243     WORD32  i4_zero_bytes_run;
    244 
    245 } bitstrm_t;
    246 
    247 
    248 /*****************************************************************************/
    249 /* Extern Function Declarations                                              */
    250 /*****************************************************************************/
    251 
    252 /**
    253 ******************************************************************************
    254 *
    255 *  @brief Initializes the encoder bitstream engine
    256 *
    257 *  @par   Description
    258 *  This routine needs to be called at start of slice/frame encode
    259 *
    260 *  @param[in]   ps_bitstrm
    261 *  pointer to bitstream context (handle)
    262 *
    263 *  @param[in]   p1_bitstrm_buf
    264 *  bitstream buffer pointer where the encoded stream is generated in byte order
    265 *
    266 *  @param[in]   u4_max_bitstrm_size
    267 *  indicates maximum bitstream buffer size. (in bytes)
    268 *  If actual stream size exceeds the maximum size, encoder should
    269 *   1. Not corrupt data beyond u4_max_bitstrm_size bytes
    270 *   2. Report an error back to application indicating overflow
    271 *
    272 *  @return      success or failure error code
    273 *
    274 ******************************************************************************
    275 */
    276 IH264E_ERROR_T    ih264e_bitstrm_init
    277         (
    278             bitstrm_t   *ps_bitstrm,
    279             UWORD8      *pu1_bitstrm_buf,
    280             UWORD32     u4_max_bitstrm_size
    281         );
    282 
    283 /**
    284 ******************************************************************************
    285 *
    286 *  @brief puts a code with specified number of bits into the bitstream
    287 *
    288 *  @par   Description
    289 *  inserts code_len number of bits from lsb of code_val into the
    290 *  bitstream.  If the total bytes (u4_strm_buf_offset) exceeds max
    291 *  available size (u4_max_strm_size), returns error without corrupting data
    292 *  beyond it
    293 *
    294 *  @param[in]    ps_bitstrm
    295 *  pointer to bitstream context (handle)
    296 *
    297 *  @param[in]    u4_code_val
    298 *  code value that needs to be inserted in the stream.
    299 *
    300 *  @param[in]    code_len
    301 *  indicates code length (in bits) of code_val that would be inserted in
    302 *  bitstream buffer size.
    303 *
    304 *  @remarks     Assumptions: all bits from bit position code_len to msb of
    305 *   code_val shall be zero
    306 *
    307 *  @return      success or failure error code
    308 *
    309 ******************************************************************************
    310 */
    311 IH264E_ERROR_T    ih264e_put_bits
    312         (
    313             bitstrm_t   *ps_bitstrm,
    314             UWORD32     u4_code_val,
    315             WORD32      code_len
    316         );
    317 
    318 /**
    319 ******************************************************************************
    320 *
    321 *  @brief inserts a 1-bit code into the bitstream
    322 *
    323 *  @par   Description
    324 *  inserts 1bit lsb of code_val into the bitstream
    325 *  updates context members like u4_cur_word, u4_strm_buf_offset and
    326 *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
    327 *  available size (u4_max_strm_size), returns error without corrupting data
    328 *  beyond it
    329 *
    330 *  @param[in]    ps_bitstrm
    331 *  pointer to bitstream context (handle)
    332 *
    333 *  @param[in]    u4_code_val
    334 *  code value that needs to be inserted in the stream.
    335 *
    336 *  @remarks     Assumptions: all bits from bit position 1 to msb of code_val
    337 *  shall be zero
    338 *
    339 *  @return      success or failure error code
    340 *
    341 ******************************************************************************
    342 */
    343 IH264E_ERROR_T    ih264e_put_bit
    344         (
    345             bitstrm_t   *ps_bitstrm,
    346             UWORD32     u4_code_val
    347         );
    348 
    349 /**
    350 ******************************************************************************
    351 *
    352 *  @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
    353 *
    354 *  @par   Description
    355 *  inserts rbsp trailing bits, updates context members like u4_cur_word and
    356 *  i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
    357 *  total words (u4_strm_buf_offset) exceeds max available size
    358 *  (u4_max_strm_size), returns error without corrupting data beyond it
    359 *
    360 *  @param[in]    ps_bitstrm
    361 *  pointer to bitstream context (handle)
    362 *
    363 *  @return      success or failure error code
    364 *
    365 ******************************************************************************
    366 */
    367 IH264E_ERROR_T    ih264e_put_rbsp_trailing_bits
    368         (
    369             bitstrm_t   *ps_bitstrm
    370         );
    371 
    372 /**
    373 ******************************************************************************
    374 *
    375 *  @brief puts exponential golomb code of a unsigned integer into bitstream
    376 *
    377 *  @par   Description
    378 *  computes uev code for given syntax element and inserts the same into
    379 *  bitstream by calling ih264e_put_bits() interface.
    380 *
    381 *  @param[in]    ps_bitstrm
    382 *  pointer to bitstream context (handle)
    383 *
    384 *  @param[in]    u4_code_num
    385 *  unsigned integer input whose golomb code is written in stream
    386 *
    387 *  @remarks     Assumptions: code value can be represented in less than 16bits
    388 *
    389 *  @return      success or failure error code
    390 *
    391 ******************************************************************************
    392 */
    393 IH264E_ERROR_T    ih264e_put_uev
    394         (
    395             bitstrm_t   *ps_bitstrm,
    396             UWORD32     u4_code_num
    397         );
    398 
    399 /**
    400 ******************************************************************************
    401 *
    402 *  @brief puts exponential golomb code of a signed integer into bitstream
    403 *
    404 *  @par   Description
    405 *  computes sev code for given syntax element and inserts the same into
    406 *  bitstream by calling ih264e_put_bits() interface.
    407 *
    408 *  @param[in]    ps_bitstrm
    409 *  pointer to bitstream context (handle)
    410 *
    411 *  @param[in]    syntax_elem
    412 *  signed integer input whose golomb code is written in stream
    413 *
    414 *  @remarks     Assumptions: code value can be represented in less than 16bits
    415 *
    416 *  @return      success or failure error code
    417 *
    418 ******************************************************************************
    419 */
    420 IH264E_ERROR_T    ih264e_put_sev
    421         (
    422             bitstrm_t   *ps_bitstrm,
    423             WORD32      syntax_elem
    424         );
    425 
    426 /**
    427 ******************************************************************************
    428 *
    429 *  @brief insert NAL start code prefix (0x000001) into bitstream with an option
    430 *  of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
    431 *
    432 *  @par   Description
    433 *  Although start code prefix could have been put by calling ih264e_put_bits(),
    434 *  ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
    435 *  prevention insertion is not done for the NAL start code prefix which will
    436 *  surely happen otherwise by calling ih264e_put_bits() interface.
    437 *
    438 *  @param[in]    ps_bitstrm
    439 *  pointer to bitstream context (handle)
    440 *
    441 *  @param[in]    insert_leading_zero_8bits
    442 *  flag indicating if one more zero bytes needs to prefixed before start code
    443 *
    444 *  @return      success or failure error code
    445 *
    446 ******************************************************************************
    447 */
    448 IH264E_ERROR_T    ih264e_put_nal_start_code_prefix
    449         (
    450             bitstrm_t   *ps_bitstrm,
    451             WORD32      insert_leading_zero_8bits
    452         );
    453 
    454 #endif /* IH264E_BITSTREAM_H_ */
    455