File: | libs/libsndfile/src/alac.c |
Location: | line 866, column 2 |
Description: | Potential leak of memory pointed to by 'info' |
1 | /* | |||
2 | ** Copyright (C) 2011-2013 Erik de Castro Lopo <erikd@mega-nerd.com> | |||
3 | ** | |||
4 | ** This program is free software; you can redistribute it and/or modify | |||
5 | ** it under the terms of the GNU Lesser General Public License as published by | |||
6 | ** the Free Software Foundation; either version 2.1 of the License, or | |||
7 | ** (at your option) any later version. | |||
8 | ** | |||
9 | ** This program is distributed in the hope that it will be useful, | |||
10 | ** but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
11 | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
12 | ** GNU Lesser General Public License for more details. | |||
13 | ** | |||
14 | ** You should have received a copy of the GNU Lesser General Public License | |||
15 | ** along with this program; if not, write to the Free Software | |||
16 | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
17 | */ | |||
18 | ||||
19 | #include "sfconfig.h" | |||
20 | ||||
21 | #include <stdio.h> | |||
22 | #include <stdlib.h> | |||
23 | #include <string.h> | |||
24 | #include <math.h> | |||
25 | #include <errno(*__errno_location ()).h> | |||
26 | ||||
27 | #include "sndfile.h" | |||
28 | #include "sfendian.h" | |||
29 | #include "common.h" | |||
30 | #include "ALAC/alac_codec.h" | |||
31 | #include "ALAC/ALACBitUtilities.h" | |||
32 | ||||
33 | #define ALAC_MAX_FRAME_SIZE8192 8192 | |||
34 | #define ALAC_BYTE_BUFFER_SIZE82000 82000 | |||
35 | ||||
36 | ||||
37 | typedef struct | |||
38 | { uint32_t current, count, allocated ; | |||
39 | uint32_t packet_size [] ; | |||
40 | } PAKT_INFO ; | |||
41 | ||||
42 | typedef struct | |||
43 | { sf_count_t input_data_pos ; | |||
44 | ||||
45 | PAKT_INFO * pakt_info ; | |||
46 | ||||
47 | int channels, final_write_block ; | |||
48 | ||||
49 | uint32_t frames_this_block, partial_block_frames, frames_per_block ; | |||
50 | uint32_t bits_per_sample, kuki_size ; | |||
51 | ||||
52 | ||||
53 | /* Can't have a decoder and an encoder at the same time so stick | |||
54 | ** them in an un-named union. | |||
55 | */ | |||
56 | union | |||
57 | { ALAC_DECODER decoder ; | |||
58 | ALAC_ENCODER encoder ; | |||
59 | } ; | |||
60 | ||||
61 | char enctmpname [512] ; | |||
62 | FILE *enctmp ; | |||
63 | ||||
64 | int buffer [] ; | |||
65 | ||||
66 | } ALAC_PRIVATE ; | |||
67 | ||||
68 | /*============================================================================================ | |||
69 | */ | |||
70 | ||||
71 | static int alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ; | |||
72 | static int alac_writer_init (SF_PRIVATE *psf) ; | |||
73 | ||||
74 | static sf_count_t alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; | |||
75 | ||||
76 | static sf_count_t alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; | |||
77 | static sf_count_t alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; | |||
78 | static sf_count_t alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; | |||
79 | static sf_count_t alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; | |||
80 | ||||
81 | static sf_count_t alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; | |||
82 | static sf_count_t alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; | |||
83 | static sf_count_t alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; | |||
84 | static sf_count_t alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; | |||
85 | ||||
86 | static sf_count_t alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; | |||
87 | ||||
88 | static int alac_close (SF_PRIVATE *psf) ; | |||
89 | static int alac_byterate (SF_PRIVATE *psf) ; | |||
90 | ||||
91 | static int alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; | |||
92 | static int alac_encode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; | |||
93 | ||||
94 | static uint32_t alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) ; | |||
95 | ||||
96 | static PAKT_INFO * alac_pakt_alloc (uint32_t initial_count) ; | |||
97 | static PAKT_INFO * alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t pakt_offset) ; | |||
98 | static PAKT_INFO * alac_pakt_append (PAKT_INFO * info, uint32_t value) ; | |||
99 | static uint8_t * alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size) ; | |||
100 | static sf_count_t alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) ; | |||
101 | ||||
102 | /*============================================================================================ | |||
103 | ** ALAC Reader initialisation function. | |||
104 | */ | |||
105 | ||||
106 | int | |||
107 | alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) | |||
108 | { int error ; | |||
109 | ||||
110 | if ((psf->codec_data = calloc (1, sizeof (ALAC_PRIVATE) + psf->sf.channels * sizeof (int) * ALAC_MAX_FRAME_SIZE8192)) == NULL((void*)0)) | |||
111 | return SFE_MALLOC_FAILED ; | |||
112 | ||||
113 | psf->codec_close = alac_close ; | |||
114 | ||||
115 | switch (psf->file.mode) | |||
116 | { case SFM_RDWR : | |||
117 | return SFE_BAD_MODE_RW ; | |||
118 | ||||
119 | case SFM_READ : | |||
120 | if ((error = alac_reader_init (psf, info))) | |||
121 | return error ; | |||
122 | break ; | |||
123 | ||||
124 | case SFM_WRITE : | |||
125 | if ((error = alac_writer_init (psf))) | |||
126 | return error ; | |||
127 | break ; | |||
128 | ||||
129 | default : | |||
130 | psf_log_printf (psf, "%s : Bad psf->file.mode.\n", __func__) ; | |||
131 | return SFE_INTERNAL ; | |||
132 | } ; | |||
133 | ||||
134 | psf->byterate = alac_byterate ; | |||
135 | ||||
136 | return 0 ; | |||
137 | } /* aiff_alac_init */ | |||
138 | ||||
139 | void | |||
140 | alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) | |||
141 | { switch (subformat) | |||
142 | { case SF_FORMAT_ALAC_16 : | |||
143 | *fmt_flags = 1 ; | |||
144 | break ; | |||
145 | case SF_FORMAT_ALAC_20 : | |||
146 | *fmt_flags = 2 ; | |||
147 | break ; | |||
148 | case SF_FORMAT_ALAC_24 : | |||
149 | *fmt_flags = 3 ; | |||
150 | break ; | |||
151 | case SF_FORMAT_ALAC_32 : | |||
152 | *fmt_flags = 4 ; | |||
153 | break ; | |||
154 | default : | |||
155 | break ; | |||
156 | } ; | |||
157 | *frames_per_packet = ALAC_FRAME_LENGTH4096 ; | |||
158 | } /* alac_get_desc_chunk_items */ | |||
159 | ||||
160 | static int | |||
161 | alac_close (SF_PRIVATE *psf) | |||
162 | { ALAC_PRIVATE *plac ; | |||
163 | BUF_UNION ubuf ; | |||
164 | ||||
165 | plac = psf->codec_data ; | |||
166 | ||||
167 | if (psf->file.mode == SFM_WRITE) | |||
168 | { ALAC_ENCODER *penc = &plac->encoder ; | |||
169 | SF_CHUNK_INFO chunk_info ; | |||
170 | sf_count_t readcount ; | |||
171 | uint32_t pakt_size = 0, saved_partial_block_frames ; | |||
172 | #ifndef _MSC_VER | |||
173 | uint8_t *kuki_data [plac->kuki_size]; | |||
174 | #else | |||
175 | uint8_t *kuki_data = (uint8_t *)_alloca(plac->kuki_size); | |||
176 | #endif | |||
177 | ||||
178 | plac->final_write_block = 1 ; | |||
179 | saved_partial_block_frames = plac->partial_block_frames ; | |||
180 | ||||
181 | /* If a block has been partially assembled, write it out as the final block. */ | |||
182 | if (plac->partial_block_frames && plac->partial_block_frames < plac->frames_per_block) | |||
183 | alac_encode_block (psf, plac) ; | |||
184 | ||||
185 | plac->partial_block_frames = saved_partial_block_frames ; | |||
186 | ||||
187 | alac_get_magic_cookie (penc, kuki_data, &plac->kuki_size) ; | |||
188 | ||||
189 | memset (&chunk_info, 0, sizeof (chunk_info)) ; | |||
190 | chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "kuki")__builtin___snprintf_chk (chunk_info.id, sizeof (chunk_info.id ), 2 - 1, __builtin_object_size (chunk_info.id, 2 > 1), "kuki" ) ; | |||
191 | chunk_info.data = kuki_data ; | |||
192 | chunk_info.datalen = plac->kuki_size ; | |||
193 | psf_save_write_chunk (&psf->wchunks, &chunk_info) ; | |||
194 | ||||
195 | memset (&chunk_info, 0, sizeof (chunk_info)) ; | |||
196 | chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt")__builtin___snprintf_chk (chunk_info.id, sizeof (chunk_info.id ), 2 - 1, __builtin_object_size (chunk_info.id, 2 > 1), "pakt" ) ; | |||
197 | chunk_info.data = alac_pakt_encode (psf, &pakt_size) ; | |||
198 | chunk_info.datalen = pakt_size ; | |||
199 | psf_save_write_chunk (&psf->wchunks, &chunk_info) ; | |||
200 | ||||
201 | free (chunk_info.data) ; | |||
202 | chunk_info.data = NULL((void*)0) ; | |||
203 | ||||
204 | psf->write_header (psf, 1) ; | |||
205 | ||||
206 | if (plac->enctmp != NULL((void*)0)) | |||
207 | { fseek (plac->enctmp, 0, SEEK_SET0) ; | |||
208 | ||||
209 | while ((readcount = fread (ubuf.ucbuf, 1, sizeof (ubuf.ucbuf), plac->enctmp)) > 0) | |||
210 | psf_fwrite (ubuf.ucbuf, 1, readcount, psf) ; | |||
211 | fclose (plac->enctmp) ; | |||
212 | remove (plac->enctmpname) ; | |||
213 | } ; | |||
214 | free(kuki_data); | |||
215 | } ; | |||
216 | ||||
217 | if (plac->pakt_info) | |||
218 | free (plac->pakt_info) ; | |||
219 | plac->pakt_info = NULL((void*)0) ; | |||
220 | ||||
221 | return 0 ; | |||
222 | } /* alac_close */ | |||
223 | ||||
224 | static int | |||
225 | alac_byterate (SF_PRIVATE *psf) | |||
226 | { | |||
227 | if (psf->file.mode == SFM_READ) | |||
228 | return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; | |||
229 | ||||
230 | return -1 ; | |||
231 | } /* alac_byterate */ | |||
232 | ||||
233 | /*============================================================================================ | |||
234 | ** ALAC initialisation Functions. | |||
235 | */ | |||
236 | ||||
237 | static int | |||
238 | alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) | |||
239 | { ALAC_PRIVATE *plac ; | |||
240 | uint32_t kuki_size ; | |||
241 | union { uint8_t kuki [512] ; uint32_t alignment ; } u ; | |||
242 | ||||
243 | if (info == NULL((void*)0)) | |||
244 | { psf_log_printf (psf, "%s : ALAC_DECODER_INFO is NULL.\n", __func__) ; | |||
245 | return SFE_INTERNAL ; | |||
246 | } ; | |||
247 | ||||
248 | plac = psf->codec_data ; | |||
249 | ||||
250 | plac->channels = psf->sf.channels ; | |||
251 | plac->frames_per_block = info->frames_per_packet ; | |||
252 | plac->bits_per_sample = info->bits_per_sample ; | |||
253 | ||||
254 | if (plac->pakt_info != NULL((void*)0)) | |||
255 | free (plac->pakt_info) ; | |||
256 | plac->pakt_info = alac_pakt_read_decode (psf, info->pakt_offset) ; | |||
257 | ||||
258 | ||||
259 | if (plac->pakt_info == NULL((void*)0)) | |||
260 | { psf_log_printf (psf, "%s : alac_pkt_read() returns NULL.\n", __func__) ; | |||
261 | return SFE_MALLOC_FAILED ; | |||
262 | } ; | |||
263 | ||||
264 | /* Read in the ALAC cookie data and pass it to the init function. */ | |||
265 | kuki_size = alac_kuki_read (psf, info->kuki_offset, u.kuki, sizeof (u.kuki)) ; | |||
266 | ||||
267 | alac_decoder_init (&plac->decoder, u.kuki, kuki_size) ; | |||
268 | ||||
269 | switch (info->bits_per_sample) | |||
270 | { case 16 : | |||
271 | case 20 : | |||
272 | case 24 : | |||
273 | case 32 : | |||
274 | psf->read_short = alac_read_s ; | |||
275 | psf->read_int = alac_read_i ; | |||
276 | psf->read_float = alac_read_f ; | |||
277 | psf->read_double = alac_read_d ; | |||
278 | break ; | |||
279 | ||||
280 | default : | |||
281 | printf ("%s : info->bits_per_sample %u\n", __func__, info->bits_per_sample)__printf_chk (2 - 1, "%s : info->bits_per_sample %u\n", __func__ , info->bits_per_sample) ; | |||
282 | return SFE_UNSUPPORTED_ENCODING ; | |||
283 | } ; | |||
284 | ||||
285 | psf->codec_close = alac_close ; | |||
286 | psf->seek = alac_seek ; | |||
287 | ||||
288 | psf->sf.frames = alac_reader_calc_frames (psf, plac) ; | |||
289 | alac_seek (psf, SFM_READ, 0) ; | |||
290 | ||||
291 | return 0 ; | |||
292 | } /* alac_reader_init */ | |||
293 | ||||
294 | static int | |||
295 | alac_writer_init (SF_PRIVATE *psf) | |||
296 | { ALAC_PRIVATE *plac ; | |||
297 | uint32_t alac_format_flags = 0 ; | |||
298 | ||||
299 | plac = psf->codec_data ; | |||
300 | ||||
301 | if (psf->file.mode != SFM_WRITE) | |||
302 | return SFE_BAD_MODE_RW ; | |||
303 | ||||
304 | plac->channels = psf->sf.channels ; | |||
305 | plac->kuki_size = alac_get_magic_cookie_size (psf->sf.channels) ; | |||
306 | ||||
307 | psf->write_short = alac_write_s ; | |||
308 | psf->write_int = alac_write_i ; | |||
309 | psf->write_float = alac_write_f ; | |||
310 | psf->write_double = alac_write_d ; | |||
311 | ||||
312 | switch (SF_CODEC (psf->sf.format)((psf->sf.format) & SF_FORMAT_SUBMASK)) | |||
313 | { case SF_FORMAT_ALAC_16 : | |||
314 | alac_format_flags = 1 ; | |||
315 | plac->bits_per_sample = 16 ; | |||
316 | break ; | |||
317 | ||||
318 | case SF_FORMAT_ALAC_20 : | |||
319 | alac_format_flags = 2 ; | |||
320 | plac->bits_per_sample = 20 ; | |||
321 | break ; | |||
322 | ||||
323 | case SF_FORMAT_ALAC_24 : | |||
324 | alac_format_flags = 3 ; | |||
325 | plac->bits_per_sample = 24 ; | |||
326 | break ; | |||
327 | ||||
328 | case SF_FORMAT_ALAC_32 : | |||
329 | alac_format_flags = 4 ; | |||
330 | plac->bits_per_sample = 32 ; | |||
331 | break ; | |||
332 | ||||
333 | default : | |||
334 | psf_log_printf (psf, "%s : Can't figure out bits per sample.\n", __func__) ; | |||
335 | return SFE_UNIMPLEMENTED ; | |||
336 | } ; | |||
337 | ||||
338 | plac->frames_per_block = ALAC_FRAME_LENGTH4096 ; | |||
339 | ||||
340 | plac->pakt_info = alac_pakt_alloc (2000) ; | |||
341 | ||||
342 | if ((plac->enctmp = psf_open_tmpfile (plac->enctmpname, sizeof (plac->enctmpname))) == NULL((void*)0)) | |||
343 | { psf_log_printf (psf, "Error : Failed to open temp file '%s' : \n", plac->enctmpname, strerror (errno(*__errno_location ()))) ; | |||
344 | return SFE_ALAC_FAIL_TMPFILE ; | |||
345 | } ; | |||
346 | ||||
347 | alac_encoder_init (&plac->encoder, psf->sf.samplerate, psf->sf.channels, alac_format_flags, ALAC_FRAME_LENGTH4096) ; | |||
348 | ||||
349 | return 0 ; | |||
350 | } /* alac_writer_init */ | |||
351 | ||||
352 | /*============================================================================================ | |||
353 | ** ALAC block decoder and encoder. | |||
354 | */ | |||
355 | ||||
356 | static inline uint32_t | |||
357 | alac_reader_next_packet_size (PAKT_INFO * info) | |||
358 | { if (info->current >= info->count) | |||
359 | return 0 ; | |||
360 | return info->packet_size [info->current++] ; | |||
361 | } /* alac_reader_next_packet_size */ | |||
362 | ||||
363 | static sf_count_t | |||
364 | alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) | |||
365 | { sf_count_t frames = 0 ; | |||
366 | uint32_t current_pos = 1, blocks = 0 ; | |||
367 | ||||
368 | plac->pakt_info->current = 0 ; | |||
369 | ||||
370 | while (current_pos < psf->filelength && current_pos > 0) | |||
371 | { current_pos = alac_reader_next_packet_size (plac->pakt_info) ; | |||
372 | blocks = current_pos > 0 ? blocks + 1 : blocks ; | |||
373 | } ; | |||
374 | ||||
375 | if (blocks == 0) | |||
376 | return 0 ; | |||
377 | ||||
378 | /* Only count full blocks. */ | |||
379 | frames = plac->frames_per_block * (blocks - 1) ; | |||
380 | ||||
381 | alac_seek (psf, SFM_READ, frames) ; | |||
382 | alac_decode_block (psf, plac) ; | |||
383 | frames += plac->frames_this_block ; | |||
384 | ||||
385 | plac->pakt_info->current = 0 ; | |||
386 | ||||
387 | return frames ; | |||
388 | } /* alac_reader_calc_frames */ | |||
389 | ||||
390 | static int | |||
391 | alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) | |||
392 | { ALAC_DECODER *pdec = &plac->decoder ; | |||
393 | uint8_t byte_buffer [ALAC_BYTE_BUFFER_SIZE82000] ; | |||
394 | uint32_t packet_size ; | |||
395 | BitBuffer bit_buffer ; | |||
396 | ||||
397 | packet_size = alac_reader_next_packet_size (plac->pakt_info) ; | |||
398 | if (packet_size == 0) | |||
399 | { if (plac->pakt_info->current < plac->pakt_info->count) | |||
400 | psf_log_printf (psf, "packet_size is 0 (%d of %d)\n", plac->pakt_info->current, plac->pakt_info->count) ; | |||
401 | return 0 ; | |||
402 | } ; | |||
403 | ||||
404 | psf_fseek (psf, plac->input_data_pos, SEEK_SET0) ; | |||
405 | ||||
406 | if (packet_size > SIGNED_SIZEOF (byte_buffer)((int) sizeof (byte_buffer))) | |||
407 | { psf_log_printf (psf, "%s : bad packet_size (%u)\n", __func__, packet_size) ; | |||
408 | return 0 ; | |||
409 | } ; | |||
410 | ||||
411 | if ((packet_size != psf_fread (byte_buffer, 1, packet_size, psf))) | |||
412 | return 0 ; | |||
413 | ||||
414 | BitBufferInit (&bit_buffer, byte_buffer, packet_size) ; | |||
415 | ||||
416 | plac->input_data_pos += packet_size ; | |||
417 | plac->frames_this_block = 0 ; | |||
418 | alac_decode (pdec, &bit_buffer, plac->buffer, plac->frames_per_block, psf->sf.channels, &plac->frames_this_block) ; | |||
419 | ||||
420 | plac->partial_block_frames = 0 ; | |||
421 | ||||
422 | return 1 ; | |||
423 | } /* alac_decode_block */ | |||
424 | ||||
425 | ||||
426 | static int | |||
427 | alac_encode_block (SF_PRIVATE * psf, ALAC_PRIVATE *plac) | |||
428 | { ALAC_ENCODER *penc = &plac->encoder ; | |||
429 | uint32_t num_bytes = 0 ; | |||
430 | #ifndef _MSC_VER | |||
431 | uint8_t byte_buffer [psf->sf.channels * ALAC_BYTE_BUFFER_SIZE82000] ; | |||
432 | #else | |||
433 | uint8_t* byte_buffer = (uint8_t*)_alloca (psf->sf.channels * ALAC_BYTE_BUFFER_SIZE82000) ; | |||
434 | #endif | |||
435 | ||||
436 | alac_encode (penc, plac->channels, plac->partial_block_frames, plac->buffer, byte_buffer, &num_bytes) ; | |||
437 | ||||
438 | if (fwrite (byte_buffer, 1, num_bytes, plac->enctmp) != num_bytes) | |||
439 | { | |||
440 | free (byte_buffer); | |||
441 | return 0 ; | |||
442 | } | |||
443 | free(byte_buffer); | |||
444 | ||||
445 | if ((plac->pakt_info = alac_pakt_append (plac->pakt_info, num_bytes)) == NULL((void*)0)) | |||
446 | return 0 ; | |||
447 | ||||
448 | plac->partial_block_frames = 0 ; | |||
449 | ||||
450 | return 1 ; | |||
451 | } /* alac_encode_block */ | |||
452 | ||||
453 | /*============================================================================================ | |||
454 | ** ALAC read functions. | |||
455 | */ | |||
456 | ||||
457 | static sf_count_t | |||
458 | alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) | |||
459 | { ALAC_PRIVATE *plac ; | |||
460 | int *iptr ; | |||
461 | int k, readcount ; | |||
462 | sf_count_t total = 0 ; | |||
463 | ||||
464 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
465 | return 0 ; | |||
466 | ||||
467 | while (len > 0) | |||
468 | { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) | |||
469 | break ; | |||
470 | ||||
471 | readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; | |||
472 | readcount = readcount > len ? len : readcount ; | |||
473 | ||||
474 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
475 | ||||
476 | for (k = 0 ; k < readcount ; k++) | |||
477 | ptr [total + k] = iptr [k] >> 16 ; | |||
478 | ||||
479 | plac->partial_block_frames += readcount / plac->channels ; | |||
480 | total += readcount ; | |||
481 | len -= readcount ; | |||
482 | } ; | |||
483 | ||||
484 | return total ; | |||
485 | } /* alac_read_s */ | |||
486 | ||||
487 | static sf_count_t | |||
488 | alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) | |||
489 | { ALAC_PRIVATE *plac ; | |||
490 | int *iptr ; | |||
491 | int k, readcount ; | |||
492 | sf_count_t total = 0 ; | |||
493 | ||||
494 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
495 | return 0 ; | |||
496 | ||||
497 | while (len > 0) | |||
498 | { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) | |||
499 | break ; | |||
500 | ||||
501 | readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; | |||
502 | readcount = readcount > len ? len : readcount ; | |||
503 | ||||
504 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
505 | ||||
506 | for (k = 0 ; k < readcount ; k++) | |||
507 | ptr [total + k] = iptr [k] ; | |||
508 | ||||
509 | plac->partial_block_frames += readcount / plac->channels ; | |||
510 | total += readcount ; | |||
511 | len -= readcount ; | |||
512 | } ; | |||
513 | ||||
514 | return total ; | |||
515 | } /* alac_read_i */ | |||
516 | ||||
517 | static sf_count_t | |||
518 | alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) | |||
519 | { ALAC_PRIVATE *plac ; | |||
520 | int *iptr ; | |||
521 | int k, readcount ; | |||
522 | sf_count_t total = 0 ; | |||
523 | float normfact ; | |||
524 | ||||
525 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
526 | return 0 ; | |||
527 | ||||
528 | normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; | |||
529 | ||||
530 | while (len > 0) | |||
531 | { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) | |||
532 | break ; | |||
533 | ||||
534 | readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; | |||
535 | readcount = readcount > len ? len : readcount ; | |||
536 | ||||
537 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
538 | ||||
539 | for (k = 0 ; k < readcount ; k++) | |||
540 | ptr [total + k] = normfact * iptr [k] ; | |||
541 | ||||
542 | plac->partial_block_frames += readcount / plac->channels ; | |||
543 | total += readcount ; | |||
544 | len -= readcount ; | |||
545 | } ; | |||
546 | ||||
547 | return total ; | |||
548 | } /* alac_read_f */ | |||
549 | ||||
550 | static sf_count_t | |||
551 | alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) | |||
552 | { ALAC_PRIVATE *plac ; | |||
553 | int *iptr ; | |||
554 | int k, readcount ; | |||
555 | sf_count_t total = 0 ; | |||
556 | double normfact ; | |||
557 | ||||
558 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
559 | return 0 ; | |||
560 | ||||
561 | normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; | |||
562 | ||||
563 | while (len > 0) | |||
564 | { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) | |||
565 | break ; | |||
566 | ||||
567 | readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; | |||
568 | readcount = readcount > len ? len : readcount ; | |||
569 | ||||
570 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
571 | ||||
572 | for (k = 0 ; k < readcount ; k++) | |||
573 | ptr [total + k] = normfact * iptr [k] ; | |||
574 | ||||
575 | plac->partial_block_frames += readcount / plac->channels ; | |||
576 | total += readcount ; | |||
577 | len -= readcount ; | |||
578 | } ; | |||
579 | ||||
580 | return total ; | |||
581 | } /* alac_read_d */ | |||
582 | ||||
583 | /*============================================================================================ | |||
584 | */ | |||
585 | ||||
586 | static sf_count_t | |||
587 | alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) | |||
588 | { ALAC_PRIVATE *plac ; | |||
589 | int newblock, newsample ; | |||
590 | ||||
591 | if (! psf->codec_data) | |||
592 | return 0 ; | |||
593 | plac = (ALAC_PRIVATE*) psf->codec_data ; | |||
594 | ||||
595 | if (psf->datalength < 0 || psf->dataoffset < 0) | |||
596 | { psf->error = SFE_BAD_SEEK ; | |||
597 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
598 | } ; | |||
599 | ||||
600 | if (offset == 0) | |||
601 | { psf_fseek (psf, psf->dataoffset, SEEK_SET0) ; | |||
602 | ||||
603 | plac->frames_this_block = 0 ; | |||
604 | plac->input_data_pos = psf->dataoffset ; | |||
605 | plac->pakt_info->current = 0 ; | |||
606 | return 0 ; | |||
607 | } ; | |||
608 | ||||
609 | if (offset < 0 || offset > plac->pakt_info->count * plac->frames_per_block) | |||
610 | { psf->error = SFE_BAD_SEEK ; | |||
611 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
612 | } ; | |||
613 | ||||
614 | newblock = offset / plac->frames_per_block ; | |||
615 | newsample = offset % plac->frames_per_block ; | |||
616 | ||||
617 | if (mode == SFM_READ) | |||
618 | { plac->input_data_pos = psf->dataoffset + alac_pakt_block_offset (plac->pakt_info, newblock) ; | |||
619 | ||||
620 | plac->pakt_info->current = newblock ; | |||
621 | alac_decode_block (psf, plac) ; | |||
622 | plac->partial_block_frames = newsample ; | |||
623 | } | |||
624 | else | |||
625 | { /* What to do about write??? */ | |||
626 | psf->error = SFE_BAD_SEEK ; | |||
627 | return PSF_SEEK_ERROR((sf_count_t) -1) ; | |||
628 | } ; | |||
629 | ||||
630 | return newblock * plac->frames_per_block + newsample ; | |||
631 | } /* alac_seek */ | |||
632 | ||||
633 | /*========================================================================================== | |||
634 | ** ALAC Write Functions. | |||
635 | */ | |||
636 | ||||
637 | static sf_count_t | |||
638 | alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) | |||
639 | { ALAC_PRIVATE *plac ; | |||
640 | int *iptr ; | |||
641 | int k, writecount ; | |||
642 | sf_count_t total = 0 ; | |||
643 | ||||
644 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
645 | return 0 ; | |||
646 | ||||
647 | while (len > 0) | |||
648 | { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; | |||
649 | writecount = (writecount == 0 || writecount > len) ? len : writecount ; | |||
650 | ||||
651 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
652 | ||||
653 | for (k = 0 ; k < writecount ; k++) | |||
654 | iptr [k] = ptr [total + k] << 16 ; | |||
655 | ||||
656 | plac->partial_block_frames += writecount / plac->channels ; | |||
657 | total += writecount ; | |||
658 | len -= writecount ; | |||
659 | ||||
660 | if (plac->partial_block_frames >= plac->frames_per_block) | |||
661 | alac_encode_block (psf, plac) ; | |||
662 | } ; | |||
663 | ||||
664 | return total ; | |||
665 | } /* alac_write_s */ | |||
666 | ||||
667 | static sf_count_t | |||
668 | alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) | |||
669 | { ALAC_PRIVATE *plac ; | |||
670 | int *iptr ; | |||
671 | int k, writecount ; | |||
672 | sf_count_t total = 0 ; | |||
673 | ||||
674 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
675 | return 0 ; | |||
676 | ||||
677 | while (len > 0) | |||
678 | { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; | |||
679 | writecount = (writecount == 0 || writecount > len) ? len : writecount ; | |||
680 | ||||
681 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
682 | ||||
683 | for (k = 0 ; k < writecount ; k++) | |||
684 | iptr [k] = ptr [total + k] ; | |||
685 | ||||
686 | plac->partial_block_frames += writecount / plac->channels ; | |||
687 | total += writecount ; | |||
688 | len -= writecount ; | |||
689 | ||||
690 | if (plac->partial_block_frames >= plac->frames_per_block) | |||
691 | alac_encode_block (psf, plac) ; | |||
692 | } ; | |||
693 | ||||
694 | return total ; | |||
695 | } /* alac_write_i */ | |||
696 | ||||
697 | static sf_count_t | |||
698 | alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) | |||
699 | { ALAC_PRIVATE *plac ; | |||
700 | void (*convert) (const float *, int *t, int, int) ; | |||
701 | int *iptr ; | |||
702 | int writecount ; | |||
703 | sf_count_t total = 0 ; | |||
704 | ||||
705 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
706 | return 0 ; | |||
707 | ||||
708 | convert = (psf->add_clipping) ? psf_f2i_clip_array : psf_f2i_array ; | |||
709 | ||||
710 | while (len > 0) | |||
711 | { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; | |||
712 | writecount = (writecount == 0 || writecount > len) ? len : writecount ; | |||
713 | ||||
714 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
715 | ||||
716 | convert (ptr, iptr, writecount, psf->norm_float) ; | |||
717 | ||||
718 | plac->partial_block_frames += writecount / plac->channels ; | |||
719 | total += writecount ; | |||
720 | len -= writecount ; | |||
721 | ||||
722 | if (plac->partial_block_frames >= plac->frames_per_block) | |||
723 | alac_encode_block (psf, plac) ; | |||
724 | } ; | |||
725 | ||||
726 | return total ; | |||
727 | } /* alac_write_f */ | |||
728 | ||||
729 | static sf_count_t | |||
730 | alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) | |||
731 | { ALAC_PRIVATE *plac ; | |||
732 | void (*convert) (const double *, int *t, int, int) ; | |||
733 | int *iptr ; | |||
734 | int writecount ; | |||
735 | sf_count_t total = 0 ; | |||
736 | ||||
737 | if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL((void*)0)) | |||
738 | return 0 ; | |||
739 | ||||
740 | convert = (psf->add_clipping) ? psf_d2i_clip_array : psf_d2i_array ; | |||
741 | ||||
742 | while (len > 0) | |||
743 | { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; | |||
744 | writecount = (writecount == 0 || writecount > len) ? len : writecount ; | |||
745 | ||||
746 | iptr = plac->buffer + plac->partial_block_frames * plac->channels ; | |||
747 | ||||
748 | convert (ptr, iptr, writecount, psf->norm_float) ; | |||
749 | ||||
750 | plac->partial_block_frames += writecount / plac->channels ; | |||
751 | total += writecount ; | |||
752 | len -= writecount ; | |||
753 | ||||
754 | if (plac->partial_block_frames >= plac->frames_per_block) | |||
755 | alac_encode_block (psf, plac) ; | |||
756 | } ; | |||
757 | ||||
758 | return total ; | |||
759 | } /* alac_write_d */ | |||
760 | ||||
761 | /*============================================================================== | |||
762 | ** PAKT_INFO handling. | |||
763 | */ | |||
764 | ||||
765 | static PAKT_INFO * | |||
766 | alac_pakt_alloc (uint32_t initial_count) | |||
767 | { PAKT_INFO * info ; | |||
768 | ||||
769 | if ((info = calloc (1, sizeof (PAKT_INFO) + initial_count * sizeof (info->packet_size [0]))) == NULL((void*)0)) | |||
770 | return NULL((void*)0) ; | |||
771 | ||||
772 | info->allocated = initial_count ; | |||
773 | info->current = 0 ; | |||
774 | info->count = 0 ; | |||
775 | ||||
776 | return info ; | |||
777 | } /* alac_pakt_alloc */ | |||
778 | ||||
779 | static PAKT_INFO * | |||
780 | alac_pakt_append (PAKT_INFO * info, uint32_t value) | |||
781 | { | |||
782 | if (info->count >= info->allocated) | |||
783 | { PAKT_INFO * temp ; | |||
784 | uint32_t newcount = info->allocated + info->allocated / 2 ; | |||
785 | ||||
786 | if ((temp = realloc (info, sizeof (PAKT_INFO) + newcount * sizeof (info->packet_size [0]))) == NULL((void*)0)) | |||
787 | return NULL((void*)0) ; | |||
788 | ||||
789 | info = temp ; | |||
790 | info->allocated = newcount ; | |||
791 | } ; | |||
792 | ||||
793 | info->packet_size [info->count++] = value ; | |||
794 | return info ; | |||
795 | } /* alac_pakt_append */ | |||
796 | ||||
797 | static PAKT_INFO * | |||
798 | alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t UNUSED (pakt_offset)UNUSED_pakt_offset __attribute__ ((unused))) | |||
799 | { SF_CHUNK_INFO chunk_info ; | |||
800 | PAKT_INFO * info = NULL((void*)0) ; | |||
801 | uint8_t *pakt_data = NULL((void*)0) ; | |||
802 | uint32_t bcount, value = 1, pakt_size ; | |||
803 | SF_CHUNK_ITERATOR * chunk_iterator ; | |||
804 | ||||
805 | ||||
806 | memset (&chunk_info, 0, sizeof (chunk_info)) ; | |||
807 | snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt")__builtin___snprintf_chk (chunk_info.id, sizeof (chunk_info.id ), 2 - 1, __builtin_object_size (chunk_info.id, 2 > 1), "pakt" ) ; | |||
808 | chunk_info.id_size = 4 ; | |||
809 | ||||
810 | if ((chunk_iterator = psf_get_chunk_iterator (psf, chunk_info.id)) == NULL((void*)0)) | |||
| ||||
811 | { printf ("%s %d : no chunk iterator found\n\n", __func__, __LINE__)__printf_chk (2 - 1, "%s %d : no chunk iterator found\n\n", __func__ , 811) ; | |||
812 | free (chunk_info.data) ; | |||
813 | chunk_info.data = NULL((void*)0) ; | |||
814 | return NULL((void*)0) ; | |||
815 | } ; | |||
816 | ||||
817 | psf->get_chunk_size (psf, chunk_iterator, &chunk_info) ; | |||
818 | ||||
819 | pakt_size = chunk_info.datalen ; | |||
820 | chunk_info.data = pakt_data = malloc (pakt_size + 5) ; | |||
821 | ||||
822 | if ((bcount = psf->get_chunk_data (psf, chunk_iterator, &chunk_info)) != SF_ERR_NO_ERROR) | |||
823 | { printf ("%s %d : %s\n\n", __func__, __LINE__, sf_error_number (bcount))__printf_chk (2 - 1, "%s %d : %s\n\n", __func__, 823, sf_error_number (bcount)) ; | |||
824 | while (chunk_iterator) | |||
825 | chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; | |||
826 | free (chunk_info.data) ; | |||
827 | chunk_info.data = NULL((void*)0) ; | |||
828 | return NULL((void*)0) ; | |||
829 | } ; | |||
830 | ||||
831 | while (chunk_iterator) | |||
832 | chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; | |||
833 | ||||
834 | info = alac_pakt_alloc (pakt_size / 4) ; | |||
835 | ||||
836 | /* Start at 24 bytes in, skipping over the 'pakt' chunks header. */ | |||
837 | for (bcount = 24 ; bcount < pakt_size && value != 0 ; ) | |||
838 | { uint8_t byte ; | |||
839 | int32_t count = 0 ; | |||
840 | ||||
841 | value = 0 ; | |||
842 | do | |||
843 | { byte = pakt_data [bcount + count] ; | |||
844 | value = (value << 7) + (byte & 0x7F) ; | |||
845 | ||||
846 | count ++ ; | |||
847 | if (count > 5 || bcount + count > pakt_size) | |||
848 | { printf ("%s %d : Ooops! count %d bcount %d\n", __func__, __LINE__, count, bcount)__printf_chk (2 - 1, "%s %d : Ooops! count %d bcount %d\n" , __func__, 848, count, bcount) ; | |||
849 | value = 0 ; | |||
850 | break ; | |||
851 | } ; | |||
852 | } | |||
853 | while (byte & 0x80) ; | |||
854 | ||||
855 | bcount += count ; | |||
856 | ||||
857 | if ((info = alac_pakt_append (info, value)) == NULL((void*)0)) | |||
858 | goto FreeExit ; | |||
859 | } ; | |||
860 | ||||
861 | free (pakt_data) ; | |||
862 | ||||
863 | return info ; | |||
864 | ||||
865 | FreeExit : | |||
866 | free (pakt_data) ; | |||
| ||||
867 | free (info) ; | |||
868 | return NULL((void*)0) ; | |||
869 | } /* alac_pakt_read_decode */ | |||
870 | ||||
871 | static uint8_t * | |||
872 | alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size_out) | |||
873 | { const ALAC_PRIVATE *plac ; | |||
874 | const PAKT_INFO *info ; | |||
875 | uint8_t *data ; | |||
876 | uint32_t k, allocated, pakt_size ; | |||
877 | ||||
878 | plac = psf->codec_data ; | |||
879 | info = plac->pakt_info ; | |||
880 | ||||
881 | allocated = 100 + 2 * info->count ; | |||
882 | if ((data = calloc (1, allocated)) == NULL((void*)0)) | |||
883 | return NULL((void*)0) ; | |||
884 | ||||
885 | psf_put_be64 (data, 0, info->count) ; | |||
886 | psf_put_be64 (data, 8, psf->sf.frames) ; | |||
887 | psf_put_be32 (data, 20, kALACDefaultFramesPerPacket - plac->partial_block_frames) ; | |||
888 | ||||
889 | /* Real 'pakt' data starts after 24 byte header. */ | |||
890 | pakt_size = 24 ; | |||
891 | ||||
892 | for (k = 0 ; k < info->count ; k++) | |||
893 | { int32_t value = info->packet_size [k] ; | |||
894 | ||||
895 | if ((value & 0x7f) == value) | |||
896 | { data [pakt_size++] = value ; | |||
897 | continue ; | |||
898 | } ; | |||
899 | ||||
900 | if ((value & 0x3fff) == value) | |||
901 | { data [pakt_size++] = (value >> 7) | 0x80 ; | |||
902 | data [pakt_size++] = value & 0x7f ; | |||
903 | continue ; | |||
904 | } ; | |||
905 | ||||
906 | if ((value & 0x1fffff) == value) | |||
907 | { data [pakt_size++] = (value >> 14) | 0x80 ; | |||
908 | data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; | |||
909 | data [pakt_size++] = value & 0x7f ; | |||
910 | continue ; | |||
911 | } ; | |||
912 | ||||
913 | if ((value & 0x0fffffff) == value) | |||
914 | { data [pakt_size++] = (value >> 21) | 0x80 ; | |||
915 | data [pakt_size++] = ((value >> 14) & 0x7f) | 0x80 ; | |||
916 | data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; | |||
917 | data [pakt_size++] = value & 0x7f ; | |||
918 | continue ; | |||
919 | } ; | |||
920 | ||||
921 | *pakt_size_out = 0 ; | |||
922 | free (data) ; | |||
923 | return NULL((void*)0) ; | |||
924 | } ; | |||
925 | ||||
926 | *pakt_size_out = pakt_size ; | |||
927 | return data ; | |||
928 | } /* alac_pakt_encode */ | |||
929 | ||||
930 | static sf_count_t | |||
931 | alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) | |||
932 | { sf_count_t offset = 0 ; | |||
933 | uint32_t k ; | |||
934 | ||||
935 | for (k = 0 ; k < block ; k++) | |||
936 | offset += info->packet_size [k] ; | |||
937 | ||||
938 | return offset ; | |||
939 | } /* alac_pakt_block_offset */ | |||
940 | ||||
941 | static uint32_t | |||
942 | alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) | |||
943 | { uint32_t marker ; | |||
944 | uint64_t kuki_size ; | |||
945 | ||||
946 | if (psf_fseek (psf, kuki_offset, SEEK_SET0) != kuki_offset) | |||
947 | return 0 ; | |||
948 | ||||
949 | psf_fread (&marker, 1, sizeof (marker), psf) ; | |||
950 | if (marker != MAKE_MARKER ('k', 'u', 'k', 'i')((uint32_t) (('k') | (('u') << 8) | (('k') << 16) | (((uint32_t) ('i')) << 24)))) | |||
951 | return 0 ; | |||
952 | ||||
953 | psf_fread (&kuki_size, 1, sizeof (kuki_size), psf) ; | |||
954 | kuki_size = BE2H_64 (kuki_size)ENDSWAP_64X (kuki_size) ; | |||
955 | ||||
956 | if (kuki_size == 0 || kuki_size > kuki_maxlen) | |||
957 | { psf_log_printf (psf, "%s : Bad size (%D) of 'kuki' chunk.\n", __func__, kuki_size) ; | |||
958 | return 0 ; | |||
959 | } ; | |||
960 | ||||
961 | psf_fread (kuki, 1, kuki_size, psf) ; | |||
962 | ||||
963 | return kuki_size ; | |||
964 | } /* alac_kuki_read */ |