Fix a couple of Windows 2Gig file size issues.
[flac.git] / src / flac / encode.c
blob1b6a4d655462ca55e344bfdf9553e008c6cf6697
1 /* flac - Command-line FLAC encoder/decoder
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
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 General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #if HAVE_CONFIG_H
20 # include <config.h>
21 #endif
23 #include <errno.h>
24 #include <limits.h> /* for LONG_MAX */
25 #include <math.h> /* for floor() */
26 #include <stdio.h> /* for FILE etc. */
27 #include <stdlib.h> /* for malloc */
28 #include <string.h> /* for strcmp(), strerror() */
29 #include <sys/stat.h>
30 #include "FLAC/all.h"
31 #include "share/alloc.h"
32 #include "share/grabbag.h"
33 #include "share/compat.h"
34 #include "share/private.h"
35 #include "encode.h"
37 #ifdef min
38 #undef min
39 #endif
40 #define min(x,y) ((x)<(y)?(x):(y))
41 #ifdef max
42 #undef max
43 #endif
44 #define max(x,y) ((x)>(y)?(x):(y))
46 /* this MUST be >= 588 so that sector aligning can take place with one read */
47 /* this MUST be < 2^sizeof(size_t) / ( FLAC__MAX_CHANNELS * (FLAC__MAX_BITS_PER_SAMPLE/8) ) */
48 #define CHUNK_OF_SAMPLES 2048
50 typedef struct {
51 unsigned sample_rate;
52 unsigned channels;
53 unsigned bits_per_sample; /* width of sample point, including 'shift' bits, valid bps is bits_per_sample-shift */
54 unsigned shift; /* # of LSBs samples have been shifted left by */
55 unsigned bytes_per_wide_sample; /* for convenience, always == channels*((bps+7)/8), or 0 if N/A to input format (like FLAC) */
56 FLAC__bool is_unsigned_samples;
57 FLAC__bool is_big_endian;
58 FLAC__uint32 channel_mask;
59 } SampleInfo;
61 /* this is the client_data attached to the FLAC decoder when encoding from a FLAC file */
62 typedef struct {
63 FLAC__off_t filesize;
64 const FLAC__byte *lookahead;
65 unsigned lookahead_length;
66 size_t num_metadata_blocks;
67 FLAC__StreamMetadata *metadata_blocks[1024]; /*@@@ BAD MAGIC number */
68 FLAC__uint64 samples_left_to_process;
69 FLAC__bool fatal_error;
70 } FLACDecoderData;
72 typedef struct {
73 #if FLAC__HAS_OGG
74 FLAC__bool use_ogg;
75 #endif
76 FLAC__bool verify;
77 FLAC__bool is_stdout;
78 FLAC__bool outputfile_opened; /* true if we successfully opened the output file and we want it to be deleted if there is an error */
79 const char *inbasefilename;
80 const char *infilename;
81 const char *outfilename;
83 FLAC__bool treat_warnings_as_errors;
84 FLAC__bool continue_through_decode_errors;
85 FLAC__bool replay_gain;
86 FLAC__uint64 total_samples_to_encode; /* (i.e. "wide samples" aka "sample frames") WATCHOUT: may be 0 to mean 'unknown' */
87 FLAC__uint64 unencoded_size; /* an estimate of the input size, only used in the progress indicator */
88 FLAC__uint64 bytes_written;
89 FLAC__uint64 samples_written;
90 unsigned stats_mask;
92 SampleInfo info;
94 FileFormat format;
95 union {
96 struct {
97 FLAC__uint64 data_bytes;
98 } iff;
99 struct {
100 FLAC__StreamDecoder *decoder;
101 FLACDecoderData client_data;
102 } flac;
103 } fmt;
105 FLAC__StreamEncoder *encoder;
107 FILE *fin;
108 FLAC__StreamMetadata *seek_table_template;
109 } EncoderSession;
111 const int FLAC_ENCODE__DEFAULT_PADDING = 8192;
113 static FLAC__bool is_big_endian_host_;
115 static unsigned char ucbuffer_[CHUNK_OF_SAMPLES*FLAC__MAX_CHANNELS*((FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE+7)/8)];
116 static signed char *scbuffer_ = (signed char *)ucbuffer_;
117 static FLAC__uint16 *usbuffer_ = (FLAC__uint16 *)ucbuffer_;
118 static FLAC__int16 *ssbuffer_ = (FLAC__int16 *)ucbuffer_;
120 static FLAC__int32 in_[FLAC__MAX_CHANNELS][CHUNK_OF_SAMPLES];
121 static FLAC__int32 *input_[FLAC__MAX_CHANNELS];
125 * local routines
127 static FLAC__bool EncoderSession_construct(EncoderSession *e, encode_options_t options, FLAC__off_t infilesize, FILE *infile, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length);
128 static void EncoderSession_destroy(EncoderSession *e);
129 static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata);
130 static int EncoderSession_finish_error(EncoderSession *e);
131 static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options);
132 static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
133 static FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e);
134 static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
135 static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
136 static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
137 static FLAC__bool format_input(FLAC__int32 *dest[], unsigned wide_samples, FLAC__bool is_big_endian, FLAC__bool is_unsigned_samples, unsigned channels, unsigned bps, unsigned shift, size_t *channel_map);
138 static void encoder_progress_callback(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
139 static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
140 static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
141 static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
142 static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
143 static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
144 static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
145 static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
146 static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
147 static FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, unsigned sample_rate, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors);
148 static void print_stats(const EncoderSession *encoder_session);
149 static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
150 static void print_error_with_state(const EncoderSession *e, const char *message);
151 static void print_verify_error(EncoderSession *e);
152 static FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn);
153 static FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn);
154 static FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn);
155 static FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn);
156 static FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn);
157 static FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset);
158 static unsigned count_channel_mask_bits(FLAC__uint32 mask);
159 #if 0
160 static FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels);
161 #endif
163 static FLAC__bool get_sample_info_raw(EncoderSession *e, encode_options_t options)
165 e->info.sample_rate = options.format_options.raw.sample_rate;
166 e->info.channels = options.format_options.raw.channels;
167 e->info.bits_per_sample = options.format_options.raw.bps;
168 e->info.shift = 0;
169 e->info.bytes_per_wide_sample = options.format_options.raw.channels * ((options.format_options.raw.bps+7)/8);
170 e->info.is_unsigned_samples = options.format_options.raw.is_unsigned_samples;
171 e->info.is_big_endian = options.format_options.raw.is_big_endian;
172 e->info.channel_mask = 0;
174 return true;
177 static FLAC__bool get_sample_info_wave(EncoderSession *e, encode_options_t options)
179 FLAC__bool got_fmt_chunk = false, got_data_chunk = false, got_ds64_chunk = false;
180 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
181 FLAC__uint32 channel_mask = 0;
182 FLAC__uint64 ds64_data_size = 0;
184 e->info.is_unsigned_samples = false;
185 e->info.is_big_endian = false;
187 if(e->format == FORMAT_WAVE64) {
189 * lookahead[] already has "riff\x2E\x91\xCF\x11\xD6\xA5\x28\xDB", skip over remaining header
191 if(!fskip_ahead(e->fin, 16+8+16-12)) { /* riff GUID + riff size + WAVE GUID - lookahead */
192 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over remaining \"riff\" header\n", e->inbasefilename);
193 return false;
196 /* else lookahead[] already has "RIFFxxxxWAVE" or "RF64xxxxWAVE" */
198 while(!feof(e->fin) && !got_data_chunk) {
199 /* chunk IDs are 4 bytes for WAVE/RF64, 16 for Wave64 */
200 /* for WAVE/RF64 we want the 5th char zeroed so we can treat it like a C string */
201 char chunk_id[16] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
203 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, e->format==FORMAT_WAVE64?16:4, /*eof_ok=*/true, e->inbasefilename)) {
204 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
205 return false;
207 if(feof(e->fin))
208 break;
210 if(e->format == FORMAT_RF64 && !memcmp(chunk_id, "ds64", 4)) { /* RF64 64-bit sizes chunk */
211 FLAC__uint32 xx, data_bytes;
213 if(got_ds64_chunk) {
214 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'ds64' chunks\n", e->inbasefilename);
215 return false;
217 if(got_fmt_chunk || got_data_chunk) {
218 flac__utils_printf(stderr, 1, "%s: ERROR: 'ds64' chunk appears after 'fmt ' or 'data' chunk\n", e->inbasefilename);
219 return false;
222 /* ds64 chunk size */
223 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
224 return false;
225 data_bytes = xx;
226 if(data_bytes < 28) {
227 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'ds64' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
228 return false;
230 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
231 data_bytes++;
233 /* RIFF 64-bit size, lo/hi */
234 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
235 return false;
236 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
237 return false;
239 /* 'data' 64-bit size */
240 if(!read_uint64(e->fin, /*big_endian=*/false, &ds64_data_size, e->inbasefilename))
241 return false;
243 data_bytes -= 16;
245 /* skip any extra data in the ds64 chunk */
246 if(!fskip_ahead(e->fin, data_bytes)) {
247 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'ds64' data\n", e->inbasefilename);
248 return false;
251 got_ds64_chunk = true;
253 else if(
254 !memcmp(chunk_id, "fmt ", 4) &&
255 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "fmt \xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
256 ) { /* format chunk */
257 FLAC__uint16 x;
258 FLAC__uint32 xx, data_bytes;
259 FLAC__uint16 wFormatTag; /* wFormatTag word from the 'fmt ' chunk */
261 if(got_fmt_chunk) {
262 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'fmt ' chunks\n", e->inbasefilename);
263 return false;
266 /* see
267 * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
268 * http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
269 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/audio_r/hh/Audio_r/aud-prop_d40f094e-44f9-4baa-8a15-03e4fb369501.xml.asp
271 * WAVEFORMAT is
272 * 4 byte: chunk size
273 * 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
274 * 2 byte: # channels
275 * 4 byte: sample rate (Hz)
276 * 4 byte: avg bytes per sec
277 * 2 byte: block align
278 * 2 byte: bits per sample (not necessarily all significant)
279 * WAVEFORMATEX adds
280 * 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
281 * WAVEFORMATEXTENSIBLE adds
282 * 2 byte: valid bits per sample
283 * 4 byte: channel mask
284 * 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
286 * Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
287 * Lots of old broken WAVEs/apps have don't follow it, e.g. 20 bps but a block align of 3/6 for mono/stereo.
289 * Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
291 * If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
292 * If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
294 * Data is supposed to be unsigned for bps <= 8 else signed.
297 /* fmt chunk size */
298 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
299 return false;
300 data_bytes = xx;
301 if(e->format == FORMAT_WAVE64) {
302 /* other half of the size field should be 0 */
303 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
304 return false;
305 if(xx) {
306 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly large Wave64 'fmt ' chunk has length = 0x%08X%08X\n", e->inbasefilename, (unsigned)xx, (unsigned)data_bytes);
307 return false;
309 /* subtract size of header */
310 if (data_bytes < 16+8) {
311 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 'fmt ' chunk has length = 0x%08X%08X\n", e->inbasefilename, (unsigned)xx, (unsigned)data_bytes);
312 return false;
314 data_bytes -= (16+8);
316 if(data_bytes < 16) {
317 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'fmt ' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
318 return false;
320 if(e->format != FORMAT_WAVE64) {
321 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
322 data_bytes++;
324 else { /* Wave64 */
325 data_bytes = (data_bytes+7) & (~7u); /* should never happen, but enforce Wave64 alignment rules */
328 /* format code */
329 if(!read_uint16(e->fin, /*big_endian=*/false, &wFormatTag, e->inbasefilename))
330 return false;
331 if(wFormatTag != 1 /*WAVE_FORMAT_PCM*/ && wFormatTag != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
332 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", e->inbasefilename, (unsigned)wFormatTag);
333 return false;
336 /* number of channels */
337 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
338 return false;
339 channels = (unsigned)x;
341 /* sample rate */
342 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
343 return false;
344 sample_rate = xx;
346 /* avg bytes per second (ignored) */
347 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
348 return false;
349 /* block align */
350 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
351 return false;
353 /* bits per sample */
354 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
355 return false;
356 bps = (unsigned)x;
358 e->info.is_unsigned_samples = (bps <= 8);
360 if(wFormatTag == 1) {
361 if(bps != 8 && bps != 16) {
362 if(bps == 24 || bps == 32) {
363 /* let these slide with a warning since they're unambiguous */
364 flac__utils_printf(stderr, 1, "%s: WARNING: legacy WAVE file has format type %u but bits-per-sample=%u\n", e->inbasefilename, (unsigned)wFormatTag, bps);
365 if(e->treat_warnings_as_errors)
366 return false;
368 else {
369 /* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
370 flac__utils_printf(stderr, 1, "%s: ERROR: legacy WAVE file has format type %u but bits-per-sample=%u\n", e->inbasefilename, (unsigned)wFormatTag, bps);
371 return false;
374 #if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
375 if((bps+7)/8 * channels == block_align) {
376 if(bps % 8) {
377 /* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
378 flac__utils_printf(stderr, 1, "%s: WARNING: legacy WAVE file (format type %d) has block alignment=%u, bits-per-sample=%u, channels=%u\n", e->inbasefilename, (unsigned)wFormatTag, block_align, bps, channels);
379 if(e->treat_warnings_as_errors)
380 return false;
381 shift = 8 - (bps % 8);
382 bps += shift;
384 else
385 shift = 0;
387 else {
388 flac__utils_printf(stderr, 1, "%s: ERROR: illegal WAVE file (format type %d) has block alignment=%u, bits-per-sample=%u, channels=%u\n", e->inbasefilename, (unsigned)wFormatTag, block_align, bps, channels);
389 return false;
391 #else
392 shift = 0;
393 #endif
394 if(channels > 2 && !options.channel_map_none) {
395 flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", e->inbasefilename);
396 return false;
398 FLAC__ASSERT(data_bytes >= 16);
399 data_bytes -= 16;
401 else {
402 if(data_bytes < 40) {
403 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", e->inbasefilename, (unsigned)data_bytes);
404 return false;
406 /* cbSize */
407 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
408 return false;
409 if(x < 22) {
410 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", e->inbasefilename, (unsigned)x);
411 return false;
413 /* valid bps */
414 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
415 return false;
416 if((unsigned)x > bps) {
417 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", e->inbasefilename, (unsigned)x, bps);
418 return false;
420 shift = bps - (unsigned)x;
421 /* channel mask */
422 if(!read_uint32(e->fin, /*big_endian=*/false, &channel_mask, e->inbasefilename))
423 return false;
424 /* for mono/stereo and unassigned channels, we fake the mask */
425 if(channel_mask == 0) {
426 if(channels == 1)
427 channel_mask = 0x0001;
428 else if(channels == 2)
429 channel_mask = 0x0003;
431 /* set channel mapping */
432 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
433 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
434 /* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
435 #if 0
436 /* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
438 options.channel_map_none ||
439 channel_mask == 0x0001 || /* 1 channel: (mono) */
440 channel_mask == 0x0003 || /* 2 channels: front left, front right */
441 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
442 channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
444 /* keep default channel order */
446 else if(
447 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
448 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
449 channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
451 /* to dolby order: front left, center, front right [, surround left, surround right ] */
452 channel_map[1] = 2;
453 channel_map[2] = 1;
455 else if(
456 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
457 channel_mask == 0x060f || /* 6 channels: front left, front right, front center, LFE, side left, side right */
458 channel_mask == 0x070f || /* 7 channels: front left, front right, front center, LFE, back center, side left, side right */
459 channel_mask == 0x063f /* 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right */
461 /* to dolby order: front left, center, front right, surround left, surround right, LFE */
462 channel_map[1] = 2;
463 channel_map[2] = 1;
464 channel_map[3] = 5;
465 channel_map[4] = 3;
466 channel_map[5] = 4;
468 #else
470 options.channel_map_none ||
471 channel_mask == 0x0001 || /* 1 channel: (mono) */
472 channel_mask == 0x0003 || /* 2 channels: front left, front right */
473 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
474 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
475 channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
476 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
477 channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
478 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
479 channel_mask == 0x060f || /* 6 channels: front left, front right, front center, LFE, side left, side right */
480 channel_mask == 0x070f || /* 7 channels: front left, front right, front center, LFE, back center, side left, side right */
481 channel_mask == 0x063f /* 8 channels: front left, front right, front center, LFE, back left, back right, side left, side right */
483 /* keep default channel order */
485 #endif
486 else {
487 flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk with unsupported channel mask=0x%04X\n\nUse --channel-map=none option to store channels in current order; FLAC files\nmust also be decoded with --channel-map=none to restore correct order.\n", e->inbasefilename, (unsigned)channel_mask);
488 return false;
490 if(!options.channel_map_none) {
491 if(count_channel_mask_bits(channel_mask) < channels) {
492 flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk: channel mask 0x%04X has unassigned channels (#channels=%u)\n", e->inbasefilename, (unsigned)channel_mask, channels);
493 return false;
495 #if 0
496 /* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
497 * there would be holes in the order that would have to be filled in, or the mask would have to be
498 * limited and the logic above rerun to see if it still fits into the FLAC mapping.
500 else if(count_channel_mask_bits(channel_mask) > channels)
501 channel_mask = limit_channel_mask(channel_mask, channels);
502 #else
503 else if(count_channel_mask_bits(channel_mask) > channels) {
504 flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk: channel mask 0x%04X has extra bits for non-existant channels (#channels=%u)\n", e->inbasefilename, (unsigned)channel_mask, channels);
505 return false;
507 #endif
509 /* first part of GUID */
510 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
511 return false;
512 if(x != 1) {
513 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", e->inbasefilename, (unsigned)x);
514 return false;
516 data_bytes -= 26;
519 e->info.bytes_per_wide_sample = channels * (bps / 8);
521 /* skip any extra data in the fmt chunk */
522 if(!fskip_ahead(e->fin, data_bytes)) {
523 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'fmt' data\n", e->inbasefilename);
524 return false;
527 got_fmt_chunk = true;
529 else if(
530 !memcmp(chunk_id, "data", 4) &&
531 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "data\xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
532 ) { /* data chunk */
533 FLAC__uint32 xx;
534 FLAC__uint64 data_bytes;
536 if(!got_fmt_chunk) {
537 flac__utils_printf(stderr, 1, "%s: ERROR: got 'data' chunk before 'fmt' chunk\n", e->inbasefilename);
538 return false;
541 /* data size */
542 if(e->format != FORMAT_WAVE64) {
543 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
544 return false;
545 data_bytes = xx;
547 else { /* Wave64 */
548 if(!read_uint64(e->fin, /*big_endian=*/false, &data_bytes, e->inbasefilename))
549 return false;
550 /* subtract size of header */
551 if (data_bytes < 16+8) {
552 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 'data' chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)data_bytes);
553 return false;
555 data_bytes -= (16+8);
557 if(e->format == FORMAT_RF64) {
558 if(!got_ds64_chunk) {
559 flac__utils_printf(stderr, 1, "%s: ERROR: RF64 file has no 'ds64' chunk before 'data' chunk\n", e->inbasefilename);
560 return false;
562 if(data_bytes == 0xffffffff)
563 data_bytes = ds64_data_size;
565 if(options.ignore_chunk_sizes) {
566 FLAC__ASSERT(!options.sector_align);
567 if(data_bytes) {
568 flac__utils_printf(stderr, 1, "%s: WARNING: 'data' chunk has non-zero size, using --ignore-chunk-sizes is probably a bad idea\n", e->inbasefilename, chunk_id);
569 if(e->treat_warnings_as_errors)
570 return false;
572 data_bytes = (FLAC__uint64)0 - (FLAC__uint64)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
574 else if(0 == data_bytes) {
575 flac__utils_printf(stderr, 1, "%s: ERROR: 'data' chunk has size of 0\n", e->inbasefilename);
576 return false;
579 e->fmt.iff.data_bytes = data_bytes;
581 got_data_chunk = true;
582 break;
584 else {
585 FLAC__uint32 xx;
586 FLAC__uint64 skip;
587 if(!options.format_options.iff.foreign_metadata) {
588 if(e->format != FORMAT_WAVE64)
589 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
590 else
591 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X (use --keep-foreign-metadata to keep)\n",
592 e->inbasefilename,
593 (unsigned)((const unsigned char *)chunk_id)[3],
594 (unsigned)((const unsigned char *)chunk_id)[2],
595 (unsigned)((const unsigned char *)chunk_id)[1],
596 (unsigned)((const unsigned char *)chunk_id)[0],
597 (unsigned)((const unsigned char *)chunk_id)[5],
598 (unsigned)((const unsigned char *)chunk_id)[4],
599 (unsigned)((const unsigned char *)chunk_id)[7],
600 (unsigned)((const unsigned char *)chunk_id)[6],
601 (unsigned)((const unsigned char *)chunk_id)[9],
602 (unsigned)((const unsigned char *)chunk_id)[8],
603 (unsigned)((const unsigned char *)chunk_id)[10],
604 (unsigned)((const unsigned char *)chunk_id)[11],
605 (unsigned)((const unsigned char *)chunk_id)[12],
606 (unsigned)((const unsigned char *)chunk_id)[13],
607 (unsigned)((const unsigned char *)chunk_id)[14],
608 (unsigned)((const unsigned char *)chunk_id)[15]
610 if(e->treat_warnings_as_errors)
611 return false;
614 /* chunk size */
615 if(e->format != FORMAT_WAVE64) {
616 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
617 return false;
618 skip = xx;
619 skip += skip & 1;
621 else { /* Wave64 */
622 if(!read_uint64(e->fin, /*big_endian=*/false, &skip, e->inbasefilename))
623 return false;
624 skip = (skip+7) & (~(FLAC__uint64)7);
625 /* subtract size of header */
626 if (skip < 16+8) {
627 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)skip);
628 return false;
630 skip -= (16+8);
632 if(skip) {
633 if(!fskip_ahead(e->fin, skip)) {
634 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
635 return false;
641 if(!got_fmt_chunk) {
642 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find fmt chunk\n", e->inbasefilename);
643 return false;
645 if(!got_data_chunk) {
646 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find data chunk\n", e->inbasefilename);
647 return false;
650 e->info.sample_rate = sample_rate;
651 e->info.channels = channels;
652 e->info.bits_per_sample = bps;
653 e->info.shift = shift;
654 e->info.channel_mask = channel_mask;
656 return true;
659 static FLAC__bool get_sample_info_aiff(EncoderSession *e, encode_options_t options)
661 FLAC__bool got_comm_chunk = false, got_ssnd_chunk = false;
662 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
663 FLAC__uint64 sample_frames = 0;
664 FLAC__uint32 channel_mask = 0;
666 e->info.is_unsigned_samples = false;
667 e->info.is_big_endian = true;
670 * lookahead[] already has "FORMxxxxAIFF", do chunks
672 while(!feof(e->fin) && !got_ssnd_chunk) {
673 char chunk_id[5] = { '\0', '\0', '\0', '\0', '\0' }; /* one extra byte for terminating NUL so we can also treat it like a C string */
674 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
675 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
676 return false;
678 if(feof(e->fin))
679 break;
681 if(!memcmp(chunk_id, "COMM", 4)) { /* common chunk */
682 FLAC__uint16 x;
683 FLAC__uint32 xx;
684 unsigned long skip;
685 const FLAC__bool is_aifc = e->format == FORMAT_AIFF_C;
686 const FLAC__uint32 minimum_comm_size = (is_aifc? 22 : 18);
688 if(got_comm_chunk) {
689 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'COMM' chunks\n", e->inbasefilename);
690 return false;
693 /* COMM chunk size */
694 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
695 return false;
696 else if(xx < minimum_comm_size) {
697 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard %s 'COMM' chunk has length = %u\n", e->inbasefilename, is_aifc? "AIFF-C" : "AIFF", (unsigned int)xx);
698 return false;
700 else if(!is_aifc && xx != minimum_comm_size) {
701 flac__utils_printf(stderr, 1, "%s: WARNING: non-standard %s 'COMM' chunk has length = %u, expected %u\n", e->inbasefilename, is_aifc? "AIFF-C" : "AIFF", (unsigned int)xx, minimum_comm_size);
702 if(e->treat_warnings_as_errors)
703 return false;
705 skip = (xx-minimum_comm_size)+(xx & 1);
707 /* number of channels */
708 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
709 return false;
710 channels = (unsigned)x;
711 if(channels > 2 && !options.channel_map_none) {
712 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
713 return false;
716 /* number of sample frames */
717 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
718 return false;
719 sample_frames = xx;
721 /* bits per sample */
722 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
723 return false;
724 bps = (unsigned)x;
725 shift = (bps%8)? 8-(bps%8) : 0; /* SSND data is always byte-aligned, left-justified but format_input() will double-check */
726 bps += shift;
728 /* sample rate */
729 if(!read_sane_extended(e->fin, &xx, e->inbasefilename))
730 return false;
731 sample_rate = xx;
733 /* check compression type for AIFF-C */
734 if(is_aifc) {
735 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
736 return false;
737 if(xx == 0x736F7774) /* "sowt" */
738 e->info.is_big_endian = false;
739 else if(xx == 0x4E4F4E45) /* "NONE" */
740 ; /* nothing to do, we already default to big-endian */
741 else {
742 flac__utils_printf(stderr, 1, "%s: ERROR: can't handle AIFF-C compression type \"%c%c%c%c\"\n", e->inbasefilename, (char)(xx>>24), (char)((xx>>16)&8), (char)((xx>>8)&8), (char)(xx&8));
743 return false;
747 /* set channel mapping */
748 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
749 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
750 /* specs say the channel ordering is:
751 * 1 2 3 4 5 6
752 * ___________________________________________________
753 * 2 stereo l r
754 * 3 l r c
755 * 4 l c r S
756 * quad (ambiguous with 4ch) Fl Fr Bl Br
757 * 5 Fl Fr Fc Sl Sr
758 * 6 l lc c r rc S
759 * l:left r:right c:center Fl:front-left Fr:front-right Bl:back-left Br:back-right Lc:left-center Rc:right-center S:surround
760 * so we only have unambiguous mappings for 2, 3, and 5 channels
763 options.channel_map_none ||
764 channels == 1 || /* 1 channel: (mono) */
765 channels == 2 || /* 2 channels: left, right */
766 channels == 3 || /* 3 channels: left, right, center */
767 channels == 5 /* 5 channels: front left, front right, center, surround left, surround right */
769 /* keep default channel order */
771 else {
772 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
773 return false;
776 e->info.bytes_per_wide_sample = channels * (bps / 8);
778 /* skip any extra data in the COMM chunk */
779 if(!fskip_ahead(e->fin, skip)) {
780 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra COMM data\n", e->inbasefilename);
781 return false;
784 got_comm_chunk = true;
786 else if(!memcmp(chunk_id, "SSND", 4) && !got_ssnd_chunk) { /* sound data chunk */
787 FLAC__uint32 xx;
788 FLAC__uint64 data_bytes;
789 unsigned offset = 0;
791 if(!got_comm_chunk) {
792 flac__utils_printf(stderr, 1, "%s: ERROR: got 'SSND' chunk before 'COMM' chunk\n", e->inbasefilename);
793 return false;
796 /* SSND chunk size */
797 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
798 return false;
799 data_bytes = xx;
800 if(options.ignore_chunk_sizes) {
801 FLAC__ASSERT(!options.sector_align);
802 if(data_bytes) {
803 flac__utils_printf(stderr, 1, "%s: WARNING: 'SSND' chunk has non-zero size, using --ignore-chunk-sizes is probably a bad idea\n", e->inbasefilename, chunk_id);
804 if(e->treat_warnings_as_errors)
805 return false;
807 data_bytes = (FLAC__uint64)0 - (FLAC__uint64)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
809 else if(data_bytes <= 8) {
810 flac__utils_printf(stderr, 1, "%s: ERROR: 'SSND' chunk has size <= 8\n", e->inbasefilename);
811 return false;
813 else {
814 data_bytes -= 8; /* discount the offset and block size fields */
817 /* offset */
818 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
819 return false;
820 offset = xx;
821 data_bytes -= offset;
823 /* block size */
824 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
825 return false;
826 if(xx && !options.ignore_chunk_sizes)
827 data_bytes -= (xx - (data_bytes % xx));
828 if(options.ignore_chunk_sizes) {
829 if(xx) {
830 flac__utils_printf(stderr, 1, "%s: WARNING: 'SSND' chunk has non-zero blocksize, using --ignore-chunk-sizes is probably a bad idea\n", e->inbasefilename, chunk_id);
831 if(e->treat_warnings_as_errors)
832 return false;
836 /* skip any SSND offset bytes */
837 if(!fskip_ahead(e->fin, offset)) {
838 flac__utils_printf(stderr, 1, "%s: ERROR: skipping offset in SSND chunk\n", e->inbasefilename);
839 return false;
842 e->fmt.iff.data_bytes = data_bytes;
844 got_ssnd_chunk = true;
846 else {
847 FLAC__uint32 xx;
848 if(!options.format_options.iff.foreign_metadata) {
849 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
850 if(e->treat_warnings_as_errors)
851 return false;
854 /* chunk size */
855 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
856 return false;
857 else {
858 unsigned long skip = xx + (xx & 1);
860 FLAC__ASSERT(skip <= LONG_MAX);
861 if(!fskip_ahead(e->fin, skip)) {
862 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
863 return false;
869 if(!got_comm_chunk) {
870 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find COMM chunk\n", e->inbasefilename);
871 return false;
873 if(!got_ssnd_chunk && sample_frames) {
874 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find SSND chunk\n", e->inbasefilename);
875 return false;
878 e->info.sample_rate = sample_rate;
879 e->info.channels = channels;
880 e->info.bits_per_sample = bps;
881 e->info.shift = shift;
882 e->info.channel_mask = channel_mask;
884 return true;
887 static FLAC__bool get_sample_info_flac(EncoderSession *e)
889 if (!(
890 FLAC__stream_decoder_set_md5_checking(e->fmt.flac.decoder, false) &&
891 FLAC__stream_decoder_set_metadata_respond_all(e->fmt.flac.decoder)
892 )) {
893 flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", e->inbasefilename);
894 return false;
897 if (e->format == FORMAT_OGGFLAC) {
898 if (FLAC__stream_decoder_init_ogg_stream(e->fmt.flac.decoder, flac_decoder_read_callback, flac_decoder_seek_callback, flac_decoder_tell_callback, flac_decoder_length_callback, flac_decoder_eof_callback, flac_decoder_write_callback, flac_decoder_metadata_callback, flac_decoder_error_callback, /*client_data=*/e) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
899 flac__utils_printf(stderr, 1, "%s: ERROR: initializing decoder for Ogg FLAC input, state = %s\n", e->inbasefilename, FLAC__stream_decoder_get_resolved_state_string(e->fmt.flac.decoder));
900 return false;
903 else if (FLAC__stream_decoder_init_stream(e->fmt.flac.decoder, flac_decoder_read_callback, flac_decoder_seek_callback, flac_decoder_tell_callback, flac_decoder_length_callback, flac_decoder_eof_callback, flac_decoder_write_callback, flac_decoder_metadata_callback, flac_decoder_error_callback, /*client_data=*/e) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
904 flac__utils_printf(stderr, 1, "%s: ERROR: initializing decoder for FLAC input, state = %s\n", e->inbasefilename, FLAC__stream_decoder_get_resolved_state_string(e->fmt.flac.decoder));
905 return false;
908 if (!FLAC__stream_decoder_process_until_end_of_metadata(e->fmt.flac.decoder) || e->fmt.flac.client_data.fatal_error) {
909 if (e->fmt.flac.client_data.fatal_error)
910 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", e->inbasefilename);
911 else
912 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, state = %s\n", e->inbasefilename, FLAC__stream_decoder_get_resolved_state_string(e->fmt.flac.decoder));
913 return false;
916 if (e->fmt.flac.client_data.num_metadata_blocks == 0) {
917 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", e->inbasefilename);
918 return false;
920 else if (e->fmt.flac.client_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
921 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", e->inbasefilename);
922 return false;
924 else if (e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
925 flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", e->inbasefilename);
926 return false;
929 e->info.sample_rate = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.sample_rate;
930 e->info.channels = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.channels;
931 e->info.bits_per_sample = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.bits_per_sample;
932 e->info.shift = 0;
933 e->info.bytes_per_wide_sample = 0;
934 e->info.is_unsigned_samples = false; /* not applicable for FLAC input */
935 e->info.is_big_endian = false; /* not applicable for FLAC input */
936 e->info.channel_mask = 0;
938 return true;
942 * public routines
944 int flac__encode_file(FILE *infile, FLAC__off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, encode_options_t options)
946 EncoderSession encoder_session;
947 size_t channel_map[FLAC__MAX_CHANNELS];
948 int info_align_carry = -1, info_align_zero = -1;
950 if(!EncoderSession_construct(&encoder_session, options, infilesize, infile, infilename, outfilename, lookahead, lookahead_length))
951 return 1;
953 /* initialize default channel map that preserves channel order */
955 size_t i;
956 for(i = 0; i < sizeof(channel_map)/sizeof(channel_map[0]); i++)
957 channel_map[i] = i;
960 /* read foreign metadata if requested */
961 if(EncoderSession_format_is_iff(&encoder_session) && options.format_options.iff.foreign_metadata) {
962 const char *error;
963 if(!(
964 options.format == FORMAT_WAVE || options.format == FORMAT_RF64?
965 flac__foreign_metadata_read_from_wave(options.format_options.iff.foreign_metadata, infilename, &error) :
966 options.format == FORMAT_WAVE64?
967 flac__foreign_metadata_read_from_wave64(options.format_options.iff.foreign_metadata, infilename, &error) :
968 flac__foreign_metadata_read_from_aiff(options.format_options.iff.foreign_metadata, infilename, &error)
969 )) {
970 flac__utils_printf(stderr, 1, "%s: ERROR reading foreign metadata: %s\n", encoder_session.inbasefilename, error);
971 return EncoderSession_finish_error(&encoder_session);
975 /* initialize encoder session with info about the audio (channels/bps/resolution/endianness/etc) */
976 switch(options.format) {
977 case FORMAT_RAW:
978 if(!get_sample_info_raw(&encoder_session, options))
979 return EncoderSession_finish_error(&encoder_session);
980 break;
981 case FORMAT_WAVE:
982 case FORMAT_WAVE64:
983 case FORMAT_RF64:
984 if(!get_sample_info_wave(&encoder_session, options))
985 return EncoderSession_finish_error(&encoder_session);
986 break;
987 case FORMAT_AIFF:
988 case FORMAT_AIFF_C:
989 if(!get_sample_info_aiff(&encoder_session, options))
990 return EncoderSession_finish_error(&encoder_session);
991 break;
992 case FORMAT_FLAC:
993 case FORMAT_OGGFLAC:
995 * set up FLAC decoder for the input
997 if (0 == (encoder_session.fmt.flac.decoder = FLAC__stream_decoder_new())) {
998 flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
999 return EncoderSession_finish_error(&encoder_session);
1001 if(!get_sample_info_flac(&encoder_session))
1002 return EncoderSession_finish_error(&encoder_session);
1003 break;
1004 default:
1005 FLAC__ASSERT(0);
1006 /* double protection */
1007 return EncoderSession_finish_error(&encoder_session);
1010 /* some more checks */
1011 if(encoder_session.info.channels == 0 || encoder_session.info.channels > FLAC__MAX_CHANNELS) {
1012 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, encoder_session.info.channels);
1013 return EncoderSession_finish_error(&encoder_session);
1015 if(!FLAC__format_sample_rate_is_valid(encoder_session.info.sample_rate)) {
1016 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
1017 return EncoderSession_finish_error(&encoder_session);
1019 if(encoder_session.info.bits_per_sample-encoder_session.info.shift < 4 || encoder_session.info.bits_per_sample-encoder_session.info.shift > 24) {
1020 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported bits-per-sample %u\n", encoder_session.inbasefilename, encoder_session.info.bits_per_sample-encoder_session.info.shift);
1021 return EncoderSession_finish_error(&encoder_session);
1023 if(options.sector_align) {
1024 if(encoder_session.info.channels != 2) {
1025 flac__utils_printf(stderr, 1, "%s: ERROR: file has %u channels, must be 2 for --sector-align\n", encoder_session.inbasefilename, encoder_session.info.channels);
1026 return EncoderSession_finish_error(&encoder_session);
1028 if(encoder_session.info.sample_rate != 44100) {
1029 flac__utils_printf(stderr, 1, "%s: ERROR: file's sample rate is %u, must be 44100 for --sector-align\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
1030 return EncoderSession_finish_error(&encoder_session);
1032 if(encoder_session.info.bits_per_sample-encoder_session.info.shift != 16) {
1033 flac__utils_printf(stderr, 1, "%s: ERROR: file has %u bits-per-sample, must be 16 for --sector-align\n", encoder_session.inbasefilename, encoder_session.info.bits_per_sample-encoder_session.info.shift);
1034 return EncoderSession_finish_error(&encoder_session);
1039 FLAC__uint64 total_samples_in_input; /* WATCHOUT: may be 0 to mean "unknown" */
1040 FLAC__uint64 skip;
1041 FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
1042 unsigned align_remainder = 0;
1044 switch(options.format) {
1045 case FORMAT_RAW:
1046 if(infilesize < 0)
1047 total_samples_in_input = 0;
1048 else
1049 total_samples_in_input = (FLAC__uint64)infilesize / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1050 break;
1051 case FORMAT_WAVE:
1052 case FORMAT_WAVE64:
1053 case FORMAT_RF64:
1054 case FORMAT_AIFF:
1055 case FORMAT_AIFF_C:
1056 /* truncation in the division removes any padding byte that was counted in encoder_session.fmt.iff.data_bytes */
1057 total_samples_in_input = encoder_session.fmt.iff.data_bytes / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1058 break;
1059 case FORMAT_FLAC:
1060 case FORMAT_OGGFLAC:
1061 total_samples_in_input = encoder_session.fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples + *options.align_reservoir_samples;
1062 break;
1063 default:
1064 FLAC__ASSERT(0);
1065 /* double protection */
1066 return EncoderSession_finish_error(&encoder_session);
1070 * now that we know the sample rate, canonicalize the
1071 * --skip string to an absolute sample number:
1073 flac__utils_canonicalize_skip_until_specification(&options.skip_specification, encoder_session.info.sample_rate);
1074 FLAC__ASSERT(options.skip_specification.value.samples >= 0);
1075 skip = (FLAC__uint64)options.skip_specification.value.samples;
1076 FLAC__ASSERT(!options.sector_align || (options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC && skip == 0));
1077 /* *options.align_reservoir_samples will be 0 unless --sector-align is used */
1078 FLAC__ASSERT(options.sector_align || *options.align_reservoir_samples == 0);
1081 * now that we possibly know the input size, canonicalize the
1082 * --until string to an absolute sample number:
1084 if(!canonicalize_until_specification(&options.until_specification, encoder_session.inbasefilename, encoder_session.info.sample_rate, skip, total_samples_in_input))
1085 return EncoderSession_finish_error(&encoder_session);
1086 until = (FLAC__uint64)options.until_specification.value.samples;
1087 FLAC__ASSERT(!options.sector_align || until == 0);
1089 /* adjust encoding parameters based on skip and until values */
1090 switch(options.format) {
1091 case FORMAT_RAW:
1092 infilesize -= (FLAC__off_t)skip * encoder_session.info.bytes_per_wide_sample;
1093 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1094 break;
1095 case FORMAT_WAVE:
1096 case FORMAT_WAVE64:
1097 case FORMAT_RF64:
1098 case FORMAT_AIFF:
1099 case FORMAT_AIFF_C:
1100 encoder_session.fmt.iff.data_bytes -= skip * encoder_session.info.bytes_per_wide_sample;
1101 if(options.ignore_chunk_sizes) {
1102 encoder_session.total_samples_to_encode = 0;
1103 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1104 FLAC__ASSERT(0 == until);
1106 else {
1107 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1109 break;
1110 case FORMAT_FLAC:
1111 case FORMAT_OGGFLAC:
1112 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1113 break;
1114 default:
1115 FLAC__ASSERT(0);
1116 /* double protection */
1117 return EncoderSession_finish_error(&encoder_session);
1119 if(until > 0) {
1120 const FLAC__uint64 trim = total_samples_in_input - until;
1121 FLAC__ASSERT(total_samples_in_input > 0);
1122 FLAC__ASSERT(!options.sector_align);
1123 if(options.format == FORMAT_RAW)
1124 infilesize -= (FLAC__off_t)trim * encoder_session.info.bytes_per_wide_sample;
1125 else if(EncoderSession_format_is_iff(&encoder_session))
1126 encoder_session.fmt.iff.data_bytes -= trim * encoder_session.info.bytes_per_wide_sample;
1127 encoder_session.total_samples_to_encode -= trim;
1129 if(options.sector_align && (options.format != FORMAT_RAW || infilesize >=0)) { /* for RAW, need to know the filesize */
1130 FLAC__ASSERT(skip == 0); /* asserted above too, but lest we forget */
1131 align_remainder = (unsigned)(encoder_session.total_samples_to_encode % 588);
1132 if(options.is_last_file)
1133 encoder_session.total_samples_to_encode += (588-align_remainder); /* will pad with zeroes */
1134 else
1135 encoder_session.total_samples_to_encode -= align_remainder; /* will stop short and carry over to next file */
1137 switch(options.format) {
1138 case FORMAT_RAW:
1139 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample;
1140 break;
1141 case FORMAT_WAVE:
1142 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1143 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 44;
1144 break;
1145 case FORMAT_WAVE64:
1146 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1147 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 104;
1148 break;
1149 case FORMAT_RF64:
1150 /* +72 for the size of the RF64 headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1151 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 80;
1152 break;
1153 case FORMAT_AIFF:
1154 case FORMAT_AIFF_C:
1155 /* +54 for the size of the AIFF headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1156 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 54;
1157 break;
1158 case FORMAT_FLAC:
1159 case FORMAT_OGGFLAC:
1160 if(infilesize < 0)
1161 /* if we don't know, use 0 as hint to progress indicator (which is the only place this is used): */
1162 encoder_session.unencoded_size = 0;
1163 else if(skip == 0 && until == 0)
1164 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1165 else if(total_samples_in_input)
1166 encoder_session.unencoded_size = (FLAC__uint64)infilesize * encoder_session.total_samples_to_encode / total_samples_in_input;
1167 else
1168 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1169 break;
1170 default:
1171 FLAC__ASSERT(0);
1172 /* double protection */
1173 return EncoderSession_finish_error(&encoder_session);
1176 if(encoder_session.total_samples_to_encode == 0)
1177 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1179 if(options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)
1180 encoder_session.fmt.flac.client_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1182 /* init the encoder */
1183 if(!EncoderSession_init_encoder(&encoder_session, options))
1184 return EncoderSession_finish_error(&encoder_session);
1186 /* skip over any samples as requested */
1187 if(skip > 0) {
1188 switch(options.format) {
1189 case FORMAT_RAW:
1191 unsigned skip_bytes = encoder_session.info.bytes_per_wide_sample * (unsigned)skip;
1192 if(skip_bytes > lookahead_length) {
1193 skip_bytes -= lookahead_length;
1194 lookahead_length = 0;
1195 if(!fskip_ahead(encoder_session.fin, skip_bytes)) {
1196 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1197 return EncoderSession_finish_error(&encoder_session);
1200 else {
1201 lookahead += skip_bytes;
1202 lookahead_length -= skip_bytes;
1205 break;
1206 case FORMAT_WAVE:
1207 case FORMAT_WAVE64:
1208 case FORMAT_RF64:
1209 case FORMAT_AIFF:
1210 case FORMAT_AIFF_C:
1211 if(!fskip_ahead(encoder_session.fin, skip * encoder_session.info.bytes_per_wide_sample)) {
1212 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1213 return EncoderSession_finish_error(&encoder_session);
1215 break;
1216 case FORMAT_FLAC:
1217 case FORMAT_OGGFLAC:
1219 * have to wait until the FLAC encoder is set up for writing
1220 * before any seeking in the input FLAC file, because the seek
1221 * itself will usually call the decoder's write callback, and
1222 * our decoder's write callback passes samples to our FLAC
1223 * encoder
1225 if(!FLAC__stream_decoder_seek_absolute(encoder_session.fmt.flac.decoder, skip)) {
1226 flac__utils_printf(stderr, 1, "%s: ERROR while skipping samples, FLAC decoder state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(encoder_session.fmt.flac.decoder));
1227 return EncoderSession_finish_error(&encoder_session);
1229 break;
1230 default:
1231 FLAC__ASSERT(0);
1232 /* double protection */
1233 return EncoderSession_finish_error(&encoder_session);
1238 * first do any samples in the reservoir
1240 if(options.sector_align && *options.align_reservoir_samples > 0) {
1241 FLAC__ASSERT(options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC); /* check again */
1242 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)options.align_reservoir, *options.align_reservoir_samples)) {
1243 print_error_with_state(&encoder_session, "ERROR during encoding");
1244 return EncoderSession_finish_error(&encoder_session);
1249 * decrement infilesize or the data_bytes counter if we need to align the file
1251 if(options.sector_align) {
1252 if(options.is_last_file) {
1253 *options.align_reservoir_samples = 0;
1255 else {
1256 *options.align_reservoir_samples = align_remainder;
1257 if(options.format == FORMAT_RAW) {
1258 FLAC__ASSERT(infilesize >= 0);
1259 infilesize -= (FLAC__off_t)((*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample);
1260 FLAC__ASSERT(infilesize >= 0);
1262 else if(EncoderSession_format_is_iff(&encoder_session))
1263 encoder_session.fmt.iff.data_bytes -= (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample;
1268 * now do samples from the file
1270 switch(options.format) {
1271 case FORMAT_RAW:
1272 if(infilesize < 0) {
1273 size_t bytes_read;
1274 while(!feof(infile)) {
1275 if(lookahead_length > 0) {
1276 FLAC__ASSERT(lookahead_length < CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1277 memcpy(ucbuffer_, lookahead, lookahead_length);
1278 bytes_read = fread(ucbuffer_+lookahead_length, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample - lookahead_length, infile) + lookahead_length;
1279 if(ferror(infile)) {
1280 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1281 return EncoderSession_finish_error(&encoder_session);
1283 lookahead_length = 0;
1285 else
1286 bytes_read = fread(ucbuffer_, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample, infile);
1288 if(bytes_read == 0) {
1289 if(ferror(infile)) {
1290 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1291 return EncoderSession_finish_error(&encoder_session);
1294 else if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1295 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1296 return EncoderSession_finish_error(&encoder_session);
1298 else {
1299 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1300 if(!format_input(input_, wide_samples, encoder_session.info.is_big_endian, encoder_session.info.is_unsigned_samples, encoder_session.info.channels, encoder_session.info.bits_per_sample, encoder_session.info.shift, channel_map))
1301 return EncoderSession_finish_error(&encoder_session);
1303 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1304 print_error_with_state(&encoder_session, "ERROR during encoding");
1305 return EncoderSession_finish_error(&encoder_session);
1310 else {
1311 size_t bytes_read;
1312 const FLAC__uint64 max_input_bytes = infilesize;
1313 FLAC__uint64 total_input_bytes_read = 0;
1314 while(total_input_bytes_read < max_input_bytes) {
1316 size_t wanted = (CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1317 wanted = (size_t) min((FLAC__uint64)wanted, max_input_bytes - total_input_bytes_read);
1319 if(lookahead_length > 0) {
1320 FLAC__ASSERT(lookahead_length <= wanted);
1321 memcpy(ucbuffer_, lookahead, lookahead_length);
1322 wanted -= lookahead_length;
1323 bytes_read = lookahead_length;
1324 if(wanted > 0) {
1325 bytes_read += fread(ucbuffer_+lookahead_length, sizeof(unsigned char), wanted, infile);
1326 if(ferror(infile)) {
1327 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1328 return EncoderSession_finish_error(&encoder_session);
1331 lookahead_length = 0;
1333 else
1334 bytes_read = fread(ucbuffer_, sizeof(unsigned char), wanted, infile);
1337 if(bytes_read == 0) {
1338 if(ferror(infile)) {
1339 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1340 return EncoderSession_finish_error(&encoder_session);
1342 else if(feof(infile)) {
1343 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; expected %" PRIu64 " samples, got %" PRIu64 " samples\n", encoder_session.inbasefilename, encoder_session.total_samples_to_encode, encoder_session.samples_written);
1344 if(encoder_session.treat_warnings_as_errors)
1345 return EncoderSession_finish_error(&encoder_session);
1346 total_input_bytes_read = max_input_bytes;
1349 else {
1350 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1351 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1352 return EncoderSession_finish_error(&encoder_session);
1354 else {
1355 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1356 if(!format_input(input_, wide_samples, encoder_session.info.is_big_endian, encoder_session.info.is_unsigned_samples, encoder_session.info.channels, encoder_session.info.bits_per_sample, encoder_session.info.shift, channel_map))
1357 return EncoderSession_finish_error(&encoder_session);
1359 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1360 print_error_with_state(&encoder_session, "ERROR during encoding");
1361 return EncoderSession_finish_error(&encoder_session);
1363 total_input_bytes_read += bytes_read;
1368 break;
1369 case FORMAT_WAVE:
1370 case FORMAT_WAVE64:
1371 case FORMAT_RF64:
1372 case FORMAT_AIFF:
1373 case FORMAT_AIFF_C:
1374 while(encoder_session.fmt.iff.data_bytes > 0) {
1375 const size_t bytes_to_read = (size_t)min(
1376 encoder_session.fmt.iff.data_bytes,
1377 (FLAC__uint64)CHUNK_OF_SAMPLES * (FLAC__uint64)encoder_session.info.bytes_per_wide_sample
1379 size_t bytes_read = fread(ucbuffer_, sizeof(unsigned char), bytes_to_read, infile);
1380 if(bytes_read == 0) {
1381 if(ferror(infile)) {
1382 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1383 return EncoderSession_finish_error(&encoder_session);
1385 else if(feof(infile)) {
1386 if(options.ignore_chunk_sizes) {
1387 flac__utils_printf(stderr, 1, "%s: INFO: hit EOF with --ignore-chunk-sizes, got %" PRIu64 " samples\n", encoder_session.inbasefilename, encoder_session.samples_written);
1389 else {
1390 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; expected %" PRIu64 " samples, got %" PRIu64 " samples\n", encoder_session.inbasefilename, encoder_session.total_samples_to_encode, encoder_session.samples_written);
1391 if(encoder_session.treat_warnings_as_errors)
1392 return EncoderSession_finish_error(&encoder_session);
1394 encoder_session.fmt.iff.data_bytes = 0;
1397 else {
1398 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1399 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1400 return EncoderSession_finish_error(&encoder_session);
1402 else {
1403 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1404 if(!format_input(input_, wide_samples, encoder_session.info.is_big_endian, encoder_session.info.is_unsigned_samples, encoder_session.info.channels, encoder_session.info.bits_per_sample, encoder_session.info.shift, channel_map))
1405 return EncoderSession_finish_error(&encoder_session);
1407 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1408 print_error_with_state(&encoder_session, "ERROR during encoding");
1409 return EncoderSession_finish_error(&encoder_session);
1411 encoder_session.fmt.iff.data_bytes -= bytes_read;
1415 break;
1416 case FORMAT_FLAC:
1417 case FORMAT_OGGFLAC:
1418 while(!encoder_session.fmt.flac.client_data.fatal_error && encoder_session.fmt.flac.client_data.samples_left_to_process > 0) {
1419 /* We can also hit the end of stream without samples_left_to_process
1420 * going to 0 if there are errors and continue_through_decode_errors
1421 * is on, so we want to break in that case too:
1423 if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(encoder_session.fmt.flac.decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1424 break;
1425 if(!FLAC__stream_decoder_process_single(encoder_session.fmt.flac.decoder)) {
1426 flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(encoder_session.fmt.flac.decoder));
1427 return EncoderSession_finish_error(&encoder_session);
1430 if(encoder_session.fmt.flac.client_data.fatal_error) {
1431 flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(encoder_session.fmt.flac.decoder));
1432 return EncoderSession_finish_error(&encoder_session);
1434 break;
1435 default:
1436 FLAC__ASSERT(0);
1437 /* double protection */
1438 return EncoderSession_finish_error(&encoder_session);
1442 * now read unaligned samples into reservoir or pad with zeroes if necessary
1444 if(options.sector_align) {
1445 if(options.is_last_file) {
1446 unsigned wide_samples = 588 - align_remainder;
1447 if(wide_samples < 588) {
1448 unsigned channel;
1450 info_align_zero = wide_samples;
1451 for(channel = 0; channel < encoder_session.info.channels; channel++)
1452 memset(input_[channel], 0, sizeof(input_[0][0]) * wide_samples);
1454 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1455 print_error_with_state(&encoder_session, "ERROR during encoding");
1456 return EncoderSession_finish_error(&encoder_session);
1460 else {
1461 if(*options.align_reservoir_samples > 0) {
1462 size_t bytes_read;
1463 FLAC__ASSERT(CHUNK_OF_SAMPLES >= 588);
1464 bytes_read = fread(ucbuffer_, sizeof(unsigned char), (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample, infile);
1465 if(bytes_read == 0 && ferror(infile)) {
1466 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1467 return EncoderSession_finish_error(&encoder_session);
1469 else if(bytes_read != (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample) {
1470 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; read %" PRIu64 " bytes; expected %" PRIu64 " samples, got %" PRIu64 " samples\n", encoder_session.inbasefilename, bytes_read, encoder_session.total_samples_to_encode, encoder_session.samples_written);
1471 if(encoder_session.treat_warnings_as_errors)
1472 return EncoderSession_finish_error(&encoder_session);
1474 else {
1475 info_align_carry = *options.align_reservoir_samples;
1476 if(!format_input(options.align_reservoir, *options.align_reservoir_samples, encoder_session.info.is_big_endian, encoder_session.info.is_unsigned_samples, encoder_session.info.channels, encoder_session.info.bits_per_sample, encoder_session.info.shift, channel_map))
1477 return EncoderSession_finish_error(&encoder_session);
1484 return EncoderSession_finish_ok(
1485 &encoder_session,
1486 info_align_carry,
1487 info_align_zero,
1488 EncoderSession_format_is_iff(&encoder_session)? options.format_options.iff.foreign_metadata : 0
1492 FLAC__bool EncoderSession_construct(EncoderSession *e, encode_options_t options, FLAC__off_t infilesize, FILE *infile, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length)
1494 unsigned i;
1495 FLAC__uint32 test = 1;
1498 * initialize globals
1501 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
1503 for(i = 0; i < FLAC__MAX_CHANNELS; i++)
1504 input_[i] = &(in_[i][0]);
1508 * initialize instance
1511 #if FLAC__HAS_OGG
1512 e->use_ogg = options.use_ogg;
1513 #endif
1514 e->verify = options.verify;
1515 e->treat_warnings_as_errors = options.treat_warnings_as_errors;
1516 e->continue_through_decode_errors = options.continue_through_decode_errors;
1518 e->is_stdout = (0 == strcmp(outfilename, "-"));
1519 e->outputfile_opened = false;
1521 e->inbasefilename = grabbag__file_get_basename(infilename);
1522 e->infilename = infilename;
1523 e->outfilename = outfilename;
1525 e->total_samples_to_encode = 0;
1526 e->unencoded_size = 0;
1527 e->bytes_written = 0;
1528 e->samples_written = 0;
1529 e->stats_mask = 0;
1531 memset(&e->info, 0, sizeof(e->info));
1533 e->format = options.format;
1535 switch(options.format) {
1536 case FORMAT_RAW:
1537 break;
1538 case FORMAT_WAVE:
1539 case FORMAT_WAVE64:
1540 case FORMAT_RF64:
1541 case FORMAT_AIFF:
1542 case FORMAT_AIFF_C:
1543 e->fmt.iff.data_bytes = 0;
1544 break;
1545 case FORMAT_FLAC:
1546 case FORMAT_OGGFLAC:
1547 e->fmt.flac.decoder = 0;
1548 e->fmt.flac.client_data.filesize = infilesize;
1549 e->fmt.flac.client_data.lookahead = lookahead;
1550 e->fmt.flac.client_data.lookahead_length = lookahead_length;
1551 e->fmt.flac.client_data.num_metadata_blocks = 0;
1552 e->fmt.flac.client_data.samples_left_to_process = 0;
1553 e->fmt.flac.client_data.fatal_error = false;
1554 break;
1555 default:
1556 FLAC__ASSERT(0);
1557 /* double protection */
1558 return false;
1561 e->encoder = 0;
1563 e->fin = infile;
1564 e->seek_table_template = 0;
1566 if(0 == (e->seek_table_template = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE))) {
1567 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1568 return false;
1571 e->encoder = FLAC__stream_encoder_new();
1572 if(0 == e->encoder) {
1573 flac__utils_printf(stderr, 1, "%s: ERROR creating the encoder instance\n", e->inbasefilename);
1574 EncoderSession_destroy(e);
1575 return false;
1578 return true;
1581 void EncoderSession_destroy(EncoderSession *e)
1583 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1584 size_t i;
1585 if(e->fmt.flac.decoder)
1586 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1587 e->fmt.flac.decoder = 0;
1588 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1589 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1590 e->fmt.flac.client_data.num_metadata_blocks = 0;
1593 if(e->fin != stdin)
1594 fclose(e->fin);
1596 if(0 != e->encoder) {
1597 FLAC__stream_encoder_delete(e->encoder);
1598 e->encoder = 0;
1601 if(0 != e->seek_table_template) {
1602 FLAC__metadata_object_delete(e->seek_table_template);
1603 e->seek_table_template = 0;
1607 int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata)
1609 FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
1610 int ret = 0;
1611 FLAC__bool verify_error = false;
1613 if(e->encoder) {
1614 fse_state = FLAC__stream_encoder_get_state(e->encoder);
1615 ret = FLAC__stream_encoder_finish(e->encoder)? 0 : 1;
1616 verify_error =
1617 fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA ||
1618 FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
1621 /* all errors except verify errors should interrupt the stats */
1622 if(ret && !verify_error)
1623 print_error_with_state(e, "ERROR during encoding");
1624 else if(e->total_samples_to_encode > 0) {
1625 print_stats(e);
1626 flac__utils_printf(stderr, 2, "\n");
1629 if(verify_error) {
1630 print_verify_error(e);
1631 ret = 1;
1633 else {
1634 if(info_align_carry >= 0) {
1635 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
1637 if(info_align_zero >= 0) {
1638 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
1642 /*@@@@@@ should this go here or somewhere else? */
1643 if(ret == 0 && foreign_metadata) {
1644 const char *error;
1645 if(!flac__foreign_metadata_write_to_flac(foreign_metadata, e->infilename, e->outfilename, &error)) {
1646 flac__utils_printf(stderr, 1, "%s: ERROR: updating foreign metadata in FLAC file: %s\n", e->inbasefilename, error);
1647 ret = 1;
1651 EncoderSession_destroy(e);
1653 return ret;
1656 int EncoderSession_finish_error(EncoderSession *e)
1658 FLAC__ASSERT(e->encoder);
1660 if(e->total_samples_to_encode > 0)
1661 flac__utils_printf(stderr, 2, "\n");
1663 if(FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1664 print_verify_error(e);
1665 else if(e->outputfile_opened)
1666 /* only want to delete the file if we opened it; otherwise it could be an existing file and our overwrite failed */
1667 unlink(e->outfilename);
1669 EncoderSession_destroy(e);
1671 return 1;
1674 typedef struct {
1675 unsigned num_metadata;
1676 FLAC__bool *needs_delete;
1677 FLAC__StreamMetadata **metadata;
1678 FLAC__StreamMetadata *cuesheet; /* always needs to be deleted */
1679 } static_metadata_t;
1681 static void static_metadata_init(static_metadata_t *m)
1683 m->num_metadata = 0;
1684 m->needs_delete = 0;
1685 m->metadata = 0;
1686 m->cuesheet = 0;
1689 static void static_metadata_clear(static_metadata_t *m)
1691 unsigned i;
1692 for(i = 0; i < m->num_metadata; i++)
1693 if(m->needs_delete[i])
1694 FLAC__metadata_object_delete(m->metadata[i]);
1695 if(m->metadata)
1696 free(m->metadata);
1697 if(m->needs_delete)
1698 free(m->needs_delete);
1699 if(m->cuesheet)
1700 FLAC__metadata_object_delete(m->cuesheet);
1701 static_metadata_init(m);
1704 static FLAC__bool static_metadata_append(static_metadata_t *m, FLAC__StreamMetadata *d, FLAC__bool needs_delete)
1706 void *x;
1707 if(0 == (x = safe_realloc_muladd2_(m->metadata, sizeof(*m->metadata), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1708 return false;
1709 m->metadata = (FLAC__StreamMetadata**)x;
1710 if(0 == (x = safe_realloc_muladd2_(m->needs_delete, sizeof(*m->needs_delete), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1711 return false;
1712 m->needs_delete = (FLAC__bool*)x;
1713 m->metadata[m->num_metadata] = d;
1714 m->needs_delete[m->num_metadata] = needs_delete;
1715 m->num_metadata++;
1716 return true;
1719 FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options)
1721 const unsigned channels = e->info.channels;
1722 const unsigned bps = e->info.bits_per_sample - e->info.shift;
1723 const unsigned sample_rate = e->info.sample_rate;
1724 FLACDecoderData *flac_decoder_data = (e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC)? &e->fmt.flac.client_data : 0;
1725 FLAC__StreamMetadata padding;
1726 FLAC__StreamMetadata **metadata = 0;
1727 static_metadata_t static_metadata;
1728 unsigned num_metadata = 0, ic;
1729 FLAC__StreamEncoderInitStatus init_status;
1730 const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);
1731 char apodizations[2000];
1733 FLAC__ASSERT(sizeof(options.pictures)/sizeof(options.pictures[0]) <= 64);
1735 static_metadata_init(&static_metadata);
1737 e->replay_gain = options.replay_gain;
1739 apodizations[0] = '\0';
1741 if(e->replay_gain) {
1742 if(channels != 1 && channels != 2) {
1743 flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
1744 return false;
1746 if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
1747 flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
1748 return false;
1750 if(options.is_first_file) {
1751 if(!grabbag__replaygain_init(sample_rate)) {
1752 flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
1753 return false;
1758 if(!parse_cuesheet(&static_metadata.cuesheet, options.cuesheet_filename, e->inbasefilename, sample_rate, is_cdda, e->total_samples_to_encode, e->treat_warnings_as_errors))
1759 return false;
1761 if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? static_metadata.cuesheet : 0, e)) {
1762 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1763 static_metadata_clear(&static_metadata);
1764 return false;
1767 /* build metadata */
1768 if(flac_decoder_data) {
1770 * we're encoding from FLAC so we will use the FLAC file's
1771 * metadata as the basis for the encoded file
1774 unsigned i;
1776 * first handle pictures: simple append any --pictures
1777 * specified.
1779 for(i = 0; i < options.num_pictures; i++) {
1780 FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1781 if(0 == pic) {
1782 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1783 static_metadata_clear(&static_metadata);
1784 return false;
1786 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1791 * next handle vorbis comment: if any tags were specified
1792 * or there is no existing vorbis comment, we create a
1793 * new vorbis comment (discarding any existing one); else
1794 * we keep the existing one. also need to make sure to
1795 * propagate any channel mask tag.
1797 /* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1798 size_t i, j;
1799 FLAC__bool vc_found = false;
1800 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1801 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1802 vc_found = true;
1803 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1804 (void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &e->info.channel_mask);
1805 flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1806 if(e->treat_warnings_as_errors) {
1807 static_metadata_clear(&static_metadata);
1808 return false;
1810 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1811 flac_decoder_data->metadata_blocks[i] = 0;
1813 else
1814 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1816 flac_decoder_data->num_metadata_blocks = j;
1817 if((!vc_found || options.vorbis_comment->data.vorbis_comment.num_comments > 0) && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1818 /* prepend ours */
1819 FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1820 if(0 == vc || (e->info.channel_mask && !flac__utils_set_channel_mask_tag(vc, e->info.channel_mask))) {
1821 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1822 static_metadata_clear(&static_metadata);
1823 return false;
1825 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1826 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1827 flac_decoder_data->metadata_blocks[1] = vc;
1828 flac_decoder_data->num_metadata_blocks++;
1833 * next handle cuesheet: if --cuesheet was specified, use
1834 * it; else if file has existing CUESHEET and cuesheet's
1835 * lead-out offset is correct, keep it; else no CUESHEET
1837 size_t i, j;
1838 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1839 FLAC__bool existing_cuesheet_is_bad = false;
1840 /* check if existing cuesheet matches the input audio */
1841 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == static_metadata.cuesheet) {
1842 const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1843 if(e->total_samples_to_encode == 0) {
1844 flac__utils_printf(stderr, 1, "%s: WARNING, cuesheet in input FLAC file cannot be kept if input size is not known, dropping it...\n", e->inbasefilename);
1845 if(e->treat_warnings_as_errors) {
1846 static_metadata_clear(&static_metadata);
1847 return false;
1849 existing_cuesheet_is_bad = true;
1851 else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1852 flac__utils_printf(stderr, 1, "%s: WARNING, lead-out offset of cuesheet in input FLAC file does not match input length, dropping existing cuesheet...\n", e->inbasefilename);
1853 if(e->treat_warnings_as_errors) {
1854 static_metadata_clear(&static_metadata);
1855 return false;
1857 existing_cuesheet_is_bad = true;
1860 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != static_metadata.cuesheet)) {
1861 if(0 != static_metadata.cuesheet) {
1862 flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1863 if(e->treat_warnings_as_errors) {
1864 static_metadata_clear(&static_metadata);
1865 return false;
1868 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1869 flac_decoder_data->metadata_blocks[i] = 0;
1871 else
1872 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1874 flac_decoder_data->num_metadata_blocks = j;
1875 if(0 != static_metadata.cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1876 /* prepend ours */
1877 FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(static_metadata.cuesheet);
1878 if(0 == cs) {
1879 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1880 static_metadata_clear(&static_metadata);
1881 return false;
1883 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1884 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1885 flac_decoder_data->metadata_blocks[1] = cs;
1886 flac_decoder_data->num_metadata_blocks++;
1891 * next handle seektable: if -S- was specified, no
1892 * SEEKTABLE; else if -S was specified, use it/them;
1893 * else if file has existing SEEKTABLE and input size is
1894 * preserved (no --skip/--until/etc specified), keep it;
1895 * else use default seektable options
1897 * note: meanings of num_requested_seek_points:
1898 * -1 : no -S option given, default to some value
1899 * 0 : -S- given (no seektable)
1900 * >0 : one or more -S options given
1902 size_t i, j;
1903 FLAC__bool existing_seektable = false;
1904 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1905 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1906 existing_seektable = true;
1907 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE && (e->total_samples_to_encode != flac_decoder_data->metadata_blocks[0]->data.stream_info.total_samples || options.num_requested_seek_points >= 0)) {
1908 if(options.num_requested_seek_points > 0) {
1909 flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1910 if(e->treat_warnings_as_errors) {
1911 static_metadata_clear(&static_metadata);
1912 return false;
1915 else if(options.num_requested_seek_points == 0)
1916 ; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1917 else {
1918 flac__utils_printf(stderr, 1, "%s: WARNING, can't use existing seektable in input FLAC since the input size is changing or unknown, dropping existing SEEKTABLE block...\n", e->inbasefilename);
1919 if(e->treat_warnings_as_errors) {
1920 static_metadata_clear(&static_metadata);
1921 return false;
1924 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1925 flac_decoder_data->metadata_blocks[i] = 0;
1926 existing_seektable = false;
1928 else
1929 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1931 flac_decoder_data->num_metadata_blocks = j;
1932 if((options.num_requested_seek_points > 0 || (options.num_requested_seek_points < 0 && !existing_seektable)) && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1933 /* prepend ours */
1934 FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1935 if(0 == st) {
1936 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1937 static_metadata_clear(&static_metadata);
1938 return false;
1940 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1941 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1942 flac_decoder_data->metadata_blocks[1] = st;
1943 flac_decoder_data->num_metadata_blocks++;
1948 * finally handle padding: if --no-padding was specified,
1949 * then delete all padding; else if -P was specified,
1950 * use that instead of existing padding (if any); else
1951 * if existing file has padding, move all existing
1952 * padding blocks to one padding block at the end; else
1953 * use default padding.
1955 int p = -1;
1956 size_t i, j;
1957 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1958 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1959 if(p < 0)
1960 p = 0;
1961 p += flac_decoder_data->metadata_blocks[i]->length;
1962 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1963 flac_decoder_data->metadata_blocks[i] = 0;
1965 else
1966 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1968 flac_decoder_data->num_metadata_blocks = j;
1969 if(options.padding > 0)
1970 p = options.padding;
1971 if(p < 0)
1972 p = e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1973 if(options.padding != 0) {
1974 if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1975 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1976 if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1977 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1978 static_metadata_clear(&static_metadata);
1979 return false;
1981 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1982 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1983 flac_decoder_data->num_metadata_blocks++;
1987 metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1988 num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1990 else {
1992 * we're not encoding from FLAC so we will build the metadata
1993 * from scratch
1995 const foreign_metadata_t *foreign_metadata = EncoderSession_format_is_iff(e)? options.format_options.iff.foreign_metadata : 0;
1996 unsigned i;
1998 if(e->seek_table_template->data.seek_table.num_points > 0) {
1999 e->seek_table_template->is_last = false; /* the encoder will set this for us */
2000 static_metadata_append(&static_metadata, e->seek_table_template, /*needs_delete=*/false);
2002 if(0 != static_metadata.cuesheet)
2003 static_metadata_append(&static_metadata, static_metadata.cuesheet, /*needs_delete=*/false);
2004 if(e->info.channel_mask) {
2005 if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, e->info.channel_mask)) {
2006 flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
2007 static_metadata_clear(&static_metadata);
2008 return false;
2011 static_metadata_append(&static_metadata, options.vorbis_comment, /*needs_delete=*/false);
2012 for(i = 0; i < options.num_pictures; i++)
2013 static_metadata_append(&static_metadata, options.pictures[i], /*needs_delete=*/false);
2014 if(foreign_metadata) {
2015 for(i = 0; i < foreign_metadata->num_blocks; i++) {
2016 FLAC__StreamMetadata *p = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
2017 if(!p) {
2018 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory\n", e->inbasefilename);
2019 static_metadata_clear(&static_metadata);
2020 return false;
2022 static_metadata_append(&static_metadata, p, /*needs_delete=*/true);
2023 static_metadata.metadata[static_metadata.num_metadata-1]->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8 + foreign_metadata->blocks[i].size;
2026 if(options.padding != 0) {
2027 padding.is_last = false; /* the encoder will set this for us */
2028 padding.type = FLAC__METADATA_TYPE_PADDING;
2029 padding.length = (unsigned)(options.padding>0? options.padding : (e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8));
2030 static_metadata_append(&static_metadata, &padding, /*needs_delete=*/false);
2032 metadata = static_metadata.metadata;
2033 num_metadata = static_metadata.num_metadata;
2036 /* check for a few things that have not already been checked. the
2037 * FLAC__stream_encoder_init*() will check it but only return
2038 * FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
2039 * up front to give a better error message.
2041 if(!verify_metadata(e, metadata, num_metadata)) {
2042 static_metadata_clear(&static_metadata);
2043 return false;
2046 FLAC__stream_encoder_set_verify(e->encoder, options.verify);
2047 FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
2048 FLAC__stream_encoder_set_channels(e->encoder, channels);
2049 FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
2050 FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
2051 for(ic = 0; ic < options.num_compression_settings; ic++) {
2052 switch(options.compression_settings[ic].type) {
2053 case CST_BLOCKSIZE:
2054 FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[ic].value.t_unsigned);
2055 break;
2056 case CST_COMPRESSION_LEVEL:
2057 FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[ic].value.t_unsigned);
2058 apodizations[0] = '\0';
2059 break;
2060 case CST_DO_MID_SIDE:
2061 FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[ic].value.t_bool);
2062 break;
2063 case CST_LOOSE_MID_SIDE:
2064 FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[ic].value.t_bool);
2065 break;
2066 case CST_APODIZATION:
2067 if(strlen(apodizations)+strlen(options.compression_settings[ic].value.t_string)+2 >= sizeof(apodizations)) {
2068 flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
2069 static_metadata_clear(&static_metadata);
2070 return false;
2072 else {
2073 strcat(apodizations, options.compression_settings[ic].value.t_string);
2074 strcat(apodizations, ";");
2076 break;
2077 case CST_MAX_LPC_ORDER:
2078 FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[ic].value.t_unsigned);
2079 break;
2080 case CST_QLP_COEFF_PRECISION:
2081 FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[ic].value.t_unsigned);
2082 break;
2083 case CST_DO_QLP_COEFF_PREC_SEARCH:
2084 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[ic].value.t_bool);
2085 break;
2086 case CST_DO_ESCAPE_CODING:
2087 FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[ic].value.t_bool);
2088 break;
2089 case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
2090 FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[ic].value.t_bool);
2091 break;
2092 case CST_MIN_RESIDUAL_PARTITION_ORDER:
2093 FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[ic].value.t_unsigned);
2094 break;
2095 case CST_MAX_RESIDUAL_PARTITION_ORDER:
2096 FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[ic].value.t_unsigned);
2097 break;
2098 case CST_RICE_PARAMETER_SEARCH_DIST:
2099 FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[ic].value.t_unsigned);
2100 break;
2103 if(*apodizations)
2104 FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
2105 FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
2106 FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
2108 FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
2109 FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
2110 FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
2111 if(!options.debug.do_md5) {
2112 flac__utils_printf(stderr, 1, "%s: WARNING, MD5 computation disabled, resulting file will not have MD5 sum\n", e->inbasefilename);
2113 if(e->treat_warnings_as_errors) {
2114 static_metadata_clear(&static_metadata);
2115 return false;
2117 FLAC__stream_encoder_set_do_md5(e->encoder, false);
2120 #if FLAC__HAS_OGG
2121 if(e->use_ogg) {
2122 FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
2124 init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2126 else
2127 #endif
2129 init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2132 if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
2133 print_error_with_init_status(e, "ERROR initializing encoder", init_status);
2134 if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
2135 e->outputfile_opened = true;
2136 static_metadata_clear(&static_metadata);
2137 return false;
2139 else
2140 e->outputfile_opened = true;
2142 e->stats_mask =
2143 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2144 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
2145 0x3f;
2147 static_metadata_clear(&static_metadata);
2149 return true;
2152 FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples)
2154 if(e->replay_gain) {
2155 if(!grabbag__replaygain_analyze(buffer, e->info.channels==2, e->info.bits_per_sample, samples)) {
2156 flac__utils_printf(stderr, 1, "%s: WARNING, error while calculating ReplayGain\n", e->inbasefilename);
2157 if(e->treat_warnings_as_errors)
2158 return false;
2162 return FLAC__stream_encoder_process(e->encoder, buffer, samples);
2165 FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e)
2167 return
2168 e->format == FORMAT_WAVE ||
2169 e->format == FORMAT_WAVE64 ||
2170 e->format == FORMAT_RF64 ||
2171 e->format == FORMAT_AIFF ||
2172 e->format == FORMAT_AIFF_C;
2175 FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e)
2177 const FLAC__bool only_placeholders = e->is_stdout;
2178 FLAC__bool has_real_points;
2180 if(num_requested_seek_points == 0 && 0 == cuesheet)
2181 return true;
2183 if(num_requested_seek_points < 0) {
2184 #if FLAC__HAS_OGG
2185 /*@@@@@@ workaround ogg bug: too many seekpoints makes table not fit in one page */
2186 if(e->use_ogg && e->total_samples_to_encode > 0 && e->total_samples_to_encode / e->info.sample_rate / 10 > 230)
2187 requested_seek_points = "230x;";
2188 else
2189 #endif
2190 requested_seek_points = "10s;";
2191 num_requested_seek_points = 1;
2194 if(num_requested_seek_points > 0) {
2195 if(!grabbag__seektable_convert_specification_to_template(requested_seek_points, only_placeholders, e->total_samples_to_encode, e->info.sample_rate, e->seek_table_template, &has_real_points))
2196 return false;
2199 if(0 != cuesheet) {
2200 unsigned i, j;
2201 const FLAC__StreamMetadata_CueSheet *cs = &cuesheet->data.cue_sheet;
2202 for(i = 0; i < cs->num_tracks; i++) {
2203 const FLAC__StreamMetadata_CueSheet_Track *tr = cs->tracks+i;
2204 for(j = 0; j < tr->num_indices; j++) {
2205 if(!FLAC__metadata_object_seektable_template_append_point(e->seek_table_template, tr->offset + tr->indices[j].offset))
2206 return false;
2207 has_real_points = true;
2210 if(has_real_points)
2211 if(!FLAC__metadata_object_seektable_template_sort(e->seek_table_template, /*compact=*/true))
2212 return false;
2215 if(has_real_points) {
2216 if(e->is_stdout) {
2217 flac__utils_printf(stderr, 1, "%s: WARNING, cannot write back seekpoints when encoding to stdout\n", e->inbasefilename);
2218 if(e->treat_warnings_as_errors)
2219 return false;
2223 return true;
2226 FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input)
2228 /* convert from mm:ss.sss to sample number if necessary */
2229 flac__utils_canonicalize_skip_until_specification(spec, sample_rate);
2231 /* special case: if "--until=-0", use the special value '0' to mean "end-of-stream" */
2232 if(spec->is_relative && spec->value.samples == 0) {
2233 spec->is_relative = false;
2234 return true;
2237 /* in any other case the total samples in the input must be known */
2238 if(total_samples_in_input == 0) {
2239 flac__utils_printf(stderr, 1, "%s: ERROR, cannot use --until when input length is unknown\n", inbasefilename);
2240 return false;
2243 FLAC__ASSERT(spec->value_is_samples);
2245 /* convert relative specifications to absolute */
2246 if(spec->is_relative) {
2247 if(spec->value.samples <= 0)
2248 spec->value.samples += (FLAC__int64)total_samples_in_input;
2249 else
2250 spec->value.samples += skip;
2251 spec->is_relative = false;
2254 /* error check */
2255 if(spec->value.samples < 0) {
2256 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before beginning of input\n", inbasefilename);
2257 return false;
2259 if((FLAC__uint64)spec->value.samples <= skip) {
2260 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before --skip point\n", inbasefilename);
2261 return false;
2263 if((FLAC__uint64)spec->value.samples > total_samples_in_input) {
2264 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is after end of input\n", inbasefilename);
2265 return false;
2268 return true;
2271 FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata)
2273 FLAC__bool metadata_picture_has_type1 = false;
2274 FLAC__bool metadata_picture_has_type2 = false;
2275 unsigned i;
2277 FLAC__ASSERT(0 != metadata);
2278 for(i = 0; i < num_metadata; i++) {
2279 const FLAC__StreamMetadata *m = metadata[i];
2280 if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
2281 if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) {
2282 flac__utils_printf(stderr, 1, "%s: ERROR: SEEKTABLE metadata block is invalid\n", e->inbasefilename);
2283 return false;
2286 else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
2287 if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) {
2288 flac__utils_printf(stderr, 1, "%s: ERROR: CUESHEET metadata block is invalid\n", e->inbasefilename);
2289 return false;
2292 else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
2293 const char *error = 0;
2294 if(!FLAC__format_picture_is_legal(&m->data.picture, &error)) {
2295 flac__utils_printf(stderr, 1, "%s: ERROR: PICTURE metadata block is invalid: %s\n", e->inbasefilename, error);
2296 return false;
2298 if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
2299 if(metadata_picture_has_type1) {
2300 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 1 (32x32 icon) in the file\n", e->inbasefilename);
2301 return false;
2303 metadata_picture_has_type1 = true;
2305 else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
2306 if(metadata_picture_has_type2) {
2307 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 2 (icon) in the file\n", e->inbasefilename);
2308 return false;
2310 metadata_picture_has_type2 = true;
2315 return true;
2318 FLAC__bool format_input(FLAC__int32 *dest[], unsigned wide_samples, FLAC__bool is_big_endian, FLAC__bool is_unsigned_samples, unsigned channels, unsigned bps, unsigned shift, size_t *channel_map)
2320 unsigned wide_sample, sample, channel, byte;
2321 FLAC__int32 *out[FLAC__MAX_CHANNELS];
2323 if(0 == channel_map) {
2324 for(channel = 0; channel < channels; channel++)
2325 out[channel] = dest[channel];
2327 else {
2328 for(channel = 0; channel < channels; channel++)
2329 out[channel] = dest[channel_map[channel]];
2332 if(bps == 8) {
2333 if(is_unsigned_samples) {
2334 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2335 for(channel = 0; channel < channels; channel++, sample++)
2336 out[channel][wide_sample] = (FLAC__int32)ucbuffer_[sample] - 0x80;
2338 else {
2339 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2340 for(channel = 0; channel < channels; channel++, sample++)
2341 out[channel][wide_sample] = (FLAC__int32)scbuffer_[sample];
2344 else if(bps == 16) {
2345 if(is_big_endian != is_big_endian_host_) {
2346 unsigned char tmp;
2347 const unsigned bytes = wide_samples * channels * (bps >> 3);
2348 for(byte = 0; byte < bytes; byte += 2) {
2349 tmp = ucbuffer_[byte];
2350 ucbuffer_[byte] = ucbuffer_[byte+1];
2351 ucbuffer_[byte+1] = tmp;
2354 if(is_unsigned_samples) {
2355 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2356 for(channel = 0; channel < channels; channel++, sample++)
2357 out[channel][wide_sample] = (FLAC__int32)usbuffer_[sample] - 0x8000;
2359 else {
2360 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2361 for(channel = 0; channel < channels; channel++, sample++)
2362 out[channel][wide_sample] = (FLAC__int32)ssbuffer_[sample];
2365 else if(bps == 24) {
2366 if(!is_big_endian) {
2367 unsigned char tmp;
2368 const unsigned bytes = wide_samples * channels * (bps >> 3);
2369 for(byte = 0; byte < bytes; byte += 3) {
2370 tmp = ucbuffer_[byte];
2371 ucbuffer_[byte] = ucbuffer_[byte+2];
2372 ucbuffer_[byte+2] = tmp;
2375 if(is_unsigned_samples) {
2376 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2377 for(channel = 0; channel < channels; channel++, sample++) {
2378 out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2379 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2380 out[channel][wide_sample] |= ucbuffer_[byte++];
2381 out[channel][wide_sample] -= 0x800000;
2384 else {
2385 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2386 for(channel = 0; channel < channels; channel++, sample++) {
2387 out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2388 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2389 out[channel][wide_sample] |= ucbuffer_[byte++];
2393 else {
2394 FLAC__ASSERT(0);
2396 if(shift > 0) {
2397 FLAC__int32 mask = (1<<shift)-1;
2398 for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2399 for(channel = 0; channel < channels; channel++) {
2400 if(out[channel][wide_sample] & mask) {
2401 flac__utils_printf(stderr, 1, "ERROR during read, sample data (channel#%u sample#%u = %d) has non-zero least-significant bits\n WAVE/AIFF header said the last %u bits are not significant and should be zero.\n", channel, wide_sample, out[channel][wide_sample], shift);
2402 return false;
2404 out[channel][wide_sample] >>= shift;
2407 return true;
2410 void encoder_progress_callback(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
2412 EncoderSession *e = (EncoderSession*)client_data;
2414 (void)encoder, (void)total_frames_estimate;
2416 e->bytes_written = bytes_written;
2417 e->samples_written = samples_written;
2419 if(e->total_samples_to_encode > 0 && !((frames_written-1) & e->stats_mask))
2420 print_stats(e);
2423 FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
2425 size_t n = 0;
2426 EncoderSession *e = (EncoderSession*)client_data;
2427 FLACDecoderData *data = &e->fmt.flac.client_data;
2429 (void)decoder;
2431 if (data->fatal_error)
2432 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2434 /* use up lookahead first */
2435 if (data->lookahead_length) {
2436 n = min(data->lookahead_length, *bytes);
2437 memcpy(buffer, data->lookahead, n);
2438 buffer += n;
2439 data->lookahead += n;
2440 data->lookahead_length -= n;
2443 /* get the rest from file */
2444 if (*bytes > n) {
2445 *bytes = n + fread(buffer, 1, *bytes-n, e->fin);
2446 if(ferror(e->fin))
2447 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2448 else if(0 == *bytes)
2449 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
2450 else
2451 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2453 else
2454 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2457 FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
2459 EncoderSession *e = (EncoderSession*)client_data;
2460 (void)decoder;
2462 if(fseeko(e->fin, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0)
2463 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
2464 else
2465 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
2468 FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
2470 EncoderSession *e = (EncoderSession*)client_data;
2471 FLAC__off_t pos;
2472 (void)decoder;
2474 if((pos = ftello(e->fin)) < 0)
2475 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
2476 else {
2477 *absolute_byte_offset = (FLAC__uint64)pos;
2478 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
2482 FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
2484 const EncoderSession *e = (EncoderSession*)client_data;
2485 const FLACDecoderData *data = &e->fmt.flac.client_data;
2486 (void)decoder;
2488 if(data->filesize < 0)
2489 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
2490 else {
2491 *stream_length = (FLAC__uint64)data->filesize;
2492 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
2496 FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
2498 EncoderSession *e = (EncoderSession*)client_data;
2499 (void)decoder;
2501 return feof(e->fin)? true : false;
2504 FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2506 EncoderSession *e = (EncoderSession*)client_data;
2507 FLACDecoderData *data = &e->fmt.flac.client_data;
2508 FLAC__uint64 n = min(data->samples_left_to_process, frame->header.blocksize);
2509 (void)decoder;
2511 if(!EncoderSession_process(e, buffer, (unsigned)n)) {
2512 print_error_with_state(e, "ERROR during encoding");
2513 data->fatal_error = true;
2514 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2517 data->samples_left_to_process -= n;
2518 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2521 void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2523 EncoderSession *e = (EncoderSession*)client_data;
2524 FLACDecoderData *data = &e->fmt.flac.client_data;
2525 (void)decoder;
2527 if (data->fatal_error)
2528 return;
2530 if (
2531 data->num_metadata_blocks == sizeof(data->metadata_blocks)/sizeof(data->metadata_blocks[0]) ||
2532 0 == (data->metadata_blocks[data->num_metadata_blocks] = FLAC__metadata_object_clone(metadata))
2534 data->fatal_error = true;
2535 else
2536 data->num_metadata_blocks++;
2539 void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2541 EncoderSession *e = (EncoderSession*)client_data;
2542 FLACDecoderData *data = &e->fmt.flac.client_data;
2543 (void)decoder;
2545 flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", e->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
2546 if(!e->continue_through_decode_errors)
2547 data->fatal_error = true;
2550 FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, unsigned sample_rate, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors)
2552 FILE *f;
2553 unsigned last_line_read;
2554 const char *error_message;
2556 if(0 == cuesheet_filename)
2557 return true;
2559 if(lead_out_offset == 0) {
2560 flac__utils_printf(stderr, 1, "%s: ERROR cannot import cuesheet when the number of input samples to encode is unknown\n", inbasefilename);
2561 return false;
2564 if(0 == (f = fopen(cuesheet_filename, "r"))) {
2565 flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
2566 return false;
2569 *cuesheet = grabbag__cuesheet_parse(f, &error_message, &last_line_read, sample_rate, is_cdda, lead_out_offset);
2571 fclose(f);
2573 if(0 == *cuesheet) {
2574 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\" on line %u: %s\n", inbasefilename, cuesheet_filename, last_line_read, error_message);
2575 return false;
2578 if(!FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/false, &error_message)) {
2579 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\": %s\n", inbasefilename, cuesheet_filename, error_message);
2580 return false;
2583 /* if we're expecting CDDA, warn about non-compliance */
2584 if(is_cdda && !FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/true, &error_message)) {
2585 flac__utils_printf(stderr, 1, "%s: WARNING cuesheet \"%s\" is not audio CD compliant: %s\n", inbasefilename, cuesheet_filename, error_message);
2586 if(treat_warnings_as_errors)
2587 return false;
2588 (*cuesheet)->data.cue_sheet.is_cd = false;
2591 return true;
2594 void print_stats(const EncoderSession *encoder_session)
2596 const FLAC__uint64 samples_written = min(encoder_session->total_samples_to_encode, encoder_session->samples_written);
2597 const FLAC__uint64 uesize = encoder_session->unencoded_size;
2598 #if defined _MSC_VER || defined __MINGW32__
2599 /* with MSVC you have to spoon feed it the casting */
2600 const double progress = (double)(FLAC__int64)samples_written / (double)(FLAC__int64)encoder_session->total_samples_to_encode;
2601 const double ratio = (double)(FLAC__int64)encoder_session->bytes_written / ((double)(FLAC__int64)(uesize? uesize:1) * min(1.0, progress));
2602 #else
2603 const double progress = (double)samples_written / (double)encoder_session->total_samples_to_encode;
2604 const double ratio = (double)encoder_session->bytes_written / ((double)(uesize? uesize:1) * min(1.0, progress));
2605 #endif
2607 FLAC__ASSERT(encoder_session->total_samples_to_encode > 0);
2609 if(samples_written == encoder_session->total_samples_to_encode) {
2610 flac__utils_printf(stderr, 2, "\r%s:%s wrote %" PRIu64 " bytes, ratio=",
2611 encoder_session->inbasefilename,
2612 encoder_session->verify? " Verify OK," : "",
2613 encoder_session->bytes_written
2616 else {
2617 flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5));
2619 if(uesize)
2620 flac__utils_printf(stderr, 2, "%0.3f", ratio);
2621 else
2622 flac__utils_printf(stderr, 2, "N/A");
2625 void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
2627 const int ilen = strlen(e->inbasefilename) + 1;
2628 const char *state_string = "";
2630 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2632 flac__utils_printf(stderr, 1, "%*s init_status = %s\n", ilen, "", FLAC__StreamEncoderInitStatusString[init_status]);
2634 if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR) {
2635 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2637 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2639 /* print out some more info for some errors: */
2640 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2641 flac__utils_printf(stderr, 1,
2642 "\n"
2643 "An error occurred while writing; the most common cause is that the disk is full.\n"
2646 else if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_IO_ERROR])) {
2647 flac__utils_printf(stderr, 1,
2648 "\n"
2649 "An error occurred opening the output file; it is likely that the output\n"
2650 "directory does not exist or is not writable, the output file already exists and\n"
2651 "is not writable, or the disk is full.\n"
2655 else if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE) {
2656 flac__utils_printf(stderr, 1,
2657 "\n"
2658 "The encoding parameters specified do not conform to the FLAC Subset and may not\n"
2659 "be streamable or playable in hardware devices. If you really understand the\n"
2660 "consequences, you can add --lax to the command-line options to encode with\n"
2661 "these parameters anyway. See http://flac.sourceforge.net/format.html#subset\n"
2666 void print_error_with_state(const EncoderSession *e, const char *message)
2668 const int ilen = strlen(e->inbasefilename) + 1;
2669 const char *state_string;
2671 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2673 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2675 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2677 /* print out some more info for some errors: */
2678 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2679 flac__utils_printf(stderr, 1,
2680 "\n"
2681 "An error occurred while writing; the most common cause is that the disk is full.\n"
2686 void print_verify_error(EncoderSession *e)
2688 FLAC__uint64 absolute_sample;
2689 unsigned frame_number;
2690 unsigned channel;
2691 unsigned sample;
2692 FLAC__int32 expected;
2693 FLAC__int32 got;
2695 FLAC__stream_encoder_get_verify_decoder_error_stats(e->encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
2697 flac__utils_printf(stderr, 1, "%s: ERROR: mismatch in decoded data, verify FAILED!\n", e->inbasefilename);
2698 flac__utils_printf(stderr, 1, " Absolute sample=%" PRIu64 ", frame=%u, channel=%u, sample=%u, expected %d, got %d\n", absolute_sample, frame_number, channel, sample, expected, got);
2699 flac__utils_printf(stderr, 1, " In all known cases, verify errors are caused by hardware problems,\n");
2700 flac__utils_printf(stderr, 1, " usually overclocking or bad RAM. Delete %s\n", e->outfilename);
2701 flac__utils_printf(stderr, 1, " and repeat the flac command exactly as before. If it does not give a\n");
2702 flac__utils_printf(stderr, 1, " verify error in the exact same place each time you try it, then there is\n");
2703 flac__utils_printf(stderr, 1, " a problem with your hardware; please see the FAQ:\n");
2704 flac__utils_printf(stderr, 1, " http://flac.sourceforge.net/faq.html#tools__hardware_prob\n");
2705 flac__utils_printf(stderr, 1, " If it does fail in the exact same place every time, keep\n");
2706 flac__utils_printf(stderr, 1, " %s and submit a bug report to:\n", e->outfilename);
2707 flac__utils_printf(stderr, 1, " https://sourceforge.net/bugs/?func=addbug&group_id=13478\n");
2708 flac__utils_printf(stderr, 1, " Make sure to upload the FLAC file and use the \"Monitor\" feature to\n");
2709 flac__utils_printf(stderr, 1, " monitor the bug status.\n");
2710 flac__utils_printf(stderr, 1, "Verify FAILED! Do not trust %s\n", e->outfilename);
2713 FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn)
2715 size_t bytes_read = fread(buf, 1, n, f);
2717 if(bytes_read == 0) {
2718 if(!eof_ok) {
2719 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2720 return false;
2722 else
2723 return true;
2725 if(bytes_read < n) {
2726 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2727 return false;
2729 return true;
2732 FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn)
2734 if(!read_bytes(f, (FLAC__byte*)val, 2, /*eof_ok=*/false, fn))
2735 return false;
2736 if(is_big_endian_host_ != big_endian) {
2737 FLAC__byte tmp, *b = (FLAC__byte*)val;
2738 tmp = b[1]; b[1] = b[0]; b[0] = tmp;
2740 return true;
2743 FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn)
2745 if(!read_bytes(f, (FLAC__byte*)val, 4, /*eof_ok=*/false, fn))
2746 return false;
2747 if(is_big_endian_host_ != big_endian) {
2748 FLAC__byte tmp, *b = (FLAC__byte*)val;
2749 tmp = b[3]; b[3] = b[0]; b[0] = tmp;
2750 tmp = b[2]; b[2] = b[1]; b[1] = tmp;
2752 return true;
2755 FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn)
2757 if(!read_bytes(f, (FLAC__byte*)val, 8, /*eof_ok=*/false, fn))
2758 return false;
2759 if(is_big_endian_host_ != big_endian) {
2760 FLAC__byte tmp, *b = (FLAC__byte*)val;
2761 tmp = b[7]; b[7] = b[0]; b[0] = tmp;
2762 tmp = b[6]; b[6] = b[1]; b[1] = tmp;
2763 tmp = b[5]; b[5] = b[2]; b[2] = tmp;
2764 tmp = b[4]; b[4] = b[3]; b[3] = tmp;
2766 return true;
2769 FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn)
2770 /* Read an IEEE 754 80-bit (aka SANE) extended floating point value from 'f',
2771 * convert it into an integral value and store in 'val'. Return false if only
2772 * between 1 and 9 bytes remain in 'f', if 0 bytes remain in 'f', or if the
2773 * value is negative, between zero and one, or too large to be represented by
2774 * 'val'; return true otherwise.
2777 unsigned int i;
2778 FLAC__byte buf[10];
2779 FLAC__uint64 p = 0;
2780 FLAC__int16 e;
2781 FLAC__int16 shift;
2783 if(!read_bytes(f, buf, sizeof(buf), /*eof_ok=*/false, fn))
2784 return false;
2785 e = ((FLAC__uint16)(buf[0])<<8 | (FLAC__uint16)(buf[1]))-0x3FFF;
2786 shift = 63-e;
2787 if((buf[0]>>7)==1U || e<0 || e>63) {
2788 flac__utils_printf(stderr, 1, "%s: ERROR: invalid floating-point value\n", fn);
2789 return false;
2792 for(i = 0; i < 8; ++i)
2793 p |= (FLAC__uint64)(buf[i+2])<<(56U-i*8);
2794 *val = (FLAC__uint32)((p>>shift)+(p>>(shift-1) & 0x1));
2796 return true;
2799 FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset)
2801 static unsigned char dump[8192];
2802 struct stat stb;
2804 if(fstat(fileno(f), &stb) == 0 && (stb.st_mode & S_IFMT) == S_IFREG)
2806 if(fseeko(f, offset, SEEK_CUR) == 0)
2807 return true;
2809 while(offset > 0) {
2810 const long need = (long)min(offset, sizeof(dump));
2811 if((long)fread(dump, 1, need, f) < need)
2812 return false;
2813 offset -= need;
2815 return true;
2818 unsigned count_channel_mask_bits(FLAC__uint32 mask)
2820 unsigned count = 0;
2821 while(mask) {
2822 if(mask & 1)
2823 count++;
2824 mask >>= 1;
2826 return count;
2829 #if 0
2830 FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels)
2832 FLAC__uint32 x = 0x80000000;
2833 unsigned count = count_channel_mask_bits(mask);
2834 while(x && count > channels) {
2835 if(mask & x) {
2836 mask &= ~x;
2837 count--;
2839 x >>= 1;
2841 FLAC__ASSERT(count_channel_mask_bits(mask) == channels);
2842 return mask;
2844 #endif