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.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 #include "ih264_platform_macros.h"
     60 #include "ih264_debug.h"
     61 #include "ih264e_error.h"
     62 #include "ih264e_bitstream.h"
     63 #include "ih264_defs.h"
     64 #include "ih264_macros.h"
     65 
     66 
     67 /*****************************************************************************/
     68 /* Function Definitions                                                      */
     69 /*****************************************************************************/
     70 
     71 /**
     72 ******************************************************************************
     73 *
     74 *  @brief Initializes the encoder bitstream engine
     75 *
     76 *  @par   Description
     77 *  This routine needs to be called at start of slice/frame encode
     78 *
     79 *  @param[in]   ps_bitstrm
     80 *  pointer to bitstream context (handle)
     81 *
     82 *  @param[in]   p1_bitstrm_buf
     83 *  bitstream buffer pointer where the encoded stream is generated in byte order
     84 *
     85 *  @param[in]   u4_max_bitstrm_size
     86 *  indicates maximum bitstream buffer size. (in bytes)
     87 *  If actual stream size exceeds the maximum size, encoder should
     88 *   1. Not corrupt data beyond u4_max_bitstrm_size bytes
     89 *   2. Report an error back to application indicating overflow
     90 *
     91 *  @return      success or failure error code
     92 *
     93 ******************************************************************************
     94 */
     95 IH264E_ERROR_T ih264e_bitstrm_init(bitstrm_t *ps_bitstrm,
     96                                    UWORD8 *pu1_bitstrm_buf,
     97                                    UWORD32 u4_max_bitstrm_size)
     98 {
     99     ps_bitstrm->pu1_strm_buffer  = pu1_bitstrm_buf;
    100     ps_bitstrm->u4_max_strm_size = u4_max_bitstrm_size;
    101 
    102     /* Default init values for other members of bitstream context */
    103     ps_bitstrm->u4_strm_buf_offset  = 0;
    104     ps_bitstrm->u4_cur_word         = 0;
    105     ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE;
    106     ps_bitstrm->i4_zero_bytes_run   = 0;
    107 
    108     return(IH264E_SUCCESS);
    109 }
    110 
    111 /**
    112 ******************************************************************************
    113 *
    114 *  @brief puts a code with specified number of bits into the bitstream
    115 *
    116 *  @par   Description
    117 *  inserts code_len number of bits from lsb of code_val into the
    118 *  bitstream. updates context members like u4_cur_word, u4_strm_buf_offset and
    119 *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
    120 *  available size (u4_max_strm_size), returns error without corrupting data
    121 *  beyond it
    122 *
    123 *  @param[in]    ps_bitstrm
    124 *  pointer to bitstream context (handle)
    125 *
    126 *  @param[in]    u4_code_val
    127 *  code value that needs to be inserted in the stream.
    128 *
    129 *  @param[in]    code_len
    130 *  indicates code length (in bits) of code_val that would be inserted in
    131 *  bitstream buffer size. Range of length[1:WORD_SIZE]
    132 *
    133 *  @remarks     Assumptions: all bits from bit position code_len to msb of
    134 *   code_val shall be zero
    135 *
    136 *  @return      success or failure error code
    137 *
    138 ******************************************************************************
    139 */
    140 IH264E_ERROR_T ih264e_put_bits(bitstrm_t *ps_bitstrm,
    141                                UWORD32 u4_code_val,
    142                                WORD32 code_len)
    143 {
    144     UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word;
    145     WORD32  bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw;
    146 
    147 
    148     /* check assumptions made in the module */
    149     ASSERT(code_len > 0 && code_len <= WORD_SIZE);
    150 
    151     if(code_len < WORD_SIZE)
    152         ASSERT((u4_code_val >> code_len) == 0);
    153 
    154     /* sanity check on the bitstream engine state */
    155     ASSERT(bits_left_in_cw > 0 && bits_left_in_cw <= WORD_SIZE);
    156 
    157     ASSERT(ps_bitstrm->i4_zero_bytes_run <= EPB_ZERO_BYTES);
    158 
    159     ASSERT(ps_bitstrm->pu1_strm_buffer != NULL);
    160 
    161 
    162     if(bits_left_in_cw > code_len)
    163     {
    164         /*******************************************************************/
    165         /* insert the code in local bitstream word and return              */
    166         /* code is inserted in position of bits left (post decrement)      */
    167         /*******************************************************************/
    168         bits_left_in_cw -= code_len;
    169         u4_cur_word     |= (u4_code_val << bits_left_in_cw);
    170 
    171         ps_bitstrm->u4_cur_word         = u4_cur_word;
    172         ps_bitstrm->i4_bits_left_in_cw  = bits_left_in_cw;
    173 
    174         return(IH264E_SUCCESS);
    175     }
    176     else
    177     {
    178         /********************************************************************/
    179         /* 1. insert partial code corresponding to bits left in cur word    */
    180         /* 2. flush all the bits of cur word to bitstream                   */
    181         /* 3. insert emulation prevention bytes while flushing the bits     */
    182         /* 4. insert remaining bits of code starting from msb of cur word   */
    183         /* 5. update bitsleft in current word and stream buffer offset      */
    184         /********************************************************************/
    185         UWORD32 u4_strm_buf_offset  = ps_bitstrm->u4_strm_buf_offset;
    186 
    187         UWORD32 u4_max_strm_size    = ps_bitstrm->u4_max_strm_size;
    188 
    189         WORD32  zero_run            = ps_bitstrm->i4_zero_bytes_run;
    190 
    191         UWORD8* pu1_strm_buf        = ps_bitstrm->pu1_strm_buffer;
    192 
    193         WORD32  i, rem_bits = (code_len - bits_left_in_cw);
    194 
    195 
    196         /*********************************************************************/
    197         /* Bitstream overflow check                                          */
    198         /* NOTE: corner case of epb bytes (max 2 for 32bit word) not handled */
    199         /*********************************************************************/
    200         if((u4_strm_buf_offset + (WORD_SIZE>>3)) >= u4_max_strm_size)
    201         {
    202             /* return without corrupting the buffer beyond its size */
    203             return(IH264E_BITSTREAM_BUFFER_OVERFLOW);
    204         }
    205 
    206         /* insert parital code corresponding to bits left in cur word */
    207         u4_cur_word |= u4_code_val >> rem_bits;
    208 
    209         for(i = WORD_SIZE; i > 0; i -= 8)
    210         {
    211             /* flush the bits in cur word byte by byte and copy to stream */
    212             UWORD8   u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF;
    213 
    214             PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, u1_next_byte, zero_run);
    215         }
    216 
    217         /* insert the remaining bits from code val into current word */
    218         u4_cur_word = rem_bits ? (u4_code_val << (WORD_SIZE - rem_bits)) : 0;
    219 
    220         /* update the state variables and return success */
    221         ps_bitstrm->u4_cur_word         = u4_cur_word;
    222         ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE - rem_bits;
    223         ps_bitstrm->i4_zero_bytes_run   = zero_run;
    224         ps_bitstrm->u4_strm_buf_offset  = u4_strm_buf_offset;
    225         return (IH264E_SUCCESS);
    226     }
    227 }
    228 
    229 /**
    230 ******************************************************************************
    231 *
    232 *  @brief inserts a 1-bit code into the bitstream
    233 *
    234 *  @par   Description
    235 *  inserts 1bit lsb of code_val into the bitstream
    236 *  updates context members like u4_cur_word, u4_strm_buf_offset and
    237 *  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
    238 *  available size (u4_max_strm_size), returns error without corrupting data
    239 *  beyond it
    240 *
    241 *  @param[in]    ps_bitstrm
    242 *  pointer to bitstream context (handle)
    243 *
    244 *  @param[in]    u4_code_val
    245 *  code value that needs to be inserted in the stream.
    246 *
    247 *  @remarks     Assumptions: all bits from bit position 1 to msb of code_val
    248 *  shall be zero
    249 *
    250 *  @return      success or failure error code
    251 *
    252 ******************************************************************************
    253 */
    254 IH264E_ERROR_T ih264e_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val)
    255 {
    256     /* call the put bits function for 1 bit and return */
    257     return(ih264e_put_bits(ps_bitstrm, u4_code_val, 1));
    258 }
    259 
    260 /**
    261 ******************************************************************************
    262 *
    263 *  @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
    264 *
    265 *  @par   Description
    266 *  inserts rbsp trailing bits, updates context members like u4_cur_word and
    267 *  i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
    268 *  total words (u4_strm_buf_offset) exceeds max available size
    269 *  (u4_max_strm_size), returns error without corrupting data beyond it
    270 *
    271 *  @param[in]    ps_bitstrm
    272 *  pointer to bitstream context (handle)
    273 *
    274 *  @return      success or failure error code
    275 *
    276 ******************************************************************************
    277 */
    278 IH264E_ERROR_T ih264e_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm)
    279 {
    280     WORD32 i;
    281     UWORD32 u4_cur_word = ps_bitstrm->u4_cur_word;
    282     WORD32  bits_left_in_cw = ps_bitstrm->i4_bits_left_in_cw;
    283     WORD32  bytes_left_in_cw = (bits_left_in_cw - 1) >> 3;
    284 
    285     UWORD32 u4_strm_buf_offset  = ps_bitstrm->u4_strm_buf_offset;
    286     UWORD32 u4_max_strm_size    = ps_bitstrm->u4_max_strm_size;
    287     WORD32  zero_run            = ps_bitstrm->i4_zero_bytes_run;
    288     UWORD8* pu1_strm_buf        = ps_bitstrm->pu1_strm_buffer;
    289 
    290     /*********************************************************************/
    291     /* Bitstream overflow check                                          */
    292     /* NOTE: corner case of epb bytes (max 2 for 32bit word) not handled */
    293     /*********************************************************************/
    294     if((u4_strm_buf_offset + (WORD_SIZE>>3) - bytes_left_in_cw) >=
    295         u4_max_strm_size)
    296     {
    297         /* return without corrupting the buffer beyond its size */
    298         return(IH264E_BITSTREAM_BUFFER_OVERFLOW);
    299     }
    300 
    301     /* insert a 1 at the end of current word and flush all the bits */
    302     u4_cur_word |= (1 << (bits_left_in_cw - 1));
    303 
    304     /* get the bits to be inserted in msbdb of the word */
    305     //u4_cur_word <<= (WORD_SIZE - bytes_left_in_cw + 1);
    306 
    307     for(i = WORD_SIZE; i > (bytes_left_in_cw*8); i -= 8)
    308     {
    309         /* flush the bits in cur word byte by byte  and copy to stream */
    310         UWORD8   u1_next_byte = (u4_cur_word >> (i-8)) & 0xFF;
    311 
    312         PUTBYTE_EPB(pu1_strm_buf, u4_strm_buf_offset, u1_next_byte, zero_run);
    313     }
    314 
    315     /* update the stream offset */
    316     ps_bitstrm->u4_strm_buf_offset  = u4_strm_buf_offset;
    317 
    318     /* Default init values for scratch variables of bitstream context */
    319     ps_bitstrm->u4_cur_word         = 0;
    320     ps_bitstrm->i4_bits_left_in_cw  = WORD_SIZE;
    321     ps_bitstrm->i4_zero_bytes_run   = 0;
    322 
    323     return (IH264E_SUCCESS);
    324 }
    325 
    326 /**
    327 ******************************************************************************
    328 *
    329 *  @brief puts exponential golomb code of a unsigned integer into bitstream
    330 *
    331 *  @par   Description
    332 *  computes uev code for given syntax element and inserts the same into
    333 *  bitstream by calling ih264e_put_bits() interface.
    334 *
    335 *  @param[in]    ps_bitstrm
    336 *  pointer to bitstream context (handle)
    337 *
    338 *  @param[in]    u4_code_num
    339 *  unsigned integer input whose golomb code is written in stream
    340 *
    341 *  @remarks     Assumptions: code value can be represented in less than 16bits
    342 *
    343 *  @return      success or failure error code
    344 *
    345 ******************************************************************************
    346 */
    347 IH264E_ERROR_T ih264e_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num)
    348 {
    349     UWORD32 u4_bit_str, u4_range;
    350     IH264E_ERROR_T e_error;
    351 
    352     /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */
    353     u4_bit_str = u4_code_num + 1;
    354 
    355     /* get range of the bit string and put using put_bits()                 */
    356     GETRANGE(u4_range, u4_bit_str);
    357 
    358     e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1));
    359 
    360     return(e_error);
    361 }
    362 
    363 /**
    364 ******************************************************************************
    365 *
    366 *  @brief puts exponential golomb code of a signed integer into bitstream
    367 *
    368 *  @par   Description
    369 *  computes sev code for given syntax element and inserts the same into
    370 *  bitstream by calling ih264e_put_bits() interface.
    371 *
    372 *  @param[in]    ps_bitstrm
    373 *  pointer to bitstream context (handle)
    374 *
    375 *  @param[in]    syntax_elem
    376 *  signed integer input whose golomb code is written in stream
    377 *
    378 *  @remarks     Assumptions: code value can be represented in less than 16bits
    379 *
    380 *  @return      success or failure error code
    381 *
    382 ******************************************************************************
    383 */
    384 IH264E_ERROR_T ih264e_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem)
    385 {
    386     UWORD32 u4_code_num, u4_bit_str, u4_range;
    387     IH264E_ERROR_T e_error;
    388 
    389     /************************************************************************/
    390     /* convert the codenum to exp-golomb bit code for signed syntax element */
    391     /* See Table9-2 and Table 9-3 of standard JCTVC-J1003_d7                */
    392     /************************************************************************/
    393     if(syntax_elem <= 0)
    394     {
    395         /* codeNum for non-positive integer =  2*abs(x) : Table9-3  */
    396         u4_code_num = ((-syntax_elem) << 1);
    397     }
    398     else
    399     {
    400         /* codeNum for positive integer     =  2x-1     : Table9-3  */
    401         u4_code_num = (syntax_elem << 1) - 1;
    402     }
    403 
    404     /* convert the codenum to exp-golomb bit code: Table 9-2 JCTVC-J1003_d7 */
    405     u4_bit_str = u4_code_num + 1;
    406 
    407     /* get range of the bit string and put using put_bits()                 */
    408     GETRANGE(u4_range, u4_bit_str);
    409 
    410     e_error = ih264e_put_bits(ps_bitstrm, u4_bit_str, (2 * u4_range - 1));
    411 
    412     return(e_error);
    413 }
    414 
    415 /**
    416 ******************************************************************************
    417 *
    418 *  @brief insert NAL start code prefix (0x000001) into bitstream with an option
    419 *  of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
    420 *
    421 *  @par   Description
    422 *  Although start code prefix could have been put by calling ih264e_put_bits(),
    423 *  ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
    424 *  prevention insertion is not done for the NAL start code prefix which will
    425 *  surely happen otherwise by calling ih264e_put_bits() interface.
    426 *
    427 *  @param[in]    ps_bitstrm
    428 *  pointer to bitstream context (handle)
    429 *
    430 *  @param[in]    insert_leading_zero_8bits
    431 *  flag indicating if one more zero bytes needs to prefixed before start code
    432 *
    433 *  @return      success or failure error code
    434 *
    435 ******************************************************************************
    436 */
    437 IH264E_ERROR_T ih264e_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm,
    438                                                 WORD32 insert_leading_zero_8bits)
    439 {
    440     UWORD32 u4_strm_buf_offset  = ps_bitstrm->u4_strm_buf_offset;
    441     UWORD8* pu1_strm_buf        = ps_bitstrm->pu1_strm_buffer;
    442 
    443     /* Bitstream buffer overflow check assuming worst case of 4 bytes */
    444     if((u4_strm_buf_offset + 4) >= ps_bitstrm->u4_max_strm_size)
    445     {
    446         return(IH264E_BITSTREAM_BUFFER_OVERFLOW);
    447     }
    448 
    449     /* Insert leading zero 8 bits conditionally */
    450     if(insert_leading_zero_8bits)
    451     {
    452         pu1_strm_buf[u4_strm_buf_offset] = 0x00;
    453         u4_strm_buf_offset++;
    454     }
    455 
    456     /* Insert NAL start code prefix 0x00 00 01 */
    457     pu1_strm_buf[u4_strm_buf_offset] = 0x00;
    458     u4_strm_buf_offset++;
    459 
    460     pu1_strm_buf[u4_strm_buf_offset] = 0x00;
    461     u4_strm_buf_offset++;
    462 
    463     pu1_strm_buf[u4_strm_buf_offset] = 0x01;
    464     u4_strm_buf_offset++;
    465 
    466     /* update the stream offset */
    467     ps_bitstrm->u4_strm_buf_offset = u4_strm_buf_offset;
    468 
    469     return (IH264E_SUCCESS);
    470 }
    471 
    472