Coverage Report

Created: 2025-07-11 06:37

/src/libavc/decoder/ih264d_bitstrm.c
Line
Count
Source (jump to first uncovered line)
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
4.22M
{
65
4.22M
    UWORD32 u4_code;
66
67
4.22M
    GETBIT(u4_code, ps_stream->u4_ofst, ps_stream->pu4_buffer);
68
4.22M
    return (u4_code);
69
4.22M
}
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
4.35M
{
92
4.35M
    UWORD32 u4_code = 0;
93
4.35M
    if(u4_num_bits)
94
4.35M
        GETBITS(u4_code, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, u4_num_bits);
95
4.35M
    return (u4_code);
96
4.35M
}
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
0
{
117
0
    UWORD32 u4_word_off = (ps_bitstrm->u4_ofst >> 5);
118
0
    UWORD32 u4_bit_off = ps_bitstrm->u4_ofst & 0x1F;
119
0
    UWORD32 *pu4_bitstream = ps_bitstrm->pu4_buffer;
120
0
    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
0
    if(u4_bit_off > (INT_IN_BITS - u4_num_bits))
128
0
        u4_bits |= (pu4_bitstream[u4_word_off] >> (INT_IN_BITS - u4_bit_off));
129
130
0
    return ((u4_bits >> (INT_IN_BITS - u4_num_bits)));
131
0
}
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
220k
{
152
220k
    ps_bitstrm->u4_ofst += u4_num_bits;
153
154
220k
    if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
155
0
    {
156
0
        return ERROR_EOB_FLUSHBITS_T;
157
0
    }
158
220k
    return OK;
159
220k
}
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
2.89M
{
177
2.89M
    if(ps_bitstrm->u4_ofst & 0x07)
178
2.10M
        return (0);
179
792k
    else
180
792k
        return (1);
181
2.89M
}