1 /* flac - Command-line FLAC encoder/decoder
2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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() */
31 #include "share/alloc.h"
32 #include "share/grabbag.h"
33 #include "share/compat.h"
39 #define min(x,y) ((x)<(y)?(x):(y))
43 #define max(x,y) ((x)>(y)?(x):(y))
45 /* this MUST be >= 588 so that sector aligning can take place with one read */
46 /* this MUST be < 2^sizeof(size_t) / ( FLAC__MAX_CHANNELS * (FLAC__MAX_BITS_PER_SAMPLE/8) ) */
47 #define CHUNK_OF_SAMPLES 2048
52 unsigned bits_per_sample; /* width of sample point, including 'shift' bits, valid bps is bits_per_sample-shift */
53 unsigned shift; /* # of LSBs samples have been shifted left by */
54 unsigned bytes_per_wide_sample; /* for convenience, always == channels*((bps+7)/8), or 0 if N/A to input format (like FLAC) */
55 FLAC__bool is_unsigned_samples;
56 FLAC__bool is_big_endian;
57 FLAC__uint32 channel_mask;
60 /* this is the client_data attached to the FLAC decoder when encoding from a FLAC file */
63 const FLAC__byte *lookahead;
64 unsigned lookahead_length;
65 size_t num_metadata_blocks;
66 FLAC__StreamMetadata *metadata_blocks[1024]; /*@@@ BAD MAGIC number */
67 FLAC__uint64 samples_left_to_process;
68 FLAC__bool fatal_error;
77 FLAC__bool outputfile_opened; /* true if we successfully opened the output file and we want it to be deleted if there is an error */
78 const char *inbasefilename;
79 const char *infilename;
80 const char *outfilename;
82 FLAC__bool treat_warnings_as_errors;
83 FLAC__bool continue_through_decode_errors;
84 FLAC__bool replay_gain;
85 FLAC__uint64 total_samples_to_encode; /* (i.e. "wide samples" aka "sample frames") WATCHOUT: may be 0 to mean 'unknown' */
86 FLAC__uint64 unencoded_size; /* an estimate of the input size, only used in the progress indicator */
87 FLAC__uint64 bytes_written;
88 FLAC__uint64 samples_written;
96 FLAC__uint64 data_bytes;
99 FLAC__StreamDecoder *decoder;
100 FLACDecoderData client_data;
104 FLAC__StreamEncoder *encoder;
107 FLAC__StreamMetadata *seek_table_template;
110 const int FLAC_ENCODE__DEFAULT_PADDING = 8192;
112 static FLAC__bool is_big_endian_host_;
114 static unsigned char ucbuffer_[CHUNK_OF_SAMPLES*FLAC__MAX_CHANNELS*((FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE+7)/8)];
115 static signed char *scbuffer_ = (signed char *)ucbuffer_;
116 static FLAC__uint16 *usbuffer_ = (FLAC__uint16 *)ucbuffer_;
117 static FLAC__int16 *ssbuffer_ = (FLAC__int16 *)ucbuffer_;
119 static FLAC__int32 in_[FLAC__MAX_CHANNELS][CHUNK_OF_SAMPLES];
120 static FLAC__int32 *input_[FLAC__MAX_CHANNELS];
124 * unpublished debug routines from the FLAC libs
126 extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
127 extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
128 extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
129 extern FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value);
134 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);
135 static void EncoderSession_destroy(EncoderSession *e);
136 static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata);
137 static int EncoderSession_finish_error(EncoderSession *e);
138 static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options);
139 static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
140 static FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e);
141 static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
142 static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
143 static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
144 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);
145 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);
146 static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
147 static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
148 static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
149 static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
150 static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
151 static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
152 static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
153 static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
154 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);
155 static void print_stats(const EncoderSession *encoder_session);
156 static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
157 static void print_error_with_state(const EncoderSession *e, const char *message);
158 static void print_verify_error(EncoderSession *e);
159 static FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn);
160 static FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn);
161 static FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn);
162 static FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn);
163 static FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn);
164 static FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset);
165 static unsigned count_channel_mask_bits(FLAC__uint32 mask);
167 static FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels);
170 static FLAC__bool get_sample_info_raw(EncoderSession *e, encode_options_t options)
172 e->info.sample_rate = options.format_options.raw.sample_rate;
173 e->info.channels = options.format_options.raw.channels;
174 e->info.bits_per_sample = options.format_options.raw.bps;
176 e->info.bytes_per_wide_sample = options.format_options.raw.channels * ((options.format_options.raw.bps+7)/8);
177 e->info.is_unsigned_samples = options.format_options.raw.is_unsigned_samples;
178 e->info.is_big_endian = options.format_options.raw.is_big_endian;
179 e->info.channel_mask = 0;
184 static FLAC__bool get_sample_info_wave(EncoderSession *e, encode_options_t options)
186 FLAC__bool got_fmt_chunk = false, got_data_chunk = false, got_ds64_chunk = false;
187 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
188 FLAC__uint32 channel_mask = 0;
189 FLAC__uint64 ds64_data_size = 0;
191 e->info.is_unsigned_samples = false;
192 e->info.is_big_endian = false;
194 if(e->format == FORMAT_WAVE64) {
196 * lookahead[] already has "riff\x2E\x91\xCF\x11\xD6\xA5\x28\xDB", skip over remaining header
198 if(!fskip_ahead(e->fin, 16+8+16-12)) { /* riff GUID + riff size + WAVE GUID - lookahead */
199 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over remaining \"riff\" header\n", e->inbasefilename);
203 /* else lookahead[] already has "RIFFxxxxWAVE" or "RF64xxxxWAVE" */
205 while(!feof(e->fin) && !got_data_chunk) {
206 /* chunk IDs are 4 bytes for WAVE/RF64, 16 for Wave64 */
207 /* for WAVE/RF64 we want the 5th char zeroed so we can treat it like a C string */
208 char chunk_id[16] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
210 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, e->format==FORMAT_WAVE64?16:4, /*eof_ok=*/true, e->inbasefilename)) {
211 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
217 if(e->format == FORMAT_RF64 && !memcmp(chunk_id, "ds64", 4)) { /* RF64 64-bit sizes chunk */
218 FLAC__uint32 xx, data_bytes;
221 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'ds64' chunks\n", e->inbasefilename);
224 if(got_fmt_chunk || got_data_chunk) {
225 flac__utils_printf(stderr, 1, "%s: ERROR: 'ds64' chunk appears after 'fmt ' or 'data' chunk\n", e->inbasefilename);
229 /* ds64 chunk size */
230 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
233 if(data_bytes < 28) {
234 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'ds64' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
237 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
240 /* RIFF 64-bit size, lo/hi */
241 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
243 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
246 /* 'data' 64-bit size */
247 if(!read_uint64(e->fin, /*big_endian=*/false, &ds64_data_size, e->inbasefilename))
252 /* skip any extra data in the ds64 chunk */
253 if(!fskip_ahead(e->fin, data_bytes)) {
254 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'ds64' data\n", e->inbasefilename);
258 got_ds64_chunk = true;
261 !memcmp(chunk_id, "fmt ", 4) &&
262 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "fmt \xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
263 ) { /* format chunk */
265 FLAC__uint32 xx, data_bytes;
266 FLAC__uint16 wFormatTag; /* wFormatTag word from the 'fmt ' chunk */
269 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'fmt ' chunks\n", e->inbasefilename);
274 * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
275 * http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
276 * 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
280 * 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
282 * 4 byte: sample rate (Hz)
283 * 4 byte: avg bytes per sec
284 * 2 byte: block align
285 * 2 byte: bits per sample (not necessarily all significant)
287 * 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
288 * WAVEFORMATEXTENSIBLE adds
289 * 2 byte: valid bits per sample
290 * 4 byte: channel mask
291 * 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
293 * Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
294 * 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.
296 * Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
298 * If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
299 * If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
301 * Data is supposed to be unsigned for bps <= 8 else signed.
305 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
308 if(e->format == FORMAT_WAVE64) {
309 /* other half of the size field should be 0 */
310 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
313 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);
316 /* subtract size of header */
317 if (data_bytes < 16+8) {
318 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);
321 data_bytes -= (16+8);
323 if(data_bytes < 16) {
324 flac__utils_printf(stderr, 1, "%s: ERROR: non-standard 'fmt ' chunk has length = %u\n", e->inbasefilename, (unsigned)data_bytes);
327 if(e->format != FORMAT_WAVE64) {
328 if(data_bytes & 1) /* should never happen, but enforce WAVE alignment rules */
332 data_bytes = (data_bytes+7) & (~7u); /* should never happen, but enforce Wave64 alignment rules */
336 if(!read_uint16(e->fin, /*big_endian=*/false, &wFormatTag, e->inbasefilename))
338 if(wFormatTag != 1 /*WAVE_FORMAT_PCM*/ && wFormatTag != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
339 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", e->inbasefilename, (unsigned)wFormatTag);
343 /* number of channels */
344 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
346 channels = (unsigned)x;
349 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
353 /* avg bytes per second (ignored) */
354 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
357 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
360 /* bits per sample */
361 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
365 e->info.is_unsigned_samples = (bps <= 8);
367 if(wFormatTag == 1) {
368 if(bps != 8 && bps != 16) {
369 if(bps == 24 || bps == 32) {
370 /* let these slide with a warning since they're unambiguous */
371 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);
372 if(e->treat_warnings_as_errors)
376 /* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
377 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);
381 #if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
382 if((bps+7)/8 * channels == block_align) {
384 /* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
385 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);
386 if(e->treat_warnings_as_errors)
388 shift = 8 - (bps % 8);
395 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);
401 if(channels > 2 && !options.channel_map_none) {
402 flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", e->inbasefilename);
405 FLAC__ASSERT(data_bytes >= 16);
409 if(data_bytes < 40) {
410 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", e->inbasefilename, (unsigned)data_bytes);
414 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
417 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", e->inbasefilename, (unsigned)x);
421 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
423 if((unsigned)x > bps) {
424 flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", e->inbasefilename, (unsigned)x, bps);
427 shift = bps - (unsigned)x;
429 if(!read_uint32(e->fin, /*big_endian=*/false, &channel_mask, e->inbasefilename))
431 /* for mono/stereo and unassigned channels, we fake the mask */
432 if(channel_mask == 0) {
434 channel_mask = 0x0001;
435 else if(channels == 2)
436 channel_mask = 0x0003;
438 /* set channel mapping */
439 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
440 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
441 /* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
443 /* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
445 options.channel_map_none ||
446 channel_mask == 0x0001 || /* 1 channel: (mono) */
447 channel_mask == 0x0003 || /* 2 channels: front left, front right */
448 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
449 channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
451 /* keep default channel order */
454 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
455 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
456 channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
458 /* to dolby order: front left, center, front right [, surround left, surround right ] */
463 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
464 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
466 /* to dolby order: front left, center, front right, surround left, surround right, LFE */
475 options.channel_map_none ||
476 channel_mask == 0x0001 || /* 1 channel: (mono) */
477 channel_mask == 0x0003 || /* 2 channels: front left, front right */
478 channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
479 channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
480 channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
481 channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
482 channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
483 channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
484 channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
486 /* keep default channel order */
490 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);
493 if(!options.channel_map_none) {
494 if(count_channel_mask_bits(channel_mask) < channels) {
495 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);
499 /* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
500 * there would be holes in the order that would have to be filled in, or the mask would have to be
501 * limited and the logic above rerun to see if it still fits into the FLAC mapping.
503 else if(count_channel_mask_bits(channel_mask) > channels)
504 channel_mask = limit_channel_mask(channel_mask, channels);
506 else if(count_channel_mask_bits(channel_mask) > channels) {
507 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);
512 /* first part of GUID */
513 if(!read_uint16(e->fin, /*big_endian=*/false, &x, e->inbasefilename))
516 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", e->inbasefilename, (unsigned)x);
522 e->info.bytes_per_wide_sample = channels * (bps / 8);
524 /* skip any extra data in the fmt chunk */
525 if(!fskip_ahead(e->fin, data_bytes)) {
526 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra 'fmt' data\n", e->inbasefilename);
530 got_fmt_chunk = true;
533 !memcmp(chunk_id, "data", 4) &&
534 (e->format!=FORMAT_WAVE64 || !memcmp(chunk_id, "data\xF3\xAC\xD3\x11\xD1\x8C\x00\xC0\x4F\x8E\xDB\x8A", 16))
537 FLAC__uint64 data_bytes;
540 flac__utils_printf(stderr, 1, "%s: ERROR: got 'data' chunk before 'fmt' chunk\n", e->inbasefilename);
545 if(e->format != FORMAT_WAVE64) {
546 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
551 if(!read_uint64(e->fin, /*big_endian=*/false, &data_bytes, e->inbasefilename))
553 /* subtract size of header */
554 if (data_bytes < 16+8) {
555 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 'data' chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)data_bytes);
558 data_bytes -= (16+8);
560 if(e->format == FORMAT_RF64) {
561 if(!got_ds64_chunk) {
562 flac__utils_printf(stderr, 1, "%s: ERROR: RF64 file has no 'ds64' chunk before 'data' chunk\n", e->inbasefilename);
565 if(data_bytes == 0xffffffff)
566 data_bytes = ds64_data_size;
568 if(options.ignore_chunk_sizes) {
569 FLAC__ASSERT(!options.sector_align);
571 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);
572 if(e->treat_warnings_as_errors)
575 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 */
577 else if(0 == data_bytes) {
578 flac__utils_printf(stderr, 1, "%s: ERROR: 'data' chunk has size of 0\n", e->inbasefilename);
582 e->fmt.iff.data_bytes = data_bytes;
584 got_data_chunk = true;
590 if(!options.format_options.iff.foreign_metadata) {
591 if(e->format != FORMAT_WAVE64)
592 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
594 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",
596 (unsigned)((const unsigned char *)chunk_id)[3],
597 (unsigned)((const unsigned char *)chunk_id)[2],
598 (unsigned)((const unsigned char *)chunk_id)[1],
599 (unsigned)((const unsigned char *)chunk_id)[0],
600 (unsigned)((const unsigned char *)chunk_id)[5],
601 (unsigned)((const unsigned char *)chunk_id)[4],
602 (unsigned)((const unsigned char *)chunk_id)[7],
603 (unsigned)((const unsigned char *)chunk_id)[6],
604 (unsigned)((const unsigned char *)chunk_id)[9],
605 (unsigned)((const unsigned char *)chunk_id)[8],
606 (unsigned)((const unsigned char *)chunk_id)[10],
607 (unsigned)((const unsigned char *)chunk_id)[11],
608 (unsigned)((const unsigned char *)chunk_id)[12],
609 (unsigned)((const unsigned char *)chunk_id)[13],
610 (unsigned)((const unsigned char *)chunk_id)[14],
611 (unsigned)((const unsigned char *)chunk_id)[15]
613 if(e->treat_warnings_as_errors)
618 if(e->format != FORMAT_WAVE64) {
619 if(!read_uint32(e->fin, /*big_endian=*/false, &xx, e->inbasefilename))
625 if(!read_uint64(e->fin, /*big_endian=*/false, &skip, e->inbasefilename))
627 skip = (skip+7) & (~(FLAC__uint64)7);
628 /* subtract size of header */
630 flac__utils_printf(stderr, 1, "%s: ERROR: freakishly small Wave64 chunk has length = 0x00000000%08X\n", e->inbasefilename, (unsigned)skip);
636 if(!fskip_ahead(e->fin, skip)) {
637 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
645 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find fmt chunk\n", e->inbasefilename);
648 if(!got_data_chunk) {
649 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find data chunk\n", e->inbasefilename);
653 e->info.sample_rate = sample_rate;
654 e->info.channels = channels;
655 e->info.bits_per_sample = bps;
656 e->info.shift = shift;
657 e->info.channel_mask = channel_mask;
662 static FLAC__bool get_sample_info_aiff(EncoderSession *e, encode_options_t options)
664 FLAC__bool got_comm_chunk = false, got_ssnd_chunk = false;
665 unsigned sample_rate = 0, channels = 0, bps = 0, shift = 0;
666 FLAC__uint64 sample_frames = 0;
667 FLAC__uint32 channel_mask = 0;
669 e->info.is_unsigned_samples = false;
670 e->info.is_big_endian = true;
673 * lookahead[] already has "FORMxxxxAIFF", do chunks
675 while(!feof(e->fin) && !got_ssnd_chunk) {
676 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 */
677 if(!read_bytes(e->fin, (FLAC__byte*)chunk_id, 4, /*eof_ok=*/true, e->inbasefilename)) {
678 flac__utils_printf(stderr, 1, "%s: ERROR: incomplete chunk identifier\n", e->inbasefilename);
684 if(!memcmp(chunk_id, "COMM", 4)) { /* common chunk */
688 const FLAC__bool is_aifc = e->format == FORMAT_AIFF_C;
689 const FLAC__uint32 minimum_comm_size = (is_aifc? 22 : 18);
692 flac__utils_printf(stderr, 1, "%s: ERROR: file has multiple 'COMM' chunks\n", e->inbasefilename);
696 /* COMM chunk size */
697 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
699 else if(xx < minimum_comm_size) {
700 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);
703 else if(!is_aifc && xx != minimum_comm_size) {
704 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);
705 if(e->treat_warnings_as_errors)
708 skip = (xx-minimum_comm_size)+(xx & 1);
710 /* number of channels */
711 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
713 channels = (unsigned)x;
714 if(channels > 2 && !options.channel_map_none) {
715 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
719 /* number of sample frames */
720 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
724 /* bits per sample */
725 if(!read_uint16(e->fin, /*big_endian=*/true, &x, e->inbasefilename))
728 shift = (bps%8)? 8-(bps%8) : 0; /* SSND data is always byte-aligned, left-justified but format_input() will double-check */
732 if(!read_sane_extended(e->fin, &xx, e->inbasefilename))
736 /* check compression type for AIFF-C */
738 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
740 if(xx == 0x736F7774) /* "sowt" */
741 e->info.is_big_endian = false;
742 else if(xx == 0x4E4F4E45) /* "NONE" */
743 ; /* nothing to do, we already default to big-endian */
745 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));
750 /* set channel mapping */
751 /* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
752 /* front left, front right, center, LFE, back left, back right, surround left, surround right */
753 /* specs say the channel ordering is:
755 * ___________________________________________________
759 * quad (ambiguous with 4ch) Fl Fr Bl Br
762 * 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
763 * so we only have unambiguous mappings for 2, 3, and 5 channels
766 options.channel_map_none ||
767 channels == 1 || /* 1 channel: (mono) */
768 channels == 2 || /* 2 channels: left, right */
769 channels == 3 || /* 3 channels: left, right, center */
770 channels == 5 /* 5 channels: front left, front right, center, surround left, surround right */
772 /* keep default channel order */
775 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u for AIFF\n", e->inbasefilename, channels);
779 e->info.bytes_per_wide_sample = channels * (bps / 8);
781 /* skip any extra data in the COMM chunk */
782 if(!fskip_ahead(e->fin, skip)) {
783 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over extra COMM data\n", e->inbasefilename);
787 got_comm_chunk = true;
789 else if(!memcmp(chunk_id, "SSND", 4) && !got_ssnd_chunk) { /* sound data chunk */
791 FLAC__uint64 data_bytes;
794 if(!got_comm_chunk) {
795 flac__utils_printf(stderr, 1, "%s: ERROR: got 'SSND' chunk before 'COMM' chunk\n", e->inbasefilename);
799 /* SSND chunk size */
800 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
803 if(options.ignore_chunk_sizes) {
804 FLAC__ASSERT(!options.sector_align);
806 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);
807 if(e->treat_warnings_as_errors)
810 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 */
812 else if(data_bytes <= 8) {
813 flac__utils_printf(stderr, 1, "%s: ERROR: 'SSND' chunk has size <= 8\n", e->inbasefilename);
817 data_bytes -= 8; /* discount the offset and block size fields */
821 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
824 data_bytes -= offset;
827 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
829 if(xx && !options.ignore_chunk_sizes)
830 data_bytes -= (xx - (data_bytes % xx));
831 if(options.ignore_chunk_sizes) {
833 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);
834 if(e->treat_warnings_as_errors)
839 /* skip any SSND offset bytes */
840 if(!fskip_ahead(e->fin, offset)) {
841 flac__utils_printf(stderr, 1, "%s: ERROR: skipping offset in SSND chunk\n", e->inbasefilename);
845 e->fmt.iff.data_bytes = data_bytes;
847 got_ssnd_chunk = true;
851 if(!options.format_options.iff.foreign_metadata) {
852 flac__utils_printf(stderr, 1, "%s: WARNING: skipping unknown chunk '%s' (use --keep-foreign-metadata to keep)\n", e->inbasefilename, chunk_id);
853 if(e->treat_warnings_as_errors)
858 if(!read_uint32(e->fin, /*big_endian=*/true, &xx, e->inbasefilename))
861 unsigned long skip = xx + (xx & 1);
863 FLAC__ASSERT(skip <= LONG_MAX);
864 if(!fskip_ahead(e->fin, skip)) {
865 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping over chunk\n", e->inbasefilename);
872 if(!got_comm_chunk) {
873 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find COMM chunk\n", e->inbasefilename);
876 if(!got_ssnd_chunk && sample_frames) {
877 flac__utils_printf(stderr, 1, "%s: ERROR: didn't find SSND chunk\n", e->inbasefilename);
881 e->info.sample_rate = sample_rate;
882 e->info.channels = channels;
883 e->info.bits_per_sample = bps;
884 e->info.shift = shift;
885 e->info.channel_mask = channel_mask;
890 static FLAC__bool get_sample_info_flac(EncoderSession *e)
893 FLAC__stream_decoder_set_md5_checking(e->fmt.flac.decoder, false) &&
894 FLAC__stream_decoder_set_metadata_respond_all(e->fmt.flac.decoder)
896 flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", e->inbasefilename);
900 if (e->format == FORMAT_OGGFLAC) {
901 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) {
902 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));
906 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) {
907 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));
911 if (!FLAC__stream_decoder_process_until_end_of_metadata(e->fmt.flac.decoder) || e->fmt.flac.client_data.fatal_error) {
912 if (e->fmt.flac.client_data.fatal_error)
913 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", e->inbasefilename);
915 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));
919 if (e->fmt.flac.client_data.num_metadata_blocks == 0) {
920 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", e->inbasefilename);
923 else if (e->fmt.flac.client_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
924 flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", e->inbasefilename);
927 else if (e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
928 flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", e->inbasefilename);
932 e->info.sample_rate = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.sample_rate;
933 e->info.channels = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.channels;
934 e->info.bits_per_sample = e->fmt.flac.client_data.metadata_blocks[0]->data.stream_info.bits_per_sample;
936 e->info.bytes_per_wide_sample = 0;
937 e->info.is_unsigned_samples = false; /* not applicable for FLAC input */
938 e->info.is_big_endian = false; /* not applicable for FLAC input */
939 e->info.channel_mask = 0;
947 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)
949 EncoderSession encoder_session;
950 size_t channel_map[FLAC__MAX_CHANNELS];
951 int info_align_carry = -1, info_align_zero = -1;
953 if(!EncoderSession_construct(&encoder_session, options, infilesize, infile, infilename, outfilename, lookahead, lookahead_length))
956 /* initialize default channel map that preserves channel order */
959 for(i = 0; i < sizeof(channel_map)/sizeof(channel_map[0]); i++)
963 /* read foreign metadata if requested */
964 if(EncoderSession_format_is_iff(&encoder_session) && options.format_options.iff.foreign_metadata) {
967 options.format == FORMAT_WAVE || options.format == FORMAT_RF64?
968 flac__foreign_metadata_read_from_wave(options.format_options.iff.foreign_metadata, infilename, &error) :
969 options.format == FORMAT_WAVE64?
970 flac__foreign_metadata_read_from_wave64(options.format_options.iff.foreign_metadata, infilename, &error) :
971 flac__foreign_metadata_read_from_aiff(options.format_options.iff.foreign_metadata, infilename, &error)
973 flac__utils_printf(stderr, 1, "%s: ERROR reading foreign metadata: %s\n", encoder_session.inbasefilename, error);
974 return EncoderSession_finish_error(&encoder_session);
978 /* initialize encoder session with info about the audio (channels/bps/resolution/endianness/etc) */
979 switch(options.format) {
981 if(!get_sample_info_raw(&encoder_session, options))
982 return EncoderSession_finish_error(&encoder_session);
987 if(!get_sample_info_wave(&encoder_session, options))
988 return EncoderSession_finish_error(&encoder_session);
992 if(!get_sample_info_aiff(&encoder_session, options))
993 return EncoderSession_finish_error(&encoder_session);
998 * set up FLAC decoder for the input
1000 if (0 == (encoder_session.fmt.flac.decoder = FLAC__stream_decoder_new())) {
1001 flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
1002 return EncoderSession_finish_error(&encoder_session);
1004 if(!get_sample_info_flac(&encoder_session))
1005 return EncoderSession_finish_error(&encoder_session);
1009 /* double protection */
1010 return EncoderSession_finish_error(&encoder_session);
1013 /* some more checks */
1014 if(encoder_session.info.channels == 0 || encoder_session.info.channels > FLAC__MAX_CHANNELS) {
1015 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, encoder_session.info.channels);
1016 return EncoderSession_finish_error(&encoder_session);
1018 if(!FLAC__format_sample_rate_is_valid(encoder_session.info.sample_rate)) {
1019 flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, encoder_session.info.sample_rate);
1020 return EncoderSession_finish_error(&encoder_session);
1022 if(encoder_session.info.bits_per_sample-encoder_session.info.shift < 4 || encoder_session.info.bits_per_sample-encoder_session.info.shift > 24) {
1023 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);
1024 return EncoderSession_finish_error(&encoder_session);
1026 if(options.sector_align) {
1027 if(encoder_session.info.channels != 2) {
1028 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);
1029 return EncoderSession_finish_error(&encoder_session);
1031 if(encoder_session.info.sample_rate != 44100) {
1032 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);
1033 return EncoderSession_finish_error(&encoder_session);
1035 if(encoder_session.info.bits_per_sample-encoder_session.info.shift != 16) {
1036 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);
1037 return EncoderSession_finish_error(&encoder_session);
1042 FLAC__uint64 total_samples_in_input; /* WATCHOUT: may be 0 to mean "unknown" */
1044 FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
1045 unsigned align_remainder = 0;
1047 switch(options.format) {
1050 total_samples_in_input = 0;
1052 total_samples_in_input = (FLAC__uint64)infilesize / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1059 /* truncation in the division removes any padding byte that was counted in encoder_session.fmt.iff.data_bytes */
1060 total_samples_in_input = encoder_session.fmt.iff.data_bytes / encoder_session.info.bytes_per_wide_sample + *options.align_reservoir_samples;
1063 case FORMAT_OGGFLAC:
1064 total_samples_in_input = encoder_session.fmt.flac.client_data.metadata_blocks[0]->data.stream_info.total_samples + *options.align_reservoir_samples;
1068 /* double protection */
1069 return EncoderSession_finish_error(&encoder_session);
1073 * now that we know the sample rate, canonicalize the
1074 * --skip string to an absolute sample number:
1076 flac__utils_canonicalize_skip_until_specification(&options.skip_specification, encoder_session.info.sample_rate);
1077 FLAC__ASSERT(options.skip_specification.value.samples >= 0);
1078 skip = (FLAC__uint64)options.skip_specification.value.samples;
1079 FLAC__ASSERT(!options.sector_align || (options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC && skip == 0));
1080 /* *options.align_reservoir_samples will be 0 unless --sector-align is used */
1081 FLAC__ASSERT(options.sector_align || *options.align_reservoir_samples == 0);
1084 * now that we possibly know the input size, canonicalize the
1085 * --until string to an absolute sample number:
1087 if(!canonicalize_until_specification(&options.until_specification, encoder_session.inbasefilename, encoder_session.info.sample_rate, skip, total_samples_in_input))
1088 return EncoderSession_finish_error(&encoder_session);
1089 until = (FLAC__uint64)options.until_specification.value.samples;
1090 FLAC__ASSERT(!options.sector_align || until == 0);
1092 /* adjust encoding parameters based on skip and until values */
1093 switch(options.format) {
1095 infilesize -= (off_t)skip * encoder_session.info.bytes_per_wide_sample;
1096 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1103 encoder_session.fmt.iff.data_bytes -= skip * encoder_session.info.bytes_per_wide_sample;
1104 if(options.ignore_chunk_sizes) {
1105 encoder_session.total_samples_to_encode = 0;
1106 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1107 FLAC__ASSERT(0 == until);
1110 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1114 case FORMAT_OGGFLAC:
1115 encoder_session.total_samples_to_encode = total_samples_in_input - skip;
1119 /* double protection */
1120 return EncoderSession_finish_error(&encoder_session);
1123 const FLAC__uint64 trim = total_samples_in_input - until;
1124 FLAC__ASSERT(total_samples_in_input > 0);
1125 FLAC__ASSERT(!options.sector_align);
1126 if(options.format == FORMAT_RAW)
1127 infilesize -= (off_t)trim * encoder_session.info.bytes_per_wide_sample;
1128 else if(EncoderSession_format_is_iff(&encoder_session))
1129 encoder_session.fmt.iff.data_bytes -= trim * encoder_session.info.bytes_per_wide_sample;
1130 encoder_session.total_samples_to_encode -= trim;
1132 if(options.sector_align && (options.format != FORMAT_RAW || infilesize >=0)) { /* for RAW, need to know the filesize */
1133 FLAC__ASSERT(skip == 0); /* asserted above too, but lest we forget */
1134 align_remainder = (unsigned)(encoder_session.total_samples_to_encode % 588);
1135 if(options.is_last_file)
1136 encoder_session.total_samples_to_encode += (588-align_remainder); /* will pad with zeroes */
1138 encoder_session.total_samples_to_encode -= align_remainder; /* will stop short and carry over to next file */
1140 switch(options.format) {
1142 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample;
1145 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1146 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 44;
1149 /* +44 for the size of the WAVE headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1150 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 104;
1153 /* +72 for the size of the RF64 headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1154 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 80;
1158 /* +54 for the size of the AIFF headers; this is just an estimate for the progress indicator and doesn't need to be exact */
1159 encoder_session.unencoded_size = encoder_session.total_samples_to_encode * encoder_session.info.bytes_per_wide_sample + 54;
1162 case FORMAT_OGGFLAC:
1164 /* if we don't know, use 0 as hint to progress indicator (which is the only place this is used): */
1165 encoder_session.unencoded_size = 0;
1166 else if(skip == 0 && until == 0)
1167 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1168 else if(total_samples_in_input)
1169 encoder_session.unencoded_size = (FLAC__uint64)infilesize * encoder_session.total_samples_to_encode / total_samples_in_input;
1171 encoder_session.unencoded_size = (FLAC__uint64)infilesize;
1175 /* double protection */
1176 return EncoderSession_finish_error(&encoder_session);
1179 if(encoder_session.total_samples_to_encode == 0)
1180 flac__utils_printf(stderr, 2, "(No runtime statistics possible; please wait for encoding to finish...)\n");
1182 if(options.format == FORMAT_FLAC || options.format == FORMAT_OGGFLAC)
1183 encoder_session.fmt.flac.client_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1185 /* init the encoder */
1186 if(!EncoderSession_init_encoder(&encoder_session, options))
1187 return EncoderSession_finish_error(&encoder_session);
1189 /* skip over any samples as requested */
1191 switch(options.format) {
1194 unsigned skip_bytes = encoder_session.info.bytes_per_wide_sample * (unsigned)skip;
1195 if(skip_bytes > lookahead_length) {
1196 skip_bytes -= lookahead_length;
1197 lookahead_length = 0;
1198 if(!fskip_ahead(encoder_session.fin, skip_bytes)) {
1199 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1200 return EncoderSession_finish_error(&encoder_session);
1204 lookahead += skip_bytes;
1205 lookahead_length -= skip_bytes;
1214 if(!fskip_ahead(encoder_session.fin, skip * encoder_session.info.bytes_per_wide_sample)) {
1215 flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
1216 return EncoderSession_finish_error(&encoder_session);
1220 case FORMAT_OGGFLAC:
1222 * have to wait until the FLAC encoder is set up for writing
1223 * before any seeking in the input FLAC file, because the seek
1224 * itself will usually call the decoder's write callback, and
1225 * our decoder's write callback passes samples to our FLAC
1228 if(!FLAC__stream_decoder_seek_absolute(encoder_session.fmt.flac.decoder, skip)) {
1229 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));
1230 return EncoderSession_finish_error(&encoder_session);
1235 /* double protection */
1236 return EncoderSession_finish_error(&encoder_session);
1241 * first do any samples in the reservoir
1243 if(options.sector_align && *options.align_reservoir_samples > 0) {
1244 FLAC__ASSERT(options.format != FORMAT_FLAC && options.format != FORMAT_OGGFLAC); /* check again */
1245 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)options.align_reservoir, *options.align_reservoir_samples)) {
1246 print_error_with_state(&encoder_session, "ERROR during encoding");
1247 return EncoderSession_finish_error(&encoder_session);
1252 * decrement infilesize or the data_bytes counter if we need to align the file
1254 if(options.sector_align) {
1255 if(options.is_last_file) {
1256 *options.align_reservoir_samples = 0;
1259 *options.align_reservoir_samples = align_remainder;
1260 if(options.format == FORMAT_RAW) {
1261 FLAC__ASSERT(infilesize >= 0);
1262 infilesize -= (off_t)((*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample);
1263 FLAC__ASSERT(infilesize >= 0);
1265 else if(EncoderSession_format_is_iff(&encoder_session))
1266 encoder_session.fmt.iff.data_bytes -= (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample;
1271 * now do samples from the file
1273 switch(options.format) {
1275 if(infilesize < 0) {
1277 while(!feof(infile)) {
1278 if(lookahead_length > 0) {
1279 FLAC__ASSERT(lookahead_length < CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1280 memcpy(ucbuffer_, lookahead, lookahead_length);
1281 bytes_read = fread(ucbuffer_+lookahead_length, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample - lookahead_length, infile) + lookahead_length;
1282 if(ferror(infile)) {
1283 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1284 return EncoderSession_finish_error(&encoder_session);
1286 lookahead_length = 0;
1289 bytes_read = fread(ucbuffer_, sizeof(unsigned char), CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample, infile);
1291 if(bytes_read == 0) {
1292 if(ferror(infile)) {
1293 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1294 return EncoderSession_finish_error(&encoder_session);
1297 else if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1298 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1299 return EncoderSession_finish_error(&encoder_session);
1302 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1303 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))
1304 return EncoderSession_finish_error(&encoder_session);
1306 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1307 print_error_with_state(&encoder_session, "ERROR during encoding");
1308 return EncoderSession_finish_error(&encoder_session);
1315 const FLAC__uint64 max_input_bytes = infilesize;
1316 FLAC__uint64 total_input_bytes_read = 0;
1317 while(total_input_bytes_read < max_input_bytes) {
1319 size_t wanted = (CHUNK_OF_SAMPLES * encoder_session.info.bytes_per_wide_sample);
1320 wanted = (size_t) min((FLAC__uint64)wanted, max_input_bytes - total_input_bytes_read);
1322 if(lookahead_length > 0) {
1323 FLAC__ASSERT(lookahead_length <= wanted);
1324 memcpy(ucbuffer_, lookahead, lookahead_length);
1325 wanted -= lookahead_length;
1326 bytes_read = lookahead_length;
1328 bytes_read += fread(ucbuffer_+lookahead_length, sizeof(unsigned char), wanted, infile);
1329 if(ferror(infile)) {
1330 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1331 return EncoderSession_finish_error(&encoder_session);
1334 lookahead_length = 0;
1337 bytes_read = fread(ucbuffer_, sizeof(unsigned char), wanted, infile);
1340 if(bytes_read == 0) {
1341 if(ferror(infile)) {
1342 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1343 return EncoderSession_finish_error(&encoder_session);
1345 else if(feof(infile)) {
1346 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);
1347 if(encoder_session.treat_warnings_as_errors)
1348 return EncoderSession_finish_error(&encoder_session);
1349 total_input_bytes_read = max_input_bytes;
1353 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1354 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1355 return EncoderSession_finish_error(&encoder_session);
1358 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1359 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))
1360 return EncoderSession_finish_error(&encoder_session);
1362 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1363 print_error_with_state(&encoder_session, "ERROR during encoding");
1364 return EncoderSession_finish_error(&encoder_session);
1366 total_input_bytes_read += bytes_read;
1377 while(encoder_session.fmt.iff.data_bytes > 0) {
1378 const size_t bytes_to_read = (size_t)min(
1379 encoder_session.fmt.iff.data_bytes,
1380 (FLAC__uint64)CHUNK_OF_SAMPLES * (FLAC__uint64)encoder_session.info.bytes_per_wide_sample
1382 size_t bytes_read = fread(ucbuffer_, sizeof(unsigned char), bytes_to_read, infile);
1383 if(bytes_read == 0) {
1384 if(ferror(infile)) {
1385 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1386 return EncoderSession_finish_error(&encoder_session);
1388 else if(feof(infile)) {
1389 if(options.ignore_chunk_sizes) {
1390 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);
1393 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);
1394 if(encoder_session.treat_warnings_as_errors)
1395 return EncoderSession_finish_error(&encoder_session);
1397 encoder_session.fmt.iff.data_bytes = 0;
1401 if(bytes_read % encoder_session.info.bytes_per_wide_sample != 0) {
1402 flac__utils_printf(stderr, 1, "%s: ERROR: got partial sample\n", encoder_session.inbasefilename);
1403 return EncoderSession_finish_error(&encoder_session);
1406 unsigned wide_samples = bytes_read / encoder_session.info.bytes_per_wide_sample;
1407 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))
1408 return EncoderSession_finish_error(&encoder_session);
1410 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1411 print_error_with_state(&encoder_session, "ERROR during encoding");
1412 return EncoderSession_finish_error(&encoder_session);
1414 encoder_session.fmt.iff.data_bytes -= bytes_read;
1420 case FORMAT_OGGFLAC:
1421 while(!encoder_session.fmt.flac.client_data.fatal_error && encoder_session.fmt.flac.client_data.samples_left_to_process > 0) {
1422 /* We can also hit the end of stream without samples_left_to_process
1423 * going to 0 if there are errors and continue_through_decode_errors
1424 * is on, so we want to break in that case too:
1426 if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(encoder_session.fmt.flac.decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1428 if(!FLAC__stream_decoder_process_single(encoder_session.fmt.flac.decoder)) {
1429 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));
1430 return EncoderSession_finish_error(&encoder_session);
1433 if(encoder_session.fmt.flac.client_data.fatal_error) {
1434 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));
1435 return EncoderSession_finish_error(&encoder_session);
1440 /* double protection */
1441 return EncoderSession_finish_error(&encoder_session);
1445 * now read unaligned samples into reservoir or pad with zeroes if necessary
1447 if(options.sector_align) {
1448 if(options.is_last_file) {
1449 unsigned wide_samples = 588 - align_remainder;
1450 if(wide_samples < 588) {
1453 info_align_zero = wide_samples;
1454 for(channel = 0; channel < encoder_session.info.channels; channel++)
1455 memset(input_[channel], 0, sizeof(input_[0][0]) * wide_samples);
1457 if(!EncoderSession_process(&encoder_session, (const FLAC__int32 * const *)input_, wide_samples)) {
1458 print_error_with_state(&encoder_session, "ERROR during encoding");
1459 return EncoderSession_finish_error(&encoder_session);
1464 if(*options.align_reservoir_samples > 0) {
1466 FLAC__ASSERT(CHUNK_OF_SAMPLES >= 588);
1467 bytes_read = fread(ucbuffer_, sizeof(unsigned char), (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample, infile);
1468 if(bytes_read == 0 && ferror(infile)) {
1469 flac__utils_printf(stderr, 1, "%s: ERROR during read\n", encoder_session.inbasefilename);
1470 return EncoderSession_finish_error(&encoder_session);
1472 else if(bytes_read != (*options.align_reservoir_samples) * encoder_session.info.bytes_per_wide_sample) {
1473 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);
1474 if(encoder_session.treat_warnings_as_errors)
1475 return EncoderSession_finish_error(&encoder_session);
1478 info_align_carry = *options.align_reservoir_samples;
1479 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))
1480 return EncoderSession_finish_error(&encoder_session);
1487 return EncoderSession_finish_ok(
1491 EncoderSession_format_is_iff(&encoder_session)? options.format_options.iff.foreign_metadata : 0
1495 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)
1498 FLAC__uint32 test = 1;
1501 * initialize globals
1504 is_big_endian_host_ = (*((FLAC__byte*)(&test)))? false : true;
1506 for(i = 0; i < FLAC__MAX_CHANNELS; i++)
1507 input_[i] = &(in_[i][0]);
1511 * initialize instance
1515 e->use_ogg = options.use_ogg;
1517 e->verify = options.verify;
1518 e->treat_warnings_as_errors = options.treat_warnings_as_errors;
1519 e->continue_through_decode_errors = options.continue_through_decode_errors;
1521 e->is_stdout = (0 == strcmp(outfilename, "-"));
1522 e->outputfile_opened = false;
1524 e->inbasefilename = grabbag__file_get_basename(infilename);
1525 e->infilename = infilename;
1526 e->outfilename = outfilename;
1528 e->total_samples_to_encode = 0;
1529 e->unencoded_size = 0;
1530 e->bytes_written = 0;
1531 e->samples_written = 0;
1534 memset(&e->info, 0, sizeof(e->info));
1536 e->format = options.format;
1538 switch(options.format) {
1546 e->fmt.iff.data_bytes = 0;
1549 case FORMAT_OGGFLAC:
1550 e->fmt.flac.decoder = 0;
1551 e->fmt.flac.client_data.filesize = infilesize;
1552 e->fmt.flac.client_data.lookahead = lookahead;
1553 e->fmt.flac.client_data.lookahead_length = lookahead_length;
1554 e->fmt.flac.client_data.num_metadata_blocks = 0;
1555 e->fmt.flac.client_data.samples_left_to_process = 0;
1556 e->fmt.flac.client_data.fatal_error = false;
1560 /* double protection */
1567 e->seek_table_template = 0;
1569 if(0 == (e->seek_table_template = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE))) {
1570 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1574 e->encoder = FLAC__stream_encoder_new();
1575 if(0 == e->encoder) {
1576 flac__utils_printf(stderr, 1, "%s: ERROR creating the encoder instance\n", e->inbasefilename);
1577 EncoderSession_destroy(e);
1584 void EncoderSession_destroy(EncoderSession *e)
1586 if(e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC) {
1588 if(e->fmt.flac.decoder)
1589 FLAC__stream_decoder_delete(e->fmt.flac.decoder);
1590 e->fmt.flac.decoder = 0;
1591 for(i = 0; i < e->fmt.flac.client_data.num_metadata_blocks; i++)
1592 FLAC__metadata_object_delete(e->fmt.flac.client_data.metadata_blocks[i]);
1593 e->fmt.flac.client_data.num_metadata_blocks = 0;
1599 if(0 != e->encoder) {
1600 FLAC__stream_encoder_delete(e->encoder);
1604 if(0 != e->seek_table_template) {
1605 FLAC__metadata_object_delete(e->seek_table_template);
1606 e->seek_table_template = 0;
1610 int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero, foreign_metadata_t *foreign_metadata)
1612 FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
1614 FLAC__bool verify_error = false;
1617 fse_state = FLAC__stream_encoder_get_state(e->encoder);
1618 ret = FLAC__stream_encoder_finish(e->encoder)? 0 : 1;
1620 fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA ||
1621 FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
1624 /* all errors except verify errors should interrupt the stats */
1625 if(ret && !verify_error)
1626 print_error_with_state(e, "ERROR during encoding");
1627 else if(e->total_samples_to_encode > 0) {
1629 flac__utils_printf(stderr, 2, "\n");
1633 print_verify_error(e);
1637 if(info_align_carry >= 0) {
1638 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
1640 if(info_align_zero >= 0) {
1641 flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
1645 /*@@@@@@ should this go here or somewhere else? */
1646 if(ret == 0 && foreign_metadata) {
1648 if(!flac__foreign_metadata_write_to_flac(foreign_metadata, e->infilename, e->outfilename, &error)) {
1649 flac__utils_printf(stderr, 1, "%s: ERROR: updating foreign metadata in FLAC file: %s\n", e->inbasefilename, error);
1654 EncoderSession_destroy(e);
1659 int EncoderSession_finish_error(EncoderSession *e)
1661 FLAC__ASSERT(e->encoder);
1663 if(e->total_samples_to_encode > 0)
1664 flac__utils_printf(stderr, 2, "\n");
1666 if(FLAC__stream_encoder_get_state(e->encoder) == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
1667 print_verify_error(e);
1668 else if(e->outputfile_opened)
1669 /* only want to delete the file if we opened it; otherwise it could be an existing file and our overwrite failed */
1670 unlink(e->outfilename);
1672 EncoderSession_destroy(e);
1678 unsigned num_metadata;
1679 FLAC__bool *needs_delete;
1680 FLAC__StreamMetadata **metadata;
1681 FLAC__StreamMetadata *cuesheet; /* always needs to be deleted */
1682 } static_metadata_t;
1684 static void static_metadata_init(static_metadata_t *m)
1686 m->num_metadata = 0;
1687 m->needs_delete = 0;
1692 static void static_metadata_clear(static_metadata_t *m)
1695 for(i = 0; i < m->num_metadata; i++)
1696 if(m->needs_delete[i])
1697 FLAC__metadata_object_delete(m->metadata[i]);
1701 free(m->needs_delete);
1703 FLAC__metadata_object_delete(m->cuesheet);
1704 static_metadata_init(m);
1707 static FLAC__bool static_metadata_append(static_metadata_t *m, FLAC__StreamMetadata *d, FLAC__bool needs_delete)
1710 if(0 == (x = safe_realloc_muladd2_(m->metadata, sizeof(*m->metadata), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1712 m->metadata = (FLAC__StreamMetadata**)x;
1713 if(0 == (x = safe_realloc_muladd2_(m->needs_delete, sizeof(*m->needs_delete), /*times (*/m->num_metadata, /*+*/1/*)*/)))
1715 m->needs_delete = (FLAC__bool*)x;
1716 m->metadata[m->num_metadata] = d;
1717 m->needs_delete[m->num_metadata] = needs_delete;
1722 FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options)
1724 const unsigned channels = e->info.channels;
1725 const unsigned bps = e->info.bits_per_sample - e->info.shift;
1726 const unsigned sample_rate = e->info.sample_rate;
1727 FLACDecoderData *flac_decoder_data = (e->format == FORMAT_FLAC || e->format == FORMAT_OGGFLAC)? &e->fmt.flac.client_data : 0;
1728 FLAC__StreamMetadata padding;
1729 FLAC__StreamMetadata **metadata = 0;
1730 static_metadata_t static_metadata;
1731 unsigned num_metadata = 0, i;
1732 FLAC__StreamEncoderInitStatus init_status;
1733 const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);
1734 char apodizations[2000];
1736 FLAC__ASSERT(sizeof(options.pictures)/sizeof(options.pictures[0]) <= 64);
1738 static_metadata_init(&static_metadata);
1740 e->replay_gain = options.replay_gain;
1742 apodizations[0] = '\0';
1744 if(e->replay_gain) {
1745 if(channels != 1 && channels != 2) {
1746 flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
1749 if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
1750 flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
1753 if(options.is_first_file) {
1754 if(!grabbag__replaygain_init(sample_rate)) {
1755 flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
1761 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))
1764 if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? static_metadata.cuesheet : 0, e)) {
1765 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
1766 static_metadata_clear(&static_metadata);
1770 /* build metadata */
1771 if(flac_decoder_data) {
1773 * we're encoding from FLAC so we will use the FLAC file's
1774 * metadata as the basis for the encoded file
1778 * first handle pictures: simple append any --pictures
1781 for(i = 0; i < options.num_pictures; i++) {
1782 FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1784 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1785 static_metadata_clear(&static_metadata);
1788 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1793 * next handle vorbis comment: if any tags were specified
1794 * or there is no existing vorbis comment, we create a
1795 * new vorbis comment (discarding any existing one); else
1796 * we keep the existing one. also need to make sure to
1797 * propagate any channel mask tag.
1799 /* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1801 FLAC__bool vc_found = false;
1802 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1803 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1805 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1806 (void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &e->info.channel_mask);
1807 flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1808 if(e->treat_warnings_as_errors) {
1809 static_metadata_clear(&static_metadata);
1812 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1813 flac_decoder_data->metadata_blocks[i] = 0;
1816 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1818 flac_decoder_data->num_metadata_blocks = j;
1819 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])) {
1821 FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1822 if(0 == vc || (e->info.channel_mask && !flac__utils_set_channel_mask_tag(vc, e->info.channel_mask))) {
1823 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1824 static_metadata_clear(&static_metadata);
1827 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1828 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1829 flac_decoder_data->metadata_blocks[1] = vc;
1830 flac_decoder_data->num_metadata_blocks++;
1835 * next handle cuesheet: if --cuesheet was specified, use
1836 * it; else if file has existing CUESHEET and cuesheet's
1837 * lead-out offset is correct, keep it; else no CUESHEET
1840 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1841 FLAC__bool existing_cuesheet_is_bad = false;
1842 /* check if existing cuesheet matches the input audio */
1843 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == static_metadata.cuesheet) {
1844 const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1845 if(e->total_samples_to_encode == 0) {
1846 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);
1847 if(e->treat_warnings_as_errors) {
1848 static_metadata_clear(&static_metadata);
1851 existing_cuesheet_is_bad = true;
1853 else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1854 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);
1855 if(e->treat_warnings_as_errors) {
1856 static_metadata_clear(&static_metadata);
1859 existing_cuesheet_is_bad = true;
1862 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != static_metadata.cuesheet)) {
1863 if(0 != static_metadata.cuesheet) {
1864 flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1865 if(e->treat_warnings_as_errors) {
1866 static_metadata_clear(&static_metadata);
1870 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1871 flac_decoder_data->metadata_blocks[i] = 0;
1874 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1876 flac_decoder_data->num_metadata_blocks = j;
1877 if(0 != static_metadata.cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1879 FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(static_metadata.cuesheet);
1881 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1882 static_metadata_clear(&static_metadata);
1885 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1886 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1887 flac_decoder_data->metadata_blocks[1] = cs;
1888 flac_decoder_data->num_metadata_blocks++;
1893 * next handle seektable: if -S- was specified, no
1894 * SEEKTABLE; else if -S was specified, use it/them;
1895 * else if file has existing SEEKTABLE and input size is
1896 * preserved (no --skip/--until/etc specified), keep it;
1897 * else use default seektable options
1899 * note: meanings of num_requested_seek_points:
1900 * -1 : no -S option given, default to some value
1901 * 0 : -S- given (no seektable)
1902 * >0 : one or more -S options given
1905 FLAC__bool existing_seektable = false;
1906 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1907 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1908 existing_seektable = true;
1909 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)) {
1910 if(options.num_requested_seek_points > 0) {
1911 flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1912 if(e->treat_warnings_as_errors) {
1913 static_metadata_clear(&static_metadata);
1917 else if(options.num_requested_seek_points == 0)
1918 ; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1920 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);
1921 if(e->treat_warnings_as_errors) {
1922 static_metadata_clear(&static_metadata);
1926 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1927 flac_decoder_data->metadata_blocks[i] = 0;
1928 existing_seektable = false;
1931 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1933 flac_decoder_data->num_metadata_blocks = j;
1934 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])) {
1936 FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1938 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1939 static_metadata_clear(&static_metadata);
1942 for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1943 flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1944 flac_decoder_data->metadata_blocks[1] = st;
1945 flac_decoder_data->num_metadata_blocks++;
1950 * finally handle padding: if --no-padding was specified,
1951 * then delete all padding; else if -P was specified,
1952 * use that instead of existing padding (if any); else
1953 * if existing file has padding, move all existing
1954 * padding blocks to one padding block at the end; else
1955 * use default padding.
1959 for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1960 if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1963 p += flac_decoder_data->metadata_blocks[i]->length;
1964 FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1965 flac_decoder_data->metadata_blocks[i] = 0;
1968 flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1970 flac_decoder_data->num_metadata_blocks = j;
1971 if(options.padding > 0)
1972 p = options.padding;
1974 p = e->total_samples_to_encode / sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1975 if(options.padding != 0) {
1976 if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1977 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1978 if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1979 flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1980 static_metadata_clear(&static_metadata);
1983 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1984 flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1985 flac_decoder_data->num_metadata_blocks++;
1989 metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1990 num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1994 * we're not encoding from FLAC so we will build the metadata
1997 const foreign_metadata_t *foreign_metadata = EncoderSession_format_is_iff(e)? options.format_options.iff.foreign_metadata : 0;
1999 if(e->seek_table_template->data.seek_table.num_points > 0) {
2000 e->seek_table_template->is_last = false; /* the encoder will set this for us */
2001 static_metadata_append(&static_metadata, e->seek_table_template, /*needs_delete=*/false);
2003 if(0 != static_metadata.cuesheet)
2004 static_metadata_append(&static_metadata, static_metadata.cuesheet, /*needs_delete=*/false);
2005 if(e->info.channel_mask) {
2006 if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, e->info.channel_mask)) {
2007 flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
2008 static_metadata_clear(&static_metadata);
2012 static_metadata_append(&static_metadata, options.vorbis_comment, /*needs_delete=*/false);
2013 for(i = 0; i < options.num_pictures; i++)
2014 static_metadata_append(&static_metadata, options.pictures[i], /*needs_delete=*/false);
2015 if(foreign_metadata) {
2016 for(i = 0; i < foreign_metadata->num_blocks; i++) {
2017 FLAC__StreamMetadata *p = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
2019 flac__utils_printf(stderr, 1, "%s: ERROR: out of memory\n", e->inbasefilename);
2020 static_metadata_clear(&static_metadata);
2023 static_metadata_append(&static_metadata, p, /*needs_delete=*/true);
2024 static_metadata.metadata[static_metadata.num_metadata-1]->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8 + foreign_metadata->blocks[i].size;
2027 if(options.padding != 0) {
2028 padding.is_last = false; /* the encoder will set this for us */
2029 padding.type = FLAC__METADATA_TYPE_PADDING;
2030 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));
2031 static_metadata_append(&static_metadata, &padding, /*needs_delete=*/false);
2033 metadata = static_metadata.metadata;
2034 num_metadata = static_metadata.num_metadata;
2037 /* check for a few things that have not already been checked. the
2038 * FLAC__stream_encoder_init*() will check it but only return
2039 * FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
2040 * up front to give a better error message.
2042 if(!verify_metadata(e, metadata, num_metadata)) {
2043 static_metadata_clear(&static_metadata);
2047 FLAC__stream_encoder_set_verify(e->encoder, options.verify);
2048 FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
2049 FLAC__stream_encoder_set_channels(e->encoder, channels);
2050 FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
2051 FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
2052 for(i = 0; i < options.num_compression_settings; i++) {
2053 switch(options.compression_settings[i].type) {
2055 FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[i].value.t_unsigned);
2057 case CST_COMPRESSION_LEVEL:
2058 FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[i].value.t_unsigned);
2059 apodizations[0] = '\0';
2061 case CST_DO_MID_SIDE:
2062 FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2064 case CST_LOOSE_MID_SIDE:
2065 FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2067 case CST_APODIZATION:
2068 if(strlen(apodizations)+strlen(options.compression_settings[i].value.t_string)+2 >= sizeof(apodizations)) {
2069 flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
2070 static_metadata_clear(&static_metadata);
2074 strcat(apodizations, options.compression_settings[i].value.t_string);
2075 strcat(apodizations, ";");
2078 case CST_MAX_LPC_ORDER:
2079 FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2081 case CST_QLP_COEFF_PRECISION:
2082 FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[i].value.t_unsigned);
2084 case CST_DO_QLP_COEFF_PREC_SEARCH:
2085 FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[i].value.t_bool);
2087 case CST_DO_ESCAPE_CODING:
2088 FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[i].value.t_bool);
2090 case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
2091 FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[i].value.t_bool);
2093 case CST_MIN_RESIDUAL_PARTITION_ORDER:
2094 FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2096 case CST_MAX_RESIDUAL_PARTITION_ORDER:
2097 FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2099 case CST_RICE_PARAMETER_SEARCH_DIST:
2100 FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[i].value.t_unsigned);
2105 FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
2106 FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
2107 FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
2109 FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
2110 FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
2111 FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
2112 if(!options.debug.do_md5) {
2113 flac__utils_printf(stderr, 1, "%s: WARNING, MD5 computation disabled, resulting file will not have MD5 sum\n", e->inbasefilename);
2114 if(e->treat_warnings_as_errors) {
2115 static_metadata_clear(&static_metadata);
2118 FLAC__stream_encoder_set_do_md5(e->encoder, false);
2123 FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
2125 init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2130 init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2133 if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
2134 print_error_with_init_status(e, "ERROR initializing encoder", init_status);
2135 if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
2136 e->outputfile_opened = true;
2137 static_metadata_clear(&static_metadata);
2141 e->outputfile_opened = true;
2144 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2145 (FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
2148 static_metadata_clear(&static_metadata);
2153 FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples)
2155 if(e->replay_gain) {
2156 if(!grabbag__replaygain_analyze(buffer, e->info.channels==2, e->info.bits_per_sample, samples)) {
2157 flac__utils_printf(stderr, 1, "%s: WARNING, error while calculating ReplayGain\n", e->inbasefilename);
2158 if(e->treat_warnings_as_errors)
2163 return FLAC__stream_encoder_process(e->encoder, buffer, samples);
2166 FLAC__bool EncoderSession_format_is_iff(const EncoderSession *e)
2169 e->format == FORMAT_WAVE ||
2170 e->format == FORMAT_WAVE64 ||
2171 e->format == FORMAT_RF64 ||
2172 e->format == FORMAT_AIFF ||
2173 e->format == FORMAT_AIFF_C;
2176 FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e)
2178 const FLAC__bool only_placeholders = e->is_stdout;
2179 FLAC__bool has_real_points;
2181 if(num_requested_seek_points == 0 && 0 == cuesheet)
2184 if(num_requested_seek_points < 0) {
2186 /*@@@@@@ workaround ogg bug: too many seekpoints makes table not fit in one page */
2187 if(e->use_ogg && e->total_samples_to_encode > 0 && e->total_samples_to_encode / e->info.sample_rate / 10 > 230)
2188 requested_seek_points = "230x;";
2191 requested_seek_points = "10s;";
2192 num_requested_seek_points = 1;
2195 if(num_requested_seek_points > 0) {
2196 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))
2202 const FLAC__StreamMetadata_CueSheet *cs = &cuesheet->data.cue_sheet;
2203 for(i = 0; i < cs->num_tracks; i++) {
2204 const FLAC__StreamMetadata_CueSheet_Track *tr = cs->tracks+i;
2205 for(j = 0; j < tr->num_indices; j++) {
2206 if(!FLAC__metadata_object_seektable_template_append_point(e->seek_table_template, tr->offset + tr->indices[j].offset))
2208 has_real_points = true;
2212 if(!FLAC__metadata_object_seektable_template_sort(e->seek_table_template, /*compact=*/true))
2216 if(has_real_points) {
2218 flac__utils_printf(stderr, 1, "%s: WARNING, cannot write back seekpoints when encoding to stdout\n", e->inbasefilename);
2219 if(e->treat_warnings_as_errors)
2227 FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input)
2229 /* convert from mm:ss.sss to sample number if necessary */
2230 flac__utils_canonicalize_skip_until_specification(spec, sample_rate);
2232 /* special case: if "--until=-0", use the special value '0' to mean "end-of-stream" */
2233 if(spec->is_relative && spec->value.samples == 0) {
2234 spec->is_relative = false;
2238 /* in any other case the total samples in the input must be known */
2239 if(total_samples_in_input == 0) {
2240 flac__utils_printf(stderr, 1, "%s: ERROR, cannot use --until when input length is unknown\n", inbasefilename);
2244 FLAC__ASSERT(spec->value_is_samples);
2246 /* convert relative specifications to absolute */
2247 if(spec->is_relative) {
2248 if(spec->value.samples <= 0)
2249 spec->value.samples += (FLAC__int64)total_samples_in_input;
2251 spec->value.samples += skip;
2252 spec->is_relative = false;
2256 if(spec->value.samples < 0) {
2257 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before beginning of input\n", inbasefilename);
2260 if((FLAC__uint64)spec->value.samples <= skip) {
2261 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is before --skip point\n", inbasefilename);
2264 if((FLAC__uint64)spec->value.samples > total_samples_in_input) {
2265 flac__utils_printf(stderr, 1, "%s: ERROR, --until value is after end of input\n", inbasefilename);
2272 FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata)
2274 FLAC__bool metadata_picture_has_type1 = false;
2275 FLAC__bool metadata_picture_has_type2 = false;
2278 FLAC__ASSERT(0 != metadata);
2279 for(i = 0; i < num_metadata; i++) {
2280 const FLAC__StreamMetadata *m = metadata[i];
2281 if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) {
2282 if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) {
2283 flac__utils_printf(stderr, 1, "%s: ERROR: SEEKTABLE metadata block is invalid\n", e->inbasefilename);
2287 else if(m->type == FLAC__METADATA_TYPE_CUESHEET) {
2288 if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) {
2289 flac__utils_printf(stderr, 1, "%s: ERROR: CUESHEET metadata block is invalid\n", e->inbasefilename);
2293 else if(m->type == FLAC__METADATA_TYPE_PICTURE) {
2294 const char *error = 0;
2295 if(!FLAC__format_picture_is_legal(&m->data.picture, &error)) {
2296 flac__utils_printf(stderr, 1, "%s: ERROR: PICTURE metadata block is invalid: %s\n", e->inbasefilename, error);
2299 if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) {
2300 if(metadata_picture_has_type1) {
2301 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 1 (32x32 icon) in the file\n", e->inbasefilename);
2304 metadata_picture_has_type1 = true;
2306 else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) {
2307 if(metadata_picture_has_type2) {
2308 flac__utils_printf(stderr, 1, "%s: ERROR: there may only be one picture of type 2 (icon) in the file\n", e->inbasefilename);
2311 metadata_picture_has_type2 = true;
2319 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)
2321 unsigned wide_sample, sample, channel, byte;
2322 FLAC__int32 *out[FLAC__MAX_CHANNELS];
2324 if(0 == channel_map) {
2325 for(channel = 0; channel < channels; channel++)
2326 out[channel] = dest[channel];
2329 for(channel = 0; channel < channels; channel++)
2330 out[channel] = dest[channel_map[channel]];
2334 if(is_unsigned_samples) {
2335 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2336 for(channel = 0; channel < channels; channel++, sample++)
2337 out[channel][wide_sample] = (FLAC__int32)ucbuffer_[sample] - 0x80;
2340 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2341 for(channel = 0; channel < channels; channel++, sample++)
2342 out[channel][wide_sample] = (FLAC__int32)scbuffer_[sample];
2345 else if(bps == 16) {
2346 if(is_big_endian != is_big_endian_host_) {
2348 const unsigned bytes = wide_samples * channels * (bps >> 3);
2349 for(byte = 0; byte < bytes; byte += 2) {
2350 tmp = ucbuffer_[byte];
2351 ucbuffer_[byte] = ucbuffer_[byte+1];
2352 ucbuffer_[byte+1] = tmp;
2355 if(is_unsigned_samples) {
2356 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2357 for(channel = 0; channel < channels; channel++, sample++)
2358 out[channel][wide_sample] = (FLAC__int32)usbuffer_[sample] - 0x8000;
2361 for(sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2362 for(channel = 0; channel < channels; channel++, sample++)
2363 out[channel][wide_sample] = (FLAC__int32)ssbuffer_[sample];
2366 else if(bps == 24) {
2367 if(!is_big_endian) {
2369 const unsigned bytes = wide_samples * channels * (bps >> 3);
2370 for(byte = 0; byte < bytes; byte += 3) {
2371 tmp = ucbuffer_[byte];
2372 ucbuffer_[byte] = ucbuffer_[byte+2];
2373 ucbuffer_[byte+2] = tmp;
2376 if(is_unsigned_samples) {
2377 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2378 for(channel = 0; channel < channels; channel++, sample++) {
2379 out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2380 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2381 out[channel][wide_sample] |= ucbuffer_[byte++];
2382 out[channel][wide_sample] -= 0x800000;
2386 for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2387 for(channel = 0; channel < channels; channel++, sample++) {
2388 out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2389 out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2390 out[channel][wide_sample] |= ucbuffer_[byte++];
2398 FLAC__int32 mask = (1<<shift)-1;
2399 for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2400 for(channel = 0; channel < channels; channel++) {
2401 if(out[channel][wide_sample] & mask) {
2402 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);
2405 out[channel][wide_sample] >>= shift;
2411 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)
2413 EncoderSession *e = (EncoderSession*)client_data;
2415 (void)encoder, (void)total_frames_estimate;
2417 e->bytes_written = bytes_written;
2418 e->samples_written = samples_written;
2420 if(e->total_samples_to_encode > 0 && !((frames_written-1) & e->stats_mask))
2424 FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
2427 EncoderSession *e = (EncoderSession*)client_data;
2428 FLACDecoderData *data = &e->fmt.flac.client_data;
2432 if (data->fatal_error)
2433 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2435 /* use up lookahead first */
2436 if (data->lookahead_length) {
2437 n = min(data->lookahead_length, *bytes);
2438 memcpy(buffer, data->lookahead, n);
2440 data->lookahead += n;
2441 data->lookahead_length -= n;
2444 /* get the rest from file */
2446 *bytes = n + fread(buffer, 1, *bytes-n, e->fin);
2448 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
2449 else if(0 == *bytes)
2450 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
2452 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2455 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
2458 FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
2460 EncoderSession *e = (EncoderSession*)client_data;
2463 if(fseeko(e->fin, (off_t)absolute_byte_offset, SEEK_SET) < 0)
2464 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
2466 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
2469 FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
2471 EncoderSession *e = (EncoderSession*)client_data;
2475 if((pos = ftello(e->fin)) < 0)
2476 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
2478 *absolute_byte_offset = (FLAC__uint64)pos;
2479 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
2483 FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
2485 const EncoderSession *e = (EncoderSession*)client_data;
2486 const FLACDecoderData *data = &e->fmt.flac.client_data;
2489 if(data->filesize < 0)
2490 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
2492 *stream_length = (FLAC__uint64)data->filesize;
2493 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
2497 FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data)
2499 EncoderSession *e = (EncoderSession*)client_data;
2502 return feof(e->fin)? true : false;
2505 FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
2507 EncoderSession *e = (EncoderSession*)client_data;
2508 FLACDecoderData *data = &e->fmt.flac.client_data;
2509 FLAC__uint64 n = min(data->samples_left_to_process, frame->header.blocksize);
2512 if(!EncoderSession_process(e, buffer, (unsigned)n)) {
2513 print_error_with_state(e, "ERROR during encoding");
2514 data->fatal_error = true;
2515 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
2518 data->samples_left_to_process -= n;
2519 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
2522 void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
2524 EncoderSession *e = (EncoderSession*)client_data;
2525 FLACDecoderData *data = &e->fmt.flac.client_data;
2528 if (data->fatal_error)
2532 data->num_metadata_blocks == sizeof(data->metadata_blocks)/sizeof(data->metadata_blocks[0]) ||
2533 0 == (data->metadata_blocks[data->num_metadata_blocks] = FLAC__metadata_object_clone(metadata))
2535 data->fatal_error = true;
2537 data->num_metadata_blocks++;
2540 void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
2542 EncoderSession *e = (EncoderSession*)client_data;
2543 FLACDecoderData *data = &e->fmt.flac.client_data;
2546 flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", e->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
2547 if(!e->continue_through_decode_errors)
2548 data->fatal_error = true;
2551 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)
2554 unsigned last_line_read;
2555 const char *error_message;
2557 if(0 == cuesheet_filename)
2560 if(lead_out_offset == 0) {
2561 flac__utils_printf(stderr, 1, "%s: ERROR cannot import cuesheet when the number of input samples to encode is unknown\n", inbasefilename);
2565 if(0 == (f = fopen(cuesheet_filename, "r"))) {
2566 flac__utils_printf(stderr, 1, "%s: ERROR opening cuesheet \"%s\" for reading: %s\n", inbasefilename, cuesheet_filename, strerror(errno));
2570 *cuesheet = grabbag__cuesheet_parse(f, &error_message, &last_line_read, sample_rate, is_cdda, lead_out_offset);
2574 if(0 == *cuesheet) {
2575 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\" on line %u: %s\n", inbasefilename, cuesheet_filename, last_line_read, error_message);
2579 if(!FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/false, &error_message)) {
2580 flac__utils_printf(stderr, 1, "%s: ERROR parsing cuesheet \"%s\": %s\n", inbasefilename, cuesheet_filename, error_message);
2584 /* if we're expecting CDDA, warn about non-compliance */
2585 if(is_cdda && !FLAC__format_cuesheet_is_legal(&(*cuesheet)->data.cue_sheet, /*check_cd_da_subset=*/true, &error_message)) {
2586 flac__utils_printf(stderr, 1, "%s: WARNING cuesheet \"%s\" is not audio CD compliant: %s\n", inbasefilename, cuesheet_filename, error_message);
2587 if(treat_warnings_as_errors)
2589 (*cuesheet)->data.cue_sheet.is_cd = false;
2595 void print_stats(const EncoderSession *encoder_session)
2597 const FLAC__uint64 samples_written = min(encoder_session->total_samples_to_encode, encoder_session->samples_written);
2598 const FLAC__uint64 uesize = encoder_session->unencoded_size;
2599 #if defined _MSC_VER || defined __MINGW32__
2600 /* with MSVC you have to spoon feed it the casting */
2601 const double progress = (double)(FLAC__int64)samples_written / (double)(FLAC__int64)encoder_session->total_samples_to_encode;
2602 const double ratio = (double)(FLAC__int64)encoder_session->bytes_written / ((double)(FLAC__int64)(uesize? uesize:1) * min(1.0, progress));
2604 const double progress = (double)samples_written / (double)encoder_session->total_samples_to_encode;
2605 const double ratio = (double)encoder_session->bytes_written / ((double)(uesize? uesize:1) * min(1.0, progress));
2608 FLAC__ASSERT(encoder_session->total_samples_to_encode > 0);
2610 if(samples_written == encoder_session->total_samples_to_encode) {
2611 flac__utils_printf(stderr, 2, "\r%s:%s wrote %u bytes, ratio=",
2612 encoder_session->inbasefilename,
2613 encoder_session->verify? " Verify OK," : "",
2614 (unsigned)encoder_session->bytes_written
2618 flac__utils_printf(stderr, 2, "\r%s: %u%% complete, ratio=", encoder_session->inbasefilename, (unsigned)floor(progress * 100.0 + 0.5));
2621 flac__utils_printf(stderr, 2, "%0.3f", ratio);
2623 flac__utils_printf(stderr, 2, "N/A");
2626 void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status)
2628 const int ilen = strlen(e->inbasefilename) + 1;
2629 const char *state_string = "";
2631 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2633 flac__utils_printf(stderr, 1, "%*s init_status = %s\n", ilen, "", FLAC__StreamEncoderInitStatusString[init_status]);
2635 if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR) {
2636 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2638 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2640 /* print out some more info for some errors: */
2641 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2642 flac__utils_printf(stderr, 1,
2644 "An error occurred while writing; the most common cause is that the disk is full.\n"
2647 else if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_IO_ERROR])) {
2648 flac__utils_printf(stderr, 1,
2650 "An error occurred opening the output file; it is likely that the output\n"
2651 "directory does not exist or is not writable, the output file already exists and\n"
2652 "is not writable, or the disk is full.\n"
2656 else if(init_status == FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE) {
2657 flac__utils_printf(stderr, 1,
2659 "The encoding parameters specified do not conform to the FLAC Subset and may not\n"
2660 "be streamable or playable in hardware devices. If you really understand the\n"
2661 "consequences, you can add --lax to the command-line options to encode with\n"
2662 "these parameters anyway. See http://flac.sourceforge.net/format.html#subset\n"
2667 void print_error_with_state(const EncoderSession *e, const char *message)
2669 const int ilen = strlen(e->inbasefilename) + 1;
2670 const char *state_string;
2672 flac__utils_printf(stderr, 1, "\n%s: %s\n", e->inbasefilename, message);
2674 state_string = FLAC__stream_encoder_get_resolved_state_string(e->encoder);
2676 flac__utils_printf(stderr, 1, "%*s state = %s\n", ilen, "", state_string);
2678 /* print out some more info for some errors: */
2679 if(0 == strcmp(state_string, FLAC__StreamEncoderStateString[FLAC__STREAM_ENCODER_CLIENT_ERROR])) {
2680 flac__utils_printf(stderr, 1,
2682 "An error occurred while writing; the most common cause is that the disk is full.\n"
2687 void print_verify_error(EncoderSession *e)
2689 FLAC__uint64 absolute_sample;
2690 unsigned frame_number;
2693 FLAC__int32 expected;
2696 FLAC__stream_encoder_get_verify_decoder_error_stats(e->encoder, &absolute_sample, &frame_number, &channel, &sample, &expected, &got);
2698 flac__utils_printf(stderr, 1, "%s: ERROR: mismatch in decoded data, verify FAILED!\n", e->inbasefilename);
2699 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);
2700 flac__utils_printf(stderr, 1, " In all known cases, verify errors are caused by hardware problems,\n");
2701 flac__utils_printf(stderr, 1, " usually overclocking or bad RAM. Delete %s\n", e->outfilename);
2702 flac__utils_printf(stderr, 1, " and repeat the flac command exactly as before. If it does not give a\n");
2703 flac__utils_printf(stderr, 1, " verify error in the exact same place each time you try it, then there is\n");
2704 flac__utils_printf(stderr, 1, " a problem with your hardware; please see the FAQ:\n");
2705 flac__utils_printf(stderr, 1, " http://flac.sourceforge.net/faq.html#tools__hardware_prob\n");
2706 flac__utils_printf(stderr, 1, " If it does fail in the exact same place every time, keep\n");
2707 flac__utils_printf(stderr, 1, " %s and submit a bug report to:\n", e->outfilename);
2708 flac__utils_printf(stderr, 1, " https://sourceforge.net/bugs/?func=addbug&group_id=13478\n");
2709 flac__utils_printf(stderr, 1, " Make sure to upload the FLAC file and use the \"Monitor\" feature to\n");
2710 flac__utils_printf(stderr, 1, " monitor the bug status.\n");
2711 flac__utils_printf(stderr, 1, "Verify FAILED! Do not trust %s\n", e->outfilename);
2714 FLAC__bool read_bytes(FILE *f, FLAC__byte *buf, size_t n, FLAC__bool eof_ok, const char *fn)
2716 size_t bytes_read = fread(buf, 1, n, f);
2718 if(bytes_read == 0) {
2720 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2726 if(bytes_read < n) {
2727 flac__utils_printf(stderr, 1, "%s: ERROR: unexpected EOF\n", fn);
2733 FLAC__bool read_uint16(FILE *f, FLAC__bool big_endian, FLAC__uint16 *val, const char *fn)
2735 if(!read_bytes(f, (FLAC__byte*)val, 2, /*eof_ok=*/false, fn))
2737 if(is_big_endian_host_ != big_endian) {
2738 FLAC__byte tmp, *b = (FLAC__byte*)val;
2739 tmp = b[1]; b[1] = b[0]; b[0] = tmp;
2744 FLAC__bool read_uint32(FILE *f, FLAC__bool big_endian, FLAC__uint32 *val, const char *fn)
2746 if(!read_bytes(f, (FLAC__byte*)val, 4, /*eof_ok=*/false, fn))
2748 if(is_big_endian_host_ != big_endian) {
2749 FLAC__byte tmp, *b = (FLAC__byte*)val;
2750 tmp = b[3]; b[3] = b[0]; b[0] = tmp;
2751 tmp = b[2]; b[2] = b[1]; b[1] = tmp;
2756 FLAC__bool read_uint64(FILE *f, FLAC__bool big_endian, FLAC__uint64 *val, const char *fn)
2758 if(!read_bytes(f, (FLAC__byte*)val, 8, /*eof_ok=*/false, fn))
2760 if(is_big_endian_host_ != big_endian) {
2761 FLAC__byte tmp, *b = (FLAC__byte*)val;
2762 tmp = b[7]; b[7] = b[0]; b[0] = tmp;
2763 tmp = b[6]; b[6] = b[1]; b[1] = tmp;
2764 tmp = b[5]; b[5] = b[2]; b[2] = tmp;
2765 tmp = b[4]; b[4] = b[3]; b[3] = tmp;
2770 FLAC__bool read_sane_extended(FILE *f, FLAC__uint32 *val, const char *fn)
2771 /* Read an IEEE 754 80-bit (aka SANE) extended floating point value from 'f',
2772 * convert it into an integral value and store in 'val'. Return false if only
2773 * between 1 and 9 bytes remain in 'f', if 0 bytes remain in 'f', or if the
2774 * value is negative, between zero and one, or too large to be represented by
2775 * 'val'; return true otherwise.
2784 if(!read_bytes(f, buf, sizeof(buf), /*eof_ok=*/false, fn))
2786 e = ((FLAC__uint16)(buf[0])<<8 | (FLAC__uint16)(buf[1]))-0x3FFF;
2788 if((buf[0]>>7)==1U || e<0 || e>63) {
2789 flac__utils_printf(stderr, 1, "%s: ERROR: invalid floating-point value\n", fn);
2793 for(i = 0; i < 8; ++i)
2794 p |= (FLAC__uint64)(buf[i+2])<<(56U-i*8);
2795 *val = (FLAC__uint32)((p>>shift)+(p>>(shift-1) & 0x1));
2800 FLAC__bool fskip_ahead(FILE *f, FLAC__uint64 offset)
2802 static unsigned char dump[8192];
2805 if(fstat(fileno(f), &stb) == 0 && (stb.st_mode & S_IFMT) == S_IFREG)
2807 if(fseeko(f, offset, SEEK_CUR) == 0)
2811 const long need = (long)min(offset, sizeof(dump));
2812 if((long)fread(dump, 1, need, f) < need)
2819 unsigned count_channel_mask_bits(FLAC__uint32 mask)
2831 FLAC__uint32 limit_channel_mask(FLAC__uint32 mask, unsigned channels)
2833 FLAC__uint32 x = 0x80000000;
2834 unsigned count = count_channel_mask_bits(mask);
2835 while(x && count > channels) {
2842 FLAC__ASSERT(count_channel_mask_bits(mask) == channels);