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  **************************************************************************
     23  * \file ih264d_bitstrm.c
     24  *
     25  * \brief
     26  *    Bitstream parsing routines
     27  *
     28  * \date
     29  *    20/11/2002
     30  *
     31  * \author  AI
     32  **************************************************************************
     33  */
     34 
     35 #include <stdlib.h>
     36 #include "ih264_typedefs.h"
     37 #include "ih264_macros.h"
     38 #include "ih264_platform_macros.h"
     39 #include "ih264d_bitstrm.h"
     40 #include "ih264d_error_handler.h"
     41 
     42 #include "ih264d_debug.h"
     43 #include "ih264d_tables.h"
     44 #include "ih264d_structs.h"
     45 
     46 /*!
     47  **************************************************************************
     48  * \if Function name : ih264d_get_bit_h264 \endif
     49  *
     50  * \brief
     51  *    Read one bit from the bitstream.
     52  *
     53  *   This is a Bitstream processing function. It reads the
     54  *   bit currently pointed by the bit pointer in the
     55  *   buffer and advances the pointer by one. It returns
     56  *   the bit (0 or 1) in the form of an unsigned integer.
     57  *
     58  * \return
     59  *    Returns the next bit (0 or 1) in the bitstream.
     60  *
     61  **************************************************************************
     62  */
     63 UWORD8 ih264d_get_bit_h264(dec_bit_stream_t *ps_stream)
     64 {
     65     UWORD32 u4_code;
     66 
     67     GETBIT(u4_code, ps_stream->u4_ofst, ps_stream->pu4_buffer);
     68     return (u4_code);
     69 }
     70 
     71 /*!
     72  **************************************************************************
     73  * \if Function name : ih264d_get_bits_h264 \endif
     74  *
     75  * \brief
     76  *    Read specified number of bits from the bitstream.
     77  *
     78  *   This is a Bitstream processing function. It reads the
     79  *   number specified number of bits from the current bit
     80  *   position and advances the bit and byte pointers
     81  *   appropriately.
     82  *
     83  * \return
     84  *    An unsigned 32 bit integer with its least significant bits
     85  *    containing the bits in order of their occurence in the bitstream.
     86  *
     87  **************************************************************************
     88  */
     89 
     90 UWORD32 ih264d_get_bits_h264(dec_bit_stream_t *ps_bitstrm, UWORD32 u4_num_bits)
     91 {
     92     UWORD32 u4_code = 0;
     93     if(u4_num_bits)
     94         GETBITS(u4_code, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, u4_num_bits);
     95     return (u4_code);
     96 }
     97 
     98 /*!
     99  **************************************************************************
    100  * \if Function name : ih264d_next_bits_h264 \endif
    101  *
    102  * \brief
    103  *    Peek specified number of bits from the bitstream.
    104  *
    105  *   This is a Bitstream processing function. It gets the
    106  *   specified number of bits from the buffer without
    107  *   altering the current pointers. It is equivalent to
    108  *   next_bits() function in the standard.
    109  *
    110  * \return
    111  *    An unsigned 32 bit integer with its least significant bits
    112  *    containing the bits in order of their occurence in the bitstream.
    113  **************************************************************************
    114  */
    115 UWORD32 ih264d_next_bits_h264(dec_bit_stream_t *ps_bitstrm, UWORD32 u4_num_bits)
    116 {
    117     UWORD32 u4_word_off = (ps_bitstrm->u4_ofst >> 5);
    118     UWORD32 u4_bit_off = ps_bitstrm->u4_ofst & 0x1F;
    119     UWORD32 *pu4_bitstream = ps_bitstrm->pu4_buffer;
    120     UWORD32 u4_bits = pu4_bitstream[u4_word_off++] << u4_bit_off;
    121 
    122     /*************************************************************************/
    123     /* Test if number of bits to be read exceeds the number of bits in the   */
    124     /* current word. If yes, read from the next word of the buffer, The bits */
    125     /* from both the words are concatenated to get next 32 bits in 'u4_bits' */
    126     /*************************************************************************/
    127     if(u4_bit_off > (INT_IN_BITS - u4_num_bits))
    128         u4_bits |= (pu4_bitstream[u4_word_off] >> (INT_IN_BITS - u4_bit_off));
    129 
    130     return ((u4_bits >> (INT_IN_BITS - u4_num_bits)));
    131 }
    132 
    133 /*!
    134  **************************************************************************
    135  * \if Function name : ih264d_flush_bits_h264 \endif
    136  *
    137  * \brief
    138  *    Flush specified number of bits from the bitstream.
    139  *
    140  *   This function flushes the specified number of bits (marks
    141  *   as read) from the buffer.
    142  *
    143  * \return
    144  *     A 8 bit unsigned integer with value
    145  *    '1' on successful flush
    146  *    '0' on failure.
    147  *
    148  **************************************************************************
    149  */
    150 WORD32 ih264d_flush_bits_h264(dec_bit_stream_t *ps_bitstrm, WORD32 u4_num_bits)
    151 {
    152     ps_bitstrm->u4_ofst += u4_num_bits;
    153 
    154     if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
    155     {
    156         return ERROR_EOB_FLUSHBITS_T;
    157     }
    158     return OK;
    159 }
    160 
    161 /*!
    162  **************************************************************************
    163  * \if Function name : ih264d_check_byte_aligned \endif
    164  *
    165  * \brief
    166  *    Checks whether the bit ps_bitstrm u4_ofst is at byte boundary.
    167  *
    168  * \param ps_bitstrm : Pointer to bitstream
    169  *
    170  * \return
    171  *    Returns 1 if bit ps_bitstrm u4_ofst is at byte alligned position else zero.
    172  **************************************************************************
    173  */
    174 
    175 UWORD8 ih264d_check_byte_aligned(dec_bit_stream_t * ps_bitstrm)
    176 {
    177     if(ps_bitstrm->u4_ofst & 0x07)
    178         return (0);
    179     else
    180         return (1);
    181 }
    182