Coverage Report

Created: 2025-07-11 06:40

/proc/self/cwd/libfaad/bits.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4
**
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
9
**
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
** GNU General Public License for more details.
14
**
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
**
19
** Any non-GPL usage of this software or parts of this software is strictly
20
** forbidden.
21
**
22
** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23
** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24
**
25
** Commercial non-GPL licensing of this software is possible.
26
** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27
**
28
** $Id: bits.c,v 1.44 2007/11/01 12:33:29 menno Exp $
29
**/
30
31
#include "common.h"
32
#include "structs.h"
33
34
#include <stdlib.h>
35
#include "bits.h"
36
37
/* reads only n bytes from the stream instead of the standard 4 */
38
static /*INLINE*/ uint32_t getdword_n(void *mem, int n)
39
2.50M
{
40
2.50M
    uint8_t* m8 = (uint8_t*)mem;
41
2.50M
    switch (n)
42
2.50M
    {
43
3.37k
    case 3:
44
3.37k
        return ((uint32_t)m8[2] << 8) | ((uint32_t)m8[1] << 16) | ((uint32_t)m8[0] << 24);
45
3.50k
    case 2:
46
3.50k
        return ((uint32_t)m8[1] << 16) | ((uint32_t)m8[0] << 24);
47
7.57k
    case 1:
48
7.57k
        return (uint32_t)m8[0] << 24;
49
2.49M
    default:
50
2.49M
        return 0;
51
2.50M
    }
52
2.50M
}
53
54
/* initialize buffer, call once before first getbits or showbits */
55
void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size)
56
21.8k
{
57
21.8k
    uint32_t tmp;
58
59
21.8k
    if (ld == NULL)
60
0
        return;
61
62
21.8k
    if (buffer_size == 0 || _buffer == NULL)
63
5.23k
    {
64
5.23k
        ld->error = 1;
65
5.23k
        return;
66
5.23k
    }
67
68
16.6k
    ld->buffer = _buffer;
69
70
16.6k
    ld->buffer_size = buffer_size;
71
16.6k
    ld->bytes_left  = buffer_size;
72
73
16.6k
    if (ld->bytes_left >= 4)
74
10.3k
    {
75
10.3k
        tmp = getdword((uint32_t*)ld->buffer);
76
10.3k
        ld->bytes_left -= 4;
77
10.3k
    } else {
78
6.28k
        tmp = getdword_n((uint32_t*)ld->buffer, ld->bytes_left);
79
6.28k
        ld->bytes_left = 0;
80
6.28k
    }
81
16.6k
    ld->bufa = tmp;
82
83
16.6k
    if (ld->bytes_left >= 4)
84
7.77k
    {
85
7.77k
        tmp = getdword((uint32_t*)ld->buffer + 1);
86
7.77k
        ld->bytes_left -= 4;
87
8.84k
    } else {
88
8.84k
        tmp = getdword_n((uint32_t*)ld->buffer + 1, ld->bytes_left);
89
8.84k
        ld->bytes_left = 0;
90
8.84k
    }
91
16.6k
    ld->bufb = tmp;
92
93
16.6k
    ld->start = (uint32_t*)ld->buffer;
94
16.6k
    ld->tail = ((uint32_t*)ld->buffer + 2);
95
96
16.6k
    ld->bits_left = 32;
97
98
16.6k
    ld->error = 0;
99
16.6k
}
100
101
void faad_endbits(bitfile *ld)
102
18.9k
{
103
18.9k
    (void)ld;
104
18.9k
}
105
106
uint32_t faad_get_processed_bits(bitfile *ld)
107
23.9M
{
108
23.9M
    return (uint32_t)(8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left));
