1 /* flac - Command-line FLAC encoder/decoder
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2008 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
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #if defined _WIN32 && !defined __CYGWIN__
24 /* where MSVC puts unlink() */
29 #if defined _MSC_VER || defined __MINGW32__
30 #include <sys/types.h> /* for off_t */
31 #if _MSC_VER <= 1600 /* @@@ [2G limit] */
37 #include <limits.h> /* for LONG_MAX */
38 #include <math.h> /* for floor() */
39 #include <stdio.h> /* for FILE etc. */
40 #include <stdlib.h> /* for malloc */
41 #include <string.h> /* for strcmp(), strerror() */
43 #include "share/alloc.h"
44 #include "share/grabbag.h"
50 #define min(x,y) ((x)<(y)?(x):(y))
54 #define max(x,y) ((x)>(y)?(x):(y))
56 /* this MUST be >= 588 so that sector aligning can take place with one read */
57 /* this MUST be < 2^sizeof(size_t) / ( FLAC__MAX_CHANNELS * (FLAC__MAX_BITS_PER_SAMPLE/8) ) */
58 #define CHUNK_OF_SAMPLES 2048
63 unsigned bits_per_sample; /* width of sample point, including 'shift' bits, valid bps is bits_per_sample-shift */
64 unsigned shift; /* # of LSBs samples have been shifted left by */
65 unsigned bytes_per_wide_sample; /* for convenience, always == channels*((bps+7)/8), or 0 if N/A to input format (like FLAC) */
66 FLAC__bool is_unsigned_samples;
67 FLAC__bool is_big_endian;
68 FLAC__uint32 channel_mask;
71 /* this is the client_data attached to the FLAC decoder when encoding from a FLAC file */
74 const FLAC__byte *lookahead;
75 unsigned lookahead_length;
76 size_t num_metadata_blocks;
77 FLAC__StreamMetadata *metadata_blocks[1024]; /*@@@ BAD MAGIC number */
78 FLAC__uint64 samples_left_to_process;
79 FLAC__bool fatal_error;
88 FLAC__bool outputfile_opened; /* true if we successfully opened the output file and we want it to be deleted if there is an error */
89 const char *inbasefilename;
90 const char *infilename;
91 const char *outfilename;
93 FLAC__bool treat_warnings_as_errors;
94 FLAC__bool continue_through_decode_errors;
95 FLAC__bool replay_gain;
96 FLAC__uint64 total_samples_to_encode; /* (i.e. "wide samples" aka "sample frames") WATCHOUT: may be 0 to mean 'unknown' */
97 FLAC__uint64 unencoded_size; /* an estimate of the input size, only used in the progress indicator */
98 FLAC__uint64 bytes_written;
99 FLAC__uint64 samples_written;
107 FLAC__uint64 data_bytes;
111 FLAC__StreamDecoder *decoder;
112 FLACDecoderData client_data;
116 FLAC__StreamEncoder *encoder;
119 FLAC__StreamMetadata *seek_table_template;
122 const int FLAC_ENCODE__DEFAULT_PADDING = 8192;
124 static FLAC__bool is_big_endian_host_;
126 static unsigned char ucbuffer_[CHUNK_OF_SAMPLES*FLAC__MAX_CHANNELS*((FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE+7)/8)];
127 static signed char *scbuffer_ = (signed char *)ucbuffer_;
128 static FLAC__uint16 *usbuffer_ = (FLAC__uint16 *)ucbuffer_;
129 static FLAC__int16 *ssbuffer_ = (FLAC__int16 *)ucbuffer_;
131 static FLAC__int32 in_[FLAC__MAX_CHANNELS][CHUNK_OF_SAMPLES];
132 static FLAC__int32 *input_[FLAC__MAX_CHANNELS];
136 * unpublished debug routines from the FLAC libs
138 extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
139 extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
140 extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
141 extern FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value);
146 static FLAC__bool EncoderSession_construct(EncoderSession *e, encode_options_t options, off_t infilesize, FILE *infile, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length);
147 static void EncoderSession_destroy(EncoderSession *e);
148 static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata);
149 static int EncoderSession_finish_error(EncoderSession *e);
150 static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options);
151 static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
152 static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
153 static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
154 static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
155 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);
156 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);
157 static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
158 static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
159 static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
160 static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
161 static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
162 static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
163 static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
164 static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
165 static FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors);
166 static void print_stats(const EncoderSession *encoder_session);
167 static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
168 static void print_error_with_state(const EncoderSession *e, const char *message);
169 static void print_verify_error(EncoderSession *e);
170 static FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn);
171 static FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn);
172 static FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn);
173 static FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn);
174 static FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn);
175 static FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset);
176 static unsigned count_channel_mask_bits(FLAC__uint32 mask);
178 static FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels);
181 static FLAC__bool get_sample_info_raw(EncoderSession *e, encode_options_t options)
183 e->info.sample_rate = options.format_options.raw.sample_rate;
184 e->info.channels = options.format_options.raw.channels;
185 e->info.bits_per_sample = options.format_options.raw.bps;
187 e->info.bytes_per_wide_sample = options.format_options.raw.channels * ((options.format_options.raw.bps+7)/8);
188 e->info.is_unsigned_samples = options.format_options.raw.is_unsigned_samples;
189 e->info.is_big_endian = options.format_options.raw.is_big_endian;
190 e->info.channel_mask = 0;
195 static FLAC__bool get_sample_info_wave(EncoderSession *e, encode_options_t options)
197 FLAC__bool got_fmt_chunk = false, got_data_chunk = false, got_ds64_chunk = false;
198 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
199 FLAC__uint32 channel_mask = 0;
200 FLAC__uint64 ds64_data_size = 0;
202 e->info.is_unsigned_samples = false;
203 e->info.is_big_endian = false;
206 * lookahead[] already has "RIFFxxxxWAVE" or "RF64xxxxWAVE", do chunks
208 while(!feof(e->fin) && !got_data_chunk) {
209 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 */
210 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
211 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
217 if(options.format == FORMAT_RF64 && !memcmp(chunk_id, "ds64", 4)) { /* RF64 64-bit sizes chunk */
218 FLAC__uint32 xx, data_bytes;
221 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'ds64' chunks\n", e->inbasefilename);
224 if(got_fmt_chunk || got_data_chunk) {
225 flac__utils_printf(stderr, 1, "%s: ERROR: 'ds64' chunk appears after 'fmt ' or 'data' chunk\n", e->inbasefilename);
229 /* ds64 chunk size */
230 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
233 if(data_bytes < 28) {
234 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'ds64' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
237 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
240 /* RIFF 64-bit size, lo/hi */
241 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
243 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
246 /* 'data' 64-bit size */
247 if(!read_uint64(e->fin, /*big_endian=*/false, &ds64_data_size, e->inbasefilename))
252 /* skip any extra data in the ds64 chunk */
253 if(!fskip_ahead(e->fin, data_bytes)) {
254 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'ds64' data\n", e->inbasefilename);
258 got_ds64_chunk = true;
260 else if(!memcmp(chunk_id, "fmt ", 4)) { /* format chunk */
262 FLAC__uint32 xx, data_bytes;
263 FLAC__uint16 wFormatTag; /* wFormatTag word from the 'fmt ' chunk */
264 unsigned block_align;
267 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'fmt ' chunks\n", e->inbasefilename);
272 * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
273 * http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
274 * 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
278 * 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
280 * 4 byte: sample rate (Hz)
281 * 4 byte: avg bytes per sec
282 * 2 byte: block align
283 * 2 byte: bits per sample (not necessarily all significant)
285 * 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
286 * WAVEFORMATEXTENSIBLE adds
287 * 2 byte: valid bits per sample
288 * 4 byte: channel mask
289 * 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
291 * Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
292 * 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.
294 * Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
296 * If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
297 * If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
299 * Data is supposed to be unsigned for bps <= 8 else signed.
303 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
306 if(data_bytes < 16) {
307 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'fmt ' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
310 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
314 if(!read_uint16(e->fin, /*big_endian=*/false, &wFormatTag, e->inbasefilename))
316 if(wFormatTag != 1 /*WAVE_FORMAT_PCM*/ && wFormatTag != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
317 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", e->inbasefilename, (unsigned)wFormatTag);
321 /* number of channels */
322 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
324 channels = (unsigned)x;
327 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
331 /* avg bytes per second (ignored) */
332 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
335 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
337 block_align = (unsigned)x;
338 /* bits per sample */
339 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
343 e->info.is_unsigned_samples = (bps <= 8);
345 if(wFormatTag == 1) {
346 if(bps != 8 && bps != 16) {
347 if(bps == 24 || bps == 32) {
348 /* let these slide with a warning since they're unambiguous */
349 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);
350 if(e->treat_warnings_as_errors)
354 /* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
355 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);
359 #if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
360 if((bps+7)/8 * channels == block_align) {
362 /* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
363 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);
364 if(e->treat_warnings_as_errors)
366 shift = 8 - (bps % 8);
373 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);
379 if(channels > 2 && !options.channel_map_none) {
380 flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", e->inbasefilename);
383 FLAC__ASSERT(data_bytes >= 16);
387 if(data_bytes < 40) {
388 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", e->inbasefilename, (unsigned)data_bytes);
392 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
395 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", e->inbasefilename, (unsigned)x);
399 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
401 if((unsigned)x > bps) {
402 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", e->inbasefilename, (unsigned)x, bps);
405 shift = bps - (unsigned)x;
407 if(!read_uint32(e->fin, /*big_endian=*/false, &channel_mask, e->inbasefilename))
409 /* for mono/stereo and unassigned channels, we fake the mask */
410 if(channel_mask == 0) {
412 channel_mask = 0x0001;
413 else if(channels == 2)
414 channel_mask = 0x0003;
416 /* set channel mapping */
417 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
418 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
419 /* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
421 /* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
423 options.channel_map_none ||
424 channel_mask == 0x0001 || /* 1 channel: (mono) */
425 channel_mask == 0x0003 || /* 2 channels: front left, front right */
426 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
427 channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
429 /* keep default channel order */
432 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
433 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
434 channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
436 /* to dolby order: front left, center, front right [, surround left, surround right ] */
441 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
442 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
444 /* to dolby order: front left, center, front right, surround left, surround right, LFE */
453 options.channel_map_none ||
454 channel_mask == 0x0001 || /* 1 channel: (mono) */
455 channel_mask == 0x0003 || /* 2 channels: front left, front right */
456 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
457 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
458 channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
459 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
460 channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
461 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
462 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
464 /* keep default channel order */
468 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);
471 if(!options.channel_map_none) {
472 if(count_channel_mask_bits(channel_mask) < channels) {
473 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);
477 /* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
478 * there would be holes in the order that would have to be filled in, or the mask would have to be
479 * limited and the logic above rerun to see if it still fits into the FLAC mapping.
481 else if(count_channel_mask_bits(channel_mask) > channels)
482 channel_mask = limit_channel_mask(channel_mask, channels);
484 else if(count_channel_mask_bits(channel_mask) > channels) {
485 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);
490 /* first part of GUID */
491 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
494 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", e->inbasefilename, (unsigned)x);
500 e->info.bytes_per_wide_sample = channels * (bps / 8);
502 /* skip any extra data in the fmt chunk */
503 if(!fskip_ahead(e->fin, data_bytes)) {
504 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'fmt' data\n", e->inbasefilename);
508 got_fmt_chunk = true;
510 else if(!memcmp(chunk_id, "data", 4)) { /* data chunk */
512 FLAC__uint64 data_bytes;
515 flac__utils_printf(stderr, 1, "%s: ERROR: got 'data' chunk before 'fmt' chunk\n", e->inbasefilename);
520 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
523 if(options.format == FORMAT_RF64) {
524 if(!got_ds64_chunk) {
525 flac__utils_printf(stderr, 1, "%s: ERROR: RF64 file has no 'ds64' chunk before 'data' chunk\n", e->inbasefilename);
528 if(data_bytes == 0xffffffff)
529 data_bytes = ds64_data_size;
531 if(options.ignore_chunk_sizes) {
532 FLAC__ASSERT(!options.sector_align);
534 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);
535 if(e->treat_warnings_as_errors)
538 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 */
540 else if(0 == data_bytes) {
541 flac__utils_printf(stderr, 1, "%s: ERROR: 'data' chunk has size of 0\n", e->inbasefilename);
545 e->fmt.iff.data_bytes = data_bytes;
546 e->fmt.iff.pad = (data_bytes & 1) ? true : false;
548 got_data_chunk = true;
553 if(!options.format_options.iff.foreign_metadata) {
554 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
555 if(e->treat_warnings_as_errors)
560 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
563 unsigned long skip = xx + (xx & 1);
565 FLAC__ASSERT(skip <= LONG_MAX);
566 if(!fskip_ahead(e->fin, skip)) {
567 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
575 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find fmt chunk\n", e->inbasefilename);
578 if(!got_data_chunk) {
579 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find data chunk\n", e->inbasefilename);
583 e->info.sample_rate = sample_rate;
584 e->info.channels = channels;
585 e->info.bits_per_sample = bps;
586 e->info.shift = shift;
587 e->info.channel_mask = channel_mask;
592 static FLAC__bool get_sample_info_aiff(EncoderSession *e, encode_options_t options)
594 FLAC__bool got_comm_chunk = false, got_ssnd_chunk = false;
595 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
596 FLAC__uint64 sample_frames = 0;
597 FLAC__uint32 channel_mask = 0;
599 e->info.is_unsigned_samples = false;
600 e->info.is_big_endian = true;
603 * lookahead[] already has "FORMxxxxAIFF", do chunks
605 while(!feof(e->fin) && !got_ssnd_chunk) {
606 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 */
607 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
608 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
614 if(!memcmp(chunk_id, "COMM", 4)) { /* common chunk */
618 const FLAC__bool is_aifc = options.format == FORMAT_AIFF_C;
619 const FLAC__uint32 minimum_comm_size = (is_aifc? 22 : 18);
622 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'COMM' chunks\n", e->inbasefilename);
626 /* COMM chunk size */
627 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
629 else if(xx < minimum_comm_size) {
630 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);
633 else if(!is_aifc && xx != minimum_comm_size) {
634 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);
635 if(e->treat_warnings_as_errors)
638 skip = (xx-minimum_comm_size)+(xx & 1);
640 /* number of channels */
641 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
643 channels = (unsigned)x;
644 if(channels > 2 && !options.channel_map_none) {
645 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
649 /* number of sample frames */
650 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
654 /* bits per sample */
655 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
658 shift = (bps%8)? 8-(bps%8) : 0; /* SSND data is always byte-aligned, left-justified but format_input() will double-check */
662 if(!read_sane_extended(e->fin, &xx, e->inbasefilename))
666 /* check compression type for AIFF-C */
668 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
670 if(xx == 0x736F7774) /* "sowt" */
671 e->info.is_big_endian = false;
672 else if(xx == 0x4E4F4E45) /* "NONE" */
673 ; /* nothing to do, we already default to big-endian */
675 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));
680 /* set channel mapping */
681 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
682 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
683 /* specs say the channel ordering is:
685 * ___________________________________________________
689 * quad (ambiguous with 4ch) Fl Fr Bl Br
692 * 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
693 * so we only have unambiguous mappings for 2, 3, and 5 channels
696 options.channel_map_none ||
697 channels == 1 || /* 1 channel: (mono) */
698 channels == 2 || /* 2 channels: left, right */
699 channels == 3 || /* 3 channels: left, right, center */
700 channels == 5 /* 5 channels: front left, front right, center, surround left, surround right */
702 /* keep default channel order */
705 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
709 e->info.bytes_per_wide_sample = channels * (bps / 8);
711 /* skip any extra data in the COMM chunk */
712 if(!fskip_ahead(e->fin, skip)) {
713 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra COMM data\n", e->inbasefilename);
717 got_comm_chunk = true;
719 else if(!memcmp(chunk_id, "SSND", 4) && !got_ssnd_chunk) { /* sound data chunk */
721 FLAC__uint64 data_bytes;
722 unsigned offset = 0, block_size = 0;
724 if(!got_comm_chunk) {
725 flac__utils_printf(stderr, 1, "%s: ERROR: got 'SSND' chunk before 'COMM' chunk\n", e->inbasefilename);
729 /* SSND chunk size */
730 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
733 if(options.ignore_chunk_sizes) {
734 FLAC__ASSERT(!options.sector_align);
736 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);
737 if(e->treat_warnings_as_errors)
740 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 */
742 else if(data_bytes <= 8) {
743 flac__utils_printf(stderr, 1, "%s: ERROR: 'SSND' chunk has size <= 8\n", e->inbasefilename);
747 data_bytes -= 8; /* discount the offset and block size fields */
749 e->fmt.iff.pad = (data_bytes & 1) ? true : false;
752 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
755 data_bytes -= offset;
758 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
761 flac__utils_printf(stderr, 1, "%s: ERROR: block size is %u; must be 0\n", e->inbasefilename, (unsigned)xx);
766 /* skip any SSND offset bytes */
767 if(!fskip_ahead(e->fin, offset)) {
768 flac__utils_printf(stderr, 1, "%s: ERROR: skipping offset in SSND chunk\n", e->inbasefilename);
771 if(data_bytes != (sample_frames * e->info.bytes_per_wide_sample)) {
772 flac__utils_printf(stderr, 1, "%s: ERROR: SSND chunk size inconsistent with sample frame count\n", e->inbasefilename);
776 e->fmt.iff.data_bytes = data_bytes;
778 got_ssnd_chunk = true;
782 if(!options.format_options.iff.foreign_metadata) {
783 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
784 if(e->treat_warnings_as_errors)
789 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
792 unsigned long skip = xx + (xx & 1);
794 FLAC__ASSERT(skip <= LONG_MAX);
795 if(!fskip_ahead(e->fin, skip)) {
796 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
803 if(!got_comm_chunk) {
804 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find COMM chunk\n", e->inbasefilename);
807 if(!got_ssnd_chunk && sample_frames) {
808 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find SSND chunk\n", e->inbasefilename);
812 e->info.sample_rate = sample_rate;
813 e->info.channels = channels;
814 e->info.bits_per_sample = bps;
815 e->info.shift = shift;
816 e->info.channel_mask = channel_mask;
821 static FLAC__bool get_sample_info_flac(EncoderSession *e, encode_options_t options)
824 FLAC__stream_decoder_set_md5_checking(e->fmt.flac.decoder, false) &&
825 FLAC__stream_decoder_set_metadata_respond_all(e->fmt.flac.decoder)
827 flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", e->inbasefilename);
831 if (options.format == FORMAT_OGGFLAC) {
832 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) {
833 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));
837 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) {
838 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));
842 if (!FLAC__stream_decoder_process_until_end_of_metadata(e->fmt.flac.decoder) || e->fmt.flac.client_data.fatal_error) {
843 if (e->fmt.flac.client_data.fatal_error)
844 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", e->inbasefilename);
846 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));
850 if (e->fmt.flac.client_data.num_metadata_blocks == 0) {
851 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", e->inbasefilename);
854 else if (e->fmt.flac.client_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
855 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", e->inbasefilename);
858 else if (e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
859 flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", e->inbasefilename);
863 e->info.sample_rate = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.sample_rate;
864 e->info.channels = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.channels;
865 e->info.bits_per_sample = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.bits_per_sample;
867 e->info.bytes_per_wide_sample = 0;
868 e->info.is_unsigned_samples = false; /* not applicable for FLAC input */
869 e->info.is_big_endian = false; /* not applicable for FLAC input */
870 e->info.channel_mask = 0;
878 int flac__encode_file(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, encode_options_t options)
880 EncoderSession encoder_session;
881 size_t channel_map[FLAC__MAX_CHANNELS];
882 int info_align_carry = -1, info_align_zero = -1;
884 if(!EncoderSession_construct(&encoder_session, options, infilesize, infile, infilename, outfilename, lookahead, lookahead_length))
887 /* initialize default channel map that preserves channel order */
890 for(i = 0; i < sizeof(channel_map)/sizeof(channel_map[0]); i++)
894 /* read foreign metadata if requested */
895 if(flac__utils_format_is_iff(options.format) && options.format_options.iff.foreign_metadata) {
898 options.format == FORMAT_WAVE || options.format == FORMAT_RF64?
899 flac__foreign_metadata_read_from_wave(options.format_options.iff.foreign_metadata, infilename, &error) :
900 flac__foreign_metadata_read_from_aiff(options.format_options.iff.foreign_metadata, infilename, &error)
902 flac__utils_printf(stderr, 1, "%s: ERROR reading foreign metadata: %s\n", encoder_session.inbasefilename, error);
903 return EncoderSession_finish_error(&encoder_session);
907 /* initialize encoder session with info about the audio (channels/bps/resolution/endianness/etc) */
908 switch(options.format) {
910 if(!get_sample_info_raw(&encoder_session, options))
911 return EncoderSession_finish_error(&encoder_session);
915 if(!get_sample_info_wave(&encoder_session, options))
916 return EncoderSession_finish_error(&encoder_session);
920 if(!get_sample_info_aiff(&encoder_session, options))
921 return EncoderSession_finish_error(&encoder_session);
926 * set up FLAC decoder for the input
928 if (0 == (encoder_session.fmt.flac.decoder = FLAC__stream_decoder_new())) {
929 flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
930 return EncoderSession_finish_error(&encoder_session);
932 if(!get_sample_info_flac(&encoder_session, options))
933 return EncoderSession_finish_error(&encoder_session);
937 /* double protection */
938 return EncoderSession_finish_error(&encoder_session);
941 /* some more checks */
942 if(encoder_session.info.channels == 0 || encoder_session.info.channels > FLAC__MAX_CHANNELS) {
943 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, encoder_session.info.channels);
944 return EncoderSession_finish_error(&encoder_session);
946 if(!FLAC__format_sample_rate_is_valid(encoder_session.info.sample_rate)) {
947 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
948 return EncoderSession_finish_error(&encoder_session);
950 if(encoder_session.info.bits_per_sample-encoder_session.info.shift < 4 || encoder_session.info.bits_per_sample-encoder_session.info.shift > 24) {
951 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);
952 return EncoderSession_finish_error(&encoder_session);
954 if(options.sector_align) {
955 if(encoder_session.info.channels != 2) {
956 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);
957 return EncoderSession_finish_error(&encoder_session);
959 if(encoder_session.info.sample_rate != 44100) {
960 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);
961 return EncoderSession_finish_error(&encoder_session);
963 if(encoder_session.info.bits_per_sample-encoder_session.info.shift != 16) {
964 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);
965 return EncoderSession_finish_error(&encoder_session);
970 FLAC__uint64 total_samples_in_input; /* WATCHOUT: may be 0 to mean "unknown" */
972 FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
973 unsigned align_remainder = 0;
975 switch(options.format) {
978 total_samples_in_input = 0;
980 total_samples_in_input = (FLAC__uint64)infilesize / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
986 total_samples_in_input = encoder_session.fmt.iff.data_bytes / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
990 total_samples_in_input = encoder_session.fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples + *options.align_reservoir_samples;
994 /* double protection */
995 return EncoderSession_finish_error(&encoder_session);
999 * now that we know the sample rate, canonicalize the
1000 * --skip string to an absolute sample number:
1002 flac__utils_canonicalize_skip_until_specification(&options.skip_specification, encoder_session.info.sample_rate);
1003 FLAC__ASSERT(options.skip_specification.value.samples >= 0);
1004 skip = (FLAC__uint64)options.skip_specification.value.samples;
1005 FLAC__ASSERT(!options.sector_align || (options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC && skip == 0));
1006 /* *options.align_reservoir_samples will be 0 unless --sector-align is used */
1007 FLAC__ASSERT(options.sector_align || *options.align_reservoir_samples == 0);
1010 * now that we possibly know the input size, canonicalize the
1011 * --until string to an absolute sample number:
1013 if(!canonicalize_until_specification(&options.until_specification, encoder_session.inbasefilename, encoder_session.info.sample_rate, skip, total_samples_in_input))
1014 return EncoderSession_finish_error(&encoder_session);
1015 until = (FLAC__uint64)options.until_specification.value.samples;
1016 FLAC__ASSERT(!options.sector_align || until == 0);
1018 /* adjust encoding parameters based on skip and until values */
1019 switch(options.format) {
1021 infilesize -= (off_t)skip * encoder_session.info.bytes_per_wide_sample;
1022 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1028 encoder_session.fmt.iff.data_bytes -= skip * encoder_session.info.bytes_per_wide_sample;
1029 if(options.ignore_chunk_sizes) {
1030 encoder_session.total_samples_to_encode = 0;
1031 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1032 FLAC__ASSERT(0 == until);
1035 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1039 case FORMAT_OGGFLAC:
1040 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1044 /* double protection */
1045 return EncoderSession_finish_error(&encoder_session);
1048 const FLAC__uint64 trim = total_samples_in_input - until;
1049 FLAC__ASSERT(total_samples_in_input > 0);
1050 FLAC__ASSERT(!options.sector_align);
1051 if(options.format == FORMAT_RAW)
1052 infilesize -= (off_t)trim * encoder_session.info.bytes_per_wide_sample;
1053 else if(flac__utils_format_is_iff(options.format))
1054 encoder_session.fmt.iff.data_bytes -= trim * encoder_session.info.bytes_per_wide_sample;
1055 encoder_session.total_samples_to_encode -= trim;
1057 if(options.sector_align && (options.format != FORMAT_RAW || infilesize >=0)) { /* for RAW, need to know the filesize */
1058 FLAC__ASSERT(skip == 0); /* asserted above too, but lest we forget */
1059 align_remainder = (unsigned)(encoder_session.total_samples_to_encode % 588);
1060 if(options.is_last_file)
1061 encoder_session.total_samples_to_encode += (588-align_remainder); /* will pad with zeroes */
1063 encoder_session.total_samples_to_encode -= align_remainder; /* will stop short and carry over to next file */
1065 switch(options.format) {
1067 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample;
1070 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1071 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 44;
1074 /* +72 for the size of the RF64 headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1075 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 80;
1079 /* +54 for the size of the AIFF headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1080 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 54;
1083 case FORMAT_OGGFLAC:
1085 /* if we don't know, use 0 as hint to progress indicator (which is the only place this is used): */
1086 encoder_session.unencoded_size = 0;
1087 else if(skip == 0 && until == 0)
1088 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1089 else if(total_samples_in_input)
1090 encoder_session.unencoded_size = (FLAC__uint64)infilesize * encoder_session.total_samples_to_encode / total_samples_in_input;
1092 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1096 /* double protection */
1097 return EncoderSession_finish_error(&encoder_session);
1100 if(encoder_session.total_samples_to_encode == 0)
1101 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1103 if(options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)
1104 encoder_session.fmt.flac.client_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1106 /* init the encoder */
1107 if(!EncoderSession_init_encoder(&encoder_session, options))
1108 return EncoderSession_finish_error(&encoder_session);
1110 /* skip over any samples as requested */
1112 switch(options.format) {
1115 unsigned skip_bytes = encoder_session.info.bytes_per_wide_sample * (unsigned)skip;
1116 if(skip_bytes > lookahead_length) {
1117 skip_bytes -= lookahead_length;
1118 lookahead_length = 0;
1119 if(!fskip_ahead(encoder_session.fin, skip_bytes)) {
1120 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1121 return EncoderSession_finish_error(&encoder_session);
1125 lookahead += skip_bytes;
1126 lookahead_length -= skip_bytes;
1134 if(!fskip_ahead(encoder_session.fin, skip * encoder_session.info.bytes_per_wide_sample)) {
1135 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1136 return EncoderSession_finish_error(&encoder_session);
1140 case FORMAT_OGGFLAC:
1142 * have to wait until the FLAC encoder is set up for writing
1143 * before any seeking in the input FLAC file, because the seek
1144 * itself will usually call the decoder's write callback, and
1145 * our decoder's write callback passes samples to our FLAC
1148 if(!FLAC__stream_decoder_seek_absolute(encoder_session.fmt.flac.decoder, skip)) {
1149 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));
1150 return EncoderSession_finish_error(&encoder_session);
1155 /* double protection */
1156 return EncoderSession_finish_error(&encoder_session);
1161 * first do any samples in the reservoir
1163 if(options.sector_align && *options.align_reservoir_samples > 0) {
1164 FLAC__ASSERT(options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC); /* check again */
1165 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)options.align_reservoir, *options.align_reservoir_samples)) {
1166 print_error_with_state(&encoder_session, "ERROR during encoding");
1167 return EncoderSession_finish_error(&encoder_session);
1172 * decrement infilesize or the data_bytes counter if we need to align the file
1174 if(options.sector_align) {
1175 if(options.is_last_file) {
1176 *options.align_reservoir_samples = 0;
1179 *options.align_reservoir_samples = align_remainder;
1180 if(options.format == FORMAT_RAW) {
1181 FLAC__ASSERT(infilesize >= 0);
1182 infilesize -= (off_t)((*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample);
1183 FLAC__ASSERT(infilesize >= 0);
1185 else if(flac__utils_format_is_iff(options.format))
1186 encoder_session.fmt.iff.data_bytes -= (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample;
1191 * now do samples from the file
1193 switch(options.format) {
1195 if(infilesize < 0) {
1197 while(!feof(infile)) {
1198 if(lookahead_length > 0) {
1199 FLAC__ASSERT(lookahead_length < CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1200 memcpy(ucbuffer_, lookahead, lookahead_length);
1201 bytes_read = fread(ucbuffer_+lookahead_length, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample - lookahead_length, infile) + lookahead_length;
1202 if(ferror(infile)) {
1203 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1204 return EncoderSession_finish_error(&encoder_session);
1206 lookahead_length = 0;
1209 bytes_read = fread(ucbuffer_, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample, infile);
1211 if(bytes_read == 0) {
1212 if(ferror(infile)) {
1213 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1214 return EncoderSession_finish_error(&encoder_session);
1217 else if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1218 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1219 return EncoderSession_finish_error(&encoder_session);
1222 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1223 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))
1224 return EncoderSession_finish_error(&encoder_session);
1226 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1227 print_error_with_state(&encoder_session, "ERROR during encoding");
1228 return EncoderSession_finish_error(&encoder_session);
1235 const FLAC__uint64 max_input_bytes = infilesize;
1236 FLAC__uint64 total_input_bytes_read = 0;
1237 while(total_input_bytes_read < max_input_bytes) {
1239 size_t wanted = (CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1240 wanted = (size_t) min((FLAC__uint64)wanted, max_input_bytes - total_input_bytes_read);
1242 if(lookahead_length > 0) {
1243 FLAC__ASSERT(lookahead_length <= wanted);
1244 memcpy(ucbuffer_, lookahead, lookahead_length);
1245 wanted -= lookahead_length;
1246 bytes_read = lookahead_length;
1248 bytes_read += fread(ucbuffer_+lookahead_length, sizeof(unsigned char), wanted, infile);
1249 if(ferror(infile)) {
1250 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1251 return EncoderSession_finish_error(&encoder_session);
1254 lookahead_length = 0;
1257 bytes_read = fread(ucbuffer_, sizeof(unsigned char), wanted, infile);
1260 if(bytes_read == 0) {
1261 if(ferror(infile)) {
1262 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1263 return EncoderSession_finish_error(&encoder_session);
1265 else if(feof(infile)) {
1266 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; expected %u samples, got %u samples\n", encoder_session.inbasefilename, (unsigned)encoder_session.total_samples_to_encode, (unsigned)encoder_session.samples_written);
1267 if(encoder_session.treat_warnings_as_errors)
1268 return EncoderSession_finish_error(&encoder_session);
1269 total_input_bytes_read = max_input_bytes;
1273 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1274 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1275 return EncoderSession_finish_error(&encoder_session);
1278 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1279 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))
1280 return EncoderSession_finish_error(&encoder_session);
1282 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1283 print_error_with_state(&encoder_session, "ERROR during encoding");
1284 return EncoderSession_finish_error(&encoder_session);
1286 total_input_bytes_read += bytes_read;
1296 while(encoder_session.fmt.iff.data_bytes > 0) {
1297 const size_t bytes_to_read = (size_t)min(
1298 encoder_session.fmt.iff.data_bytes,
1299 (FLAC__uint64)CHUNK_OF_SAMPLES * (FLAC__uint64)encoder_session.info.bytes_per_wide_sample
1301 size_t bytes_read = fread(ucbuffer_, sizeof(unsigned char), bytes_to_read, infile);
1302 if(bytes_read == 0) {
1303 if(ferror(infile)) {
1304 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1305 return EncoderSession_finish_error(&encoder_session);
1307 else if(feof(infile)) {
1308 if(options.ignore_chunk_sizes) {
1309 flac__utils_printf(stderr, 1, "%s: INFO: hit EOF with --ignore-chunk-sizes, got %u samples\n", encoder_session.inbasefilename, (unsigned)encoder_session.samples_written);
1312 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; expected %u samples, got %u samples\n", encoder_session.inbasefilename, (unsigned)encoder_session.total_samples_to_encode, (unsigned)encoder_session.samples_written);
1313 if(encoder_session.treat_warnings_as_errors)
1314 return EncoderSession_finish_error(&encoder_session);
1316 encoder_session.fmt.iff.data_bytes = 0;
1320 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1321 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1322 return EncoderSession_finish_error(&encoder_session);
1325 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1326 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))
1327 return EncoderSession_finish_error(&encoder_session);
1329 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1330 print_error_with_state(&encoder_session, "ERROR during encoding");
1331 return EncoderSession_finish_error(&encoder_session);
1333 encoder_session.fmt.iff.data_bytes -= bytes_read;
1339 case FORMAT_OGGFLAC:
1340 while(!encoder_session.fmt.flac.client_data.fatal_error && encoder_session.fmt.flac.client_data.samples_left_to_process > 0) {
1341 /* We can also hit the end of stream without samples_left_to_process
1342 * going to 0 if there are errors and continue_through_decode_errors
1343 * is on, so we want to break in that case too:
1345 if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(encoder_session.fmt.flac.decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1347 if(!FLAC__stream_decoder_process_single(encoder_session.fmt.flac.decoder)) {
1348 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));
1349 return EncoderSession_finish_error(&encoder_session);
1352 if(encoder_session.fmt.flac.client_data.fatal_error) {
1353 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));
1354 return EncoderSession_finish_error(&encoder_session);
1359 /* double protection */
1360 return EncoderSession_finish_error(&encoder_session);
1364 * now read unaligned samples into reservoir or pad with zeroes if necessary
1366 if(options.sector_align) {
1367 if(options.is_last_file) {
1368 unsigned wide_samples = 588 - align_remainder;
1369 if(wide_samples < 588) {
1372 info_align_zero = wide_samples;
1373 for(channel = 0; channel < encoder_session.info.channels; channel++)
1374 memset(input_[channel], 0, sizeof(input_[0][0]) * wide_samples);
1376 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1377 print_error_with_state(&encoder_session, "ERROR during encoding");
1378 return EncoderSession_finish_error(&encoder_session);
1383 if(*options.align_reservoir_samples > 0) {
1385 FLAC__ASSERT(CHUNK_OF_SAMPLES >= 588);
1386 bytes_read = fread(ucbuffer_, sizeof(unsigned char), (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample, infile);
1387 if(bytes_read == 0 && ferror(infile)) {
1388 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1389 return EncoderSession_finish_error(&encoder_session);
1391 else if(bytes_read != (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample) {
1392 flac__utils_printf(stderr, 1, "%s: WARNING: unexpected EOF; read %u bytes; expected %u samples, got %u samples\n", encoder_session.inbasefilename, (unsigned)bytes_read, (unsigned)encoder_session.total_samples_to_encode, (unsigned)encoder_session.samples_written);
1393 if(encoder_session.treat_warnings_as_errors)
1394 return EncoderSession_finish_error(&encoder_session);
1397 info_align_carry = *options.align_reservoir_samples;
1398 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))
1399 return EncoderSession_finish_error(&encoder_session);
1406 return EncoderSession_finish_ok(
1410 flac__utils_format_is_iff(options.format)? options.format_options.iff.foreign_metadata : 0
1414 FLAC__bool EncoderSession_construct(EncoderSession *e, encode_options_t options, off_t infilesize, FILE *infile, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length)
1417 FLAC__uint32 test = 1;
1420 * initialize globals
1423 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
1425 for(i = 0; i < FLAC__MAX_CHANNELS; i++)
1426 input_[i] = &(in_[i][0]);
1430 * initialize instance
1434 e->use_ogg = options.use_ogg;
1436 e->verify = options.verify;
1437 e->treat_warnings_as_errors = options.treat_warnings_as_errors;
1438 e->continue_through_decode_errors = options.continue_through_decode_errors;
1440 e->is_stdout = (0 == strcmp(outfilename, "-"));
1441 e->outputfile_opened = false;
1443 e->inbasefilename = grabbag__file_get_basename(infilename);
1444 e->infilename = infilename;
1445 e->outfilename = outfilename;
1447 e->total_samples_to_encode = 0;
1448 e->unencoded_size = 0;
1449 e->bytes_written = 0;
1450 e->samples_written = 0;
1453 memset(&e->info, 0, sizeof(e->info));
1455 e->format = options.format;
1457 switch(options.format) {
1464 e->fmt.iff.data_bytes = 0;
1468 case FORMAT_OGGFLAC:
1469 e->fmt.flac.decoder = 0;
1470 e->fmt.flac.client_data.filesize = infilesize;
1471 e->fmt.flac.client_data.lookahead = lookahead;
1472 e->fmt.flac.client_data.lookahead_length = lookahead_length;
1473 e->fmt.flac.client_data.num_metadata_blocks = 0;
1474 e->fmt.flac.client_data.samples_left_to_process = 0;
1475 e->fmt.flac.client_data.fatal_error = false;
1479 /* double protection */
1486 e->seek_table_template = 0;
1488 if(0 == (e->seek_table_template = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE))) {
1489 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1493 e->encoder = FLAC__stream_encoder_new();
1494 if(0 == e->encoder) {
1495 flac__utils_printf(stderr, 1, "%s: ERROR creating the encoder instance\n", e->inbasefilename);
1496 EncoderSession_destroy(e);
1503 void EncoderSession_destroy(EncoderSession *e)
1505 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1507 if(e->fmt.flac.decoder)
1508 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1509 e->fmt.flac.decoder = 0;
1510 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1511 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1512 e->fmt.flac.client_data.num_metadata_blocks = 0;
1518 if(0 != e->encoder) {
1519 FLAC__stream_encoder_delete(e->encoder);
1523 if(0 != e->seek_table_template) {
1524 FLAC__metadata_object_delete(e->seek_table_template);
1525 e->seek_table_template = 0;
1529 int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata)
1531 FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
1533 FLAC__bool verify_error = false;
1536 fse_state = FLAC__stream_encoder_get_state(e->encoder);
1537 ret = FLAC__stream_encoder_finish(e->encoder)? 0 : 1;
1539 fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA ||
1540 FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
1543 /* all errors except verify errors should interrupt the stats */
1544 if(ret && !verify_error)
1545 print_error_with_state(e, "ERROR during encoding");
1546 else if(e->total_samples_to_encode > 0) {
1548 flac__utils_printf(stderr, 2, "\n");
1552 print_verify_error(e);
1556 if(info_align_carry >= 0) {
1557 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
1559 if(info_align_zero >= 0) {
1560 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
1564 /*@@@@@@ should this go here or somewhere else? */
1565 if(ret == 0 && foreign_metadata) {
1567 if(!flac__foreign_metadata_write_to_flac(foreign_metadata, e->infilename, e->outfilename, &error)) {
1568 flac__utils_printf(stderr, 1, "%s: ERROR: updating foreign metadata in FLAC file: %s\n", e->inbasefilename, error);
1573 EncoderSession_destroy(e);
1578 int EncoderSession_finish_error(EncoderSession *e)
1580 FLAC__ASSERT(e->encoder);
1582 if(e->total_samples_to_encode > 0)
1583 flac__utils_printf(stderr, 2, "\n");
1585 if(FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1586 print_verify_error(e);
1587 else if(e->outputfile_opened)
1588 /* only want to delete the file if we opened it; otherwise it could be an existing file and our overwrite failed */
1589 unlink(e->outfilename);
1591 EncoderSession_destroy(e);
1597 unsigned num_metadata;
1598 FLAC__bool *needs_delete;
1599 FLAC__StreamMetadata **metadata;
1600 FLAC__StreamMetadata *cuesheet; /* always needs to be deleted */
1601 } static_metadata_t;
1603 static void static_metadata_init(static_metadata_t *m)
1605 m->num_metadata = 0;
1606 m->needs_delete = 0;
1611 static void static_metadata_clear(static_metadata_t *m)
1614 for(i = 0; i < m->num_metadata; i++)
1615 if(m->needs_delete[i])
1616 FLAC__metadata_object_delete(m->metadata[i]);
1620 free(m->needs_delete);
1622 FLAC__metadata_object_delete(m->cuesheet);
1623 static_metadata_init(m);
1626 static FLAC__bool static_metadata_append(static_metadata_t *m, FLAC__StreamMetadata *d, FLAC__bool needs_delete)
1629 if(0 == (x = safe_realloc_muladd2_(m->metadata, sizeof(*m->metadata), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1631 m->metadata = (FLAC__StreamMetadata**)x;
1632 if(0 == (x = safe_realloc_muladd2_(m->needs_delete, sizeof(*m->needs_delete), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1634 m->needs_delete = (FLAC__bool*)x;
1635 m->metadata[m->num_metadata] = d;
1636 m->needs_delete[m->num_metadata] = needs_delete;
1641 FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options)
1643 const unsigned channels = e->info.channels;
1644 const unsigned bps = e->info.bits_per_sample - e->info.shift;
1645 const unsigned sample_rate = e->info.sample_rate;
1646 FLACDecoderData *flac_decoder_data = (options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)? &e->fmt.flac.client_data : 0;
1647 FLAC__StreamMetadata padding;
1648 FLAC__StreamMetadata **metadata = 0;
1649 static_metadata_t static_metadata;
1650 unsigned num_metadata = 0, i;
1651 FLAC__StreamEncoderInitStatus init_status;
1652 const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);
1653 char apodizations[2000];
1655 FLAC__ASSERT(sizeof(options.pictures)/sizeof(options.pictures[0]) <= 64);
1657 static_metadata_init(&static_metadata);
1659 e->replay_gain = options.replay_gain;
1661 apodizations[0] = '\0';
1663 if(e->replay_gain) {
1664 if(channels != 1 && channels != 2) {
1665 flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
1668 if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
1669 flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
1672 if(options.is_first_file) {
1673 if(!grabbag__replaygain_init(sample_rate)) {
1674 flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
1680 if(!parse_cuesheet(&static_metadata.cuesheet, options.cuesheet_filename, e->inbasefilename, is_cdda, e->total_samples_to_encode, e->treat_warnings_as_errors))
1683 if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? static_metadata.cuesheet : 0, e)) {
1684 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1685 static_metadata_clear(&static_metadata);
1689 /* build metadata */
1690 if(flac_decoder_data) {
1692 * we're encoding from FLAC so we will use the FLAC file's
1693 * metadata as the basis for the encoded file
1697 * first handle pictures: simple append any --pictures
1700 for(i = 0; i < options.num_pictures; i++) {
1701 FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1703 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1704 static_metadata_clear(&static_metadata);
1707 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1712 * next handle vorbis comment: if any tags were specified
1713 * or there is no existing vorbis comment, we create a
1714 * new vorbis comment (discarding any existing one); else
1715 * we keep the existing one. also need to make sure to
1716 * propagate any channel mask tag.
1718 /* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1720 FLAC__bool vc_found = false;
1721 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1722 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1724 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1725 (void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &e->info.channel_mask);
1726 flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1727 if(e->treat_warnings_as_errors) {
1728 static_metadata_clear(&static_metadata);
1731 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1732 flac_decoder_data->metadata_blocks[i] = 0;
1735 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1737 flac_decoder_data->num_metadata_blocks = j;
1738 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])) {
1740 FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1741 if(0 == vc || (e->info.channel_mask && !flac__utils_set_channel_mask_tag(vc, e->info.channel_mask))) {
1742 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1743 static_metadata_clear(&static_metadata);
1746 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1747 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1748 flac_decoder_data->metadata_blocks[1] = vc;
1749 flac_decoder_data->num_metadata_blocks++;
1754 * next handle cuesheet: if --cuesheet was specified, use
1755 * it; else if file has existing CUESHEET and cuesheet's
1756 * lead-out offset is correct, keep it; else no CUESHEET
1759 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1760 FLAC__bool existing_cuesheet_is_bad = false;
1761 /* check if existing cuesheet matches the input audio */
1762 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == static_metadata.cuesheet) {
1763 const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1764 if(e->total_samples_to_encode == 0) {
1765 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);
1766 if(e->treat_warnings_as_errors) {
1767 static_metadata_clear(&static_metadata);
1770 existing_cuesheet_is_bad = true;
1772 else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1773 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);
1774 if(e->treat_warnings_as_errors) {
1775 static_metadata_clear(&static_metadata);
1778 existing_cuesheet_is_bad = true;
1781 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != static_metadata.cuesheet)) {
1782 if(0 != static_metadata.cuesheet) {
1783 flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1784 if(e->treat_warnings_as_errors) {
1785 static_metadata_clear(&static_metadata);
1789 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1790 flac_decoder_data->metadata_blocks[i] = 0;
1793 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1795 flac_decoder_data->num_metadata_blocks = j;
1796 if(0 != static_metadata.cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1798 FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(static_metadata.cuesheet);
1800 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1801 static_metadata_clear(&static_metadata);
1804 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1805 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1806 flac_decoder_data->metadata_blocks[1] = cs;
1807 flac_decoder_data->num_metadata_blocks++;
1812 * next handle seektable: if -S- was specified, no
1813 * SEEKTABLE; else if -S was specified, use it/them;
1814 * else if file has existing SEEKTABLE and input size is
1815 * preserved (no --skip/--until/etc specified), keep it;
1816 * else use default seektable options
1818 * note: meanings of num_requested_seek_points:
1819 * -1 : no -S option given, default to some value
1820 * 0 : -S- given (no seektable)
1821 * >0 : one or more -S options given
1824 FLAC__bool existing_seektable = false;
1825 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1826 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1827 existing_seektable = true;
1828 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)) {
1829 if(options.num_requested_seek_points > 0) {
1830 flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1831 if(e->treat_warnings_as_errors) {
1832 static_metadata_clear(&static_metadata);
1836 else if(options.num_requested_seek_points == 0)
1837 ; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1839 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);
1840 if(e->treat_warnings_as_errors) {
1841 static_metadata_clear(&static_metadata);
1845 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1846 flac_decoder_data->metadata_blocks[i] = 0;
1847 existing_seektable = false;
1850 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1852 flac_decoder_data->num_metadata_blocks = j;
1853 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])) {
1855 FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1857 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1858 static_metadata_clear(&static_metadata);
1861 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1862 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1863 flac_decoder_data->metadata_blocks[1] = st;
1864 flac_decoder_data->num_metadata_blocks++;
1869 * finally handle padding: if --no-padding was specified,
1870 * then delete all padding; else if -P was specified,
1871 * use that instead of existing padding (if any); else
1872 * if existing file has padding, move all existing
1873 * padding blocks to one padding block at the end; else
1874 * use default padding.
1878 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1879 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1882 p += flac_decoder_data->metadata_blocks[i]->length;
1883 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1884 flac_decoder_data->metadata_blocks[i] = 0;
1887 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1889 flac_decoder_data->num_metadata_blocks = j;
1890 if(options.padding > 0)
1891 p = options.padding;
1893 p = e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1894 if(options.padding != 0) {
1895 if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1896 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1897 if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1898 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1899 static_metadata_clear(&static_metadata);
1902 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1903 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1904 flac_decoder_data->num_metadata_blocks++;
1908 metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1909 num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1913 * we're not encoding from FLAC so we will build the metadata
1916 const foreign_metadata_t *foreign_metadata = flac__utils_format_is_iff(options.format)? options.format_options.iff.foreign_metadata : 0;
1918 if(e->seek_table_template->data.seek_table.num_points > 0) {
1919 e->seek_table_template->is_last = false; /* the encoder will set this for us */
1920 static_metadata_append(&static_metadata, e->seek_table_template, /*needs_delete=*/false);
1922 if(0 != static_metadata.cuesheet)
1923 static_metadata_append(&static_metadata, static_metadata.cuesheet, /*needs_delete=*/false);
1924 if(e->info.channel_mask) {
1925 if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, e->info.channel_mask)) {
1926 flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
1927 static_metadata_clear(&static_metadata);
1931 static_metadata_append(&static_metadata, options.vorbis_comment, /*needs_delete=*/false);
1932 for(i = 0; i < options.num_pictures; i++)
1933 static_metadata_append(&static_metadata, options.pictures[i], /*needs_delete=*/false);
1934 if(foreign_metadata) {
1935 for(i = 0; i < foreign_metadata->num_blocks; i++) {
1936 FLAC__StreamMetadata *p = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1938 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory\n", e->inbasefilename);
1939 static_metadata_clear(&static_metadata);
1942 static_metadata_append(&static_metadata, p, /*needs_delete=*/true);
1943 static_metadata.metadata[static_metadata.num_metadata-1]->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8 + foreign_metadata->blocks[i].size;
1946 if(options.padding != 0) {
1947 padding.is_last = false; /* the encoder will set this for us */
1948 padding.type = FLAC__METADATA_TYPE_PADDING;
1949 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));
1950 static_metadata_append(&static_metadata, &padding, /*needs_delete=*/false);
1952 metadata = static_metadata.metadata;
1953 num_metadata = static_metadata.num_metadata;
1956 /* check for a few things that have not already been checked. the
1957 * FLAC__stream_encoder_init*() will check it but only return
1958 * FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
1959 * up front to give a better error message.
1961 if(!verify_metadata(e, metadata, num_metadata)) {
1962 static_metadata_clear(&static_metadata);
1966 FLAC__stream_encoder_set_verify(e->encoder, options.verify);
1967 FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
1968 FLAC__stream_encoder_set_channels(e->encoder, channels);
1969 FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
1970 FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
1971 for(i = 0; i < options.num_compression_settings; i++) {
1972 switch(options.compression_settings[i].type) {
1974 FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[i].value.t_unsigned);
1976 case CST_COMPRESSION_LEVEL:
1977 FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[i].value.t_unsigned);
1978 apodizations[0] = '\0';
1980 case CST_DO_MID_SIDE:
1981 FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
1983 case CST_LOOSE_MID_SIDE:
1984 FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
1986 case CST_APODIZATION:
1987 if(strlen(apodizations)+strlen(options.compression_settings[i].value.t_string)+2 >= sizeof(apodizations)) {
1988 flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
1989 static_metadata_clear(&static_metadata);
1993 strcat(apodizations, options.compression_settings[i].value.t_string);
1994 strcat(apodizations, ";");
1997 case CST_MAX_LPC_ORDER:
1998 FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2000 case CST_QLP_COEFF_PRECISION:
2001 FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[i].value.t_unsigned);
2003 case CST_DO_QLP_COEFF_PREC_SEARCH:
2004 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[i].value.t_bool);
2006 case CST_DO_ESCAPE_CODING:
2007 FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[i].value.t_bool);
2009 case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
2010 FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[i].value.t_bool);
2012 case CST_MIN_RESIDUAL_PARTITION_ORDER:
2013 FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2015 case CST_MAX_RESIDUAL_PARTITION_ORDER:
2016 FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2018 case CST_RICE_PARAMETER_SEARCH_DIST:
2019 FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[i].value.t_unsigned);
2024 FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
2025 FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
2026 FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
2028 FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
2029 FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
2030 FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
2031 if(!options.debug.do_md5) {
2032 flac__utils_printf(stderr, 1, "%s: WARNING, MD5 computation disabled, resulting file will not have MD5 sum\n", e->inbasefilename);
2033 if(e->treat_warnings_as_errors) {
2034 static_metadata_clear(&static_metadata);
2037 FLAC__stream_encoder_set_do_md5(e->encoder, false);
2042 FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
2044 init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2049 init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2052 if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
2053 print_error_with_init_status(e, "ERROR initializing encoder", init_status);
2054 if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
2055 e->outputfile_opened = true;
2056 static_metadata_clear(&static_metadata);
2060 e->outputfile_opened = true;
2063 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2064 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
2067 static_metadata_clear(&static_metadata);
2072 FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples)
2074 if(e->replay_gain) {
2075 if(!grabbag__replaygain_analyze(buffer, e->info.channels==2, e->info.bits_per_sample, samples)) {
2076 flac__utils_printf(stderr, 1, "%s: WARNING, error while calculating ReplayGain\n", e->inbasefilename);
2077 if(e->treat_warnings_as_errors)
2082 return FLAC__stream_encoder_process(e->encoder, buffer, samples);
2085 FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e)
2087 const FLAC__bool only_placeholders = e->is_stdout;
2088 FLAC__bool has_real_points;
2090 if(num_requested_seek_points == 0 && 0 == cuesheet)
2093 if(num_requested_seek_points < 0) {
2095 /*@@@@@@ workaround ogg bug: too many seekpoints makes table not fit in one page */
2096 if(e->use_ogg && e->total_samples_to_encode > 0 && e->total_samples_to_encode / e->info.sample_rate / 10 > 230)
2097 requested_seek_points = "230x;";
2100 requested_seek_points = "10s;";
2101 num_requested_seek_points = 1;
2104 if(num_requested_seek_points > 0) {
2105 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))
2111 const FLAC__StreamMetadata_CueSheet *cs = &cuesheet->data.cue_sheet;
2112 for(i = 0; i < cs->num_tracks; i++) {
2113 const FLAC__StreamMetadata_CueSheet_Track *tr = cs->tracks+i;
2114 for(j = 0; j < tr->num_indices; j++) {
2115 if(!FLAC__metadata_object_seektable_template_append_point(e->seek_table_template, tr->offset + tr->indices[j].offset))
2117 has_real_points = true;
2121 if(!FLAC__metadata_object_seektable_template_sort(e->seek_table_template, /*compact=*/true))
2125 if(has_real_points) {
2127 flac__utils_printf(stderr, 1, "%s: WARNING, cannot write back seekpoints when encoding to stdout\n", e->inbasefilename);
2128 if(e->treat_warnings_as_errors)
2136 FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input)
2138 /* convert from mm:ss.sss to sample number if necessary */
2139 flac__utils_canonicalize_skip_until_specification(spec, sample_rate);
2141 /* special case: if "--until=-0", use the special value '0' to mean "end-of-stream" */
2142 if(spec->is_relative && spec->value.samples == 0) {
2143 spec->is_relative = false;
2147 /* in any other case the total samples in the input must be known */
2148 if(total_samples_in_input == 0) {
2149 flac__utils_printf(stderr, 1, "%s: ERROR, cannot use --until when input length is unknown\n", inbasefilename);
2153 FLAC__ASSERT(spec->value_is_samples);
2155 /* convert relative specifications to absolute */
2156 if(spec->is_relative) {
2157 if(spec->value.samples <= 0)
2158 spec->value.samples += (FLAC__int64)total_samples_in_input;
2160 spec->value.samples += skip;
2161 spec->is_relative = false;
2165 if(spec->value.samples < 0) {
2166 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before beginning of input\n", inbasefilename);
2169 if((FLAC__uint64)spec->value.samples <= skip) {
2170 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before --skip point\n", inbasefilename);
2173 if((FLAC__uint64)spec->value.samples > total_samples_in_input) {
2174 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is after end of input\n", inbasefilename);
2181 FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata)
2183 FLAC__bool metadata_picture_has_type1 = false;
2184 FLAC__bool metadata_picture_has_type2 = false;
2187 FLAC__ASSERT(0 != metadata);
2188 for(i = 0; i < num_metadata; i++) {
2189 const FLAC__StreamMetadata *m = metadata[i];
2190 if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
2191 if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) {
2192 flac__utils_printf(stderr, 1, "%s: ERROR: SEEKTABLE metadata block is invalid\n", e->inbasefilename);
2196 else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
2197 if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) {
2198 flac__utils_printf(stderr, 1, "%s: ERROR: CUESHEET metadata block is invalid\n", e->inbasefilename);
2202 else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
2203 const char *error = 0;
2204 if(!FLAC__format_picture_is_legal(&m->data.picture, &error)) {
2205 flac__utils_printf(stderr, 1, "%s: ERROR: PICTURE metadata block is invalid: %s\n", e->inbasefilename, error);
2208 if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
2209 if(metadata_picture_has_type1) {
2210 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 1 (32x32 icon) in the file\n", e->inbasefilename);
2213 metadata_picture_has_type1 = true;
2215 else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
2216 if(metadata_picture_has_type2) {
2217 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 2 (icon) in the file\n", e->inbasefilename);
2220 metadata_picture_has_type2 = true;
2228 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)
2230 unsigned wide_sample, sample, channel, byte;
2231 FLAC__int32 *out[FLAC__MAX_CHANNELS];
2233 if(0 == channel_map) {
2234 for(channel = 0; channel < channels; channel++)
2235 out[channel] = dest[channel];
2238 for(channel = 0; channel < channels; channel++)
2239 out[channel] = dest[channel_map[channel]];
2243 if(is_unsigned_samples) {
2244 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2245 for(channel = 0; channel < channels; channel++, sample++)
2246 out[channel][wide_sample] = (FLAC__int32)ucbuffer_[sample] - 0x80;
2249 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2250 for(channel = 0; channel < channels; channel++, sample++)
2251 out[channel][wide_sample] = (FLAC__int32)scbuffer_[sample];
2254 else if(bps == 16) {
2255 if(is_big_endian != is_big_endian_host_) {
2257 const unsigned bytes = wide_samples * channels * (bps >> 3);
2258 for(byte = 0; byte < bytes; byte += 2) {
2259 tmp = ucbuffer_[byte];
2260 ucbuffer_[byte] = ucbuffer_[byte+1];
2261 ucbuffer_[byte+1] = tmp;
2264 if(is_unsigned_samples) {
2265 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2266 for(channel = 0; channel < channels; channel++, sample++)
2267 out[channel][wide_sample] = (FLAC__int32)usbuffer_[sample] - 0x8000;
2270 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2271 for(channel = 0; channel < channels; channel++, sample++)
2272 out[channel][wide_sample] = (FLAC__int32)ssbuffer_[sample];
2275 else if(bps == 24) {
2276 if(!is_big_endian) {
2278 const unsigned bytes = wide_samples * channels * (bps >> 3);
2279 for(byte = 0; byte < bytes; byte += 3) {
2280 tmp = ucbuffer_[byte];
2281 ucbuffer_[byte] = ucbuffer_[byte+2];
2282 ucbuffer_[byte+2] = tmp;
2285 if(is_unsigned_samples) {
2286 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2287 for(channel = 0; channel < channels; channel++, sample++) {
2288 out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2289 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2290 out[channel][wide_sample] |= ucbuffer_[byte++];
2291 out[channel][wide_sample] -= 0x800000;
2295 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2296 for(channel = 0; channel < channels; channel++, sample++) {
2297 out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2298 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2299 out[channel][wide_sample] |= ucbuffer_[byte++];
2307 FLAC__int32 mask = (1<<shift)-1;
2308 for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2309 for(channel = 0; channel < channels; channel++) {
2310 if(out[channel][wide_sample] & mask) {
2311 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);
2314 out[channel][wide_sample] >>= shift;
2320 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)
2322 EncoderSession *e = (EncoderSession*)client_data;
2324 (void)encoder, (void)total_frames_estimate;
2326 e->bytes_written = bytes_written;
2327 e->samples_written = samples_written;
2329 if(e->total_samples_to_encode > 0 && !((frames_written-1) & e->stats_mask))
2333 FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
2336 EncoderSession *e = (EncoderSession*)client_data;
2337 FLACDecoderData *data = &e->fmt.flac.client_data;
2341 if (data->fatal_error)
2342 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2344 /* use up lookahead first */
2345 if (data->lookahead_length) {
2346 n = min(data->lookahead_length, *bytes);
2347 memcpy(buffer, data->lookahead, n);
2349 data->lookahead += n;
2350 data->lookahead_length -= n;
2353 /* get the rest from file */
2355 *bytes = n + fread(buffer, 1, *bytes-n, e->fin);
2357 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2358 else if(0 == *bytes)
2359 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
2361 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2364 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2367 FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
2369 EncoderSession *e = (EncoderSession*)client_data;
2372 if(fseeko(e->fin, (off_t)absolute_byte_offset, SEEK_SET) < 0)
2373 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
2375 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
2378 FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
2380 EncoderSession *e = (EncoderSession*)client_data;
2384 if((pos = ftello(e->fin)) < 0)
2385 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
2387 *absolute_byte_offset = (FLAC__uint64)pos;
2388 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
2392 FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
2394 const EncoderSession *e = (EncoderSession*)client_data;
2395 const FLACDecoderData *data = &e->fmt.flac.client_data;
2398 if(data->filesize < 0)
2399 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
2401 *stream_length = (FLAC__uint64)data->filesize;
2402 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
2406 FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
2408 EncoderSession *e = (EncoderSession*)client_data;
2411 return feof(e->fin)? true : false;
2414 FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2416 EncoderSession *e = (EncoderSession*)client_data;
2417 FLACDecoderData *data = &e->fmt.flac.client_data;
2418 FLAC__uint64 n = min(data->samples_left_to_process, frame->header.blocksize);
2421 if(!EncoderSession_process(e, buffer, (unsigned)n)) {
2422 print_error_with_state(e, "ERROR during encoding");
2423 data->fatal_error = true;
2424 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2427 data->samples_left_to_process -= n;
2428 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2431 void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2433 EncoderSession *e = (EncoderSession*)client_data;
2434 FLACDecoderData *data = &e->fmt.flac.client_data;
2437 if (data->fatal_error)
2441 data->num_metadata_blocks == sizeof(data->metadata_blocks)/sizeof(data->metadata_blocks[0]) ||
2442 0 == (data->metadata_blocks[data->num_metadata_blocks] = FLAC__metadata_object_clone(metadata))
2444 data->fatal_error = true;
2446 data->num_metadata_blocks++;
2449 void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2451 EncoderSession *e = (EncoderSession*)client_data;
2452 FLACDecoderData *data = &e->fmt.flac.client_data;
2455 flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", e->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
2456 if(!e->continue_through_decode_errors)
2457 data->fatal_error = true;
2460 FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors)
2463 unsigned last_line_read;
2464 const char *error_message;
2466 if(0 == cuesheet_filename)
2469 if(lead_out_offset == 0) {
2470 flac__utils_printf(stderr, 1, "%s: ERROR cannot import cuesheet when the number of input samples to encode is unknown\n", inbasefilename);
2474 if(0 == (f = fopen(cuesheet_filename, "r"))) {
2475 flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
2479 *cuesheet = grabbag__cuesheet_parse(f, &error_message, &last_line_read, is_cdda, lead_out_offset);
2483 if(0 == *cuesheet) {
2484 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\" on line %u: %s\n", inbasefilename, cuesheet_filename, last_line_read, error_message);
2488 if(!FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/false, &error_message)) {
2489 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\": %s\n", inbasefilename, cuesheet_filename, error_message);
2493 /* if we're expecting CDDA, warn about non-compliance */
2494 if(is_cdda && !FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/true, &error_message)) {
2495 flac__utils_printf(stderr, 1, "%s: WARNING cuesheet \"%s\" is not audio CD compliant: %s\n", inbasefilename, cuesheet_filename, error_message);
2496 if(treat_warnings_as_errors)
2498 (*cuesheet)->data.cue_sheet.is_cd = false;
2504 void print_stats(const EncoderSession *encoder_session)
2506 const FLAC__uint64 samples_written = min(encoder_session->total_samples_to_encode, encoder_session->samples_written);
2507 const FLAC__uint64 uesize = encoder_session->unencoded_size;
2508 #if defined _MSC_VER || defined __MINGW32__
2509 /* with MSVC you have to spoon feed it the casting */
2510 const double progress = (double)(FLAC__int64)samples_written / (double)(FLAC__int64)encoder_session->total_samples_to_encode;
2511 const double ratio = (double)(FLAC__int64)encoder_session->bytes_written / ((double)(FLAC__int64)(uesize? uesize:1) * min(1.0, progress));
2513 const double progress = (double)samples_written / (double)encoder_session->total_samples_to_encode;
2514 const double ratio = (double)encoder_session->bytes_written / ((double)(uesize? uesize:1) * min(1.0, progress));
2517 FLAC__ASSERT(encoder_session->total_samples_to_encode > 0);
2519 if(samples_written == encoder_session->total_samples_to_encode) {
2520 flac__utils_printf(stderr, 2, "\r%s:%s wrote %u bytes, ratio=",
2521 encoder_session->inbasefilename,
2522 encoder_session->verify? " Verify OK," : "",
2523 (unsigned)encoder_session->bytes_written
2527 flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5));
2530 flac__utils_printf(stderr, 2, "%0.3f", ratio);
2532 flac__utils_printf(stderr, 2, "N/A");
2535 void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
2537 const int ilen = strlen(e->inbasefilename) + 1;
2538 const char *state_string = "";
2540 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2542 flac__utils_printf(stderr, 1, "%*s init_status = %s\n", ilen, "", FLAC__StreamEncoderInitStatusString[init_status]);
2544 if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR) {
2545 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2547 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2549 /* print out some more info for some errors: */
2550 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2551 flac__utils_printf(stderr, 1,
2553 "An error occurred while writing; the most common cause is that the disk is full.\n"
2556 else if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_IO_ERROR])) {
2557 flac__utils_printf(stderr, 1,
2559 "An error occurred opening the output file; it is likely that the output\n"
2560 "directory does not exist or is not writable, the output file already exists and\n"
2561 "is not writable, or the disk is full.\n"
2565 else if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE) {
2566 flac__utils_printf(stderr, 1,
2568 "The encoding parameters specified do not conform to the FLAC Subset and may not\n"
2569 "be streamable or playable in hardware devices. If you really understand the\n"
2570 "consequences, you can add --lax to the command-line options to encode with\n"
2571 "these parameters anyway. See http://flac.sourceforge.net/format.html#subset\n"
2576 void print_error_with_state(const EncoderSession *e, const char *message)
2578 const int ilen = strlen(e->inbasefilename) + 1;
2579 const char *state_string;
2581 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2583 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2585 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2587 /* print out some more info for some errors: */
2588 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2589 flac__utils_printf(stderr, 1,
2591 "An error occurred while writing; the most common cause is that the disk is full.\n"
2596 void print_verify_error(EncoderSession *e)
2598 FLAC__uint64 absolute_sample;
2599 unsigned frame_number;
2602 FLAC__int32 expected;
2605 FLAC__stream_encoder_get_verify_decoder_error_stats(e->encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
2607 flac__utils_printf(stderr, 1, "%s: ERROR: mismatch in decoded data, verify FAILED!\n", e->inbasefilename);
2608 flac__utils_printf(stderr, 1, " Absolute sample=%u, frame=%u, channel=%u, sample=%u, expected %d, got %d\n", (unsigned)absolute_sample, frame_number, channel, sample, expected, got);
2609 flac__utils_printf(stderr, 1, " In all known cases, verify errors are caused by hardware problems,\n");
2610 flac__utils_printf(stderr, 1, " usually overclocking or bad RAM. Delete %s\n", e->outfilename);
2611 flac__utils_printf(stderr, 1, " and repeat the flac command exactly as before. If it does not give a\n");
2612 flac__utils_printf(stderr, 1, " verify error in the exact same place each time you try it, then there is\n");
2613 flac__utils_printf(stderr, 1, " a problem with your hardware; please see the FAQ:\n");
2614 flac__utils_printf(stderr, 1, " http://flac.sourceforge.net/faq.html#tools__hardware_prob\n");
2615 flac__utils_printf(stderr, 1, " If it does fail in the exact same place every time, keep\n");
2616 flac__utils_printf(stderr, 1, " %s and submit a bug report to:\n", e->outfilename);
2617 flac__utils_printf(stderr, 1, " https://sourceforge.net/bugs/?func=addbug&group_id=13478\n");
2618 flac__utils_printf(stderr, 1, " Make sure to upload the FLAC file and use the \"Monitor\" feature to\n");
2619 flac__utils_printf(stderr, 1, " monitor the bug status.\n");
2620 flac__utils_printf(stderr, 1, "Verify FAILED! Do not trust %s\n", e->outfilename);
2623 FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn)
2625 size_t bytes_read = fread(buf, 1, n, f);
2627 if(bytes_read == 0) {
2629 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2635 if(bytes_read < n) {
2636 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2642 FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn)
2644 if(!read_bytes(f, (FLAC__byte*)val, 2, /*eof_ok=*/false, fn))
2646 if(is_big_endian_host_ != big_endian) {
2647 FLAC__byte tmp, *b = (FLAC__byte*)val;
2648 tmp = b[1]; b[1] = b[0]; b[0] = tmp;
2653 FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn)
2655 if(!read_bytes(f, (FLAC__byte*)val, 4, /*eof_ok=*/false, fn))
2657 if(is_big_endian_host_ != big_endian) {
2658 FLAC__byte tmp, *b = (FLAC__byte*)val;
2659 tmp = b[3]; b[3] = b[0]; b[0] = tmp;
2660 tmp = b[2]; b[2] = b[1]; b[1] = tmp;
2665 FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn)
2667 if(!read_bytes(f, (FLAC__byte*)val, 8, /*eof_ok=*/false, fn))
2669 if(is_big_endian_host_ != big_endian) {
2670 FLAC__byte tmp, *b = (FLAC__byte*)val;
2671 tmp = b[7]; b[7] = b[0]; b[0] = tmp;
2672 tmp = b[6]; b[6] = b[1]; b[1] = tmp;
2673 tmp = b[5]; b[5] = b[2]; b[2] = tmp;
2674 tmp = b[4]; b[4] = b[3]; b[3] = tmp;
2679 FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn)
2680 /* Read an IEEE 754 80-bit (aka SANE) extended floating point value from 'f',
2681 * convert it into an integral value and store in 'val'. Return false if only
2682 * between 1 and 9 bytes remain in 'f', if 0 bytes remain in 'f', or if the
2683 * value is negative, between zero and one, or too large to be represented by
2684 * 'val'; return true otherwise.
2693 if(!read_bytes(f, buf, sizeof(buf), /*eof_ok=*/false, fn))
2695 e = ((FLAC__uint16)(buf[0])<<8 | (FLAC__uint16)(buf[1]))-0x3FFF;
2697 if((buf[0]>>7)==1U || e<0 || e>63) {
2698 flac__utils_printf(stderr, 1, "%s: ERROR: invalid floating-point value\n", fn);
2702 for(i = 0; i < 8; ++i)
2703 p |= (FLAC__uint64)(buf[i+2])<<(56U-i*8);
2704 *val = (FLAC__uint32)((p>>shift)+(p>>(shift-1) & 0x1));
2709 FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset)
2711 static unsigned char dump[8192];
2715 /* MS' stdio impl can't even seek forward on stdin, have to use pure non-fseek() version: */
2717 const long need = (long)min(offset, sizeof(dump));
2718 if((long)fread(dump, 1, need, f) < need)
2727 long need = (long)min(offset, LONG_MAX);
2728 if(fseeko(f, need, SEEK_CUR) < 0) {
2729 need = (long)min(offset, sizeof(dump));
2730 if((long)fread(dump, 1, need, f) < need)
2739 unsigned count_channel_mask_bits(FLAC__uint32 mask)
2751 FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels)
2753 FLAC__uint32 x = 0x80000000;
2754 unsigned count = count_channel_mask_bits(mask);
2755 while(x && count > channels) {
2762 FLAC__ASSERT(count_channel_mask_bits(mask) == channels);