2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
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.
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.
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.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
35 /* Need to be large enough to fit the largest compressed sample in a file.
36 * Samples were observed to need up to 1500 bytes (400 kbps nero aac).
38 #define BUFFER_SIZE 2048
39 static uint8_t static_buffer
[BUFFER_SIZE
] IBSS_ATTR
;
41 /* initialize buffer, call once before first getbits or showbits */
42 void faad_initbits(bitfile
*ld
, const void *_buffer
, const uint32_t buffer_size
)
49 memset(ld
, 0, sizeof(bitfile
));
51 if (buffer_size
== 0 || _buffer
== NULL
|| (buffer_size
+12)>BUFFER_SIZE
)
54 ld
->no_more_reading
= 1;
58 ld
->buffer
= &static_buffer
;
59 memset(ld
->buffer
, 0, (buffer_size
+12)*sizeof(uint8_t));
60 memcpy(ld
->buffer
, _buffer
, buffer_size
*sizeof(uint8_t));
62 ld
->buffer_size
= buffer_size
;
64 tmp
= getdword((uint32_t*)ld
->buffer
);
67 tmp
= getdword((uint32_t*)ld
->buffer
+ 1);
70 ld
->start
= (uint32_t*)ld
->buffer
;
71 ld
->tail
= ((uint32_t*)ld
->buffer
+ 2);
76 ld
->no_more_reading
= 0;
80 void faad_endbits(bitfile
*ld
)
87 faad_free(ld
->buffer
);
96 uint32_t faad_get_processed_bits(bitfile
*ld
)
98 return (uint32_t)(8 * (4*(ld
->tail
- ld
->start
) - 4) - (ld
->bits_left
));
101 uint8_t faad_byte_align(bitfile
*ld
)
103 uint8_t remainder
= (uint8_t)((32 - ld
->bits_left
) % 8);
107 faad_flushbits(ld
, 8 - remainder
);
108 return (8 - remainder
);
113 /* rewind to beginning */
115 void faad_rewindbits(bitfile *ld)
120 #ifndef ARCH_IS_BIG_ENDIAN
126 #ifndef ARCH_IS_BIG_ENDIAN
131 ld->tail = &ld->start[2];
133 ld->no_more_reading = 0;
137 #ifdef ERROR_RESILIENCE
138 uint8_t *faad_getbitbuffer(bitfile
*ld
, uint32_t bits
143 uint16_t bytes
= (uint16_t)bits
/ 8;
144 uint8_t remainder
= (uint8_t)bits
% 8;
146 uint8_t *buffer
= (uint8_t*)faad_malloc((bytes
+1)*sizeof(uint8_t));
148 for (i
= 0; i
< bytes
; i
++)
150 buffer
[i
] = (uint8_t)faad_getbits(ld
, 8 DEBUGVAR(print
,var
,dbg
));
155 temp
= (uint8_t)faad_getbits(ld
, remainder
DEBUGVAR(print
,var
,dbg
)) << (8-remainder
);
157 buffer
[bytes
] = temp
;
165 /* return the original data buffer */
166 void *faad_origbitbuffer(bitfile
*ld
)
168 return (void*)ld
->start
;
171 /* return the original data buffer size */
172 uint32_t faad_origbitbuffer_size(bitfile
*ld
)
174 return ld
->buffer_size
;
178 /* reversed bit reading routines, used for RVLC and HCR */
180 void faad_initbits_rev(bitfile *ld, void *buffer,
181 uint32_t bits_in_buffer)
186 ld->buffer_size = bit2byte(bits_in_buffer);
188 index = (bits_in_buffer+31)/32 - 1;
190 ld->start = (uint32_t*)buffer + index - 2;
192 tmp = getdword((uint32_t*)buffer + index);
195 tmp = getdword((uint32_t*)buffer + index - 1);
198 ld->tail = (uint32_t*)buffer + index;
200 ld->bits_left = bits_in_buffer % 32;
201 if (ld->bits_left == 0)
205 ld->no_more_reading = 0;