109
23.9M
}
110
111
uint8_t faad_byte_align(bitfile *ld)
112
51.7k
{
113
51.7k
    int remainder = (32 - ld->bits_left) & 0x7;
114
115
51.7k
    if (remainder)
116
8.41k
    {
117
8.41k
        faad_flushbits(ld, 8 - remainder);
118
8.41k
        return (uint8_t)(8 - remainder);
119
8.41k
    }
120
43.3k
    return 0;
121
51.7k
}
122
123
void faad_flushbits_ex(bitfile *ld, uint32_t bits)
124
6.94M
{
125
6.94M
    uint32_t tmp;
126
127
6.94M
    ld->bufa = ld->bufb;
128
6.94M
    if (ld->bytes_left >= 4)
129
4.45M
    {
130
4.45M
        tmp = getdword(ld->tail);
131
4.45M
        ld->bytes_left -= 4;
132
4.45M
    } else {
133
2.49M
        tmp = getdword_n(ld->tail, ld->bytes_left);
134
2.49M
        ld->bytes_left = 0;
135
2.49M
    }
136
6.94M
    ld->bufb = tmp;
137
6.94M
    ld->tail++;
138
6.94M
    ld->bits_left += (32 - bits);
139
    //ld->bytes_left -= 4;
140
//    if (ld->bytes_left == 0)
141
//        ld->no_more_reading = 1;
142
//    if (ld->bytes_left < 0)
143
//        ld->error = 1;
144
6.94M
}
145
146
#ifdef DRM
147
/* rewind to beginning */
148
void faad_rewindbits(bitfile *ld)
149
{
150
    uint32_t tmp;
151
152
    ld->bytes_left = ld->buffer_size;
153
154
    if (ld->bytes_left >= 4)
155
    {
156
        tmp = getdword((uint32_t*)&ld->start[0]);
157
        ld->bytes_left -= 4;
158
    } else {
159
        tmp = getdword_n((uint32_t*)&ld->start[0], ld->bytes_left);
160
        ld->bytes_left = 0;
161
    }
162
    ld->bufa = tmp;
163
164
    if (ld->bytes_left >= 4)
165
    {
166
        tmp = getdword((uint32_t*)&ld->start[1]);
167
        ld->bytes_left -= 4;
168
    } else {
169
        tmp = getdword_n((uint32_t*)&ld->start[1], ld->bytes_left);
170
        ld->bytes_left = 0;
171
    }
172
    ld->bufb = tmp;
173
174
    ld->bits_left = 32;
175
    ld->tail = &ld->start[2];
176
}
177
#endif
178
179
/* reset to a certain point */
180
void faad_resetbits(bitfile *ld, uint32_t bits)
181
10.0k
{
182
10.0k
    uint32_t tmp;
183
10.0k
    uint32_t words = bits >> 5;
184
10.0k
    uint32_t remainder = bits & 0x1F;
185
186
10.0k
    if (ld->buffer_size < words * 4)
187
104
        ld->bytes_left = 0;
188
9.97k
    else
189
9.97k
        ld->bytes_left = ld->buffer_size - words*4;
190
191
10.0k
    if (ld->bytes_left >= 4)
192
9.82k
    {
193
9.82k
        tmp = getdword(&ld->start[words]);
194
9.82k
        ld->bytes_left -= 4;
195
9.82k
    } else {
196
251
        tmp = getdword_n(&ld->start[words], ld->bytes_left);
197
251
        ld->bytes_left = 0;
198
251
    }
199
10.0k
    ld->bufa = tmp;
200
201
10.0k
    if (ld->bytes_left >= 4)
202
9.61k
    {
203
9.61k
        tmp = getdword(&ld->start[words+1]);
204
9.61k
        ld->bytes_left -= 4;
205
9.61k
    } else {
206
464
        tmp = getdword_n(&ld->start[words+1], ld->bytes_left);
207
464
        ld->bytes_left = 0;
208
464
    }
209
10.0k
    ld->bufb = tmp;
210
211
10.0k
    ld->bits_left = 32 - remainder;
212
10.0k
    ld->tail = &ld->start[words+2];
213
214
    /* recheck for reading too many bytes */
215
10.0k
    ld->error = 0;
216
//    if (ld->bytes_left == 0)
217
//        ld->no_more_reading = 1;
218
//    if (ld->bytes_left < 0)
219
//        ld->error = 1;
220
10.0k
}
221
222
uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
223
                       DEBUGDEC)
224
1.57k
{
225
1.57k
    int i;
226
1.57k
    unsigned int temp;
227
1.57k
    int bytes = bits >> 3;
228
1.57k
    int remainder = bits & 0x7;
229
230
1.57k
    uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t));
231
232
265k
    for (i = 0; i < bytes; i++)
233
263k
    {
234
263k
        buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg));
235
263k
    }
236
237
1.57k
    if (remainder)
238
905
    {
239
905
        temp = faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder);
240
241
905
        buffer[bytes] = (uint8_t)temp;
242
905
    }
243
244
1.57k
    return buffer;
245
1.57k
}
246
247
#ifdef DRM
248
/* return the original data buffer */
249
void *faad_origbitbuffer(bitfile *ld)
250
{
251
    return (void*)ld->start;
252
}
253
254
/* return the original data buffer size */
255
uint32_t faad_origbitbuffer_size(bitfile *ld)
256
{
257
    return ld->buffer_size;
258
}
259
#endif
260
261
#if 0
262
/* reversed bit reading routines, used for RVLC and HCR */
263
void faad_initbits_rev(bitfile *ld, void *buffer,
264
                       uint32_t bits_in_buffer)
265
{
266
    uint32_t tmp;
267
    int32_t index;
268
269
    ld->buffer_size = bit2byte(bits_in_buffer);
270
271
    index = (bits_in_buffer+31)/32 - 1;
272
273
    ld->start = (uint32_t*)buffer + index - 2;
274
275
    tmp = getdword((uint32_t*)buffer + index);
276
    ld->bufa = tmp;
277
278
    tmp = getdword((uint32_t*)buffer + index - 1);
279
    ld->bufb = tmp;
280
281
    ld->tail = (uint32_t*)buffer + index;
282
283
    ld->bits_left = bits_in_buffer % 32;
284
    if (ld->bits_left == 0)
285
        ld->bits_left = 32;
286
287
    ld->bytes_left = ld->buffer_size;
288
    ld->error = 0;
289
}
290
#endif
291
292
/* EOF */