1 /* flac - Command-line FLAC encoder/decoder
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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 #define CHUNK_OF_SAMPLES 2048
62 unsigned bits_per_sample; /* width of sample point, including 'shift' bits, valid bps is bits_per_sample-shift */
63 unsigned shift; /* # of LSBs samples have been shifted left by */
64 unsigned bytes_per_wide_sample; /* for convenience, always == channels*((bps+7)/8), or 0 if N/A to input format (like FLAC) */
65 FLAC__bool is_unsigned_samples;
66 FLAC__bool is_big_endian;
67 FLAC__uint32 channel_mask;
70 /* this is the client_data attached to the FLAC decoder when encoding from a FLAC file */
73 const FLAC__byte *lookahead;
74 unsigned lookahead_length;
75 size_t num_metadata_blocks;
76 FLAC__StreamMetadata *metadata_blocks[1024]; /*@@@ BAD MAGIC number */
77 FLAC__uint64 samples_left_to_process;
78 FLAC__bool fatal_error;
87 FLAC__bool outputfile_opened; /* true if we successfully opened the output file and we want it to be deleted if there is an error */
88 const char *inbasefilename;
89 const char *infilename;
90 const char *outfilename;
92 FLAC__bool treat_warnings_as_errors;
93 FLAC__bool continue_through_decode_errors;
94 FLAC__bool replay_gain;
95 FLAC__uint64 total_samples_to_encode; /* (i.e. "wide samples" aka "sample frames") WATCHOUT: may be 0 to mean 'unknown' */
96 FLAC__uint64 unencoded_size; /* an estimate of the input size, only used in the progress indicator */
97 FLAC__uint64 bytes_written;
98 FLAC__uint64 samples_written;
110 FLAC__StreamDecoder *decoder;
111 FLACDecoderData client_data;
115 FLAC__StreamEncoder *encoder;
118 FLAC__StreamMetadata *seek_table_template;
121 const int FLAC_ENCODE__DEFAULT_PADDING = 8192;
123 static FLAC__bool is_big_endian_host_;
125 static unsigned char ucbuffer_[CHUNK_OF_SAMPLES*FLAC__MAX_CHANNELS*((FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE+7)/8)];
126 static signed char *scbuffer_ = (signed char *)ucbuffer_;
127 static FLAC__uint16 *usbuffer_ = (FLAC__uint16 *)ucbuffer_;
128 static FLAC__int16 *ssbuffer_ = (FLAC__int16 *)ucbuffer_;
130 static FLAC__int32 in_[FLAC__MAX_CHANNELS][CHUNK_OF_SAMPLES];
131 static FLAC__int32 *input_[FLAC__MAX_CHANNELS];
135 * unpublished debug routines from the FLAC libs
137 extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
138 extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
139 extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
140 extern FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value);
145 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);
146 static void EncoderSession_destroy(EncoderSession *e);
147 static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata);
148 static int EncoderSession_finish_error(EncoderSession *e);
149 static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options);
150 static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
151 static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
152 static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
153 static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
154 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);
155 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);
156 static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
157 static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
158 static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
159 static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
160 static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
161 static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
162 static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
163 static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
164 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);
165 static void print_stats(const EncoderSession *encoder_session);
166 static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
167 static void print_error_with_state(const EncoderSession *e, const char *message);
168 static void print_verify_error(EncoderSession *e);
169 static FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn);
170 static FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn);
171 static FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn);
172 static FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn);
173 static FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset);
174 static unsigned count_channel_mask_bits(FLAC__uint32 mask);
176 static FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels);
179 static FLAC__bool get_sample_info_raw(EncoderSession *e, encode_options_t options)
181 e->info.sample_rate = options.format_options.raw.sample_rate;
182 e->info.channels = options.format_options.raw.channels;
183 e->info.bits_per_sample = options.format_options.raw.bps;
185 e->info.bytes_per_wide_sample = options.format_options.raw.channels * ((options.format_options.raw.bps+7)/8);
186 e->info.is_unsigned_samples = options.format_options.raw.is_unsigned_samples;
187 e->info.is_big_endian = options.format_options.raw.is_big_endian;
188 e->info.channel_mask = 0;
193 static FLAC__bool get_sample_info_wave(EncoderSession *e, encode_options_t options)
195 FLAC__bool got_fmt_chunk = false, got_data_chunk = false;
196 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
197 FLAC__uint32 channel_mask = 0;
198 size_t data_bytes = 0;
200 e->info.is_unsigned_samples = false;
201 e->info.is_big_endian = false;
204 * lookahead[] already has "RIFFxxxxWAVE", do "fmt" chunk and beginning of "data" chunk
206 while(!feof(e->fin) && !got_data_chunk) {
207 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 */
208 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
209 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
215 if(!memcmp(chunk_id, "fmt ", 4)) { /* format chunk */
218 FLAC__uint16 wFormatTag; /* wFormatTag word from the 'fmt ' chunk */
219 unsigned block_align;
222 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'fmt ' chunks\n", e->inbasefilename);
227 * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
228 * http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
229 * 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
233 * 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
235 * 4 byte: sample rate (Hz)
236 * 4 byte: avg bytes per sec
237 * 2 byte: block align
238 * 2 byte: bits per sample (not necessarily all significant)
240 * 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
241 * WAVEFORMATEXTENSIBLE adds
242 * 2 byte: valid bits per sample
243 * 4 byte: channel mask
244 * 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
246 * Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
247 * 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.
249 * Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
251 * If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
252 * If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
254 * Data is supposed to be unsigned for bps <= 8 else signed.
258 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
261 if(data_bytes < 16) {
262 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'fmt ' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
267 if(!read_uint16(e->fin, /*big_endian=*/false, &wFormatTag, e->inbasefilename))
269 if(wFormatTag != 1 /*WAVE_FORMAT_PCM*/ && wFormatTag != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
270 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", e->inbasefilename, (unsigned)wFormatTag);
274 /* number of channels */
275 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
277 channels = (unsigned)x;
280 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
284 /* avg bytes per second (ignored) */
285 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
288 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
290 block_align = (unsigned)x;
291 /* bits per sample */
292 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
296 e->info.is_unsigned_samples = (bps <= 8);
298 if(wFormatTag == 1) {
299 if(bps != 8 && bps != 16) {
300 if(bps == 24 || bps == 32) {
301 /* let these slide with a warning since they're unambiguous */
302 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);
303 if(e->treat_warnings_as_errors)
307 /* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
308 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);
312 #if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
313 if((bps+7)/8 * channels == block_align) {
315 /* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
316 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);
317 if(e->treat_warnings_as_errors)
319 shift = 8 - (bps % 8);
326 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);
332 if(channels > 2 && !options.channel_map_none) {
333 flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", e->inbasefilename);
336 FLAC__ASSERT(data_bytes >= 16);
340 if(data_bytes < 40) {
341 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", e->inbasefilename, (unsigned)data_bytes);
345 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
348 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", e->inbasefilename, (unsigned)x);
352 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
354 if((unsigned)x > bps) {
355 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", e->inbasefilename, (unsigned)x, bps);
358 shift = bps - (unsigned)x;
360 if(!read_uint32(e->fin, /*big_endian=*/false, &channel_mask, e->inbasefilename))
362 /* for mono/stereo and unassigned channels, we fake the mask */
363 if(channel_mask == 0) {
365 channel_mask = 0x0001;
366 else if(channels == 2)
367 channel_mask = 0x0003;
369 /* set channel mapping */
370 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
371 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
372 /* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
374 /* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
376 options.channel_map_none ||
377 channel_mask == 0x0001 || /* 1 channel: (mono) */
378 channel_mask == 0x0003 || /* 2 channels: front left, front right */
379 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
380 channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
382 /* keep default channel order */
385 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
386 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
387 channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
389 /* to dolby order: front left, center, front right [, surround left, surround right ] */
394 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
395 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
397 /* to dolby order: front left, center, front right, surround left, surround right, LFE */
406 options.channel_map_none ||
407 channel_mask == 0x0001 || /* 1 channel: (mono) */
408 channel_mask == 0x0003 || /* 2 channels: front left, front right */
409 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
410 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
411 channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
412 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
413 channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
414 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
415 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
417 /* keep default channel order */
421 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);
424 if(!options.channel_map_none) {
425 if(count_channel_mask_bits(channel_mask) < channels) {
426 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);
430 /* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
431 * there would be holes in the order that would have to be filled in, or the mask would have to be
432 * limited and the logic above rerun to see if it still fits into the FLAC mapping.
434 else if(count_channel_mask_bits(channel_mask) > channels)
435 channel_mask = limit_channel_mask(channel_mask, channels);
437 else if(count_channel_mask_bits(channel_mask) > channels) {
438 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);
443 /* first part of GUID */
444 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
447 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", e->inbasefilename, (unsigned)x);
453 e->info.bytes_per_wide_sample = channels * (bps / 8);
455 /* skip any extra data in the fmt chunk */
456 if(!fskip_ahead(e->fin, data_bytes)) {
457 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'fmt' data\n", e->inbasefilename);
461 got_fmt_chunk = true;
463 else if(!memcmp(chunk_id, "data", 4)) { /* data chunk */
467 flac__utils_printf(stderr, 1, "%s: ERROR: got 'data' chunk before 'fmt' chunk\n", e->inbasefilename);
472 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
474 if(options.ignore_chunk_sizes) {
475 FLAC__ASSERT(!options.sector_align);
477 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);
478 if(e->treat_warnings_as_errors)
481 data_bytes = (size_t)0 - (size_t)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
485 if(0 == data_bytes) {
486 flac__utils_printf(stderr, 1, "%s: ERROR: 'data' chunk has size of 0\n", e->inbasefilename);
491 e->fmt.iff.data_bytes = data_bytes;
492 e->fmt.iff.pad = (data_bytes & 1) ? true : false;
494 got_data_chunk = true;
499 if(!options.format_options.iff.foreign_metadata) {
500 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
501 if(e->treat_warnings_as_errors)
506 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
509 unsigned long skip = xx + (xx & 1);
511 FLAC__ASSERT(skip <= LONG_MAX);
512 if(!fskip_ahead(e->fin, skip)) {
513 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
521 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find fmt chunk\n", e->inbasefilename);
524 if(!got_data_chunk) {
525 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find data chunk\n", e->inbasefilename);
529 e->info.sample_rate = sample_rate;
530 e->info.channels = channels;
531 e->info.bits_per_sample = bps;
532 e->info.shift = shift;
533 e->info.channel_mask = channel_mask;
538 static FLAC__bool get_sample_info_aiff(EncoderSession *e, encode_options_t options)
540 FLAC__bool got_comm_chunk = false, got_ssnd_chunk = false;
541 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0, sample_frames = 0;
542 FLAC__uint32 channel_mask = 0;
544 e->info.is_unsigned_samples = false;
545 e->info.is_big_endian = true;
548 * lookahead[] already has "FORMxxxxAIFF", do chunks
550 while(!feof(e->fin) && !got_ssnd_chunk) {
551 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 */
552 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
553 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
559 if(!memcmp(chunk_id, "COMM", 4)) { /* common chunk */
563 const FLAC__bool is_aifc = options.format == FORMAT_AIFF_C;
564 const FLAC__uint32 minimum_comm_size = (is_aifc? 22 : 18);
567 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'COMM' chunks\n", e->inbasefilename);
571 /* COMM chunk size */
572 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
574 else if(xx < minimum_comm_size) {
575 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);
578 else if(!is_aifc && xx != minimum_comm_size) {
579 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);
580 if(e->treat_warnings_as_errors)
583 skip = (xx-minimum_comm_size)+(xx & 1);
585 /* number of channels */
586 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
588 channels = (unsigned)x;
589 if(channels > 2 && !options.channel_map_none) {
590 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number channels %u for AIFF\n", e->inbasefilename, channels);
594 /* number of sample frames */
595 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
599 /* bits per sample */
600 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
603 shift = (bps%8)? 8-(bps%8) : 0; /* SSND data is always byte-aligned, left-justified but format_input() will double-check */
607 if(!read_sane_extended(e->fin, &xx, e->inbasefilename))
611 /* check compression type for AIFF-C */
613 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
615 if(xx == 0x736F7774) /* "sowt" */
616 e->info.is_big_endian = false;
617 else if(xx == 0x4E4F4E45) /* "NONE" */
618 ; /* nothing to do, we already default to big-endian */
620 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));
625 /* set channel mapping */
626 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
627 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
628 /* specs say the channel ordering is:
630 * ___________________________________________________
634 * quad (ambiguous with 4ch) Fl Fr Bl Br
637 * 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
638 * so we only have unambiguous mappings for 2, 3, and 5 channels
641 options.channel_map_none ||
642 channels == 1 || /* 1 channel: (mono) */
643 channels == 2 || /* 2 channels: left, right */
644 channels == 3 || /* 3 channels: left, right, center */
645 channels == 5 /* 5 channels: front left, front right, center, surround left, surround right */
647 /* keep default channel order */
650 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number channels %u for AIFF\n", e->inbasefilename, channels);
654 e->info.bytes_per_wide_sample = channels * (bps / 8);
656 /* skip any extra data in the COMM chunk */
657 if(!fskip_ahead(e->fin, skip)) {
658 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra COMM data\n", e->inbasefilename);
662 got_comm_chunk = true;
664 else if(!memcmp(chunk_id, "SSND", 4) && !got_ssnd_chunk) { /* sound data chunk */
666 unsigned offset = 0, block_size = 0, data_bytes;
668 if(!got_comm_chunk) {
669 flac__utils_printf(stderr, 1, "%s: ERROR: got 'SSND' chunk before 'COMM' chunk\n", e->inbasefilename);
673 /* SSND chunk size */
674 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
676 if(options.ignore_chunk_sizes) {
677 FLAC__ASSERT(!options.sector_align);
679 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);
680 if(e->treat_warnings_as_errors)
683 data_bytes = (size_t)0 - (size_t)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
687 data_bytes -= 8; /* discount the offset and block size fields */
689 e->fmt.iff.pad = (data_bytes & 1) ? true : false;
692 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
695 data_bytes -= offset;
698 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
701 flac__utils_printf(stderr, 1, "%s: ERROR: block size is %u; must be 0\n", e->inbasefilename, (unsigned)xx);
706 /* skip any SSND offset bytes */
707 if(!fskip_ahead(e->fin, offset)) {
708 flac__utils_printf(stderr, 1, "%s: ERROR: skipping offset in SSND chunk\n", e->inbasefilename);
711 if(data_bytes != (sample_frames * e->info.bytes_per_wide_sample)) {
712 flac__utils_printf(stderr, 1, "%s: ERROR: SSND chunk size inconsistent with sample frame count\n", e->inbasefilename);
716 e->fmt.iff.data_bytes = data_bytes;
718 got_ssnd_chunk = true;
722 if(!options.format_options.iff.foreign_metadata) {
723 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
724 if(e->treat_warnings_as_errors)
729 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
732 unsigned long skip = xx + (xx & 1);
734 FLAC__ASSERT(skip <= LONG_MAX);
735 if(!fskip_ahead(e->fin, skip)) {
736 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
743 if(!got_comm_chunk) {
744 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find COMM chunk\n", e->inbasefilename);
747 if(!got_ssnd_chunk && sample_frames) {
748 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find SSND chunk\n", e->inbasefilename);
752 e->info.sample_rate = sample_rate;
753 e->info.channels = channels;
754 e->info.bits_per_sample = bps;
755 e->info.shift = shift;
756 e->info.channel_mask = channel_mask;
761 static FLAC__bool get_sample_info_flac(EncoderSession *e, encode_options_t options)
764 FLAC__stream_decoder_set_md5_checking(e->fmt.flac.decoder, false) &&
765 FLAC__stream_decoder_set_metadata_respond_all(e->fmt.flac.decoder)
767 flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", e->inbasefilename);
771 if (options.format == FORMAT_OGGFLAC) {
772 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) {
773 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));
777 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) {
778 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));
782 if (!FLAC__stream_decoder_process_until_end_of_metadata(e->fmt.flac.decoder) || e->fmt.flac.client_data.fatal_error) {
783 if (e->fmt.flac.client_data.fatal_error)
784 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", e->inbasefilename);
786 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));
790 if (e->fmt.flac.client_data.num_metadata_blocks == 0) {
791 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", e->inbasefilename);
794 else if (e->fmt.flac.client_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
795 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", e->inbasefilename);
798 else if (e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
799 flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", e->inbasefilename);
803 e->info.sample_rate = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.sample_rate;
804 e->info.channels = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.channels;
805 e->info.bits_per_sample = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.bits_per_sample;
807 e->info.bytes_per_wide_sample = 0;
808 e->info.is_unsigned_samples = false; /* not applicable for FLAC input */
809 e->info.is_big_endian = false; /* not applicable for FLAC input */
810 e->info.channel_mask = 0;
818 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)
820 EncoderSession encoder_session;
821 size_t channel_map[FLAC__MAX_CHANNELS];
822 int info_align_carry = -1, info_align_zero = -1;
824 if(!EncoderSession_construct(&encoder_session, options, infilesize, infile, infilename, outfilename, lookahead, lookahead_length))
827 /* initialize default channel map that preserves channel order */
830 for(i = 0; i < sizeof(channel_map)/sizeof(channel_map[0]); i++)
834 /* read foreign metadata if requested */
836 (options.format == FORMAT_WAVE || options.format == FORMAT_AIFF || options.format == FORMAT_AIFF_C) &&
837 options.format_options.iff.foreign_metadata
841 options.format == FORMAT_WAVE?
842 flac__foreign_metadata_read_from_wave(options.format_options.iff.foreign_metadata, infilename, &error) :
843 flac__foreign_metadata_read_from_aiff(options.format_options.iff.foreign_metadata, infilename, &error)
845 flac__utils_printf(stderr, 1, "%s: ERROR reading foreign metadata: %s\n", encoder_session.inbasefilename, error);
846 return EncoderSession_finish_error(&encoder_session);
850 /* initialize encoder session with info about the audio (channels/bps/resolution/endianness/etc) */
851 switch(options.format) {
853 if(!get_sample_info_raw(&encoder_session, options))
854 return EncoderSession_finish_error(&encoder_session);
857 if(!get_sample_info_wave(&encoder_session, options))
858 return EncoderSession_finish_error(&encoder_session);
862 if(!get_sample_info_aiff(&encoder_session, options))
863 return EncoderSession_finish_error(&encoder_session);
868 * set up FLAC decoder for the input
870 if (0 == (encoder_session.fmt.flac.decoder = FLAC__stream_decoder_new())) {
871 flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
872 return EncoderSession_finish_error(&encoder_session);
874 if(!get_sample_info_flac(&encoder_session, options))
875 return EncoderSession_finish_error(&encoder_session);
879 /* double protection */
880 return EncoderSession_finish_error(&encoder_session);
883 /* some more checks */
884 if(encoder_session.info.channels == 0 || encoder_session.info.channels > FLAC__MAX_CHANNELS) {
885 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, encoder_session.info.channels);
886 return EncoderSession_finish_error(&encoder_session);
888 if(!FLAC__format_sample_rate_is_valid(encoder_session.info.sample_rate)) {
889 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
890 return EncoderSession_finish_error(&encoder_session);
892 if(encoder_session.info.bits_per_sample-encoder_session.info.shift < 4 || encoder_session.info.bits_per_sample-encoder_session.info.shift > 24) {
893 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);
894 return EncoderSession_finish_error(&encoder_session);
896 if(options.sector_align) {
897 if(encoder_session.info.channels != 2) {
898 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);
899 return EncoderSession_finish_error(&encoder_session);
901 if(encoder_session.info.sample_rate != 44100) {
902 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);
903 return EncoderSession_finish_error(&encoder_session);
905 if(encoder_session.info.bits_per_sample-encoder_session.info.shift != 16) {
906 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);
907 return EncoderSession_finish_error(&encoder_session);
912 FLAC__uint64 total_samples_in_input; /* WATCHOUT: may be 0 to mean "unknown" */
914 FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
915 unsigned align_remainder = 0;
917 switch(options.format) {
920 total_samples_in_input = 0;
922 total_samples_in_input = (FLAC__uint64)infilesize / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
927 total_samples_in_input = encoder_session.fmt.iff.data_bytes / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
931 total_samples_in_input = encoder_session.fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples + *options.align_reservoir_samples;
935 /* double protection */
936 return EncoderSession_finish_error(&encoder_session);
940 * now that we know the sample rate, canonicalize the
941 * --skip string to an absolute sample number:
943 flac__utils_canonicalize_skip_until_specification(&options.skip_specification, encoder_session.info.sample_rate);
944 FLAC__ASSERT(options.skip_specification.value.samples >= 0);
945 skip = (FLAC__uint64)options.skip_specification.value.samples;
946 FLAC__ASSERT(!options.sector_align || (options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC && skip == 0));
947 /* *options.align_reservoir_samples will be 0 unless --sector-align is used */
948 FLAC__ASSERT(options.sector_align || *options.align_reservoir_samples == 0);
951 * now that we possibly know the input size, canonicalize the
952 * --until string to an absolute sample number:
954 if(!canonicalize_until_specification(&options.until_specification, encoder_session.inbasefilename, encoder_session.info.sample_rate, skip, total_samples_in_input))
955 return EncoderSession_finish_error(&encoder_session);
956 until = (FLAC__uint64)options.until_specification.value.samples;
957 FLAC__ASSERT(!options.sector_align || until == 0);
959 /* adjust encoding parameters based on skip and until values */
960 switch(options.format) {
962 infilesize -= (off_t)skip * encoder_session.info.bytes_per_wide_sample;
963 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
968 encoder_session.fmt.iff.data_bytes -= (unsigned)skip * encoder_session.info.bytes_per_wide_sample; /*@@@ WATCHOUT: 4GB limit */
969 if(options.ignore_chunk_sizes) {
970 encoder_session.total_samples_to_encode = 0;
971 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
972 FLAC__ASSERT(0 == until);
975 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
980 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
984 /* double protection */
985 return EncoderSession_finish_error(&encoder_session);
988 const FLAC__uint64 trim = total_samples_in_input - until;
989 FLAC__ASSERT(total_samples_in_input > 0);
990 FLAC__ASSERT(!options.sector_align);
991 if(options.format == FORMAT_RAW)
992 infilesize -= (off_t)trim * encoder_session.info.bytes_per_wide_sample;
993 else if(options.format == FORMAT_WAVE || options.format == FORMAT_AIFF || options.format == FORMAT_AIFF_C)
994 encoder_session.fmt.iff.data_bytes -= (unsigned)trim * encoder_session.info.bytes_per_wide_sample;
995 encoder_session.total_samples_to_encode -= trim;
997 if(options.sector_align && (options.format != FORMAT_RAW || infilesize >=0)) { /* for RAW, need to know the filesize */
998 FLAC__ASSERT(skip == 0); /* asserted above too, but lest we forget */
999 align_remainder = (unsigned)(encoder_session.total_samples_to_encode % 588);
1000 if(options.is_last_file)
1001 encoder_session.total_samples_to_encode += (588-align_remainder); /* will pad with zeroes */
1003 encoder_session.total_samples_to_encode -= align_remainder; /* will stop short and carry over to next file */
1005 switch(options.format) {
1007 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample;
1010 /* +44 for the size of the WAV headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1011 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 44;
1015 /* +54 for the size of the WAV headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1016 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 54;
1019 case FORMAT_OGGFLAC:
1021 /* if we don't know, use 0 as hint to progress indicator (which is the only place this is used): */
1022 encoder_session.unencoded_size = 0;
1023 else if(skip == 0 && until == 0)
1024 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1025 else if(total_samples_in_input)
1026 encoder_session.unencoded_size = (FLAC__uint64)infilesize * encoder_session.total_samples_to_encode / total_samples_in_input;
1028 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1032 /* double protection */
1033 return EncoderSession_finish_error(&encoder_session);
1036 if(encoder_session.total_samples_to_encode == 0)
1037 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1039 if(options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)
1040 encoder_session.fmt.flac.client_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1042 /* init the encoder */
1043 if(!EncoderSession_init_encoder(&encoder_session, options))
1044 return EncoderSession_finish_error(&encoder_session);
1046 /* skip over any samples as requested */
1048 switch(options.format) {
1051 unsigned skip_bytes = encoder_session.info.bytes_per_wide_sample * (unsigned)skip;
1052 if(skip_bytes > lookahead_length) {
1053 skip_bytes -= lookahead_length;
1054 lookahead_length = 0;
1055 if(!fskip_ahead(encoder_session.fin, skip_bytes)) {
1056 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1057 return EncoderSession_finish_error(&encoder_session);
1061 lookahead += skip_bytes;
1062 lookahead_length -= skip_bytes;
1069 if(!fskip_ahead(encoder_session.fin, skip * encoder_session.info.bytes_per_wide_sample)) {
1070 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1071 return EncoderSession_finish_error(&encoder_session);
1075 case FORMAT_OGGFLAC:
1077 * have to wait until the FLAC encoder is set up for writing
1078 * before any seeking in the input FLAC file, because the seek
1079 * itself will usually call the decoder's write callback, and
1080 * our decoder's write callback passes samples to our FLAC
1083 if(!FLAC__stream_decoder_seek_absolute(encoder_session.fmt.flac.decoder, skip)) {
1084 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));
1085 return EncoderSession_finish_error(&encoder_session);
1090 /* double protection */
1091 return EncoderSession_finish_error(&encoder_session);
1096 * first do any samples in the reservoir
1098 if(options.sector_align && *options.align_reservoir_samples > 0) {
1099 FLAC__ASSERT(options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC); /* check again */
1100 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)options.align_reservoir, *options.align_reservoir_samples)) {
1101 print_error_with_state(&encoder_session, "ERROR during encoding");
1102 return EncoderSession_finish_error(&encoder_session);
1107 * decrement infilesize or the data_bytes counter if we need to align the file
1109 if(options.sector_align) {
1110 if(options.is_last_file) {
1111 *options.align_reservoir_samples = 0;
1114 *options.align_reservoir_samples = align_remainder;
1115 if(options.format == FORMAT_RAW) {
1116 FLAC__ASSERT(infilesize >= 0);
1117 infilesize -= (off_t)((*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample);
1118 FLAC__ASSERT(infilesize >= 0);
1120 else if(options.format == FORMAT_WAVE || options.format == FORMAT_AIFF || options.format == FORMAT_AIFF_C)
1121 encoder_session.fmt.iff.data_bytes -= (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample;
1126 * now do samples from the file
1128 switch(options.format) {
1130 if(infilesize < 0) {
1132 while(!feof(infile)) {
1133 if(lookahead_length > 0) {
1134 FLAC__ASSERT(lookahead_length < CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1135 memcpy(ucbuffer_, lookahead, lookahead_length);
1136 bytes_read = fread(ucbuffer_+lookahead_length, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample - lookahead_length, infile) + lookahead_length;
1137 if(ferror(infile)) {
1138 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1139 return EncoderSession_finish_error(&encoder_session);
1141 lookahead_length = 0;
1144 bytes_read = fread(ucbuffer_, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample, infile);
1146 if(bytes_read == 0) {
1147 if(ferror(infile)) {
1148 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1149 return EncoderSession_finish_error(&encoder_session);
1152 else if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1153 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1154 return EncoderSession_finish_error(&encoder_session);
1157 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1158 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))
1159 return EncoderSession_finish_error(&encoder_session);
1161 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1162 print_error_with_state(&encoder_session, "ERROR during encoding");
1163 return EncoderSession_finish_error(&encoder_session);
1170 const FLAC__uint64 max_input_bytes = infilesize;
1171 FLAC__uint64 total_input_bytes_read = 0;
1172 while(total_input_bytes_read < max_input_bytes) {
1174 size_t wanted = (CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1175 wanted = (size_t) min((FLAC__uint64)wanted, max_input_bytes - total_input_bytes_read);
1177 if(lookahead_length > 0) {
1178 FLAC__ASSERT(lookahead_length <= wanted);
1179 memcpy(ucbuffer_, lookahead, lookahead_length);
1180 wanted -= lookahead_length;
1181 bytes_read = lookahead_length;
1183 bytes_read += fread(ucbuffer_+lookahead_length, sizeof(unsigned char), wanted, infile);
1184 if(ferror(infile)) {
1185 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1186 return EncoderSession_finish_error(&encoder_session);
1189 lookahead_length = 0;
1192 bytes_read = fread(ucbuffer_, sizeof(unsigned char), wanted, infile);
1195 if(bytes_read == 0) {
1196 if(ferror(infile)) {
1197 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1198 return EncoderSession_finish_error(&encoder_session);
1200 else if(feof(infile)) {
1201 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);
1202 if(encoder_session.treat_warnings_as_errors)
1203 return EncoderSession_finish_error(&encoder_session);
1204 total_input_bytes_read = max_input_bytes;
1208 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1209 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1210 return EncoderSession_finish_error(&encoder_session);
1213 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1214 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))
1215 return EncoderSession_finish_error(&encoder_session);
1217 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1218 print_error_with_state(&encoder_session, "ERROR during encoding");
1219 return EncoderSession_finish_error(&encoder_session);
1221 total_input_bytes_read += bytes_read;
1230 while(encoder_session.fmt.iff.data_bytes > 0) {
1231 size_t bytes_read = fread(ucbuffer_, sizeof(unsigned char), min(encoder_session.fmt.iff.data_bytes, CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample), infile);
1232 if(bytes_read == 0) {
1233 if(ferror(infile)) {
1234 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1235 return EncoderSession_finish_error(&encoder_session);
1237 else if(feof(infile)) {
1238 if(options.ignore_chunk_sizes) {
1239 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);
1242 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);
1243 if(encoder_session.treat_warnings_as_errors)
1244 return EncoderSession_finish_error(&encoder_session);
1246 encoder_session.fmt.iff.data_bytes = 0;
1250 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1251 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1252 return EncoderSession_finish_error(&encoder_session);
1255 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1256 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))
1257 return EncoderSession_finish_error(&encoder_session);
1259 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1260 print_error_with_state(&encoder_session, "ERROR during encoding");
1261 return EncoderSession_finish_error(&encoder_session);
1263 encoder_session.fmt.iff.data_bytes -= bytes_read;
1269 case FORMAT_OGGFLAC:
1270 while(!encoder_session.fmt.flac.client_data.fatal_error && encoder_session.fmt.flac.client_data.samples_left_to_process > 0) {
1271 /* We can also hit the end of stream without samples_left_to_process
1272 * going to 0 if there are errors and continue_through_decode_errors
1273 * is on, so we want to break in that case too:
1275 if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(encoder_session.fmt.flac.decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1277 if(!FLAC__stream_decoder_process_single(encoder_session.fmt.flac.decoder)) {
1278 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));
1279 return EncoderSession_finish_error(&encoder_session);
1282 if(encoder_session.fmt.flac.client_data.fatal_error) {
1283 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));
1284 return EncoderSession_finish_error(&encoder_session);
1289 /* double protection */
1290 return EncoderSession_finish_error(&encoder_session);
1294 * now read unaligned samples into reservoir or pad with zeroes if necessary
1296 if(options.sector_align) {
1297 if(options.is_last_file) {
1298 unsigned wide_samples = 588 - align_remainder;
1299 if(wide_samples < 588) {
1302 info_align_zero = wide_samples;
1303 for(channel = 0; channel < encoder_session.info.channels; channel++)
1304 memset(input_[channel], 0, sizeof(input_[0][0]) * wide_samples);
1306 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1307 print_error_with_state(&encoder_session, "ERROR during encoding");
1308 return EncoderSession_finish_error(&encoder_session);
1313 if(*options.align_reservoir_samples > 0) {
1315 FLAC__ASSERT(CHUNK_OF_SAMPLES >= 588);
1316 bytes_read = fread(ucbuffer_, sizeof(unsigned char), (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample, infile);
1317 if(bytes_read == 0 && ferror(infile)) {
1318 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1319 return EncoderSession_finish_error(&encoder_session);
1321 else if(bytes_read != (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample) {
1322 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);
1323 if(encoder_session.treat_warnings_as_errors)
1324 return EncoderSession_finish_error(&encoder_session);
1327 info_align_carry = *options.align_reservoir_samples;
1328 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))
1329 return EncoderSession_finish_error(&encoder_session);
1336 return EncoderSession_finish_ok(
1340 (options.format == FORMAT_WAVE || options.format == FORMAT_AIFF || options.format == FORMAT_AIFF_C)? options.format_options.iff.foreign_metadata : 0
1344 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)
1347 FLAC__uint32 test = 1;
1350 * initialize globals
1353 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
1355 for(i = 0; i < FLAC__MAX_CHANNELS; i++)
1356 input_[i] = &(in_[i][0]);
1360 * initialize instance
1364 e->use_ogg = options.use_ogg;
1366 e->verify = options.verify;
1367 e->treat_warnings_as_errors = options.treat_warnings_as_errors;
1368 e->continue_through_decode_errors = options.continue_through_decode_errors;
1370 e->is_stdout = (0 == strcmp(outfilename, "-"));
1371 e->outputfile_opened = false;
1373 e->inbasefilename = grabbag__file_get_basename(infilename);
1374 e->infilename = infilename;
1375 e->outfilename = outfilename;
1377 e->total_samples_to_encode = 0;
1378 e->unencoded_size = 0;
1379 e->bytes_written = 0;
1380 e->samples_written = 0;
1383 memset(&e->info, 0, sizeof(e->info));
1385 e->format = options.format;
1387 switch(options.format) {
1393 e->fmt.iff.data_bytes = 0;
1397 case FORMAT_OGGFLAC:
1398 e->fmt.flac.decoder = 0;
1399 e->fmt.flac.client_data.filesize = infilesize;
1400 e->fmt.flac.client_data.lookahead = lookahead;
1401 e->fmt.flac.client_data.lookahead_length = lookahead_length;
1402 e->fmt.flac.client_data.num_metadata_blocks = 0;
1403 e->fmt.flac.client_data.samples_left_to_process = 0;
1404 e->fmt.flac.client_data.fatal_error = false;
1408 /* double protection */
1415 e->seek_table_template = 0;
1417 if(0 == (e->seek_table_template = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE))) {
1418 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1422 e->encoder = FLAC__stream_encoder_new();
1423 if(0 == e->encoder) {
1424 flac__utils_printf(stderr, 1, "%s: ERROR creating the encoder instance\n", e->inbasefilename);
1425 EncoderSession_destroy(e);
1432 void EncoderSession_destroy(EncoderSession *e)
1437 if(0 != e->encoder) {
1438 FLAC__stream_encoder_delete(e->encoder);
1442 if(0 != e->seek_table_template) {
1443 FLAC__metadata_object_delete(e->seek_table_template);
1444 e->seek_table_template = 0;
1448 int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata)
1450 FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
1452 FLAC__bool verify_error = false;
1454 /*@@@ can this go in EncoderSession_destroy()? it's duplicated in EncoderSession_finish_error() */
1455 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1457 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1458 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1459 e->fmt.flac.client_data.num_metadata_blocks = 0;
1460 if(e->fmt.flac.decoder)
1461 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1462 e->fmt.flac.decoder = 0;
1466 fse_state = FLAC__stream_encoder_get_state(e->encoder);
1467 ret = FLAC__stream_encoder_finish(e->encoder)? 0 : 1;
1469 fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA ||
1470 FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
1473 /* all errors except verify errors should interrupt the stats */
1474 if(ret && !verify_error)
1475 print_error_with_state(e, "ERROR during encoding");
1476 else if(e->total_samples_to_encode > 0) {
1478 flac__utils_printf(stderr, 2, "\n");
1482 print_verify_error(e);
1486 if(info_align_carry >= 0) {
1487 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
1489 if(info_align_zero >= 0) {
1490 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
1494 /*@@@@@@ should this go here or somewhere else? */
1495 if(ret == 0 && foreign_metadata) {
1497 if(!flac__foreign_metadata_write_to_flac(foreign_metadata, e->infilename, e->outfilename, &error)) {
1498 flac__utils_printf(stderr, 1, "%s: ERROR: updating foreign metadata in FLAC file: %s\n", e->inbasefilename, error);
1503 EncoderSession_destroy(e);
1508 int EncoderSession_finish_error(EncoderSession *e)
1510 FLAC__ASSERT(e->encoder);
1512 /*@@@ can this go in EncoderSession_destroy()? it's duplicated in EncoderSession_finish_ok() */
1513 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1515 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1516 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1517 e->fmt.flac.client_data.num_metadata_blocks = 0;
1518 if(e->fmt.flac.decoder)
1519 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1520 e->fmt.flac.decoder = 0;
1523 if(e->total_samples_to_encode > 0)
1524 flac__utils_printf(stderr, 2, "\n");
1526 if(FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1527 print_verify_error(e);
1528 else if(e->outputfile_opened)
1529 /* only want to delete the file if we opened it; otherwise it could be an existing file and our overwrite failed */
1530 unlink(e->outfilename);
1532 EncoderSession_destroy(e);
1538 unsigned num_metadata;
1539 FLAC__bool *needs_delete;
1540 FLAC__StreamMetadata **metadata;
1541 FLAC__StreamMetadata *cuesheet; /* always needs to be deleted */
1542 } static_metadata_t;
1544 static void static_metadata_init(static_metadata_t *m)
1546 m->num_metadata = 0;
1547 m->needs_delete = 0;
1552 static void static_metadata_clear(static_metadata_t *m)
1555 for(i = 0; i < m->num_metadata; i++)
1556 if(m->needs_delete[i])
1557 FLAC__metadata_object_delete(m->metadata[i]);
1561 free(m->needs_delete);
1563 FLAC__metadata_object_delete(m->cuesheet);
1564 static_metadata_init(m);
1567 static FLAC__bool static_metadata_append(static_metadata_t *m, FLAC__StreamMetadata *d, FLAC__bool needs_delete)
1570 if(0 == (x = safe_realloc_muladd2_(m->metadata, sizeof(*m->metadata), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1572 m->metadata = (FLAC__StreamMetadata**)x;
1573 if(0 == (x = safe_realloc_muladd2_(m->needs_delete, sizeof(*m->needs_delete), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1575 m->needs_delete = (FLAC__bool*)x;
1576 m->metadata[m->num_metadata] = d;
1577 m->needs_delete[m->num_metadata] = needs_delete;
1582 FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options)
1584 const unsigned channels = e->info.channels;
1585 const unsigned bps = e->info.bits_per_sample - e->info.shift;
1586 const unsigned sample_rate = e->info.sample_rate;
1587 FLACDecoderData *flac_decoder_data = (options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)? &e->fmt.flac.client_data : 0;
1588 FLAC__StreamMetadata padding;
1589 FLAC__StreamMetadata **metadata = 0;
1590 static_metadata_t static_metadata;
1591 unsigned num_metadata = 0, i;
1592 FLAC__StreamEncoderInitStatus init_status;
1593 const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);
1594 char apodizations[2000];
1596 FLAC__ASSERT(sizeof(options.pictures)/sizeof(options.pictures[0]) <= 64);
1598 static_metadata_init(&static_metadata);
1600 e->replay_gain = options.replay_gain;
1602 apodizations[0] = '\0';
1604 if(e->replay_gain) {
1605 if(channels != 1 && channels != 2) {
1606 flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
1609 if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
1610 flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
1613 if(options.is_first_file) {
1614 if(!grabbag__replaygain_init(sample_rate)) {
1615 flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
1621 if(!parse_cuesheet(&static_metadata.cuesheet, options.cuesheet_filename, e->inbasefilename, is_cdda, e->total_samples_to_encode, e->treat_warnings_as_errors))
1624 if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? static_metadata.cuesheet : 0, e)) {
1625 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1626 static_metadata_clear(&static_metadata);
1630 /* build metadata */
1631 if(flac_decoder_data) {
1633 * we're encoding from FLAC so we will use the FLAC file's
1634 * metadata as the basis for the encoded file
1638 * first handle pictures: simple append any --pictures
1641 for(i = 0; i < options.num_pictures; i++) {
1642 FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1644 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1645 static_metadata_clear(&static_metadata);
1648 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1653 * next handle vorbis comment: if any tags were specified
1654 * or there is no existing vorbis comment, we create a
1655 * new vorbis comment (discarding any existing one); else
1656 * we keep the existing one. also need to make sure to
1657 * propagate any channel mask tag.
1659 /* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1661 FLAC__bool vc_found = false;
1662 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1663 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1665 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1666 (void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &e->info.channel_mask);
1667 flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1668 if(e->treat_warnings_as_errors) {
1669 static_metadata_clear(&static_metadata);
1672 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1673 flac_decoder_data->metadata_blocks[i] = 0;
1676 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1678 flac_decoder_data->num_metadata_blocks = j;
1679 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])) {
1681 FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1682 if(0 == vc || (e->info.channel_mask && !flac__utils_set_channel_mask_tag(vc, e->info.channel_mask))) {
1683 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1684 static_metadata_clear(&static_metadata);
1687 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1688 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1689 flac_decoder_data->metadata_blocks[1] = vc;
1690 flac_decoder_data->num_metadata_blocks++;
1695 * next handle cuesheet: if --cuesheet was specified, use
1696 * it; else if file has existing CUESHEET and cuesheet's
1697 * lead-out offset is correct, keep it; else no CUESHEET
1700 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1701 FLAC__bool existing_cuesheet_is_bad = false;
1702 /* check if existing cuesheet matches the input audio */
1703 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == static_metadata.cuesheet) {
1704 const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1705 if(e->total_samples_to_encode == 0) {
1706 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);
1707 if(e->treat_warnings_as_errors) {
1708 static_metadata_clear(&static_metadata);
1711 existing_cuesheet_is_bad = true;
1713 else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1714 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);
1715 if(e->treat_warnings_as_errors) {
1716 static_metadata_clear(&static_metadata);
1719 existing_cuesheet_is_bad = true;
1722 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != static_metadata.cuesheet)) {
1723 if(0 != static_metadata.cuesheet) {
1724 flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1725 if(e->treat_warnings_as_errors) {
1726 static_metadata_clear(&static_metadata);
1730 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1731 flac_decoder_data->metadata_blocks[i] = 0;
1734 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1736 flac_decoder_data->num_metadata_blocks = j;
1737 if(0 != static_metadata.cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1739 FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(static_metadata.cuesheet);
1741 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1742 static_metadata_clear(&static_metadata);
1745 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1746 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1747 flac_decoder_data->metadata_blocks[1] = cs;
1748 flac_decoder_data->num_metadata_blocks++;
1753 * next handle seektable: if -S- was specified, no
1754 * SEEKTABLE; else if -S was specified, use it/them;
1755 * else if file has existing SEEKTABLE and input size is
1756 * preserved (no --skip/--until/etc specified), keep it;
1757 * else use default seektable options
1759 * note: meanings of num_requested_seek_points:
1760 * -1 : no -S option given, default to some value
1761 * 0 : -S- given (no seektable)
1762 * >0 : one or more -S options given
1765 FLAC__bool existing_seektable = false;
1766 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1767 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1768 existing_seektable = true;
1769 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)) {
1770 if(options.num_requested_seek_points > 0) {
1771 flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1772 if(e->treat_warnings_as_errors) {
1773 static_metadata_clear(&static_metadata);
1777 else if(options.num_requested_seek_points == 0)
1778 ; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1780 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);
1781 if(e->treat_warnings_as_errors) {
1782 static_metadata_clear(&static_metadata);
1786 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1787 flac_decoder_data->metadata_blocks[i] = 0;
1788 existing_seektable = false;
1791 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1793 flac_decoder_data->num_metadata_blocks = j;
1794 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])) {
1796 FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1798 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1799 static_metadata_clear(&static_metadata);
1802 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1803 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1804 flac_decoder_data->metadata_blocks[1] = st;
1805 flac_decoder_data->num_metadata_blocks++;
1810 * finally handle padding: if --no-padding was specified,
1811 * then delete all padding; else if -P was specified,
1812 * use that instead of existing padding (if any); else
1813 * if existing file has padding, move all existing
1814 * padding blocks to one padding block at the end; else
1815 * use default padding.
1819 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1820 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1823 p += flac_decoder_data->metadata_blocks[i]->length;
1824 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1825 flac_decoder_data->metadata_blocks[i] = 0;
1828 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1830 flac_decoder_data->num_metadata_blocks = j;
1831 if(options.padding > 0)
1832 p = options.padding;
1834 p = e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1835 if(options.padding != 0) {
1836 if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1837 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1838 if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1839 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1840 static_metadata_clear(&static_metadata);
1843 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1844 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1845 flac_decoder_data->num_metadata_blocks++;
1849 metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1850 num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1854 * we're not encoding from FLAC so we will build the metadata
1857 const foreign_metadata_t *foreign_metadata = (options.format == FORMAT_WAVE || options.format == FORMAT_AIFF || options.format == FORMAT_AIFF_C)? options.format_options.iff.foreign_metadata : 0;
1859 if(e->seek_table_template->data.seek_table.num_points > 0) {
1860 e->seek_table_template->is_last = false; /* the encoder will set this for us */
1861 static_metadata_append(&static_metadata, e->seek_table_template, /*needs_delete=*/false);
1863 if(0 != static_metadata.cuesheet)
1864 static_metadata_append(&static_metadata, static_metadata.cuesheet, /*needs_delete=*/false);
1865 if(e->info.channel_mask) {
1866 if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, e->info.channel_mask)) {
1867 flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
1868 static_metadata_clear(&static_metadata);
1872 static_metadata_append(&static_metadata, options.vorbis_comment, /*needs_delete=*/false);
1873 for(i = 0; i < options.num_pictures; i++)
1874 static_metadata_append(&static_metadata, options.pictures[i], /*needs_delete=*/false);
1875 if(foreign_metadata) {
1876 for(i = 0; i < foreign_metadata->num_blocks; i++) {
1877 FLAC__StreamMetadata *p = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1879 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory\n", e->inbasefilename);
1880 static_metadata_clear(&static_metadata);
1883 static_metadata_append(&static_metadata, p, /*needs_delete=*/true);
1884 static_metadata.metadata[static_metadata.num_metadata-1]->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8 + foreign_metadata->blocks[i].size;
1885 /*fprintf(stderr,"@@@@@@ add PADDING=%u\n",static_metadata.metadata[static_metadata.num_metadata-1]->length);*/
1888 if(options.padding != 0) {
1889 padding.is_last = false; /* the encoder will set this for us */
1890 padding.type = FLAC__METADATA_TYPE_PADDING;
1891 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));
1892 static_metadata_append(&static_metadata, &padding, /*needs_delete=*/false);
1894 metadata = static_metadata.metadata;
1895 num_metadata = static_metadata.num_metadata;
1898 /* check for a few things that have not already been checked. the
1899 * FLAC__stream_encoder_init*() will check it but only return
1900 * FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
1901 * up front to give a better error message.
1903 if(!verify_metadata(e, metadata, num_metadata)) {
1904 static_metadata_clear(&static_metadata);
1908 FLAC__stream_encoder_set_verify(e->encoder, options.verify);
1909 FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
1910 FLAC__stream_encoder_set_channels(e->encoder, channels);
1911 FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
1912 FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
1913 for(i = 0; i < options.num_compression_settings; i++) {
1914 switch(options.compression_settings[i].type) {
1916 FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[i].value.t_unsigned);
1918 case CST_COMPRESSION_LEVEL:
1919 FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[i].value.t_unsigned);
1920 apodizations[0] = '\0';
1922 case CST_DO_MID_SIDE:
1923 FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
1925 case CST_LOOSE_MID_SIDE:
1926 FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
1928 case CST_APODIZATION:
1929 if(strlen(apodizations)+strlen(options.compression_settings[i].value.t_string)+2 >= sizeof(apodizations)) {
1930 flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
1931 static_metadata_clear(&static_metadata);
1935 strcat(apodizations, options.compression_settings[i].value.t_string);
1936 strcat(apodizations, ";");
1939 case CST_MAX_LPC_ORDER:
1940 FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[i].value.t_unsigned);
1942 case CST_QLP_COEFF_PRECISION:
1943 FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[i].value.t_unsigned);
1945 case CST_DO_QLP_COEFF_PREC_SEARCH:
1946 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[i].value.t_bool);
1948 case CST_DO_ESCAPE_CODING:
1949 FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[i].value.t_bool);
1951 case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
1952 FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[i].value.t_bool);
1954 case CST_MIN_RESIDUAL_PARTITION_ORDER:
1955 FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
1957 case CST_MAX_RESIDUAL_PARTITION_ORDER:
1958 FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
1960 case CST_RICE_PARAMETER_SEARCH_DIST:
1961 FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[i].value.t_unsigned);
1966 FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
1967 FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
1968 FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
1970 FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
1971 FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
1972 FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
1973 if(!options.debug.do_md5) {
1974 flac__utils_printf(stderr, 1, "%s: WARNING, MD5 computation disabled, resulting file will not have MD5 sum\n", e->inbasefilename);
1975 if(e->treat_warnings_as_errors) {
1976 static_metadata_clear(&static_metadata);
1979 FLAC__stream_encoder_set_do_md5(e->encoder, false);
1984 FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
1986 init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
1991 init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
1994 if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
1995 print_error_with_init_status(e, "ERROR initializing encoder", init_status);
1996 if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
1997 e->outputfile_opened = true;
1998 static_metadata_clear(&static_metadata);
2002 e->outputfile_opened = true;
2005 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2006 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
2009 static_metadata_clear(&static_metadata);
2014 FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples)
2016 if(e->replay_gain) {
2017 if(!grabbag__replaygain_analyze(buffer, e->info.channels==2, e->info.bits_per_sample, samples)) {
2018 flac__utils_printf(stderr, 1, "%s: WARNING, error while calculating ReplayGain\n", e->inbasefilename);
2019 if(e->treat_warnings_as_errors)
2024 return FLAC__stream_encoder_process(e->encoder, buffer, samples);
2027 FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e)
2029 const FLAC__bool only_placeholders = e->is_stdout;
2030 FLAC__bool has_real_points;
2032 if(num_requested_seek_points == 0 && 0 == cuesheet)
2035 if(num_requested_seek_points < 0) {
2037 /*@@@@@@ workaround ogg bug: too many seekpoints makes table not fit in one page */
2038 if(e->use_ogg && e->total_samples_to_encode > 0 && e->total_samples_to_encode / e->info.sample_rate / 10 > 230)
2039 requested_seek_points = "230x;";
2042 requested_seek_points = "10s;";
2043 num_requested_seek_points = 1;
2046 if(num_requested_seek_points > 0) {
2047 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))
2053 const FLAC__StreamMetadata_CueSheet *cs = &cuesheet->data.cue_sheet;
2054 for(i = 0; i < cs->num_tracks; i++) {
2055 const FLAC__StreamMetadata_CueSheet_Track *tr = cs->tracks+i;
2056 for(j = 0; j < tr->num_indices; j++) {
2057 if(!FLAC__metadata_object_seektable_template_append_point(e->seek_table_template, tr->offset + tr->indices[j].offset))
2059 has_real_points = true;
2063 if(!FLAC__metadata_object_seektable_template_sort(e->seek_table_template, /*compact=*/true))
2067 if(has_real_points) {
2069 flac__utils_printf(stderr, 1, "%s: WARNING, cannot write back seekpoints when encoding to stdout\n", e->inbasefilename);
2070 if(e->treat_warnings_as_errors)
2078 FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input)
2080 /* convert from mm:ss.sss to sample number if necessary */
2081 flac__utils_canonicalize_skip_until_specification(spec, sample_rate);
2083 /* special case: if "--until=-0", use the special value '0' to mean "end-of-stream" */
2084 if(spec->is_relative && spec->value.samples == 0) {
2085 spec->is_relative = false;
2089 /* in any other case the total samples in the input must be known */
2090 if(total_samples_in_input == 0) {
2091 flac__utils_printf(stderr, 1, "%s: ERROR, cannot use --until when input length is unknown\n", inbasefilename);
2095 FLAC__ASSERT(spec->value_is_samples);
2097 /* convert relative specifications to absolute */
2098 if(spec->is_relative) {
2099 if(spec->value.samples <= 0)
2100 spec->value.samples += (FLAC__int64)total_samples_in_input;
2102 spec->value.samples += skip;
2103 spec->is_relative = false;
2107 if(spec->value.samples < 0) {
2108 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before beginning of input\n", inbasefilename);
2111 if((FLAC__uint64)spec->value.samples <= skip) {
2112 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before --skip point\n", inbasefilename);
2115 if((FLAC__uint64)spec->value.samples > total_samples_in_input) {
2116 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is after end of input\n", inbasefilename);
2123 FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata)
2125 FLAC__bool metadata_picture_has_type1 = false;
2126 FLAC__bool metadata_picture_has_type2 = false;
2129 FLAC__ASSERT(0 != metadata);
2130 for(i = 0; i < num_metadata; i++) {
2131 const FLAC__StreamMetadata *m = metadata[i];
2132 if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
2133 if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) {
2134 flac__utils_printf(stderr, 1, "%s: ERROR: SEEKTABLE metadata block is invalid\n", e->inbasefilename);
2138 else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
2139 if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) {
2140 flac__utils_printf(stderr, 1, "%s: ERROR: CUESHEET metadata block is invalid\n", e->inbasefilename);
2144 else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
2145 const char *error = 0;
2146 if(!FLAC__format_picture_is_legal(&m->data.picture, &error)) {
2147 flac__utils_printf(stderr, 1, "%s: ERROR: PICTURE metadata block is invalid: %s\n", e->inbasefilename, error);
2150 if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
2151 if(metadata_picture_has_type1) {
2152 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 1 (32x32 icon) in the file\n", e->inbasefilename);
2155 metadata_picture_has_type1 = true;
2157 else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
2158 if(metadata_picture_has_type2) {
2159 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 2 (icon) in the file\n", e->inbasefilename);
2162 metadata_picture_has_type2 = true;
2170 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)
2172 unsigned wide_sample, sample, channel, byte;
2173 FLAC__int32 *out[FLAC__MAX_CHANNELS];
2175 if(0 == channel_map) {
2176 for(channel = 0; channel < channels; channel++)
2177 out[channel] = dest[channel];
2180 for(channel = 0; channel < channels; channel++)
2181 out[channel] = dest[channel_map[channel]];
2185 if(is_unsigned_samples) {
2186 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2187 for(channel = 0; channel < channels; channel++, sample++)
2188 out[channel][wide_sample] = (FLAC__int32)ucbuffer_[sample] - 0x80;
2191 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2192 for(channel = 0; channel < channels; channel++, sample++)
2193 out[channel][wide_sample] = (FLAC__int32)scbuffer_[sample];
2196 else if(bps == 16) {
2197 if(is_big_endian != is_big_endian_host_) {
2199 const unsigned bytes = wide_samples * channels * (bps >> 3);
2200 for(byte = 0; byte < bytes; byte += 2) {
2201 tmp = ucbuffer_[byte];
2202 ucbuffer_[byte] = ucbuffer_[byte+1];
2203 ucbuffer_[byte+1] = tmp;
2206 if(is_unsigned_samples) {
2207 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2208 for(channel = 0; channel < channels; channel++, sample++)
2209 out[channel][wide_sample] = (FLAC__int32)usbuffer_[sample] - 0x8000;
2212 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2213 for(channel = 0; channel < channels; channel++, sample++)
2214 out[channel][wide_sample] = (FLAC__int32)ssbuffer_[sample];
2217 else if(bps == 24) {
2218 if(!is_big_endian) {
2220 const unsigned bytes = wide_samples * channels * (bps >> 3);
2221 for(byte = 0; byte < bytes; byte += 3) {
2222 tmp = ucbuffer_[byte];
2223 ucbuffer_[byte] = ucbuffer_[byte+2];
2224 ucbuffer_[byte+2] = tmp;
2227 if(is_unsigned_samples) {
2228 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2229 for(channel = 0; channel < channels; channel++, sample++) {
2230 out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2231 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2232 out[channel][wide_sample] |= ucbuffer_[byte++];
2233 out[channel][wide_sample] -= 0x800000;
2237 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2238 for(channel = 0; channel < channels; channel++, sample++) {
2239 out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2240 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2241 out[channel][wide_sample] |= ucbuffer_[byte++];
2249 FLAC__int32 mask = (1<<shift)-1;
2250 for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2251 for(channel = 0; channel < channels; channel++) {
2252 if(out[channel][wide_sample] & mask) {
2253 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);
2256 out[channel][wide_sample] >>= shift;
2262 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)
2264 EncoderSession *e = (EncoderSession*)client_data;
2266 (void)encoder, (void)total_frames_estimate;
2268 e->bytes_written = bytes_written;
2269 e->samples_written = samples_written;
2271 if(e->total_samples_to_encode > 0 && !((frames_written-1) & e->stats_mask))
2275 FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
2278 EncoderSession *e = (EncoderSession*)client_data;
2279 FLACDecoderData *data = &e->fmt.flac.client_data;
2283 if (data->fatal_error)
2284 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2286 /* use up lookahead first */
2287 if (data->lookahead_length) {
2288 n = min(data->lookahead_length, *bytes);
2289 memcpy(buffer, data->lookahead, n);
2291 data->lookahead += n;
2292 data->lookahead_length -= n;
2295 /* get the rest from file */
2297 *bytes = n + fread(buffer, 1, *bytes-n, e->fin);
2299 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2300 else if(0 == *bytes)
2301 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
2303 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2306 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2309 FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
2311 EncoderSession *e = (EncoderSession*)client_data;
2314 if(fseeko(e->fin, (off_t)absolute_byte_offset, SEEK_SET) < 0)
2315 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
2317 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
2320 FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
2322 EncoderSession *e = (EncoderSession*)client_data;
2326 if((pos = ftello(e->fin)) < 0)
2327 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
2329 *absolute_byte_offset = (FLAC__uint64)pos;
2330 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
2334 FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
2336 const EncoderSession *e = (EncoderSession*)client_data;
2337 const FLACDecoderData *data = &e->fmt.flac.client_data;
2340 if(data->filesize < 0)
2341 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
2343 *stream_length = (FLAC__uint64)data->filesize;
2344 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
2348 FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
2350 EncoderSession *e = (EncoderSession*)client_data;
2353 return feof(e->fin)? true : false;
2356 FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2358 EncoderSession *e = (EncoderSession*)client_data;
2359 FLACDecoderData *data = &e->fmt.flac.client_data;
2360 FLAC__uint64 n = min(data->samples_left_to_process, frame->header.blocksize);
2363 if(!EncoderSession_process(e, buffer, (unsigned)n)) {
2364 print_error_with_state(e, "ERROR during encoding");
2365 data->fatal_error = true;
2366 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2369 data->samples_left_to_process -= n;
2370 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2373 void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2375 EncoderSession *e = (EncoderSession*)client_data;
2376 FLACDecoderData *data = &e->fmt.flac.client_data;
2379 if (data->fatal_error)
2383 data->num_metadata_blocks == sizeof(data->metadata_blocks)/sizeof(data->metadata_blocks[0]) ||
2384 0 == (data->metadata_blocks[data->num_metadata_blocks] = FLAC__metadata_object_clone(metadata))
2386 data->fatal_error = true;
2388 data->num_metadata_blocks++;
2391 void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2393 EncoderSession *e = (EncoderSession*)client_data;
2394 FLACDecoderData *data = &e->fmt.flac.client_data;
2397 flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", e->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
2398 if(!e->continue_through_decode_errors)
2399 data->fatal_error = true;
2402 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)
2405 unsigned last_line_read;
2406 const char *error_message;
2408 if(0 == cuesheet_filename)
2411 if(lead_out_offset == 0) {
2412 flac__utils_printf(stderr, 1, "%s: ERROR cannot import cuesheet when the number of input samples to encode is unknown\n", inbasefilename);
2416 if(0 == (f = fopen(cuesheet_filename, "r"))) {
2417 flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
2421 *cuesheet = grabbag__cuesheet_parse(f, &error_message, &last_line_read, is_cdda, lead_out_offset);
2425 if(0 == *cuesheet) {
2426 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\" on line %u: %s\n", inbasefilename, cuesheet_filename, last_line_read, error_message);
2430 if(!FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/false, &error_message)) {
2431 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\": %s\n", inbasefilename, cuesheet_filename, error_message);
2435 /* if we're expecting CDDA, warn about non-compliance */
2436 if(is_cdda && !FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/true, &error_message)) {
2437 flac__utils_printf(stderr, 1, "%s: WARNING cuesheet \"%s\" is not audio CD compliant: %s\n", inbasefilename, cuesheet_filename, error_message);
2438 if(treat_warnings_as_errors)
2440 (*cuesheet)->data.cue_sheet.is_cd = false;
2446 void print_stats(const EncoderSession *encoder_session)
2448 const FLAC__uint64 samples_written = min(encoder_session->total_samples_to_encode, encoder_session->samples_written);
2449 const FLAC__uint64 uesize = encoder_session->unencoded_size;
2450 #if defined _MSC_VER || defined __MINGW32__
2451 /* with MSVC you have to spoon feed it the casting */
2452 const double progress = (double)(FLAC__int64)samples_written / (double)(FLAC__int64)encoder_session->total_samples_to_encode;
2453 const double ratio = (double)(FLAC__int64)encoder_session->bytes_written / ((double)(FLAC__int64)(uesize? uesize:1) * min(1.0, progress));
2455 const double progress = (double)samples_written / (double)encoder_session->total_samples_to_encode;
2456 const double ratio = (double)encoder_session->bytes_written / ((double)(uesize? uesize:1) * min(1.0, progress));
2459 FLAC__ASSERT(encoder_session->total_samples_to_encode > 0);
2461 if(samples_written == encoder_session->total_samples_to_encode) {
2462 flac__utils_printf(stderr, 2, "\r%s:%s wrote %u bytes, ratio=",
2463 encoder_session->inbasefilename,
2464 encoder_session->verify? " Verify OK," : "",
2465 (unsigned)encoder_session->bytes_written
2469 flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5));
2472 flac__utils_printf(stderr, 2, "%0.3f", ratio);
2474 flac__utils_printf(stderr, 2, "N/A");
2477 void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
2479 const int ilen = strlen(e->inbasefilename) + 1;
2480 const char *state_string = "";
2482 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2484 flac__utils_printf(stderr, 1, "%*s init_status = %s\n", ilen, "", FLAC__StreamEncoderInitStatusString[init_status]);
2486 if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR) {
2487 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2489 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2491 /* print out some more info for some errors: */
2492 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2493 flac__utils_printf(stderr, 1,
2495 "An error occurred while writing; the most common cause is that the disk is full.\n"
2498 else if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_IO_ERROR])) {
2499 flac__utils_printf(stderr, 1,
2501 "An error occurred opening the output file; it is likely that the output\n"
2502 "directory does not exist or is not writable, the output file already exists and\n"
2503 "is not writable, or the disk is full.\n"
2507 else if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE) {
2508 flac__utils_printf(stderr, 1,
2510 "The encoding parameters specified do not conform to the FLAC Subset and may not\n"
2511 "be streamable or playable in hardware devices. If you really understand the\n"
2512 "consequences, you can add --lax to the command-line options to encode with\n"
2513 "these parameters anyway. See http://flac.sourceforge.net/format.html#subset\n"
2518 void print_error_with_state(const EncoderSession *e, const char *message)
2520 const int ilen = strlen(e->inbasefilename) + 1;
2521 const char *state_string;
2523 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2525 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2527 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2529 /* print out some more info for some errors: */
2530 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2531 flac__utils_printf(stderr, 1,
2533 "An error occurred while writing; the most common cause is that the disk is full.\n"
2538 void print_verify_error(EncoderSession *e)
2540 FLAC__uint64 absolute_sample;
2541 unsigned frame_number;
2544 FLAC__int32 expected;
2547 FLAC__stream_encoder_get_verify_decoder_error_stats(e->encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
2549 flac__utils_printf(stderr, 1, "%s: ERROR: mismatch in decoded data, verify FAILED!\n", e->inbasefilename);
2550 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);
2551 flac__utils_printf(stderr, 1, " In all known cases, verify errors are caused by hardware problems,\n");
2552 flac__utils_printf(stderr, 1, " usually overclocking or bad RAM. Delete %s\n", e->outfilename);
2553 flac__utils_printf(stderr, 1, " and repeat the flac command exactly as before. If it does not give a\n");
2554 flac__utils_printf(stderr, 1, " verify error in the exact same place each time you try it, then there is\n");
2555 flac__utils_printf(stderr, 1, " a problem with your hardware; please see the FAQ:\n");
2556 flac__utils_printf(stderr, 1, " http://flac.sourceforge.net/faq.html#tools__hardware_prob\n");
2557 flac__utils_printf(stderr, 1, " If it does fail in the exact same place every time, keep\n");
2558 flac__utils_printf(stderr, 1, " %s and submit a bug report to:\n", e->outfilename);
2559 flac__utils_printf(stderr, 1, " https://sourceforge.net/bugs/?func=addbug&group_id=13478\n");
2560 flac__utils_printf(stderr, 1, " Make sure to upload the FLAC file and use the \"Monitor\" feature to\n");
2561 flac__utils_printf(stderr, 1, " monitor the bug status.\n");
2562 flac__utils_printf(stderr, 1, "Verify FAILED! Do not trust %s\n", e->outfilename);
2565 FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn)
2567 size_t bytes_read = fread(buf, 1, n, f);
2569 if(bytes_read == 0) {
2571 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2577 if(bytes_read < n) {
2578 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2584 FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn)
2586 if(!read_bytes(f, (FLAC__byte*)val, 2, /*eof_ok=*/false, fn))
2588 if(is_big_endian_host_ != big_endian) {
2589 FLAC__byte tmp, *b = (FLAC__byte*)val;
2590 tmp = b[1]; b[1] = b[0]; b[0] = tmp;
2595 FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn)
2597 if(!read_bytes(f, (FLAC__byte*)val, 4, /*eof_ok=*/false, fn))
2599 if(is_big_endian_host_ != big_endian) {
2600 FLAC__byte tmp, *b = (FLAC__byte*)val;
2601 tmp = b[3]; b[3] = b[0]; b[0] = tmp;
2602 tmp = b[2]; b[2] = b[1]; b[1] = tmp;
2607 FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn)
2608 /* Read an IEEE 754 80-bit (aka SANE) extended floating point value from 'f',
2609 * convert it into an integral value and store in 'val'. Return false if only
2610 * between 1 and 9 bytes remain in 'f', if 0 bytes remain in 'f', or if the
2611 * value is negative, between zero and one, or too large to be represented by
2612 * 'val'; return true otherwise.
2621 if(!read_bytes(f, buf, sizeof(buf), /*eof_ok=*/false, fn))
2623 e = ((FLAC__uint16)(buf[0])<<8 | (FLAC__uint16)(buf[1]))-0x3FFF;
2625 if((buf[0]>>7)==1U || e<0 || e>63) {
2626 flac__utils_printf(stderr, 1, "%s: ERROR: invalid floating-point value\n", fn);
2630 for(i = 0; i < 8; ++i)
2631 p |= (FLAC__uint64)(buf[i+2])<<(56U-i*8);
2632 *val = (FLAC__uint32)((p>>shift)+(p>>(shift-1) & 0x1));
2637 FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset)
2639 static unsigned char dump[8192];
2643 /* MS' stdio impl can't even seek forward on stdin, have to use pure non-fseek() version: */
2645 const long need = (long)min(offset, sizeof(dump));
2646 if((long)fread(dump, 1, need, f) < need)
2655 long need = (long)min(offset, LONG_MAX);
2656 if(fseeko(f, need, SEEK_CUR) < 0) {
2657 need = (long)min(offset, sizeof(dump));
2658 if((long)fread(dump, 1, need, f) < need)
2667 unsigned count_channel_mask_bits(FLAC__uint32 mask)
2679 FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels)
2681 FLAC__uint32 x = 0x80000000;
2682 unsigned count = count_channel_mask_bits(mask);
2683 while(x && count > channels) {
2690 FLAC__ASSERT(count_channel_mask_bits(mask) == channels);