1 /* flac - Command-line FLAC encoder/decoder
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
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.
24 #include <limits.h> /* for LONG_MAX */
25 #include <math.h> /* for floor() */
26 #include <stdio.h> /* for FILE etc. */
27 #include <stdlib.h> /* for malloc */
28 #include <string.h> /* for strcmp(), strerror() */
30 #include "share/alloc.h"
31 #include "share/grabbag.h"
32 #include "share/compat.h"
38 #define min(x,y) ((x)<(y)?(x):(y))
42 #define max(x,y) ((x)>(y)?(x):(y))
44 /* this MUST be >= 588 so that sector aligning can take place with one read */
45 /* this MUST be < 2^sizeof(size_t) / ( FLAC__MAX_CHANNELS * (FLAC__MAX_BITS_PER_SAMPLE/8) ) */
46 #define CHUNK_OF_SAMPLES 2048
51 unsigned bits_per_sample; /* width of sample point, including 'shift' bits, valid bps is bits_per_sample-shift */
52 unsigned shift; /* # of LSBs samples have been shifted left by */
53 unsigned bytes_per_wide_sample; /* for convenience, always == channels*((bps+7)/8), or 0 if N/A to input format (like FLAC) */
54 FLAC__bool is_unsigned_samples;
55 FLAC__bool is_big_endian;
56 FLAC__uint32 channel_mask;
59 /* this is the client_data attached to the FLAC decoder when encoding from a FLAC file */
62 const FLAC__byte *lookahead;
63 unsigned lookahead_length;
64 size_t num_metadata_blocks;
65 FLAC__StreamMetadata *metadata_blocks[1024]; /*@@@ BAD MAGIC number */
66 FLAC__uint64 samples_left_to_process;
67 FLAC__bool fatal_error;
76 FLAC__bool outputfile_opened; /* true if we successfully opened the output file and we want it to be deleted if there is an error */
77 const char *inbasefilename;
78 const char *infilename;
79 const char *outfilename;
81 FLAC__bool treat_warnings_as_errors;
82 FLAC__bool continue_through_decode_errors;
83 FLAC__bool replay_gain;
84 FLAC__uint64 total_samples_to_encode; /* (i.e. "wide samples" aka "sample frames") WATCHOUT: may be 0 to mean 'unknown' */
85 FLAC__uint64 unencoded_size; /* an estimate of the input size, only used in the progress indicator */
86 FLAC__uint64 bytes_written;
87 FLAC__uint64 samples_written;
95 FLAC__uint64 data_bytes;
98 FLAC__StreamDecoder *decoder;
99 FLACDecoderData client_data;
103 FLAC__StreamEncoder *encoder;
106 FLAC__StreamMetadata *seek_table_template;
109 const int FLAC_ENCODE__DEFAULT_PADDING = 8192;
111 static FLAC__bool is_big_endian_host_;
113 static unsigned char ucbuffer_[CHUNK_OF_SAMPLES*FLAC__MAX_CHANNELS*((FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE+7)/8)];
114 static signed char *scbuffer_ = (signed char *)ucbuffer_;
115 static FLAC__uint16 *usbuffer_ = (FLAC__uint16 *)ucbuffer_;
116 static FLAC__int16 *ssbuffer_ = (FLAC__int16 *)ucbuffer_;
118 static FLAC__int32 in_[FLAC__MAX_CHANNELS][CHUNK_OF_SAMPLES];
119 static FLAC__int32 *input_[FLAC__MAX_CHANNELS];
123 * unpublished debug routines from the FLAC libs
125 extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
126 extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
127 extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
128 extern FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value);
133 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);
134 static void EncoderSession_destroy(EncoderSession *e);
135 static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata);
136 static int EncoderSession_finish_error(EncoderSession *e);
137 static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options);
138 static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
139 static FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e);
140 static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
141 static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
142 static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
143 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);
144 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);
145 static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
146 static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
147 static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
148 static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
149 static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
150 static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
151 static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
152 static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
153 static FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, unsigned sample_rate, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors);
154 static void print_stats(const EncoderSession *encoder_session);
155 static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
156 static void print_error_with_state(const EncoderSession *e, const char *message);
157 static void print_verify_error(EncoderSession *e);
158 static FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn);
159 static FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn);
160 static FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn);
161 static FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn);
162 static FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn);
163 static FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset);
164 static unsigned count_channel_mask_bits(FLAC__uint32 mask);
166 static FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels);
169 static FLAC__bool get_sample_info_raw(EncoderSession *e, encode_options_t options)
171 e->info.sample_rate = options.format_options.raw.sample_rate;
172 e->info.channels = options.format_options.raw.channels;
173 e->info.bits_per_sample = options.format_options.raw.bps;
175 e->info.bytes_per_wide_sample = options.format_options.raw.channels * ((options.format_options.raw.bps+7)/8);
176 e->info.is_unsigned_samples = options.format_options.raw.is_unsigned_samples;
177 e->info.is_big_endian = options.format_options.raw.is_big_endian;
178 e->info.channel_mask = 0;
183 static FLAC__bool get_sample_info_wave(EncoderSession *e, encode_options_t options)
185 FLAC__bool got_fmt_chunk = false, got_data_chunk = false, got_ds64_chunk = false;
186 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
187 FLAC__uint32 channel_mask = 0;
188 FLAC__uint64 ds64_data_size = 0;
190 e->info.is_unsigned_samples = false;
191 e->info.is_big_endian = false;
193 if(e->format == FORMAT_WAVE64) {
195 * lookahead[] already has "riff\x2E\x91\xCF\x11\xD6\xA5\x28\xDB", skip over remaining header
197 if(!fskip_ahead(e->fin, 16+8+16-12)) { /* riff GUID + riff size + WAVE GUID - lookahead */
198 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over remaining \"riff\" header\n", e->inbasefilename);
202 /* else lookahead[] already has "RIFFxxxxWAVE" or "RF64xxxxWAVE" */
204 while(!feof(e->fin) && !got_data_chunk) {
205 /* chunk IDs are 4 bytes for WAVE/RF64, 16 for Wave64 */
206 /* for WAVE/RF64 we want the 5th char zeroed so we can treat it like a C string */
207 char chunk_id[16] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
209 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, e->format==FORMAT_WAVE64?16:4, /*eof_ok=*/true, e->inbasefilename)) {
210 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
216 if(e->format == FORMAT_RF64 && !memcmp(chunk_id, "ds64", 4)) { /* RF64 64-bit sizes chunk */
217 FLAC__uint32 xx, data_bytes;
220 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'ds64' chunks\n", e->inbasefilename);
223 if(got_fmt_chunk || got_data_chunk) {
224 flac__utils_printf(stderr, 1, "%s: ERROR: 'ds64' chunk appears after 'fmt ' or 'data' chunk\n", e->inbasefilename);
228 /* ds64 chunk size */
229 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
232 if(data_bytes < 28) {
233 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'ds64' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
236 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
239 /* RIFF 64-bit size, lo/hi */
240 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
242 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
245 /* 'data' 64-bit size */
246 if(!read_uint64(e->fin, /*big_endian=*/false, &ds64_data_size, e->inbasefilename))
251 /* skip any extra data in the ds64 chunk */
252 if(!fskip_ahead(e->fin, data_bytes)) {
253 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'ds64' data\n", e->inbasefilename);
257 got_ds64_chunk = true;
260 !memcmp(chunk_id, "fmt ", 4) &&
261 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "fmt \xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
262 ) { /* format chunk */
264 FLAC__uint32 xx, data_bytes;
265 FLAC__uint16 wFormatTag; /* wFormatTag word from the 'fmt ' chunk */
268 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'fmt ' chunks\n", e->inbasefilename);
273 * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
274 * http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
275 * 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
279 * 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
281 * 4 byte: sample rate (Hz)
282 * 4 byte: avg bytes per sec
283 * 2 byte: block align
284 * 2 byte: bits per sample (not necessarily all significant)
286 * 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
287 * WAVEFORMATEXTENSIBLE adds
288 * 2 byte: valid bits per sample
289 * 4 byte: channel mask
290 * 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
292 * Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
293 * 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.
295 * Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
297 * If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
298 * If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
300 * Data is supposed to be unsigned for bps <= 8 else signed.
304 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
307 if(e->format == FORMAT_WAVE64) {
308 /* other half of the size field should be 0 */
309 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
312 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly large Wave64 'fmt ' chunk has length = 0x%08X%08X\n", e->inbasefilename, (unsigned)xx, (unsigned)data_bytes);
315 /* subtract size of header */
316 if (data_bytes < 16+8) {
317 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 'fmt ' chunk has length = 0x%08X%08X\n", e->inbasefilename, (unsigned)xx, (unsigned)data_bytes);
320 data_bytes -= (16+8);
322 if(data_bytes < 16) {
323 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'fmt ' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
326 if(e->format != FORMAT_WAVE64) {
327 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
331 data_bytes = (data_bytes+7) & (~7u); /* should never happen, but enforce Wave64 alignment rules */
335 if(!read_uint16(e->fin, /*big_endian=*/false, &wFormatTag, e->inbasefilename))
337 if(wFormatTag != 1 /*WAVE_FORMAT_PCM*/ && wFormatTag != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
338 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", e->inbasefilename, (unsigned)wFormatTag);
342 /* number of channels */
343 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
345 channels = (unsigned)x;
348 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
352 /* avg bytes per second (ignored) */
353 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
356 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
359 /* bits per sample */
360 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
364 e->info.is_unsigned_samples = (bps <= 8);
366 if(wFormatTag == 1) {
367 if(bps != 8 && bps != 16) {
368 if(bps == 24 || bps == 32) {
369 /* let these slide with a warning since they're unambiguous */
370 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);
371 if(e->treat_warnings_as_errors)
375 /* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
376 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);
380 #if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
381 if((bps+7)/8 * channels == block_align) {
383 /* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
384 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);
385 if(e->treat_warnings_as_errors)
387 shift = 8 - (bps % 8);
394 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);
400 if(channels > 2 && !options.channel_map_none) {
401 flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", e->inbasefilename);
404 FLAC__ASSERT(data_bytes >= 16);
408 if(data_bytes < 40) {
409 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", e->inbasefilename, (unsigned)data_bytes);
413 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
416 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", e->inbasefilename, (unsigned)x);
420 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
422 if((unsigned)x > bps) {
423 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", e->inbasefilename, (unsigned)x, bps);
426 shift = bps - (unsigned)x;
428 if(!read_uint32(e->fin, /*big_endian=*/false, &channel_mask, e->inbasefilename))
430 /* for mono/stereo and unassigned channels, we fake the mask */
431 if(channel_mask == 0) {
433 channel_mask = 0x0001;
434 else if(channels == 2)
435 channel_mask = 0x0003;
437 /* set channel mapping */
438 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
439 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
440 /* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
442 /* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
444 options.channel_map_none ||
445 channel_mask == 0x0001 || /* 1 channel: (mono) */
446 channel_mask == 0x0003 || /* 2 channels: front left, front right */
447 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
448 channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
450 /* keep default channel order */
453 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
454 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
455 channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
457 /* to dolby order: front left, center, front right [, surround left, surround right ] */
462 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
463 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
465 /* to dolby order: front left, center, front right, surround left, surround right, LFE */
474 options.channel_map_none ||
475 channel_mask == 0x0001 || /* 1 channel: (mono) */
476 channel_mask == 0x0003 || /* 2 channels: front left, front right */
477 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
478 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
479 channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
480 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
481 channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
482 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
483 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
485 /* keep default channel order */
489 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);
492 if(!options.channel_map_none) {
493 if(count_channel_mask_bits(channel_mask) < channels) {
494 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);
498 /* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
499 * there would be holes in the order that would have to be filled in, or the mask would have to be
500 * limited and the logic above rerun to see if it still fits into the FLAC mapping.
502 else if(count_channel_mask_bits(channel_mask) > channels)
503 channel_mask = limit_channel_mask(channel_mask, channels);
505 else if(count_channel_mask_bits(channel_mask) > channels) {
506 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);
511 /* first part of GUID */
512 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
515 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", e->inbasefilename, (unsigned)x);
521 e->info.bytes_per_wide_sample = channels * (bps / 8);
523 /* skip any extra data in the fmt chunk */
524 if(!fskip_ahead(e->fin, data_bytes)) {
525 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'fmt' data\n", e->inbasefilename);
529 got_fmt_chunk = true;
532 !memcmp(chunk_id, "data", 4) &&
533 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "data\xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
536 FLAC__uint64 data_bytes;
539 flac__utils_printf(stderr, 1, "%s: ERROR: got 'data' chunk before 'fmt' chunk\n", e->inbasefilename);
544 if(e->format != FORMAT_WAVE64) {
545 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
550 if(!read_uint64(e->fin, /*big_endian=*/false, &data_bytes, e->inbasefilename))
552 /* subtract size of header */
553 if (data_bytes < 16+8) {
554 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 'data' chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)data_bytes);
557 data_bytes -= (16+8);
559 if(e->format == FORMAT_RF64) {
560 if(!got_ds64_chunk) {
561 flac__utils_printf(stderr, 1, "%s: ERROR: RF64 file has no 'ds64' chunk before 'data' chunk\n", e->inbasefilename);
564 if(data_bytes == 0xffffffff)
565 data_bytes = ds64_data_size;
567 if(options.ignore_chunk_sizes) {
568 FLAC__ASSERT(!options.sector_align);
570 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);
571 if(e->treat_warnings_as_errors)
574 data_bytes = (FLAC__uint64)0 - (FLAC__uint64)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
576 else if(0 == data_bytes) {
577 flac__utils_printf(stderr, 1, "%s: ERROR: 'data' chunk has size of 0\n", e->inbasefilename);
581 e->fmt.iff.data_bytes = data_bytes;
583 got_data_chunk = true;
589 if(!options.format_options.iff.foreign_metadata) {
590 if(e->format != FORMAT_WAVE64)
591 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
593 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X (use --keep-foreign-metadata to keep)\n",
595 (unsigned)((const unsigned char *)chunk_id)[3],
596 (unsigned)((const unsigned char *)chunk_id)[2],
597 (unsigned)((const unsigned char *)chunk_id)[1],
598 (unsigned)((const unsigned char *)chunk_id)[0],
599 (unsigned)((const unsigned char *)chunk_id)[5],
600 (unsigned)((const unsigned char *)chunk_id)[4],
601 (unsigned)((const unsigned char *)chunk_id)[7],
602 (unsigned)((const unsigned char *)chunk_id)[6],
603 (unsigned)((const unsigned char *)chunk_id)[9],
604 (unsigned)((const unsigned char *)chunk_id)[8],
605 (unsigned)((const unsigned char *)chunk_id)[10],
606 (unsigned)((const unsigned char *)chunk_id)[11],
607 (unsigned)((const unsigned char *)chunk_id)[12],
608 (unsigned)((const unsigned char *)chunk_id)[13],
609 (unsigned)((const unsigned char *)chunk_id)[14],
610 (unsigned)((const unsigned char *)chunk_id)[15]
612 if(e->treat_warnings_as_errors)
617 if(e->format != FORMAT_WAVE64) {
618 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
624 if(!read_uint64(e->fin, /*big_endian=*/false, &skip, e->inbasefilename))
626 skip = (skip+7) & (~(FLAC__uint64)7);
627 /* subtract size of header */
629 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)skip);
635 if(!fskip_ahead(e->fin, skip)) {
636 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
644 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find fmt chunk\n", e->inbasefilename);
647 if(!got_data_chunk) {
648 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find data chunk\n", e->inbasefilename);
652 e->info.sample_rate = sample_rate;
653 e->info.channels = channels;
654 e->info.bits_per_sample = bps;
655 e->info.shift = shift;
656 e->info.channel_mask = channel_mask;
661 static FLAC__bool get_sample_info_aiff(EncoderSession *e, encode_options_t options)
663 FLAC__bool got_comm_chunk = false, got_ssnd_chunk = false;
664 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
665 FLAC__uint64 sample_frames = 0;
666 FLAC__uint32 channel_mask = 0;
668 e->info.is_unsigned_samples = false;
669 e->info.is_big_endian = true;
672 * lookahead[] already has "FORMxxxxAIFF", do chunks
674 while(!feof(e->fin) && !got_ssnd_chunk) {
675 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 */
676 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
677 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
683 if(!memcmp(chunk_id, "COMM", 4)) { /* common chunk */
687 const FLAC__bool is_aifc = e->format == FORMAT_AIFF_C;
688 const FLAC__uint32 minimum_comm_size = (is_aifc? 22 : 18);
691 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'COMM' chunks\n", e->inbasefilename);
695 /* COMM chunk size */
696 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
698 else if(xx < minimum_comm_size) {
699 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);
702 else if(!is_aifc && xx != minimum_comm_size) {
703 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);
704 if(e->treat_warnings_as_errors)
707 skip = (xx-minimum_comm_size)+(xx & 1);
709 /* number of channels */
710 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
712 channels = (unsigned)x;
713 if(channels > 2 && !options.channel_map_none) {
714 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
718 /* number of sample frames */
719 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
723 /* bits per sample */
724 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
727 shift = (bps%8)? 8-(bps%8) : 0; /* SSND data is always byte-aligned, left-justified but format_input() will double-check */
731 if(!read_sane_extended(e->fin, &xx, e->inbasefilename))
735 /* check compression type for AIFF-C */
737 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
739 if(xx == 0x736F7774) /* "sowt" */
740 e->info.is_big_endian = false;
741 else if(xx == 0x4E4F4E45) /* "NONE" */
742 ; /* nothing to do, we already default to big-endian */
744 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));
749 /* set channel mapping */
750 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
751 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
752 /* specs say the channel ordering is:
754 * ___________________________________________________
758 * quad (ambiguous with 4ch) Fl Fr Bl Br
761 * 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
762 * so we only have unambiguous mappings for 2, 3, and 5 channels
765 options.channel_map_none ||
766 channels == 1 || /* 1 channel: (mono) */
767 channels == 2 || /* 2 channels: left, right */
768 channels == 3 || /* 3 channels: left, right, center */
769 channels == 5 /* 5 channels: front left, front right, center, surround left, surround right */
771 /* keep default channel order */
774 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
778 e->info.bytes_per_wide_sample = channels * (bps / 8);
780 /* skip any extra data in the COMM chunk */
781 if(!fskip_ahead(e->fin, skip)) {
782 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra COMM data\n", e->inbasefilename);
786 got_comm_chunk = true;
788 else if(!memcmp(chunk_id, "SSND", 4) && !got_ssnd_chunk) { /* sound data chunk */
790 FLAC__uint64 data_bytes;
793 if(!got_comm_chunk) {
794 flac__utils_printf(stderr, 1, "%s: ERROR: got 'SSND' chunk before 'COMM' chunk\n", e->inbasefilename);
798 /* SSND chunk size */
799 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
802 if(options.ignore_chunk_sizes) {
803 FLAC__ASSERT(!options.sector_align);
805 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);
806 if(e->treat_warnings_as_errors)
809 data_bytes = (FLAC__uint64)0 - (FLAC__uint64)e->info.bytes_per_wide_sample; /* max out data_bytes; we'll use EOF as signal to stop reading */
811 else if(data_bytes <= 8) {
812 flac__utils_printf(stderr, 1, "%s: ERROR: 'SSND' chunk has size <= 8\n", e->inbasefilename);
816 data_bytes -= 8; /* discount the offset and block size fields */
820 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
823 data_bytes -= offset;
826 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
828 if(xx && !options.ignore_chunk_sizes)
829 data_bytes -= (xx - (data_bytes % xx));
830 if(options.ignore_chunk_sizes) {
832 flac__utils_printf(stderr, 1, "%s: WARNING: 'SSND' chunk has non-zero blocksize, using --ignore-chunk-sizes is probably a bad idea\n", e->inbasefilename, chunk_id);
833 if(e->treat_warnings_as_errors)
838 /* skip any SSND offset bytes */
839 if(!fskip_ahead(e->fin, offset)) {
840 flac__utils_printf(stderr, 1, "%s: ERROR: skipping offset in SSND chunk\n", e->inbasefilename);
844 e->fmt.iff.data_bytes = data_bytes;
846 got_ssnd_chunk = true;
850 if(!options.format_options.iff.foreign_metadata) {
851 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
852 if(e->treat_warnings_as_errors)
857 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
860 unsigned long skip = xx + (xx & 1);
862 FLAC__ASSERT(skip <= LONG_MAX);
863 if(!fskip_ahead(e->fin, skip)) {
864 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
871 if(!got_comm_chunk) {
872 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find COMM chunk\n", e->inbasefilename);
875 if(!got_ssnd_chunk && sample_frames) {
876 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find SSND chunk\n", e->inbasefilename);
880 e->info.sample_rate = sample_rate;
881 e->info.channels = channels;
882 e->info.bits_per_sample = bps;
883 e->info.shift = shift;
884 e->info.channel_mask = channel_mask;
889 static FLAC__bool get_sample_info_flac(EncoderSession *e)
892 FLAC__stream_decoder_set_md5_checking(e->fmt.flac.decoder, false) &&
893 FLAC__stream_decoder_set_metadata_respond_all(e->fmt.flac.decoder)
895 flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", e->inbasefilename);
899 if (e->format == FORMAT_OGGFLAC) {
900 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) {
901 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));
905 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) {
906 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));
910 if (!FLAC__stream_decoder_process_until_end_of_metadata(e->fmt.flac.decoder) || e->fmt.flac.client_data.fatal_error) {
911 if (e->fmt.flac.client_data.fatal_error)
912 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", e->inbasefilename);
914 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));
918 if (e->fmt.flac.client_data.num_metadata_blocks == 0) {
919 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", e->inbasefilename);
922 else if (e->fmt.flac.client_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
923 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", e->inbasefilename);
926 else if (e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
927 flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", e->inbasefilename);
931 e->info.sample_rate = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.sample_rate;
932 e->info.channels = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.channels;
933 e->info.bits_per_sample = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.bits_per_sample;
935 e->info.bytes_per_wide_sample = 0;
936 e->info.is_unsigned_samples = false; /* not applicable for FLAC input */
937 e->info.is_big_endian = false; /* not applicable for FLAC input */
938 e->info.channel_mask = 0;
946 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)
948 EncoderSession encoder_session;
949 size_t channel_map[FLAC__MAX_CHANNELS];
950 int info_align_carry = -1, info_align_zero = -1;
952 if(!EncoderSession_construct(&encoder_session, options, infilesize, infile, infilename, outfilename, lookahead, lookahead_length))
955 /* initialize default channel map that preserves channel order */
958 for(i = 0; i < sizeof(channel_map)/sizeof(channel_map[0]); i++)
962 /* read foreign metadata if requested */
963 if(EncoderSession_format_is_iff(&encoder_session) && options.format_options.iff.foreign_metadata) {
966 options.format == FORMAT_WAVE || options.format == FORMAT_RF64?
967 flac__foreign_metadata_read_from_wave(options.format_options.iff.foreign_metadata, infilename, &error) :
968 options.format == FORMAT_WAVE64?
969 flac__foreign_metadata_read_from_wave64(options.format_options.iff.foreign_metadata, infilename, &error) :
970 flac__foreign_metadata_read_from_aiff(options.format_options.iff.foreign_metadata, infilename, &error)
972 flac__utils_printf(stderr, 1, "%s: ERROR reading foreign metadata: %s\n", encoder_session.inbasefilename, error);
973 return EncoderSession_finish_error(&encoder_session);
977 /* initialize encoder session with info about the audio (channels/bps/resolution/endianness/etc) */
978 switch(options.format) {
980 if(!get_sample_info_raw(&encoder_session, options))
981 return EncoderSession_finish_error(&encoder_session);
986 if(!get_sample_info_wave(&encoder_session, options))
987 return EncoderSession_finish_error(&encoder_session);
991 if(!get_sample_info_aiff(&encoder_session, options))
992 return EncoderSession_finish_error(&encoder_session);
997 * set up FLAC decoder for the input
999 if (0 == (encoder_session.fmt.flac.decoder = FLAC__stream_decoder_new())) {
1000 flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
1001 return EncoderSession_finish_error(&encoder_session);
1003 if(!get_sample_info_flac(&encoder_session))
1004 return EncoderSession_finish_error(&encoder_session);
1008 /* double protection */
1009 return EncoderSession_finish_error(&encoder_session);
1012 /* some more checks */
1013 if(encoder_session.info.channels == 0 || encoder_session.info.channels > FLAC__MAX_CHANNELS) {
1014 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, encoder_session.info.channels);
1015 return EncoderSession_finish_error(&encoder_session);
1017 if(!FLAC__format_sample_rate_is_valid(encoder_session.info.sample_rate)) {
1018 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
1019 return EncoderSession_finish_error(&encoder_session);
1021 if(encoder_session.info.bits_per_sample-encoder_session.info.shift < 4 || encoder_session.info.bits_per_sample-encoder_session.info.shift > 24) {
1022 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);
1023 return EncoderSession_finish_error(&encoder_session);
1025 if(options.sector_align) {
1026 if(encoder_session.info.channels != 2) {
1027 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);
1028 return EncoderSession_finish_error(&encoder_session);
1030 if(encoder_session.info.sample_rate != 44100) {
1031 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);
1032 return EncoderSession_finish_error(&encoder_session);
1034 if(encoder_session.info.bits_per_sample-encoder_session.info.shift != 16) {
1035 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);
1036 return EncoderSession_finish_error(&encoder_session);
1041 FLAC__uint64 total_samples_in_input; /* WATCHOUT: may be 0 to mean "unknown" */
1043 FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
1044 unsigned align_remainder = 0;
1046 switch(options.format) {
1049 total_samples_in_input = 0;
1051 total_samples_in_input = (FLAC__uint64)infilesize / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1058 /* truncation in the division removes any padding byte that was counted in encoder_session.fmt.iff.data_bytes */
1059 total_samples_in_input = encoder_session.fmt.iff.data_bytes / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1062 case FORMAT_OGGFLAC:
1063 total_samples_in_input = encoder_session.fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples + *options.align_reservoir_samples;
1067 /* double protection */
1068 return EncoderSession_finish_error(&encoder_session);
1072 * now that we know the sample rate, canonicalize the
1073 * --skip string to an absolute sample number:
1075 flac__utils_canonicalize_skip_until_specification(&options.skip_specification, encoder_session.info.sample_rate);
1076 FLAC__ASSERT(options.skip_specification.value.samples >= 0);
1077 skip = (FLAC__uint64)options.skip_specification.value.samples;
1078 FLAC__ASSERT(!options.sector_align || (options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC && skip == 0));
1079 /* *options.align_reservoir_samples will be 0 unless --sector-align is used */
1080 FLAC__ASSERT(options.sector_align || *options.align_reservoir_samples == 0);
1083 * now that we possibly know the input size, canonicalize the
1084 * --until string to an absolute sample number:
1086 if(!canonicalize_until_specification(&options.until_specification, encoder_session.inbasefilename, encoder_session.info.sample_rate, skip, total_samples_in_input))
1087 return EncoderSession_finish_error(&encoder_session);
1088 until = (FLAC__uint64)options.until_specification.value.samples;
1089 FLAC__ASSERT(!options.sector_align || until == 0);
1091 /* adjust encoding parameters based on skip and until values */
1092 switch(options.format) {
1094 infilesize -= (off_t)skip * encoder_session.info.bytes_per_wide_sample;
1095 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1102 encoder_session.fmt.iff.data_bytes -= skip * encoder_session.info.bytes_per_wide_sample;
1103 if(options.ignore_chunk_sizes) {
1104 encoder_session.total_samples_to_encode = 0;
1105 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1106 FLAC__ASSERT(0 == until);
1109 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1113 case FORMAT_OGGFLAC:
1114 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1118 /* double protection */
1119 return EncoderSession_finish_error(&encoder_session);
1122 const FLAC__uint64 trim = total_samples_in_input - until;
1123 FLAC__ASSERT(total_samples_in_input > 0);
1124 FLAC__ASSERT(!options.sector_align);
1125 if(options.format == FORMAT_RAW)
1126 infilesize -= (off_t)trim * encoder_session.info.bytes_per_wide_sample;
1127 else if(EncoderSession_format_is_iff(&encoder_session))
1128 encoder_session.fmt.iff.data_bytes -= trim * encoder_session.info.bytes_per_wide_sample;
1129 encoder_session.total_samples_to_encode -= trim;
1131 if(options.sector_align && (options.format != FORMAT_RAW || infilesize >=0)) { /* for RAW, need to know the filesize */
1132 FLAC__ASSERT(skip == 0); /* asserted above too, but lest we forget */
1133 align_remainder = (unsigned)(encoder_session.total_samples_to_encode % 588);
1134 if(options.is_last_file)
1135 encoder_session.total_samples_to_encode += (588-align_remainder); /* will pad with zeroes */
1137 encoder_session.total_samples_to_encode -= align_remainder; /* will stop short and carry over to next file */
1139 switch(options.format) {
1141 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample;
1144 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1145 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 44;
1148 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1149 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 104;
1152 /* +72 for the size of the RF64 headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1153 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 80;
1157 /* +54 for the size of the AIFF headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1158 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 54;
1161 case FORMAT_OGGFLAC:
1163 /* if we don't know, use 0 as hint to progress indicator (which is the only place this is used): */
1164 encoder_session.unencoded_size = 0;
1165 else if(skip == 0 && until == 0)
1166 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1167 else if(total_samples_in_input)
1168 encoder_session.unencoded_size = (FLAC__uint64)infilesize * encoder_session.total_samples_to_encode / total_samples_in_input;
1170 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1174 /* double protection */
1175 return EncoderSession_finish_error(&encoder_session);
1178 if(encoder_session.total_samples_to_encode == 0)
1179 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1181 if(options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)
1182 encoder_session.fmt.flac.client_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1184 /* init the encoder */
1185 if(!EncoderSession_init_encoder(&encoder_session, options))
1186 return EncoderSession_finish_error(&encoder_session);
1188 /* skip over any samples as requested */
1190 switch(options.format) {
1193 unsigned skip_bytes = encoder_session.info.bytes_per_wide_sample * (unsigned)skip;
1194 if(skip_bytes > lookahead_length) {
1195 skip_bytes -= lookahead_length;
1196 lookahead_length = 0;
1197 if(!fskip_ahead(encoder_session.fin, skip_bytes)) {
1198 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1199 return EncoderSession_finish_error(&encoder_session);
1203 lookahead += skip_bytes;
1204 lookahead_length -= skip_bytes;
1213 if(!fskip_ahead(encoder_session.fin, skip * encoder_session.info.bytes_per_wide_sample)) {
1214 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1215 return EncoderSession_finish_error(&encoder_session);
1219 case FORMAT_OGGFLAC:
1221 * have to wait until the FLAC encoder is set up for writing
1222 * before any seeking in the input FLAC file, because the seek
1223 * itself will usually call the decoder's write callback, and
1224 * our decoder's write callback passes samples to our FLAC
1227 if(!FLAC__stream_decoder_seek_absolute(encoder_session.fmt.flac.decoder, skip)) {
1228 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));
1229 return EncoderSession_finish_error(&encoder_session);
1234 /* double protection */
1235 return EncoderSession_finish_error(&encoder_session);
1240 * first do any samples in the reservoir
1242 if(options.sector_align && *options.align_reservoir_samples > 0) {
1243 FLAC__ASSERT(options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC); /* check again */
1244 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)options.align_reservoir, *options.align_reservoir_samples)) {
1245 print_error_with_state(&encoder_session, "ERROR during encoding");
1246 return EncoderSession_finish_error(&encoder_session);
1251 * decrement infilesize or the data_bytes counter if we need to align the file
1253 if(options.sector_align) {
1254 if(options.is_last_file) {
1255 *options.align_reservoir_samples = 0;
1258 *options.align_reservoir_samples = align_remainder;
1259 if(options.format == FORMAT_RAW) {
1260 FLAC__ASSERT(infilesize >= 0);
1261 infilesize -= (off_t)((*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample);
1262 FLAC__ASSERT(infilesize >= 0);
1264 else if(EncoderSession_format_is_iff(&encoder_session))
1265 encoder_session.fmt.iff.data_bytes -= (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample;
1270 * now do samples from the file
1272 switch(options.format) {
1274 if(infilesize < 0) {
1276 while(!feof(infile)) {
1277 if(lookahead_length > 0) {
1278 FLAC__ASSERT(lookahead_length < CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1279 memcpy(ucbuffer_, lookahead, lookahead_length);
1280 bytes_read = fread(ucbuffer_+lookahead_length, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample - lookahead_length, infile) + lookahead_length;
1281 if(ferror(infile)) {
1282 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1283 return EncoderSession_finish_error(&encoder_session);
1285 lookahead_length = 0;
1288 bytes_read = fread(ucbuffer_, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample, infile);
1290 if(bytes_read == 0) {
1291 if(ferror(infile)) {
1292 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1293 return EncoderSession_finish_error(&encoder_session);
1296 else if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1297 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1298 return EncoderSession_finish_error(&encoder_session);
1301 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1302 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))
1303 return EncoderSession_finish_error(&encoder_session);
1305 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1306 print_error_with_state(&encoder_session, "ERROR during encoding");
1307 return EncoderSession_finish_error(&encoder_session);
1314 const FLAC__uint64 max_input_bytes = infilesize;
1315 FLAC__uint64 total_input_bytes_read = 0;
1316 while(total_input_bytes_read < max_input_bytes) {
1318 size_t wanted = (CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1319 wanted = (size_t) min((FLAC__uint64)wanted, max_input_bytes - total_input_bytes_read);
1321 if(lookahead_length > 0) {
1322 FLAC__ASSERT(lookahead_length <= wanted);
1323 memcpy(ucbuffer_, lookahead, lookahead_length);
1324 wanted -= lookahead_length;
1325 bytes_read = lookahead_length;
1327 bytes_read += fread(ucbuffer_+lookahead_length, sizeof(unsigned char), wanted, infile);
1328 if(ferror(infile)) {
1329 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1330 return EncoderSession_finish_error(&encoder_session);
1333 lookahead_length = 0;
1336 bytes_read = fread(ucbuffer_, sizeof(unsigned char), wanted, infile);
1339 if(bytes_read == 0) {
1340 if(ferror(infile)) {
1341 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1342 return EncoderSession_finish_error(&encoder_session);
1344 else if(feof(infile)) {
1345 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);
1346 if(encoder_session.treat_warnings_as_errors)
1347 return EncoderSession_finish_error(&encoder_session);
1348 total_input_bytes_read = max_input_bytes;
1352 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1353 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1354 return EncoderSession_finish_error(&encoder_session);
1357 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1358 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))
1359 return EncoderSession_finish_error(&encoder_session);
1361 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1362 print_error_with_state(&encoder_session, "ERROR during encoding");
1363 return EncoderSession_finish_error(&encoder_session);
1365 total_input_bytes_read += bytes_read;
1376 while(encoder_session.fmt.iff.data_bytes > 0) {
1377 const size_t bytes_to_read = (size_t)min(
1378 encoder_session.fmt.iff.data_bytes,
1379 (FLAC__uint64)CHUNK_OF_SAMPLES * (FLAC__uint64)encoder_session.info.bytes_per_wide_sample
1381 size_t bytes_read = fread(ucbuffer_, sizeof(unsigned char), bytes_to_read, infile);
1382 if(bytes_read == 0) {
1383 if(ferror(infile)) {
1384 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1385 return EncoderSession_finish_error(&encoder_session);
1387 else if(feof(infile)) {
1388 if(options.ignore_chunk_sizes) {
1389 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);
1392 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);
1393 if(encoder_session.treat_warnings_as_errors)
1394 return EncoderSession_finish_error(&encoder_session);
1396 encoder_session.fmt.iff.data_bytes = 0;
1400 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1401 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1402 return EncoderSession_finish_error(&encoder_session);
1405 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1406 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))
1407 return EncoderSession_finish_error(&encoder_session);
1409 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1410 print_error_with_state(&encoder_session, "ERROR during encoding");
1411 return EncoderSession_finish_error(&encoder_session);
1413 encoder_session.fmt.iff.data_bytes -= bytes_read;
1419 case FORMAT_OGGFLAC:
1420 while(!encoder_session.fmt.flac.client_data.fatal_error && encoder_session.fmt.flac.client_data.samples_left_to_process > 0) {
1421 /* We can also hit the end of stream without samples_left_to_process
1422 * going to 0 if there are errors and continue_through_decode_errors
1423 * is on, so we want to break in that case too:
1425 if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(encoder_session.fmt.flac.decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1427 if(!FLAC__stream_decoder_process_single(encoder_session.fmt.flac.decoder)) {
1428 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));
1429 return EncoderSession_finish_error(&encoder_session);
1432 if(encoder_session.fmt.flac.client_data.fatal_error) {
1433 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));
1434 return EncoderSession_finish_error(&encoder_session);
1439 /* double protection */
1440 return EncoderSession_finish_error(&encoder_session);
1444 * now read unaligned samples into reservoir or pad with zeroes if necessary
1446 if(options.sector_align) {
1447 if(options.is_last_file) {
1448 unsigned wide_samples = 588 - align_remainder;
1449 if(wide_samples < 588) {
1452 info_align_zero = wide_samples;
1453 for(channel = 0; channel < encoder_session.info.channels; channel++)
1454 memset(input_[channel], 0, sizeof(input_[0][0]) * wide_samples);
1456 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1457 print_error_with_state(&encoder_session, "ERROR during encoding");
1458 return EncoderSession_finish_error(&encoder_session);
1463 if(*options.align_reservoir_samples > 0) {
1465 FLAC__ASSERT(CHUNK_OF_SAMPLES >= 588);
1466 bytes_read = fread(ucbuffer_, sizeof(unsigned char), (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample, infile);
1467 if(bytes_read == 0 && ferror(infile)) {
1468 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1469 return EncoderSession_finish_error(&encoder_session);
1471 else if(bytes_read != (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample) {
1472 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);
1473 if(encoder_session.treat_warnings_as_errors)
1474 return EncoderSession_finish_error(&encoder_session);
1477 info_align_carry = *options.align_reservoir_samples;
1478 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))
1479 return EncoderSession_finish_error(&encoder_session);
1486 return EncoderSession_finish_ok(
1490 EncoderSession_format_is_iff(&encoder_session)? options.format_options.iff.foreign_metadata : 0
1494 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)
1497 FLAC__uint32 test = 1;
1500 * initialize globals
1503 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
1505 for(i = 0; i < FLAC__MAX_CHANNELS; i++)
1506 input_[i] = &(in_[i][0]);
1510 * initialize instance
1514 e->use_ogg = options.use_ogg;
1516 e->verify = options.verify;
1517 e->treat_warnings_as_errors = options.treat_warnings_as_errors;
1518 e->continue_through_decode_errors = options.continue_through_decode_errors;
1520 e->is_stdout = (0 == strcmp(outfilename, "-"));
1521 e->outputfile_opened = false;
1523 e->inbasefilename = grabbag__file_get_basename(infilename);
1524 e->infilename = infilename;
1525 e->outfilename = outfilename;
1527 e->total_samples_to_encode = 0;
1528 e->unencoded_size = 0;
1529 e->bytes_written = 0;
1530 e->samples_written = 0;
1533 memset(&e->info, 0, sizeof(e->info));
1535 e->format = options.format;
1537 switch(options.format) {
1545 e->fmt.iff.data_bytes = 0;
1548 case FORMAT_OGGFLAC:
1549 e->fmt.flac.decoder = 0;
1550 e->fmt.flac.client_data.filesize = infilesize;
1551 e->fmt.flac.client_data.lookahead = lookahead;
1552 e->fmt.flac.client_data.lookahead_length = lookahead_length;
1553 e->fmt.flac.client_data.num_metadata_blocks = 0;
1554 e->fmt.flac.client_data.samples_left_to_process = 0;
1555 e->fmt.flac.client_data.fatal_error = false;
1559 /* double protection */
1566 e->seek_table_template = 0;
1568 if(0 == (e->seek_table_template = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE))) {
1569 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1573 e->encoder = FLAC__stream_encoder_new();
1574 if(0 == e->encoder) {
1575 flac__utils_printf(stderr, 1, "%s: ERROR creating the encoder instance\n", e->inbasefilename);
1576 EncoderSession_destroy(e);
1583 void EncoderSession_destroy(EncoderSession *e)
1585 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1587 if(e->fmt.flac.decoder)
1588 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1589 e->fmt.flac.decoder = 0;
1590 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1591 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1592 e->fmt.flac.client_data.num_metadata_blocks = 0;
1598 if(0 != e->encoder) {
1599 FLAC__stream_encoder_delete(e->encoder);
1603 if(0 != e->seek_table_template) {
1604 FLAC__metadata_object_delete(e->seek_table_template);
1605 e->seek_table_template = 0;
1609 int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata)
1611 FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
1613 FLAC__bool verify_error = false;
1616 fse_state = FLAC__stream_encoder_get_state(e->encoder);
1617 ret = FLAC__stream_encoder_finish(e->encoder)? 0 : 1;
1619 fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA ||
1620 FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
1623 /* all errors except verify errors should interrupt the stats */
1624 if(ret && !verify_error)
1625 print_error_with_state(e, "ERROR during encoding");
1626 else if(e->total_samples_to_encode > 0) {
1628 flac__utils_printf(stderr, 2, "\n");
1632 print_verify_error(e);
1636 if(info_align_carry >= 0) {
1637 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
1639 if(info_align_zero >= 0) {
1640 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
1644 /*@@@@@@ should this go here or somewhere else? */
1645 if(ret == 0 && foreign_metadata) {
1647 if(!flac__foreign_metadata_write_to_flac(foreign_metadata, e->infilename, e->outfilename, &error)) {
1648 flac__utils_printf(stderr, 1, "%s: ERROR: updating foreign metadata in FLAC file: %s\n", e->inbasefilename, error);
1653 EncoderSession_destroy(e);
1658 int EncoderSession_finish_error(EncoderSession *e)
1660 FLAC__ASSERT(e->encoder);
1662 if(e->total_samples_to_encode > 0)
1663 flac__utils_printf(stderr, 2, "\n");
1665 if(FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1666 print_verify_error(e);
1667 else if(e->outputfile_opened)
1668 /* only want to delete the file if we opened it; otherwise it could be an existing file and our overwrite failed */
1669 unlink(e->outfilename);
1671 EncoderSession_destroy(e);
1677 unsigned num_metadata;
1678 FLAC__bool *needs_delete;
1679 FLAC__StreamMetadata **metadata;
1680 FLAC__StreamMetadata *cuesheet; /* always needs to be deleted */
1681 } static_metadata_t;
1683 static void static_metadata_init(static_metadata_t *m)
1685 m->num_metadata = 0;
1686 m->needs_delete = 0;
1691 static void static_metadata_clear(static_metadata_t *m)
1694 for(i = 0; i < m->num_metadata; i++)
1695 if(m->needs_delete[i])
1696 FLAC__metadata_object_delete(m->metadata[i]);
1700 free(m->needs_delete);
1702 FLAC__metadata_object_delete(m->cuesheet);
1703 static_metadata_init(m);
1706 static FLAC__bool static_metadata_append(static_metadata_t *m, FLAC__StreamMetadata *d, FLAC__bool needs_delete)
1709 if(0 == (x = safe_realloc_muladd2_(m->metadata, sizeof(*m->metadata), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1711 m->metadata = (FLAC__StreamMetadata**)x;
1712 if(0 == (x = safe_realloc_muladd2_(m->needs_delete, sizeof(*m->needs_delete), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1714 m->needs_delete = (FLAC__bool*)x;
1715 m->metadata[m->num_metadata] = d;
1716 m->needs_delete[m->num_metadata] = needs_delete;
1721 FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options)
1723 const unsigned channels = e->info.channels;
1724 const unsigned bps = e->info.bits_per_sample - e->info.shift;
1725 const unsigned sample_rate = e->info.sample_rate;
1726 FLACDecoderData *flac_decoder_data = (e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC)? &e->fmt.flac.client_data : 0;
1727 FLAC__StreamMetadata padding;
1728 FLAC__StreamMetadata **metadata = 0;
1729 static_metadata_t static_metadata;
1730 unsigned num_metadata = 0, i;
1731 FLAC__StreamEncoderInitStatus init_status;
1732 const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);
1733 char apodizations[2000];
1735 FLAC__ASSERT(sizeof(options.pictures)/sizeof(options.pictures[0]) <= 64);
1737 static_metadata_init(&static_metadata);
1739 e->replay_gain = options.replay_gain;
1741 apodizations[0] = '\0';
1743 if(e->replay_gain) {
1744 if(channels != 1 && channels != 2) {
1745 flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
1748 if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
1749 flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
1752 if(options.is_first_file) {
1753 if(!grabbag__replaygain_init(sample_rate)) {
1754 flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
1760 if(!parse_cuesheet(&static_metadata.cuesheet, options.cuesheet_filename, e->inbasefilename, sample_rate, is_cdda, e->total_samples_to_encode, e->treat_warnings_as_errors))
1763 if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? static_metadata.cuesheet : 0, e)) {
1764 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1765 static_metadata_clear(&static_metadata);
1769 /* build metadata */
1770 if(flac_decoder_data) {
1772 * we're encoding from FLAC so we will use the FLAC file's
1773 * metadata as the basis for the encoded file
1777 * first handle pictures: simple append any --pictures
1780 for(i = 0; i < options.num_pictures; i++) {
1781 FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1783 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1784 static_metadata_clear(&static_metadata);
1787 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1792 * next handle vorbis comment: if any tags were specified
1793 * or there is no existing vorbis comment, we create a
1794 * new vorbis comment (discarding any existing one); else
1795 * we keep the existing one. also need to make sure to
1796 * propagate any channel mask tag.
1798 /* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1800 FLAC__bool vc_found = false;
1801 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1802 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1804 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1805 (void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &e->info.channel_mask);
1806 flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1807 if(e->treat_warnings_as_errors) {
1808 static_metadata_clear(&static_metadata);
1811 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1812 flac_decoder_data->metadata_blocks[i] = 0;
1815 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1817 flac_decoder_data->num_metadata_blocks = j;
1818 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])) {
1820 FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1821 if(0 == vc || (e->info.channel_mask && !flac__utils_set_channel_mask_tag(vc, e->info.channel_mask))) {
1822 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1823 static_metadata_clear(&static_metadata);
1826 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1827 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1828 flac_decoder_data->metadata_blocks[1] = vc;
1829 flac_decoder_data->num_metadata_blocks++;
1834 * next handle cuesheet: if --cuesheet was specified, use
1835 * it; else if file has existing CUESHEET and cuesheet's
1836 * lead-out offset is correct, keep it; else no CUESHEET
1839 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1840 FLAC__bool existing_cuesheet_is_bad = false;
1841 /* check if existing cuesheet matches the input audio */
1842 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == static_metadata.cuesheet) {
1843 const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1844 if(e->total_samples_to_encode == 0) {
1845 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);
1846 if(e->treat_warnings_as_errors) {
1847 static_metadata_clear(&static_metadata);
1850 existing_cuesheet_is_bad = true;
1852 else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1853 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);
1854 if(e->treat_warnings_as_errors) {
1855 static_metadata_clear(&static_metadata);
1858 existing_cuesheet_is_bad = true;
1861 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != static_metadata.cuesheet)) {
1862 if(0 != static_metadata.cuesheet) {
1863 flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1864 if(e->treat_warnings_as_errors) {
1865 static_metadata_clear(&static_metadata);
1869 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1870 flac_decoder_data->metadata_blocks[i] = 0;
1873 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1875 flac_decoder_data->num_metadata_blocks = j;
1876 if(0 != static_metadata.cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1878 FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(static_metadata.cuesheet);
1880 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1881 static_metadata_clear(&static_metadata);
1884 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1885 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1886 flac_decoder_data->metadata_blocks[1] = cs;
1887 flac_decoder_data->num_metadata_blocks++;
1892 * next handle seektable: if -S- was specified, no
1893 * SEEKTABLE; else if -S was specified, use it/them;
1894 * else if file has existing SEEKTABLE and input size is
1895 * preserved (no --skip/--until/etc specified), keep it;
1896 * else use default seektable options
1898 * note: meanings of num_requested_seek_points:
1899 * -1 : no -S option given, default to some value
1900 * 0 : -S- given (no seektable)
1901 * >0 : one or more -S options given
1904 FLAC__bool existing_seektable = false;
1905 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1906 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1907 existing_seektable = true;
1908 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)) {
1909 if(options.num_requested_seek_points > 0) {
1910 flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1911 if(e->treat_warnings_as_errors) {
1912 static_metadata_clear(&static_metadata);
1916 else if(options.num_requested_seek_points == 0)
1917 ; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1919 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);
1920 if(e->treat_warnings_as_errors) {
1921 static_metadata_clear(&static_metadata);
1925 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1926 flac_decoder_data->metadata_blocks[i] = 0;
1927 existing_seektable = false;
1930 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1932 flac_decoder_data->num_metadata_blocks = j;
1933 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])) {
1935 FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1937 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1938 static_metadata_clear(&static_metadata);
1941 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1942 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1943 flac_decoder_data->metadata_blocks[1] = st;
1944 flac_decoder_data->num_metadata_blocks++;
1949 * finally handle padding: if --no-padding was specified,
1950 * then delete all padding; else if -P was specified,
1951 * use that instead of existing padding (if any); else
1952 * if existing file has padding, move all existing
1953 * padding blocks to one padding block at the end; else
1954 * use default padding.
1958 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1959 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1962 p += flac_decoder_data->metadata_blocks[i]->length;
1963 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1964 flac_decoder_data->metadata_blocks[i] = 0;
1967 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1969 flac_decoder_data->num_metadata_blocks = j;
1970 if(options.padding > 0)
1971 p = options.padding;
1973 p = e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1974 if(options.padding != 0) {
1975 if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1976 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1977 if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1978 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1979 static_metadata_clear(&static_metadata);
1982 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1983 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1984 flac_decoder_data->num_metadata_blocks++;
1988 metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1989 num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1993 * we're not encoding from FLAC so we will build the metadata
1996 const foreign_metadata_t *foreign_metadata = EncoderSession_format_is_iff(e)? options.format_options.iff.foreign_metadata : 0;
1998 if(e->seek_table_template->data.seek_table.num_points > 0) {
1999 e->seek_table_template->is_last = false; /* the encoder will set this for us */
2000 static_metadata_append(&static_metadata, e->seek_table_template, /*needs_delete=*/false);
2002 if(0 != static_metadata.cuesheet)
2003 static_metadata_append(&static_metadata, static_metadata.cuesheet, /*needs_delete=*/false);
2004 if(e->info.channel_mask) {
2005 if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, e->info.channel_mask)) {
2006 flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
2007 static_metadata_clear(&static_metadata);
2011 static_metadata_append(&static_metadata, options.vorbis_comment, /*needs_delete=*/false);
2012 for(i = 0; i < options.num_pictures; i++)
2013 static_metadata_append(&static_metadata, options.pictures[i], /*needs_delete=*/false);
2014 if(foreign_metadata) {
2015 for(i = 0; i < foreign_metadata->num_blocks; i++) {
2016 FLAC__StreamMetadata *p = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
2018 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory\n", e->inbasefilename);
2019 static_metadata_clear(&static_metadata);
2022 static_metadata_append(&static_metadata, p, /*needs_delete=*/true);
2023 static_metadata.metadata[static_metadata.num_metadata-1]->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8 + foreign_metadata->blocks[i].size;
2026 if(options.padding != 0) {
2027 padding.is_last = false; /* the encoder will set this for us */
2028 padding.type = FLAC__METADATA_TYPE_PADDING;
2029 padding.length = (unsigned)(options.padding>0? options.padding : (e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8));
2030 static_metadata_append(&static_metadata, &padding, /*needs_delete=*/false);
2032 metadata = static_metadata.metadata;
2033 num_metadata = static_metadata.num_metadata;
2036 /* check for a few things that have not already been checked. the
2037 * FLAC__stream_encoder_init*() will check it but only return
2038 * FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
2039 * up front to give a better error message.
2041 if(!verify_metadata(e, metadata, num_metadata)) {
2042 static_metadata_clear(&static_metadata);
2046 FLAC__stream_encoder_set_verify(e->encoder, options.verify);
2047 FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
2048 FLAC__stream_encoder_set_channels(e->encoder, channels);
2049 FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
2050 FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
2051 for(i = 0; i < options.num_compression_settings; i++) {
2052 switch(options.compression_settings[i].type) {
2054 FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[i].value.t_unsigned);
2056 case CST_COMPRESSION_LEVEL:
2057 FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[i].value.t_unsigned);
2058 apodizations[0] = '\0';
2060 case CST_DO_MID_SIDE:
2061 FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2063 case CST_LOOSE_MID_SIDE:
2064 FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2066 case CST_APODIZATION:
2067 if(strlen(apodizations)+strlen(options.compression_settings[i].value.t_string)+2 >= sizeof(apodizations)) {
2068 flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
2069 static_metadata_clear(&static_metadata);
2073 strcat(apodizations, options.compression_settings[i].value.t_string);
2074 strcat(apodizations, ";");
2077 case CST_MAX_LPC_ORDER:
2078 FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2080 case CST_QLP_COEFF_PRECISION:
2081 FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[i].value.t_unsigned);
2083 case CST_DO_QLP_COEFF_PREC_SEARCH:
2084 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[i].value.t_bool);
2086 case CST_DO_ESCAPE_CODING:
2087 FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[i].value.t_bool);
2089 case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
2090 FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[i].value.t_bool);
2092 case CST_MIN_RESIDUAL_PARTITION_ORDER:
2093 FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2095 case CST_MAX_RESIDUAL_PARTITION_ORDER:
2096 FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2098 case CST_RICE_PARAMETER_SEARCH_DIST:
2099 FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[i].value.t_unsigned);
2104 FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
2105 FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
2106 FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
2108 FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
2109 FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
2110 FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
2111 if(!options.debug.do_md5) {
2112 flac__utils_printf(stderr, 1, "%s: WARNING, MD5 computation disabled, resulting file will not have MD5 sum\n", e->inbasefilename);
2113 if(e->treat_warnings_as_errors) {
2114 static_metadata_clear(&static_metadata);
2117 FLAC__stream_encoder_set_do_md5(e->encoder, false);
2122 FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
2124 init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2129 init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2132 if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
2133 print_error_with_init_status(e, "ERROR initializing encoder", init_status);
2134 if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
2135 e->outputfile_opened = true;
2136 static_metadata_clear(&static_metadata);
2140 e->outputfile_opened = true;
2143 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2144 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
2147 static_metadata_clear(&static_metadata);
2152 FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples)
2154 if(e->replay_gain) {
2155 if(!grabbag__replaygain_analyze(buffer, e->info.channels==2, e->info.bits_per_sample, samples)) {
2156 flac__utils_printf(stderr, 1, "%s: WARNING, error while calculating ReplayGain\n", e->inbasefilename);
2157 if(e->treat_warnings_as_errors)
2162 return FLAC__stream_encoder_process(e->encoder, buffer, samples);
2165 FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e)
2168 e->format == FORMAT_WAVE ||
2169 e->format == FORMAT_WAVE64 ||
2170 e->format == FORMAT_RF64 ||
2171 e->format == FORMAT_AIFF ||
2172 e->format == FORMAT_AIFF_C;
2175 FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e)
2177 const FLAC__bool only_placeholders = e->is_stdout;
2178 FLAC__bool has_real_points;
2180 if(num_requested_seek_points == 0 && 0 == cuesheet)
2183 if(num_requested_seek_points < 0) {
2185 /*@@@@@@ workaround ogg bug: too many seekpoints makes table not fit in one page */
2186 if(e->use_ogg && e->total_samples_to_encode > 0 && e->total_samples_to_encode / e->info.sample_rate / 10 > 230)
2187 requested_seek_points = "230x;";
2190 requested_seek_points = "10s;";
2191 num_requested_seek_points = 1;
2194 if(num_requested_seek_points > 0) {
2195 if(!grabbag__seektable_convert_specification_to_template(requested_seek_points, only_placeholders, e->total_samples_to_encode, e->info.sample_rate, e->seek_table_template, &has_real_points))
2201 const FLAC__StreamMetadata_CueSheet *cs = &cuesheet->data.cue_sheet;
2202 for(i = 0; i < cs->num_tracks; i++) {
2203 const FLAC__StreamMetadata_CueSheet_Track *tr = cs->tracks+i;
2204 for(j = 0; j < tr->num_indices; j++) {
2205 if(!FLAC__metadata_object_seektable_template_append_point(e->seek_table_template, tr->offset + tr->indices[j].offset))
2207 has_real_points = true;
2211 if(!FLAC__metadata_object_seektable_template_sort(e->seek_table_template, /*compact=*/true))
2215 if(has_real_points) {
2217 flac__utils_printf(stderr, 1, "%s: WARNING, cannot write back seekpoints when encoding to stdout\n", e->inbasefilename);
2218 if(e->treat_warnings_as_errors)
2226 FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input)
2228 /* convert from mm:ss.sss to sample number if necessary */
2229 flac__utils_canonicalize_skip_until_specification(spec, sample_rate);
2231 /* special case: if "--until=-0", use the special value '0' to mean "end-of-stream" */
2232 if(spec->is_relative && spec->value.samples == 0) {
2233 spec->is_relative = false;
2237 /* in any other case the total samples in the input must be known */
2238 if(total_samples_in_input == 0) {
2239 flac__utils_printf(stderr, 1, "%s: ERROR, cannot use --until when input length is unknown\n", inbasefilename);
2243 FLAC__ASSERT(spec->value_is_samples);
2245 /* convert relative specifications to absolute */
2246 if(spec->is_relative) {
2247 if(spec->value.samples <= 0)
2248 spec->value.samples += (FLAC__int64)total_samples_in_input;
2250 spec->value.samples += skip;
2251 spec->is_relative = false;
2255 if(spec->value.samples < 0) {
2256 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before beginning of input\n", inbasefilename);
2259 if((FLAC__uint64)spec->value.samples <= skip) {
2260 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before --skip point\n", inbasefilename);
2263 if((FLAC__uint64)spec->value.samples > total_samples_in_input) {
2264 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is after end of input\n", inbasefilename);
2271 FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata)
2273 FLAC__bool metadata_picture_has_type1 = false;
2274 FLAC__bool metadata_picture_has_type2 = false;
2277 FLAC__ASSERT(0 != metadata);
2278 for(i = 0; i < num_metadata; i++) {
2279 const FLAC__StreamMetadata *m = metadata[i];
2280 if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
2281 if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) {
2282 flac__utils_printf(stderr, 1, "%s: ERROR: SEEKTABLE metadata block is invalid\n", e->inbasefilename);
2286 else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
2287 if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) {
2288 flac__utils_printf(stderr, 1, "%s: ERROR: CUESHEET metadata block is invalid\n", e->inbasefilename);
2292 else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
2293 const char *error = 0;
2294 if(!FLAC__format_picture_is_legal(&m->data.picture, &error)) {
2295 flac__utils_printf(stderr, 1, "%s: ERROR: PICTURE metadata block is invalid: %s\n", e->inbasefilename, error);
2298 if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
2299 if(metadata_picture_has_type1) {
2300 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 1 (32x32 icon) in the file\n", e->inbasefilename);
2303 metadata_picture_has_type1 = true;
2305 else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
2306 if(metadata_picture_has_type2) {
2307 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 2 (icon) in the file\n", e->inbasefilename);
2310 metadata_picture_has_type2 = true;
2318 FLAC__bool format_input(FLAC__int32 *dest[], unsigned wide_samples, FLAC__bool is_big_endian, FLAC__bool is_unsigned_samples, unsigned channels, unsigned bps, unsigned shift, size_t *channel_map)
2320 unsigned wide_sample, sample, channel, byte;
2321 FLAC__int32 *out[FLAC__MAX_CHANNELS];
2323 if(0 == channel_map) {
2324 for(channel = 0; channel < channels; channel++)
2325 out[channel] = dest[channel];
2328 for(channel = 0; channel < channels; channel++)
2329 out[channel] = dest[channel_map[channel]];
2333 if(is_unsigned_samples) {
2334 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2335 for(channel = 0; channel < channels; channel++, sample++)
2336 out[channel][wide_sample] = (FLAC__int32)ucbuffer_[sample] - 0x80;
2339 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2340 for(channel = 0; channel < channels; channel++, sample++)
2341 out[channel][wide_sample] = (FLAC__int32)scbuffer_[sample];
2344 else if(bps == 16) {
2345 if(is_big_endian != is_big_endian_host_) {
2347 const unsigned bytes = wide_samples * channels * (bps >> 3);
2348 for(byte = 0; byte < bytes; byte += 2) {
2349 tmp = ucbuffer_[byte];
2350 ucbuffer_[byte] = ucbuffer_[byte+1];
2351 ucbuffer_[byte+1] = tmp;
2354 if(is_unsigned_samples) {
2355 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2356 for(channel = 0; channel < channels; channel++, sample++)
2357 out[channel][wide_sample] = (FLAC__int32)usbuffer_[sample] - 0x8000;
2360 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2361 for(channel = 0; channel < channels; channel++, sample++)
2362 out[channel][wide_sample] = (FLAC__int32)ssbuffer_[sample];
2365 else if(bps == 24) {
2366 if(!is_big_endian) {
2368 const unsigned bytes = wide_samples * channels * (bps >> 3);
2369 for(byte = 0; byte < bytes; byte += 3) {
2370 tmp = ucbuffer_[byte];
2371 ucbuffer_[byte] = ucbuffer_[byte+2];
2372 ucbuffer_[byte+2] = tmp;
2375 if(is_unsigned_samples) {
2376 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2377 for(channel = 0; channel < channels; channel++, sample++) {
2378 out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2379 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2380 out[channel][wide_sample] |= ucbuffer_[byte++];
2381 out[channel][wide_sample] -= 0x800000;
2385 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2386 for(channel = 0; channel < channels; channel++, sample++) {
2387 out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2388 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2389 out[channel][wide_sample] |= ucbuffer_[byte++];
2397 FLAC__int32 mask = (1<<shift)-1;
2398 for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2399 for(channel = 0; channel < channels; channel++) {
2400 if(out[channel][wide_sample] & mask) {
2401 flac__utils_printf(stderr, 1, "ERROR during read, sample data (channel#%u sample#%u = %d) has non-zero least-significant bits\n WAVE/AIFF header said the last %u bits are not significant and should be zero.\n", channel, wide_sample, out[channel][wide_sample], shift);
2404 out[channel][wide_sample] >>= shift;
2410 void encoder_progress_callback(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
2412 EncoderSession *e = (EncoderSession*)client_data;
2414 (void)encoder, (void)total_frames_estimate;
2416 e->bytes_written = bytes_written;
2417 e->samples_written = samples_written;
2419 if(e->total_samples_to_encode > 0 && !((frames_written-1) & e->stats_mask))
2423 FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
2426 EncoderSession *e = (EncoderSession*)client_data;
2427 FLACDecoderData *data = &e->fmt.flac.client_data;
2431 if (data->fatal_error)
2432 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2434 /* use up lookahead first */
2435 if (data->lookahead_length) {
2436 n = min(data->lookahead_length, *bytes);
2437 memcpy(buffer, data->lookahead, n);
2439 data->lookahead += n;
2440 data->lookahead_length -= n;
2443 /* get the rest from file */
2445 *bytes = n + fread(buffer, 1, *bytes-n, e->fin);
2447 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2448 else if(0 == *bytes)
2449 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
2451 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2454 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2457 FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
2459 EncoderSession *e = (EncoderSession*)client_data;
2462 if(fseeko(e->fin, (off_t)absolute_byte_offset, SEEK_SET) < 0)
2463 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
2465 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
2468 FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
2470 EncoderSession *e = (EncoderSession*)client_data;
2474 if((pos = ftello(e->fin)) < 0)
2475 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
2477 *absolute_byte_offset = (FLAC__uint64)pos;
2478 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
2482 FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
2484 const EncoderSession *e = (EncoderSession*)client_data;
2485 const FLACDecoderData *data = &e->fmt.flac.client_data;
2488 if(data->filesize < 0)
2489 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
2491 *stream_length = (FLAC__uint64)data->filesize;
2492 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
2496 FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
2498 EncoderSession *e = (EncoderSession*)client_data;
2501 return feof(e->fin)? true : false;
2504 FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2506 EncoderSession *e = (EncoderSession*)client_data;
2507 FLACDecoderData *data = &e->fmt.flac.client_data;
2508 FLAC__uint64 n = min(data->samples_left_to_process, frame->header.blocksize);
2511 if(!EncoderSession_process(e, buffer, (unsigned)n)) {
2512 print_error_with_state(e, "ERROR during encoding");
2513 data->fatal_error = true;
2514 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2517 data->samples_left_to_process -= n;
2518 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2521 void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2523 EncoderSession *e = (EncoderSession*)client_data;
2524 FLACDecoderData *data = &e->fmt.flac.client_data;
2527 if (data->fatal_error)
2531 data->num_metadata_blocks == sizeof(data->metadata_blocks)/sizeof(data->metadata_blocks[0]) ||
2532 0 == (data->metadata_blocks[data->num_metadata_blocks] = FLAC__metadata_object_clone(metadata))
2534 data->fatal_error = true;
2536 data->num_metadata_blocks++;
2539 void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2541 EncoderSession *e = (EncoderSession*)client_data;
2542 FLACDecoderData *data = &e->fmt.flac.client_data;
2545 flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", e->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
2546 if(!e->continue_through_decode_errors)
2547 data->fatal_error = true;
2550 FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, unsigned sample_rate, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors)
2553 unsigned last_line_read;
2554 const char *error_message;
2556 if(0 == cuesheet_filename)
2559 if(lead_out_offset == 0) {
2560 flac__utils_printf(stderr, 1, "%s: ERROR cannot import cuesheet when the number of input samples to encode is unknown\n", inbasefilename);
2564 if(0 == (f = fopen(cuesheet_filename, "r"))) {
2565 flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
2569 *cuesheet = grabbag__cuesheet_parse(f, &error_message, &last_line_read, sample_rate, is_cdda, lead_out_offset);
2573 if(0 == *cuesheet) {
2574 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\" on line %u: %s\n", inbasefilename, cuesheet_filename, last_line_read, error_message);
2578 if(!FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/false, &error_message)) {
2579 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\": %s\n", inbasefilename, cuesheet_filename, error_message);
2583 /* if we're expecting CDDA, warn about non-compliance */
2584 if(is_cdda && !FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/true, &error_message)) {
2585 flac__utils_printf(stderr, 1, "%s: WARNING cuesheet \"%s\" is not audio CD compliant: %s\n", inbasefilename, cuesheet_filename, error_message);
2586 if(treat_warnings_as_errors)
2588 (*cuesheet)->data.cue_sheet.is_cd = false;
2594 void print_stats(const EncoderSession *encoder_session)
2596 const FLAC__uint64 samples_written = min(encoder_session->total_samples_to_encode, encoder_session->samples_written);
2597 const FLAC__uint64 uesize = encoder_session->unencoded_size;
2598 #if defined _MSC_VER || defined __MINGW32__
2599 /* with MSVC you have to spoon feed it the casting */
2600 const double progress = (double)(FLAC__int64)samples_written / (double)(FLAC__int64)encoder_session->total_samples_to_encode;
2601 const double ratio = (double)(FLAC__int64)encoder_session->bytes_written / ((double)(FLAC__int64)(uesize? uesize:1) * min(1.0, progress));
2603 const double progress = (double)samples_written / (double)encoder_session->total_samples_to_encode;
2604 const double ratio = (double)encoder_session->bytes_written / ((double)(uesize? uesize:1) * min(1.0, progress));
2607 FLAC__ASSERT(encoder_session->total_samples_to_encode > 0);
2609 if(samples_written == encoder_session->total_samples_to_encode) {
2610 flac__utils_printf(stderr, 2, "\r%s:%s wrote %u bytes, ratio=",
2611 encoder_session->inbasefilename,
2612 encoder_session->verify? " Verify OK," : "",
2613 (unsigned)encoder_session->bytes_written
2617 flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5));
2620 flac__utils_printf(stderr, 2, "%0.3f", ratio);
2622 flac__utils_printf(stderr, 2, "N/A");
2625 void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
2627 const int ilen = strlen(e->inbasefilename) + 1;
2628 const char *state_string = "";
2630 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2632 flac__utils_printf(stderr, 1, "%*s init_status = %s\n", ilen, "", FLAC__StreamEncoderInitStatusString[init_status]);
2634 if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR) {
2635 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2637 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2639 /* print out some more info for some errors: */
2640 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2641 flac__utils_printf(stderr, 1,
2643 "An error occurred while writing; the most common cause is that the disk is full.\n"
2646 else if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_IO_ERROR])) {
2647 flac__utils_printf(stderr, 1,
2649 "An error occurred opening the output file; it is likely that the output\n"
2650 "directory does not exist or is not writable, the output file already exists and\n"
2651 "is not writable, or the disk is full.\n"
2655 else if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE) {
2656 flac__utils_printf(stderr, 1,
2658 "The encoding parameters specified do not conform to the FLAC Subset and may not\n"
2659 "be streamable or playable in hardware devices. If you really understand the\n"
2660 "consequences, you can add --lax to the command-line options to encode with\n"
2661 "these parameters anyway. See http://flac.sourceforge.net/format.html#subset\n"
2666 void print_error_with_state(const EncoderSession *e, const char *message)
2668 const int ilen = strlen(e->inbasefilename) + 1;
2669 const char *state_string;
2671 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2673 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2675 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2677 /* print out some more info for some errors: */
2678 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2679 flac__utils_printf(stderr, 1,
2681 "An error occurred while writing; the most common cause is that the disk is full.\n"
2686 void print_verify_error(EncoderSession *e)
2688 FLAC__uint64 absolute_sample;
2689 unsigned frame_number;
2692 FLAC__int32 expected;
2695 FLAC__stream_encoder_get_verify_decoder_error_stats(e->encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
2697 flac__utils_printf(stderr, 1, "%s: ERROR: mismatch in decoded data, verify FAILED!\n", e->inbasefilename);
2698 flac__utils_printf(stderr, 1, " Absolute sample=%u, frame=%u, channel=%u, sample=%u, expected %d, got %d\n", (unsigned)absolute_sample, frame_number, channel, sample, expected, got);
2699 flac__utils_printf(stderr, 1, " In all known cases, verify errors are caused by hardware problems,\n");
2700 flac__utils_printf(stderr, 1, " usually overclocking or bad RAM. Delete %s\n", e->outfilename);
2701 flac__utils_printf(stderr, 1, " and repeat the flac command exactly as before. If it does not give a\n");
2702 flac__utils_printf(stderr, 1, " verify error in the exact same place each time you try it, then there is\n");
2703 flac__utils_printf(stderr, 1, " a problem with your hardware; please see the FAQ:\n");
2704 flac__utils_printf(stderr, 1, " http://flac.sourceforge.net/faq.html#tools__hardware_prob\n");
2705 flac__utils_printf(stderr, 1, " If it does fail in the exact same place every time, keep\n");
2706 flac__utils_printf(stderr, 1, " %s and submit a bug report to:\n", e->outfilename);
2707 flac__utils_printf(stderr, 1, " https://sourceforge.net/bugs/?func=addbug&group_id=13478\n");
2708 flac__utils_printf(stderr, 1, " Make sure to upload the FLAC file and use the \"Monitor\" feature to\n");
2709 flac__utils_printf(stderr, 1, " monitor the bug status.\n");
2710 flac__utils_printf(stderr, 1, "Verify FAILED! Do not trust %s\n", e->outfilename);
2713 FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn)
2715 size_t bytes_read = fread(buf, 1, n, f);
2717 if(bytes_read == 0) {
2719 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2725 if(bytes_read < n) {
2726 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2732 FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn)
2734 if(!read_bytes(f, (FLAC__byte*)val, 2, /*eof_ok=*/false, fn))
2736 if(is_big_endian_host_ != big_endian) {
2737 FLAC__byte tmp, *b = (FLAC__byte*)val;
2738 tmp = b[1]; b[1] = b[0]; b[0] = tmp;
2743 FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn)
2745 if(!read_bytes(f, (FLAC__byte*)val, 4, /*eof_ok=*/false, fn))
2747 if(is_big_endian_host_ != big_endian) {
2748 FLAC__byte tmp, *b = (FLAC__byte*)val;
2749 tmp = b[3]; b[3] = b[0]; b[0] = tmp;
2750 tmp = b[2]; b[2] = b[1]; b[1] = tmp;
2755 FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn)
2757 if(!read_bytes(f, (FLAC__byte*)val, 8, /*eof_ok=*/false, fn))
2759 if(is_big_endian_host_ != big_endian) {
2760 FLAC__byte tmp, *b = (FLAC__byte*)val;
2761 tmp = b[7]; b[7] = b[0]; b[0] = tmp;
2762 tmp = b[6]; b[6] = b[1]; b[1] = tmp;
2763 tmp = b[5]; b[5] = b[2]; b[2] = tmp;
2764 tmp = b[4]; b[4] = b[3]; b[3] = tmp;
2769 FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn)
2770 /* Read an IEEE 754 80-bit (aka SANE) extended floating point value from 'f',
2771 * convert it into an integral value and store in 'val'. Return false if only
2772 * between 1 and 9 bytes remain in 'f', if 0 bytes remain in 'f', or if the
2773 * value is negative, between zero and one, or too large to be represented by
2774 * 'val'; return true otherwise.
2783 if(!read_bytes(f, buf, sizeof(buf), /*eof_ok=*/false, fn))
2785 e = ((FLAC__uint16)(buf[0])<<8 | (FLAC__uint16)(buf[1]))-0x3FFF;
2787 if((buf[0]>>7)==1U || e<0 || e>63) {
2788 flac__utils_printf(stderr, 1, "%s: ERROR: invalid floating-point value\n", fn);
2792 for(i = 0; i < 8; ++i)
2793 p |= (FLAC__uint64)(buf[i+2])<<(56U-i*8);
2794 *val = (FLAC__uint32)((p>>shift)+(p>>(shift-1) & 0x1));
2799 FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset)
2801 static unsigned char dump[8192];
2805 /* MS' stdio impl can't even seek forward on stdin, have to use pure non-fseek() version: */
2807 const long need = (long)min(offset, sizeof(dump));
2808 if((long)fread(dump, 1, need, f) < need)
2817 long need = (long)min(offset, LONG_MAX);
2818 if(fseeko(f, need, SEEK_CUR) < 0) {
2819 need = (long)min(offset, sizeof(dump));
2820 if((long)fread(dump, 1, need, f) < need)
2829 unsigned count_channel_mask_bits(FLAC__uint32 mask)
2841 FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels)
2843 FLAC__uint32 x = 0x80000000;
2844 unsigned count = count_channel_mask_bits(mask);
2845 while(x && count > channels) {
2852 FLAC__ASSERT(count_channel_mask_bits(mask) == channels);