Home | History | Annotate | Download | only in decoder
      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  *  \file   ih264d_nal.c
     23  *
     24  *  \brief  NAL parsing routines
     25  *
     26  *  Detailed_description
     27  *
     28  *  \author
     29  *         - AI  19 11 2002  Creation
     30  **************************************************************************
     31  */
     32 #include "ih264d_bitstrm.h"
     33 #include "ih264d_defs.h"
     34 #include "ih264_typedefs.h"
     35 #include "ih264_macros.h"
     36 #include "ih264_platform_macros.h"
     37 #include "ih264d_defs.h"
     38 #define NUM_OF_ZERO_BYTES_BEFORE_START_CODE 2
     39 #define EMULATION_PREVENTION_BYTE           0x03
     40 
     41 #define NAL_FIRST_BYTE_SIZE 1
     42 
     43 /*!
     44  **************************************************************************
     45  * \if Function name : ih264d_find_start_code \endif
     46  *
     47  * \brief
     48  *    This function searches for the Start Code Prefix.
     49  *
     50  * \param pu1_buf : Pointer to char buffer which contains bitstream.
     51  * \param u4_cur_pos : Current position in the buffer.
     52  * \param u4_max_ofst : Number of bytes in Buffer.
     53  * \param pu4_length_of_start_code  : Poiter to length of Start Code.
     54  *
     55  * \return
     56  *    Returns 0 on success and -1 on error.
     57  *
     58  **************************************************************************
     59  */
     60 #define START_CODE_NOT_FOUND    -1
     61 #define END_OF_STREAM_BUFFER    -2
     62 #define END_OF_STREAM           -1
     63 
     64 void ih264d_check_if_aud(UWORD8 *pu1_buf,
     65                          UWORD32 u4_cur_pos,
     66                          UWORD32 u4_max_ofst,
     67                          UWORD32 *pu4_next_is_aud)
     68 {
     69     UWORD8 u1_first_byte, u1_nal_unit_type;
     70     if(u4_cur_pos + 1 < u4_max_ofst)
     71     {
     72         u1_first_byte = pu1_buf[u4_cur_pos + 1];
     73         u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
     74 
     75         if(u1_nal_unit_type == ACCESS_UNIT_DELIMITER_RBSP)
     76         {
     77             *pu4_next_is_aud = 1;
     78         }
     79     }
     80 
     81 }
     82 WORD32 ih264d_find_start_code(UWORD8 *pu1_buf,
     83                               UWORD32 u4_cur_pos,
     84                               UWORD32 u4_max_ofst,
     85                               UWORD32 *pu4_length_of_start_code,
     86                               UWORD32 *pu4_next_is_aud)
     87 {
     88     WORD32 zero_byte_cnt = 0;
     89     UWORD32 ui_curPosTemp;
     90 
     91     *pu4_length_of_start_code = 0;
     92     /*Find first start code */
     93     while(u4_cur_pos < u4_max_ofst)
     94     {
     95         if(pu1_buf[u4_cur_pos] == 0)
     96             zero_byte_cnt++;
     97         else if(pu1_buf[u4_cur_pos]
     98                         == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE)
     99         {
    100             /* Found the start code */
    101             u4_cur_pos++;
    102             break;
    103         }
    104         else
    105         {
    106             zero_byte_cnt = 0;
    107         }
    108         u4_cur_pos++;
    109     }
    110     /*Find Next Start Code */
    111     *pu4_length_of_start_code = u4_cur_pos;
    112     zero_byte_cnt = 0;
    113     ui_curPosTemp = u4_cur_pos;
    114     while(u4_cur_pos < u4_max_ofst)
    115     {
    116 
    117         if(pu1_buf[u4_cur_pos] == 0)
    118             zero_byte_cnt++;
    119         else if(pu1_buf[u4_cur_pos]
    120                         == 0x01 && zero_byte_cnt >= NUM_OF_ZERO_BYTES_BEFORE_START_CODE)
    121         {
    122             /* Found the start code */
    123             ih264d_check_if_aud(pu1_buf, u4_cur_pos, u4_max_ofst,
    124                                 pu4_next_is_aud);
    125             return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp);
    126         }
    127         else
    128         {
    129             zero_byte_cnt = 0;
    130         }
    131         u4_cur_pos++;
    132     }
    133 
    134     return (u4_cur_pos - zero_byte_cnt - ui_curPosTemp); //(START_CODE_NOT_FOUND);
    135 }
    136 
    137 /*!
    138  **************************************************************************
    139  * \if Function name : ih264d_get_next_nal_unit \endif
    140  *
    141  * \brief
    142  *    This function reads one NAl unit.
    143  *
    144  * \param ps_nalStream : Poiter to NalUnitStream structure.
    145  * \param ps_nalUnit : Pointer to NalUnit.
    146  *
    147  * \return
    148  *    Returns 0 on success and -1 on error.
    149  *
    150  **************************************************************************
    151  */
    152 WORD32 ih264d_get_next_nal_unit(UWORD8 *pu1_buf,
    153                                 UWORD32 u4_cur_pos,
    154                                 UWORD32 u4_max_ofst,
    155                                 UWORD32 *pu4_length_of_start_code)
    156 {
    157 
    158     WORD32 i_length_of_nal_unit = 0;
    159     UWORD32 u4_next_is_aud;
    160 
    161     /* NAL Thread starts */
    162 
    163     ih264d_find_start_code(pu1_buf, u4_cur_pos, u4_max_ofst,
    164                            pu4_length_of_start_code, &u4_next_is_aud);
    165 
    166     return (i_length_of_nal_unit);
    167 }
    168 
    169 /*!
    170  **************************************************************************
    171  * \if Function name : ih264d_process_nal_unit \endif
    172  *
    173  * \brief
    174  *    This function removes emulation byte "0x03" from bitstream (EBSP to RBSP).
    175  *    It also converts bytestream format into 32 bit little-endian format.
    176  *
    177  * \param ps_bitstrm : Poiter to dec_bit_stream_t structure.
    178  * \param pu1_nal_unit  : Pointer to char buffer of NalUnit.
    179  * \param u4_numbytes_in_nal_unit : Number bytes in NalUnit buffer.
    180  *
    181  * \return
    182  *    Returns number of bytes in RBSP ps_bitstrm.
    183  *
    184  * \note
    185  *    This function is same as nal_unit() of 7.3.1. Apart from nal_unit()
    186  *    implementation it converts char buffer into 32 bit Buffer. This
    187  *    facilitates efficient access of bitstream. This has been done taking
    188  *    into account present processor architectures.
    189  *
    190  **************************************************************************
    191  */
    192 WORD32 ih264d_process_nal_unit(dec_bit_stream_t *ps_bitstrm,
    193                             UWORD8 *pu1_nal_unit,
    194                             UWORD32 u4_numbytes_in_nal_unit)
    195 {
    196     UWORD32 u4_num_bytes_in_rbsp;
    197     UWORD8 u1_cur_byte;
    198     WORD32 i = 0;
    199     WORD8 c_count;
    200     UWORD32 ui_word;
    201     UWORD32 *puc_bitstream_buffer = (UWORD32*)pu1_nal_unit;
    202     ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
    203 
    204     /*--------------------------------------------------------------------*/
    205     /* First Byte of the NAL Unit                                         */
    206     /*--------------------------------------------------------------------*/
    207 
    208     ui_word = *pu1_nal_unit++;
    209 
    210     /*--------------------------------------------------------------------*/
    211     /* Convertion of the EBSP to RBSP                                     */
    212     /* ie Remove the emulation_prevention_byte [equal to 0x03]            */
    213     /*--------------------------------------------------------------------*/
    214     u4_num_bytes_in_rbsp = 0;
    215     c_count = 0;
    216 
    217 //first iteration
    218 
    219     u1_cur_byte = *pu1_nal_unit++;
    220 
    221     ui_word = ((ui_word << 8) | u1_cur_byte);
    222 
    223     c_count++;
    224     if(u1_cur_byte != 0x00)
    225         c_count = 0;
    226 
    227 //second iteration
    228 
    229     u1_cur_byte = *pu1_nal_unit++;
    230 
    231     ui_word = ((ui_word << 8) | u1_cur_byte);
    232     u4_num_bytes_in_rbsp = 2;
    233 
    234     c_count++;
    235     if(u1_cur_byte != 0x00)
    236         c_count = 0;
    237 
    238     if(u4_numbytes_in_nal_unit > 2)
    239     {
    240         i = ((u4_numbytes_in_nal_unit - 3));
    241     }
    242 
    243     for(; i > 8; i -= 4)
    244     {
    245 
    246 // loop 0
    247         u1_cur_byte = *pu1_nal_unit++;
    248 
    249         if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
    250                         && u1_cur_byte == EMULATION_PREVENTION_BYTE)
    251         {
    252             c_count = 0;
    253             u1_cur_byte = *pu1_nal_unit++;
    254             i--;
    255         }
    256 
    257         ui_word = ((ui_word << 8) | u1_cur_byte);
    258         *puc_bitstream_buffer = ui_word;
    259         puc_bitstream_buffer++;
    260         c_count++;
    261         if(u1_cur_byte != 0x00)
    262             c_count = 0;
    263 
    264 // loop 1
    265         u1_cur_byte = *pu1_nal_unit++;
    266 
    267         if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
    268                         && u1_cur_byte == EMULATION_PREVENTION_BYTE)
    269         {
    270             c_count = 0;
    271             u1_cur_byte = *pu1_nal_unit++;
    272             i--;
    273         }
    274         ui_word = ((ui_word << 8) | u1_cur_byte);
    275 
    276         c_count++;
    277         if(u1_cur_byte != 0x00)
    278             c_count = 0;
    279 
    280 // loop 2
    281         u1_cur_byte = *pu1_nal_unit++;
    282 
    283         if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
    284                         && u1_cur_byte == EMULATION_PREVENTION_BYTE)
    285         {
    286             c_count = 0;
    287             u1_cur_byte = *pu1_nal_unit++;
    288             i--;
    289         }
    290 
    291         ui_word = ((ui_word << 8) | u1_cur_byte);
    292 
    293         c_count++;
    294         if(u1_cur_byte != 0x00)
    295             c_count = 0;
    296 
    297 // loop 3
    298         u1_cur_byte = *pu1_nal_unit++;
    299 
    300         if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
    301                         && u1_cur_byte == EMULATION_PREVENTION_BYTE)
    302         {
    303             c_count = 0;
    304             u1_cur_byte = *pu1_nal_unit++;
    305             i--;
    306         }
    307 
    308         ui_word = ((ui_word << 8) | u1_cur_byte);
    309 
    310         c_count++;
    311         if(u1_cur_byte != 0x00)
    312             c_count = 0;
    313 
    314         u4_num_bytes_in_rbsp += 4;
    315 
    316     }
    317 
    318     for(; i > 0; i--)
    319     {
    320         u1_cur_byte = *pu1_nal_unit++;
    321 
    322         if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE
    323                         && u1_cur_byte == EMULATION_PREVENTION_BYTE)
    324         {
    325             c_count = 0;
    326             i--;
    327             u1_cur_byte = *pu1_nal_unit++;
    328         }
    329 
    330         ui_word = ((ui_word << 8) | u1_cur_byte);
    331         u4_num_bytes_in_rbsp++;
    332 
    333         if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
    334         {
    335             *puc_bitstream_buffer = ui_word;
    336             puc_bitstream_buffer++;
    337         }
    338         c_count++;
    339         if(u1_cur_byte != 0x00)
    340             c_count = 0;
    341 
    342     }
    343 
    344     *puc_bitstream_buffer = (ui_word
    345                     << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
    346     ps_bitstrm->u4_ofst = 0;
    347     ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + NAL_FIRST_BYTE_SIZE) << 3);
    348 
    349     return (u4_num_bytes_in_rbsp);
    350 }
    351 
    352 
    353 /*!
    354  **************************************************************************
    355  * \if Function name : ih264d_rbsp_to_sodb \endif
    356  *
    357  * \brief
    358  *    This function converts RBSP to SODB.
    359  *
    360  * \param ps_bitstrm : Poiter to dec_bit_stream_t structure.
    361  *
    362  * \return
    363  *    None.
    364  *
    365  **************************************************************************
    366  */
    367 void ih264d_rbsp_to_sodb(dec_bit_stream_t *ps_bitstrm)
    368 {
    369     UWORD32 ui_lastWord;
    370     UWORD32 ui_word;
    371     UWORD8 uc_lastByte;
    372     WORD8 i;
    373 
    374     ui_lastWord = (ps_bitstrm->u4_max_ofst >> 5);
    375     i = (ps_bitstrm->u4_max_ofst >> 3) & 0x03;
    376 
    377     if(i)
    378     {
    379         ui_word = ps_bitstrm->pu4_buffer[ui_lastWord];
    380         uc_lastByte = ((ui_word << ((i - 1) << 3)) >> 24);
    381     }
    382     else
    383     {
    384         ui_word = ps_bitstrm->pu4_buffer[ui_lastWord - 1];
    385         uc_lastByte = ((ui_word << 24) >> 24);
    386     }
    387     /*--------------------------------------------------------------------*/
    388     /* Find out the rbsp_stop_bit position in the last byte of rbsp       */
    389     /*--------------------------------------------------------------------*/
    390     for(i = 0; (i < 8) && !CHECKBIT(uc_lastByte, i); ++i)
    391         ;
    392     ps_bitstrm->u4_max_ofst = ps_bitstrm->u4_max_ofst - (i + 1);
    393 }
    394