114
116
extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
115
117
extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
116
118
extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
117
extern FLAC__bool FLAC__file_encoder_disable_constant_subframes(FLAC__FileEncoder *encoder, FLAC__bool value);
118
extern FLAC__bool FLAC__file_encoder_disable_fixed_subframes(FLAC__FileEncoder *encoder, FLAC__bool value);
119
extern FLAC__bool FLAC__file_encoder_disable_verbatim_subframes(FLAC__FileEncoder *encoder, FLAC__bool value);
121
extern FLAC__bool OggFLAC__stream_encoder_disable_constant_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value);
122
extern FLAC__bool OggFLAC__stream_encoder_disable_fixed_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value);
123
extern FLAC__bool OggFLAC__stream_encoder_disable_verbatim_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value);
124
extern FLAC__bool OggFLAC__file_encoder_disable_constant_subframes(OggFLAC__FileEncoder *encoder, FLAC__bool value);
125
extern FLAC__bool OggFLAC__file_encoder_disable_fixed_subframes(OggFLAC__FileEncoder *encoder, FLAC__bool value);
126
extern FLAC__bool OggFLAC__file_encoder_disable_verbatim_subframes(OggFLAC__FileEncoder *encoder, FLAC__bool value);
132
static FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FILE *infile, const char *infilename, const char *outfilename);
123
static FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FLAC__bool treat_warnings_as_errors, FLAC__bool continue_through_decode_errors, FILE *infile, const char *infilename, const char *outfilename);
133
124
static void EncoderSession_destroy(EncoderSession *e);
134
125
static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero);
135
126
static int EncoderSession_finish_error(EncoderSession *e);
136
static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options, unsigned channels, unsigned bps, unsigned sample_rate);
127
static FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options, FLAC__uint32 channel_mask, unsigned channels, unsigned bps, unsigned sample_rate, FLACDecoderData *flac_decoder_data);
137
128
static FLAC__bool EncoderSession_process(EncoderSession *e, const FLAC__int32 * const buffer[], unsigned samples);
138
129
static FLAC__bool convert_to_seek_table_template(const char *requested_seek_points, int num_requested_seek_points, FLAC__StreamMetadata *cuesheet, EncoderSession *e);
139
130
static FLAC__bool canonicalize_until_specification(utils__SkipUntilSpecification *spec, const char *inbasefilename, unsigned sample_rate, FLAC__uint64 skip, FLAC__uint64 total_samples_in_input);
140
static void format_input(FLAC__int32 *dest[], unsigned wide_samples, FLAC__bool is_big_endian, FLAC__bool is_unsigned_samples, unsigned channels, unsigned bps);
142
static FLAC__StreamEncoderWriteStatus ogg_stream_encoder_write_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
143
static void ogg_stream_encoder_metadata_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data);
144
static void ogg_file_encoder_progress_callback(const OggFLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
146
static FLAC__StreamEncoderWriteStatus flac_stream_encoder_write_callback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
147
static void flac_stream_encoder_metadata_callback(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data);
148
static void flac_file_encoder_progress_callback(const FLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
149
static FLAC__bool parse_cuesheet_(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset);
131
static FLAC__bool verify_metadata(const EncoderSession *e, FLAC__StreamMetadata **metadata, unsigned num_metadata);
132
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);
133
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);
134
static FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
135
static FLAC__StreamDecoderSeekStatus flac_decoder_seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
136
static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
137
static FLAC__StreamDecoderLengthStatus flac_decoder_length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
138
static FLAC__bool flac_decoder_eof_callback(const FLAC__StreamDecoder *decoder, void *client_data);
139
static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
140
static void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
141
static void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
142
static FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset, FLAC__bool treat_warnings_as_errors);
150
143
static void print_stats(const EncoderSession *encoder_session);
144
static void print_error_with_init_status(const EncoderSession *e, const char *message, FLAC__StreamEncoderInitStatus init_status);
151
145
static void print_error_with_state(const EncoderSession *e, const char *message);
152
146
static void print_verify_error(EncoderSession *e);
153
147
static FLAC__bool read_little_endian_uint16(FILE *f, FLAC__uint16 *val, FLAC__bool eof_ok, const char *fn);
554
633
if(xx == 0x20746d66 && !got_fmt_chunk) { /* "fmt " */
555
unsigned block_align;
634
unsigned block_align, data_bytes;
637
* http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
638
* http://windowssdk.msdn.microsoft.com/en-us/library/ms713497.aspx
639
* 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
642
* 4 byte: subchunk size
643
* 2 byte: format type: 1 for WAVE_FORMAT_PCM, 65534 for WAVE_FORMAT_EXTENSIBLE
645
* 4 byte: sample rate (Hz)
646
* 4 byte: avg bytes per sec
647
* 2 byte: block align
648
* 2 byte: bits per sample (not necessarily all significant)
650
* 2 byte: extension size in bytes (usually 0 for WAVEFORMATEX and 22 for WAVEFORMATEXTENSIBLE with PCM)
651
* WAVEFORMATEXTENSIBLE adds
652
* 2 byte: valid bits per sample
653
* 4 byte: channel mask
654
* 16 byte: subformat GUID, first 2 bytes have format type, 1 being PCM
656
* Current spec says WAVEFORMATEX with PCM must have bps == 8 or 16, or any multiple of 8 for WAVEFORMATEXTENSIBLE.
657
* 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.
659
* Block align for WAVE_FORMAT_PCM or WAVE_FORMAT_EXTENSIBLE is also supposed to be channels*bps/8
661
* If the channel mask has more set bits than # of channels, the extra MSBs are ignored.
662
* If the channel mask has less set bits than # of channels, the extra channels are unassigned to any speaker.
664
* Data is supposed to be unsigned for bps <= 8 else signed.
557
667
/* fmt sub-chunk size */
558
668
if(!read_little_endian_uint32(infile, &xx, false, encoder_session.inbasefilename))
559
669
return EncoderSession_finish_error(&encoder_session);
561
flac__utils_printf(stderr, 1, "%s: ERROR: found non-standard 'fmt ' sub-chunk which has length = %u\n", encoder_session.inbasefilename, (unsigned)xx);
562
return EncoderSession_finish_error(&encoder_session);
564
else if(xx != 16 && xx != 18) {
565
flac__utils_printf(stderr, 1, "%s: WARNING: found non-standard 'fmt ' sub-chunk which has length = %u\n", encoder_session.inbasefilename, (unsigned)xx);
568
/* compression code */
569
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
570
return EncoderSession_finish_error(&encoder_session);
572
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported compression type %u\n", encoder_session.inbasefilename, (unsigned)x);
671
if(data_bytes < 16) {
672
flac__utils_printf(stderr, 1, "%s: ERROR: found non-standard 'fmt ' sub-chunk which has length = %u\n", encoder_session.inbasefilename, data_bytes);
673
return EncoderSession_finish_error(&encoder_session);
676
if(!read_little_endian_uint16(infile, &format, false, encoder_session.inbasefilename))
677
return EncoderSession_finish_error(&encoder_session);
678
if(format != 1 /*WAVE_FORMAT_PCM*/ && format != 65534 /*WAVE_FORMAT_EXTENSIBLE*/) {
679
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported format type %u\n", encoder_session.inbasefilename, (unsigned)format);
573
680
return EncoderSession_finish_error(&encoder_session);
575
682
/* number of channels */
576
683
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
577
684
return EncoderSession_finish_error(&encoder_session);
578
if(x == 0 || x > FLAC__MAX_CHANNELS) {
579
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number channels %u\n", encoder_session.inbasefilename, (unsigned)x);
580
return EncoderSession_finish_error(&encoder_session);
582
else if(options.common.sector_align && x != 2) {
583
flac__utils_printf(stderr, 1, "%s: ERROR: file has %u channels, must be 2 for --sector-align\n", encoder_session.inbasefilename, (unsigned)x);
584
return EncoderSession_finish_error(&encoder_session);
685
channels = (unsigned)x;
686
if(channels == 0 || channels > FLAC__MAX_CHANNELS) {
687
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported number of channels %u\n", encoder_session.inbasefilename, channels);
688
return EncoderSession_finish_error(&encoder_session);
690
else if(options.common.sector_align && channels != 2) {
691
flac__utils_printf(stderr, 1, "%s: ERROR: file has %u channels, must be 2 for --sector-align\n", encoder_session.inbasefilename, channels);
692
return EncoderSession_finish_error(&encoder_session);
587
694
/* sample rate */
588
695
if(!read_little_endian_uint32(infile, &xx, false, encoder_session.inbasefilename))
589
696
return EncoderSession_finish_error(&encoder_session);
590
if(!FLAC__format_sample_rate_is_valid(xx)) {
591
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, (unsigned)xx);
592
return EncoderSession_finish_error(&encoder_session);
594
else if(options.common.sector_align && xx != 44100) {
595
flac__utils_printf(stderr, 1, "%s: ERROR: file's sample rate is %u, must be 44100 for --sector-align\n", encoder_session.inbasefilename, (unsigned)xx);
596
return EncoderSession_finish_error(&encoder_session);
598
697
sample_rate = xx;
698
if(!FLAC__format_sample_rate_is_valid(sample_rate)) {
699
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported sample rate %u\n", encoder_session.inbasefilename, sample_rate);
700
return EncoderSession_finish_error(&encoder_session);
702
else if(options.common.sector_align && sample_rate != 44100) {
703
flac__utils_printf(stderr, 1, "%s: ERROR: file's sample rate is %u, must be 44100 for --sector-align\n", encoder_session.inbasefilename, sample_rate);
704
return EncoderSession_finish_error(&encoder_session);
599
706
/* avg bytes per second (ignored) */
600
707
if(!read_little_endian_uint32(infile, &xx, false, encoder_session.inbasefilename))
601
708
return EncoderSession_finish_error(&encoder_session);
602
709
/* block align */
603
710
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
604
711
return EncoderSession_finish_error(&encoder_session);
712
block_align = (unsigned)x;
606
713
/* bits per sample */
607
714
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
608
715
return EncoderSession_finish_error(&encoder_session);
609
if(x != 8 && x != 16 && x != 24) {
610
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported bits-per-sample %u\n", encoder_session.inbasefilename, (unsigned)x);
611
return EncoderSession_finish_error(&encoder_session);
613
else if(options.common.sector_align && x != 16) {
614
flac__utils_printf(stderr, 1, "%s: ERROR: file has %u bits per sample, must be 16 for --sector-align\n", encoder_session.inbasefilename, (unsigned)x);
615
return EncoderSession_finish_error(&encoder_session);
618
if(bps * channels != block_align * 8) {
619
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported block alignment (%u), for bits-per-sample=%u, channels=%u\n", encoder_session.inbasefilename, block_align, bps, channels);
620
return EncoderSession_finish_error(&encoder_session);
622
is_unsigned_samples = (x == 8);
717
is_unsigned_samples = (bps <= 8);
719
if(bps != 8 && bps != 16) {
720
if(bps == 24 || bps == 32) {
721
/* let these slide with a warning since they're unambiguous */
722
flac__utils_printf(stderr, 1, "%s: WARNING: legacy WAVE file has format type %u but bits-per-sample=%u\n", encoder_session.inbasefilename, (unsigned)format, bps);
723
if(encoder_session.treat_warnings_as_errors)
724
return EncoderSession_finish_error(&encoder_session);
727
/* @@@ we could add an option to specify left- or right-justified blocks so we knew how to set 'shift' */
728
flac__utils_printf(stderr, 1, "%s: ERROR: legacy WAVE file has format type %u but bits-per-sample=%u\n", encoder_session.inbasefilename, (unsigned)format, bps);
729
return EncoderSession_finish_error(&encoder_session);
732
#if 0 /* @@@ reinstate once we can get an answer about whether the samples are left- or right-justified */
733
if((bps+7)/8 * channels == block_align) {
735
/* assume legacy file is byte aligned with some LSBs zero; this is double-checked in format_input() */
736
flac__utils_printf(stderr, 1, "%s: WARNING: legacy WAVE file (format type %d) has block alignment=%u, bits-per-sample=%u, channels=%u\n", encoder_session.inbasefilename, (unsigned)format, block_align, bps, channels);
737
if(encoder_session.treat_warnings_as_errors)
738
return EncoderSession_finish_error(&encoder_session);
739
shift = 8 - (bps % 8);
746
flac__utils_printf(stderr, 1, "%s: ERROR: illegal WAVE file (format type %d) has block alignment=%u, bits-per-sample=%u, channels=%u\n", encoder_session.inbasefilename, (unsigned)format, block_align, bps, channels);
747
return EncoderSession_finish_error(&encoder_session);
752
if(channels > 2 && !options.common.channel_map_none) {
753
flac__utils_printf(stderr, 1, "%s: ERROR: WAVE has >2 channels but is not WAVE_FORMAT_EXTENSIBLE; cannot assign channels\n", encoder_session.inbasefilename);
754
return EncoderSession_finish_error(&encoder_session);
756
FLAC__ASSERT(data_bytes >= 16);
760
if(data_bytes < 40) {
761
flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with size %u\n", encoder_session.inbasefilename, data_bytes);
762
return EncoderSession_finish_error(&encoder_session);
765
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
766
return EncoderSession_finish_error(&encoder_session);
768
flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with cbSize %u\n", encoder_session.inbasefilename, (unsigned)x);
769
return EncoderSession_finish_error(&encoder_session);
772
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
773
return EncoderSession_finish_error(&encoder_session);
774
if((unsigned)x > bps) {
775
flac__utils_printf(stderr, 1, "%s: ERROR: invalid WAVEFORMATEXTENSIBLE chunk with wValidBitsPerSample (%u) > wBitsPerSample (%u)\n", encoder_session.inbasefilename, (unsigned)x, bps);
776
return EncoderSession_finish_error(&encoder_session);
778
shift = bps - (unsigned)x;
780
if(!read_little_endian_uint32(infile, &channel_mask, false, encoder_session.inbasefilename))
781
return EncoderSession_finish_error(&encoder_session);
782
/* for mono/stereo and unassigned channels, we fake the mask */
783
if(channel_mask == 0) {
785
channel_mask = 0x0001;
786
else if(channels == 2)
787
channel_mask = 0x0003;
789
/* set channel mapping */
790
/* FLAC order follows SMPTE and WAVEFORMATEXTENSIBLE but with fewer channels, which are: */
791
/* front left, front right, center, LFE, back left, back right, surround left, surround right */
792
/* the default mapping is sufficient for 1-6 channels and 7-8 are currently unspecified anyway */
794
/* @@@ example for dolby/vorbis order, for reference later in case it becomes important */
796
options.common.channel_map_none ||
797
channel_mask == 0x0001 || /* 1 channel: (mono) */
798
channel_mask == 0x0003 || /* 2 channels: front left, front right */
799
channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
800
channel_mask == 0x0603 /* 4 channels: front left, front right, side left, side right */
802
/* keep default channel order */
805
channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
806
channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
807
channel_mask == 0x0607 /* 5 channels: front left, front right, front center, side left, side right */
809
/* to dolby order: front left, center, front right [, surround left, surround right ] */
814
channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
815
channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
817
/* to dolby order: front left, center, front right, surround left, surround right, LFE */
826
options.common.channel_map_none ||
827
channel_mask == 0x0001 || /* 1 channel: (mono) */
828
channel_mask == 0x0003 || /* 2 channels: front left, front right */
829
channel_mask == 0x0007 || /* 3 channels: front left, front right, front center */
830
channel_mask == 0x0033 || /* 4 channels: front left, front right, back left, back right */
831
channel_mask == 0x0603 || /* 4 channels: front left, front right, side left, side right */
832
channel_mask == 0x0037 || /* 5 channels: front left, front right, front center, back left, back right */
833
channel_mask == 0x0607 || /* 5 channels: front left, front right, front center, side left, side right */
834
channel_mask == 0x003f || /* 6 channels: front left, front right, front center, LFE, back left, back right */
835
channel_mask == 0x060f /* 6 channels: front left, front right, front center, LFE, side left, side right */
837
/* keep default channel order */
841
flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk with unsupported channel mask=0x%04X\n", encoder_session.inbasefilename, (unsigned)channel_mask);
842
return EncoderSession_finish_error(&encoder_session);
844
if(!options.common.channel_map_none) {
845
if(count_channel_mask_bits(channel_mask) < channels) {
846
flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk: channel mask 0x%04X has unassigned channels (#channels=%u)\n", encoder_session.inbasefilename, (unsigned)channel_mask, channels);
847
return EncoderSession_finish_error(&encoder_session);
850
/* supporting this is too difficult with channel mapping; e.g. what if mask is 0x003f but #channels=4?
851
* there would be holes in the order that would have to be filled in, or the mask would have to be
852
* limited and the logic above rerun to see if it still fits into the FLAC mapping.
854
else if(count_channel_mask_bits(channel_mask) > channels)
855
channel_mask = limit_channel_mask(channel_mask, channels);
857
else if(count_channel_mask_bits(channel_mask) > channels) {
858
flac__utils_printf(stderr, 1, "%s: ERROR: WAVEFORMATEXTENSIBLE chunk: channel mask 0x%04X has extra bits for non-existant channels (#channels=%u)\n", encoder_session.inbasefilename, (unsigned)channel_mask, channels);
859
return EncoderSession_finish_error(&encoder_session);
863
/* first part of GUID */
864
if(!read_little_endian_uint16(infile, &x, false, encoder_session.inbasefilename))
865
return EncoderSession_finish_error(&encoder_session);
867
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported WAVEFORMATEXTENSIBLE chunk with non-PCM format %u\n", encoder_session.inbasefilename, (unsigned)x);
868
return EncoderSession_finish_error(&encoder_session);
873
if(bps-shift < 4 || bps-shift > 24) {
874
flac__utils_printf(stderr, 1, "%s: ERROR: unsupported bits-per-sample %u\n", encoder_session.inbasefilename, bps-shift);
875
return EncoderSession_finish_error(&encoder_session);
877
else if(options.common.sector_align && bps-shift != 16) {
878
flac__utils_printf(stderr, 1, "%s: ERROR: file has %u bits-per-sample, must be 16 for --sector-align\n", encoder_session.inbasefilename, bps-shift);
879
return EncoderSession_finish_error(&encoder_session);
624
882
/* skip any extra data in the fmt sub-chunk */
628
for(left = data_bytes; left > 0; ) {
629
need = min(left, CHUNK_OF_SAMPLES);
630
if(fread(ucbuffer_, 1U, need, infile) < need) {
631
flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping samples\n", encoder_session.inbasefilename);
632
return EncoderSession_finish_error(&encoder_session);
883
if(!fskip_ahead(infile, data_bytes)) {
884
flac__utils_printf(stderr, 1, "%s: ERROR during read while skipping extra 'fmt' data\n", encoder_session.inbasefilename);
885
return EncoderSession_finish_error(&encoder_session);
1111
1386
return EncoderSession_finish_ok(&encoder_session, info_align_carry, info_align_zero);
1114
FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FILE *infile, const char *infilename, const char *outfilename)
1389
int flac__encode_flac(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, flac_encode_options_t options, FLAC__bool input_is_ogg)
1391
EncoderSession encoder_session;
1392
FLAC__StreamDecoder *decoder = 0;
1393
FLACDecoderData decoder_data;
1398
EncoderSession_construct(
1401
options.common.use_ogg,
1405
options.common.verify,
1406
options.common.treat_warnings_as_errors,
1407
options.common.continue_through_decode_errors,
1415
decoder_data.encoder_session = &encoder_session;
1416
decoder_data.filesize = (infilesize == (off_t)(-1)? 0 : infilesize);
1417
decoder_data.lookahead = lookahead;
1418
decoder_data.lookahead_length = lookahead_length;
1419
decoder_data.num_metadata_blocks = 0;
1420
decoder_data.samples_left_to_process = 0;
1421
decoder_data.fatal_error = false;
1424
* set up FLAC decoder for the input
1426
if (0 == (decoder = FLAC__stream_decoder_new())) {
1427
flac__utils_printf(stderr, 1, "%s: ERROR: creating decoder for FLAC input\n", encoder_session.inbasefilename);
1428
return EncoderSession_finish_error(&encoder_session);
1431
FLAC__stream_decoder_set_md5_checking(decoder, false) &&
1432
FLAC__stream_decoder_set_metadata_respond_all(decoder)
1434
flac__utils_printf(stderr, 1, "%s: ERROR: setting up decoder for FLAC input\n", encoder_session.inbasefilename);
1435
goto fubar1; /*@@@ yuck */
1439
if (FLAC__stream_decoder_init_ogg_stream(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=*/&decoder_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
1440
flac__utils_printf(stderr, 1, "%s: ERROR: initializing decoder for Ogg FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
1441
goto fubar1; /*@@@ yuck */
1444
else if (FLAC__stream_decoder_init_stream(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=*/&decoder_data) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
1445
flac__utils_printf(stderr, 1, "%s: ERROR: initializing decoder for FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
1446
goto fubar1; /*@@@ yuck */
1449
if (!FLAC__stream_decoder_process_until_end_of_metadata(decoder) || decoder_data.fatal_error) {
1450
if (decoder_data.fatal_error)
1451
flac__utils_printf(stderr, 1, "%s: ERROR: out of memory or too many metadata blocks while reading metadata in FLAC input\n", encoder_session.inbasefilename);
1453
flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
1454
goto fubar1; /*@@@ yuck */
1457
if (decoder_data.num_metadata_blocks == 0) {
1458
flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, got no metadata blocks\n", encoder_session.inbasefilename);
1459
goto fubar2; /*@@@ yuck */
1461
else if (decoder_data.metadata_blocks[0]->type != FLAC__METADATA_TYPE_STREAMINFO) {
1462
flac__utils_printf(stderr, 1, "%s: ERROR: reading metadata in FLAC input, first metadata block is not STREAMINFO\n", encoder_session.inbasefilename);
1463
goto fubar2; /*@@@ yuck */
1465
else if (decoder_data.metadata_blocks[0]->data.stream_info.total_samples == 0) {
1466
flac__utils_printf(stderr, 1, "%s: ERROR: FLAC input has STREAMINFO with unknown total samples which is not supported\n", encoder_session.inbasefilename);
1467
goto fubar2; /*@@@ yuck */
1471
* now that we have the STREAMINFO and know the sample rate,
1472
* canonicalize the --skip string to a number of samples:
1474
flac__utils_canonicalize_skip_until_specification(&options.common.skip_specification, decoder_data.metadata_blocks[0]->data.stream_info.sample_rate);
1475
FLAC__ASSERT(options.common.skip_specification.value.samples >= 0);
1476
encoder_session.skip = (FLAC__uint64)options.common.skip_specification.value.samples;
1477
FLAC__ASSERT(!options.common.sector_align); /* --sector-align with FLAC input is not supported */
1480
FLAC__uint64 total_samples_in_input, trim = 0;
1482
total_samples_in_input = decoder_data.metadata_blocks[0]->data.stream_info.total_samples;
1485
* now that we know the input size, canonicalize the
1486
* --until string to an absolute sample number:
1488
if(!canonicalize_until_specification(&options.common.until_specification, encoder_session.inbasefilename, decoder_data.metadata_blocks[0]->data.stream_info.sample_rate, encoder_session.skip, total_samples_in_input))
1489
goto fubar2; /*@@@ yuck */
1490
encoder_session.until = (FLAC__uint64)options.common.until_specification.value.samples;
1492
encoder_session.total_samples_to_encode = total_samples_in_input - encoder_session.skip;
1493
if(encoder_session.until > 0) {
1494
trim = total_samples_in_input - encoder_session.until;
1495
FLAC__ASSERT(total_samples_in_input > 0);
1496
encoder_session.total_samples_to_encode -= trim;
1499
encoder_session.unencoded_size = decoder_data.filesize;
1501
/* (channel mask will get copied over from the source VORBIS_COMMENT if it exists) */
1502
if(!EncoderSession_init_encoder(&encoder_session, options.common, /*channel_mask=*/0, decoder_data.metadata_blocks[0]->data.stream_info.channels, decoder_data.metadata_blocks[0]->data.stream_info.bits_per_sample, decoder_data.metadata_blocks[0]->data.stream_info.sample_rate, &decoder_data))
1503
goto fubar2; /*@@@ yuck */
1506
* have to wait until the FLAC encoder is set up for writing
1507
* before any seeking in the input FLAC file, because the seek
1508
* itself will usually call the decoder's write callback, and
1509
* our decoder's write callback passes samples to our FLAC
1512
decoder_data.samples_left_to_process = encoder_session.total_samples_to_encode;
1513
if(encoder_session.skip > 0) {
1514
if(!FLAC__stream_decoder_seek_absolute(decoder, encoder_session.skip)) {
1515
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(decoder));
1516
goto fubar2; /*@@@ yuck */
1521
* now do samples from the file
1523
while(!decoder_data.fatal_error && decoder_data.samples_left_to_process > 0) {
1524
/* We can also hit the end of stream without samples_left_to_process
1525
* going to 0 if there are errors and continue_through_decode_errors
1526
* is on, so we want to break in that case too:
1528
if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
1530
if(!FLAC__stream_decoder_process_single(decoder)) {
1531
flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
1532
goto fubar2; /*@@@ yuck */
1535
if(decoder_data.fatal_error) {
1536
flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
1537
goto fubar2; /*@@@ yuck */
1541
FLAC__stream_decoder_delete(decoder);
1542
retval = EncoderSession_finish_ok(&encoder_session, -1, -1);
1543
/* have to wail until encoder is completely finished before deleting because of the final step of writing the seekpoint offsets */
1544
for(i = 0; i < decoder_data.num_metadata_blocks; i++)
1545
FLAC__metadata_object_delete(decoder_data.metadata_blocks[i]);
1549
for(i = 0; i < decoder_data.num_metadata_blocks; i++)
1550
FLAC__metadata_object_delete(decoder_data.metadata_blocks[i]);
1552
FLAC__stream_decoder_delete(decoder);
1553
return EncoderSession_finish_error(&encoder_session);
1556
FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FLAC__bool treat_warnings_as_errors, FLAC__bool continue_through_decode_errors, FILE *infile, const char *infilename, const char *outfilename)
1117
1559
FLAC__uint32 test = 1;
1393
if(e->seek_table_template->data.seek_table.num_points > 0) {
1394
e->seek_table_template->is_last = false; /* the encoder will set this for us */
1395
metadata[num_metadata++] = e->seek_table_template;
1398
metadata[num_metadata++] = cuesheet;
1399
metadata[num_metadata++] = options.vorbis_comment;
1400
if(options.padding > 0) {
1401
padding.is_last = false; /* the encoder will set this for us */
1402
padding.type = FLAC__METADATA_TYPE_PADDING;
1403
padding.length = (unsigned)options.padding;
1404
metadata[num_metadata++] = &padding;
1407
e->blocksize = options.blocksize;
1408
e->stats_mask = (options.do_exhaustive_model_search || options.do_qlp_coeff_prec_search)? 0x0f : 0x3f;
1410
#ifdef FLAC__HAS_OGG
1737
if(flac_decoder_data) {
1739
* we're encoding from FLAC so we will use the FLAC file's
1740
* metadata as the basis for the encoded file
1744
* first handle pictures: simple append any --pictures
1747
for(i = 0; i < options.num_pictures; i++) {
1748
FLAC__StreamMetadata *pic = FLAC__metadata_object_clone(options.pictures[i]);
1750
flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PICTURE block\n", e->inbasefilename);
1752
FLAC__metadata_object_delete(cuesheet);
1755
flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks++] = pic;
1760
* next handle vorbis comment: if any tags were specified
1761
* or there is no existing vorbis comment, we create a
1762
* new vorbis comment (discarding any existing one); else
1763
* we keep the existing one. also need to make sure to
1764
* propagate any channel mask tag.
1766
/* @@@ change to append -T values from options.vorbis_comment if input has VC already? */
1768
FLAC__bool vc_found = false;
1769
for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1770
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
1772
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT && options.vorbis_comment->data.vorbis_comment.num_comments > 0) {
1773
(void) flac__utils_get_channel_mask_tag(flac_decoder_data->metadata_blocks[i], &channel_mask);
1774
flac__utils_printf(stderr, 1, "%s: WARNING, replacing tags from input FLAC file with those given on the command-line\n", e->inbasefilename);
1775
if(e->treat_warnings_as_errors) {
1777
FLAC__metadata_object_delete(cuesheet);
1780
FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1781
flac_decoder_data->metadata_blocks[i] = 0;
1784
flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1786
flac_decoder_data->num_metadata_blocks = j;
1787
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])) {
1789
FLAC__StreamMetadata *vc = FLAC__metadata_object_clone(options.vorbis_comment);
1790
if(0 == vc || (channel_mask && !flac__utils_set_channel_mask_tag(vc, channel_mask))) {
1791
flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for VORBIS_COMMENT block\n", e->inbasefilename);
1793
FLAC__metadata_object_delete(cuesheet);
1796
for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1797
flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1798
flac_decoder_data->metadata_blocks[1] = vc;
1799
flac_decoder_data->num_metadata_blocks++;
1804
* next handle cuesheet: if --cuesheet was specified, use
1805
* it; else if file has existing CUESHEET and cuesheet's
1806
* lead-out offset is correct, keep it; else no CUESHEET
1809
for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1810
FLAC__bool existing_cuesheet_is_bad = false;
1811
/* check if existing cuesheet matches the input audio */
1812
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && 0 == cuesheet) {
1813
const FLAC__StreamMetadata_CueSheet *cs = &flac_decoder_data->metadata_blocks[i]->data.cue_sheet;
1814
if(e->total_samples_to_encode == 0) {
1815
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);
1816
if(e->treat_warnings_as_errors) {
1818
FLAC__metadata_object_delete(cuesheet);
1821
existing_cuesheet_is_bad = true;
1823
else if(e->total_samples_to_encode != cs->tracks[cs->num_tracks-1].offset) {
1824
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);
1825
if(e->treat_warnings_as_errors) {
1827
FLAC__metadata_object_delete(cuesheet);
1830
existing_cuesheet_is_bad = true;
1833
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_CUESHEET && (existing_cuesheet_is_bad || 0 != cuesheet)) {
1835
flac__utils_printf(stderr, 1, "%s: WARNING, replacing cuesheet in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1836
if(e->treat_warnings_as_errors) {
1837
FLAC__metadata_object_delete(cuesheet);
1841
FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1842
flac_decoder_data->metadata_blocks[i] = 0;
1845
flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1847
flac_decoder_data->num_metadata_blocks = j;
1848
if(0 != cuesheet && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1850
FLAC__StreamMetadata *cs = FLAC__metadata_object_clone(cuesheet);
1852
flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for CUESHEET block\n", e->inbasefilename);
1854
FLAC__metadata_object_delete(cuesheet);
1857
for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1858
flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1859
flac_decoder_data->metadata_blocks[1] = cs;
1860
flac_decoder_data->num_metadata_blocks++;
1865
* next handle seektable: if -S- was specified, no
1866
* SEEKTABLE; else if -S was specified, use it/them;
1867
* else if file has existing SEEKTABLE and input size is
1868
* preserved (no --skip/--until/etc specified), keep it;
1869
* else use default seektable options
1871
* note: meanings of num_requested_seek_points:
1872
* -1 : no -S option given, default to some value
1873
* 0 : -S- given (no seektable)
1874
* >0 : one or more -S options given
1877
FLAC__bool existing_seektable = false;
1878
for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1879
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_SEEKTABLE)
1880
existing_seektable = true;
1881
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)) {
1882
if(options.num_requested_seek_points > 0) {
1883
flac__utils_printf(stderr, 1, "%s: WARNING, replacing seektable in input FLAC file with the one given on the command-line\n", e->inbasefilename);
1884
if(e->treat_warnings_as_errors) {
1886
FLAC__metadata_object_delete(cuesheet);
1890
else if(options.num_requested_seek_points == 0)
1891
; /* no warning, silently delete existing SEEKTABLE since user specified --no-seektable (-S-) */
1893
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);
1894
if(e->treat_warnings_as_errors) {
1896
FLAC__metadata_object_delete(cuesheet);
1900
FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1901
flac_decoder_data->metadata_blocks[i] = 0;
1902
existing_seektable = false;
1905
flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1907
flac_decoder_data->num_metadata_blocks = j;
1908
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])) {
1910
FLAC__StreamMetadata *st = FLAC__metadata_object_clone(e->seek_table_template);
1912
flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for SEEKTABLE block\n", e->inbasefilename);
1914
FLAC__metadata_object_delete(cuesheet);
1917
for(i = flac_decoder_data->num_metadata_blocks; i > 1; i--)
1918
flac_decoder_data->metadata_blocks[i] = flac_decoder_data->metadata_blocks[i-1];
1919
flac_decoder_data->metadata_blocks[1] = st;
1920
flac_decoder_data->num_metadata_blocks++;
1925
* finally handle padding: if --no-padding was specified,
1926
* then delete all padding; else if -P was specified,
1927
* use that instead of existing padding (if any); else
1928
* if existing file has padding, move all existing
1929
* padding blocks to one padding block at the end; else
1930
* use default padding.
1934
for(i = 0, j = 0; i < flac_decoder_data->num_metadata_blocks; i++) {
1935
if(flac_decoder_data->metadata_blocks[i]->type == FLAC__METADATA_TYPE_PADDING) {
1938
p += flac_decoder_data->metadata_blocks[i]->length;
1939
FLAC__metadata_object_delete(flac_decoder_data->metadata_blocks[i]);
1940
flac_decoder_data->metadata_blocks[i] = 0;
1943
flac_decoder_data->metadata_blocks[j++] = flac_decoder_data->metadata_blocks[i];
1945
flac_decoder_data->num_metadata_blocks = j;
1946
if(options.padding > 0)
1947
p = options.padding;
1949
p = e->total_samples_to_encode / e->sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8;
1950
if(options.padding != 0) {
1951
if(p > 0 && flac_decoder_data->num_metadata_blocks < sizeof(flac_decoder_data->metadata_blocks)/sizeof(flac_decoder_data->metadata_blocks[0])) {
1952
flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
1953
if(0 == flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]) {
1954
flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for PADDING block\n", e->inbasefilename);
1956
FLAC__metadata_object_delete(cuesheet);
1959
flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->is_last = false; /* the encoder will set this for us */
1960
flac_decoder_data->metadata_blocks[flac_decoder_data->num_metadata_blocks]->length = p;
1961
flac_decoder_data->num_metadata_blocks++;
1965
metadata = &flac_decoder_data->metadata_blocks[1]; /* don't include STREAMINFO */
1966
num_metadata = flac_decoder_data->num_metadata_blocks - 1;
1970
* we're not encoding from FLAC so we will build the metadata
1974
if(e->seek_table_template->data.seek_table.num_points > 0) {
1975
e->seek_table_template->is_last = false; /* the encoder will set this for us */
1976
metadata[num_metadata++] = e->seek_table_template;
1979
metadata[num_metadata++] = cuesheet;
1981
if(!flac__utils_set_channel_mask_tag(options.vorbis_comment, channel_mask)) {
1982
flac__utils_printf(stderr, 1, "%s: ERROR adding channel mask tag\n", e->inbasefilename);
1984
FLAC__metadata_object_delete(cuesheet);
1988
metadata[num_metadata++] = options.vorbis_comment;
1989
for(i = 0; i < options.num_pictures; i++)
1990
metadata[num_metadata++] = options.pictures[i];
1991
if(options.padding != 0) {
1992
padding.is_last = false; /* the encoder will set this for us */
1993
padding.type = FLAC__METADATA_TYPE_PADDING;
1994
padding.length = (unsigned)(options.padding>0? options.padding : (e->total_samples_to_encode / e->sample_rate < 20*60? FLAC_ENCODE__DEFAULT_PADDING : FLAC_ENCODE__DEFAULT_PADDING*8));
1995
metadata[num_metadata++] = &padding;
1999
/* check for a few things that have not already been checked. the
2000
* FLAC__stream_encoder_init*() will check it but only return
2001
* FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA so we check some
2002
* up front to give a better error message.
2004
if(!verify_metadata(e, metadata, num_metadata)) {
2006
FLAC__metadata_object_delete(cuesheet);
2010
FLAC__stream_encoder_set_verify(e->encoder, options.verify);
2011
FLAC__stream_encoder_set_streamable_subset(e->encoder, !options.lax);
2012
FLAC__stream_encoder_set_channels(e->encoder, channels);
2013
FLAC__stream_encoder_set_bits_per_sample(e->encoder, bps);
2014
FLAC__stream_encoder_set_sample_rate(e->encoder, sample_rate);
2015
for(i = 0; i < options.num_compression_settings; i++) {
2016
switch(options.compression_settings[i].type) {
2018
FLAC__stream_encoder_set_blocksize(e->encoder, options.compression_settings[i].value.t_unsigned);
2020
case CST_COMPRESSION_LEVEL:
2021
FLAC__stream_encoder_set_compression_level(e->encoder, options.compression_settings[i].value.t_unsigned);
2022
apodizations[0] = '\0';
2024
case CST_DO_MID_SIDE:
2025
FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2027
case CST_LOOSE_MID_SIDE:
2028
FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder, options.compression_settings[i].value.t_bool);
2030
case CST_APODIZATION:
2031
if(strlen(apodizations)+strlen(options.compression_settings[i].value.t_string)+2 >= sizeof(apodizations)) {
2032
flac__utils_printf(stderr, 1, "%s: ERROR: too many apodization functions requested\n", e->inbasefilename);
2034
FLAC__metadata_object_delete(cuesheet);
2038
strcat(apodizations, options.compression_settings[i].value.t_string);
2039
strcat(apodizations, ";");
2042
case CST_MAX_LPC_ORDER:
2043
FLAC__stream_encoder_set_max_lpc_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2045
case CST_QLP_COEFF_PRECISION:
2046
FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder, options.compression_settings[i].value.t_unsigned);
2048
case CST_DO_QLP_COEFF_PREC_SEARCH:
2049
FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder, options.compression_settings[i].value.t_bool);
2051
case CST_DO_ESCAPE_CODING:
2052
FLAC__stream_encoder_set_do_escape_coding(e->encoder, options.compression_settings[i].value.t_bool);
2054
case CST_DO_EXHAUSTIVE_MODEL_SEARCH:
2055
FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder, options.compression_settings[i].value.t_bool);
2057
case CST_MIN_RESIDUAL_PARTITION_ORDER:
2058
FLAC__stream_encoder_set_min_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2060
case CST_MAX_RESIDUAL_PARTITION_ORDER:
2061
FLAC__stream_encoder_set_max_residual_partition_order(e->encoder, options.compression_settings[i].value.t_unsigned);
2063
case CST_RICE_PARAMETER_SEARCH_DIST:
2064
FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder, options.compression_settings[i].value.t_unsigned);
2069
FLAC__stream_encoder_set_apodization(e->encoder, apodizations);
2070
FLAC__stream_encoder_set_total_samples_estimate(e->encoder, e->total_samples_to_encode);
2071
FLAC__stream_encoder_set_metadata(e->encoder, (num_metadata > 0)? metadata : 0, num_metadata);
2073
FLAC__stream_encoder_disable_constant_subframes(e->encoder, options.debug.disable_constant_subframes);
2074
FLAC__stream_encoder_disable_fixed_subframes(e->encoder, options.debug.disable_fixed_subframes);
2075
FLAC__stream_encoder_disable_verbatim_subframes(e->encoder, options.debug.disable_verbatim_subframes);
1411
2078
if(e->use_ogg) {
1413
OggFLAC__stream_encoder_set_serial_number(e->encoder.ogg.stream, options.serial_number);
1414
OggFLAC__stream_encoder_set_verify(e->encoder.ogg.stream, options.verify);
1415
OggFLAC__stream_encoder_set_streamable_subset(e->encoder.ogg.stream, !options.lax);
1416
OggFLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.ogg.stream, options.do_mid_side);
1417
OggFLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.ogg.stream, options.loose_mid_side);
1418
OggFLAC__stream_encoder_set_channels(e->encoder.ogg.stream, channels);
1419
OggFLAC__stream_encoder_set_bits_per_sample(e->encoder.ogg.stream, bps);
1420
OggFLAC__stream_encoder_set_sample_rate(e->encoder.ogg.stream, sample_rate);
1421
OggFLAC__stream_encoder_set_blocksize(e->encoder.ogg.stream, options.blocksize);
1422
OggFLAC__stream_encoder_set_max_lpc_order(e->encoder.ogg.stream, options.max_lpc_order);
1423
OggFLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.ogg.stream, options.qlp_coeff_precision);
1424
OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.stream, options.do_qlp_coeff_prec_search);
1425
OggFLAC__stream_encoder_set_do_escape_coding(e->encoder.ogg.stream, options.do_escape_coding);
1426
OggFLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.ogg.stream, options.do_exhaustive_model_search);
1427
OggFLAC__stream_encoder_set_min_residual_partition_order(e->encoder.ogg.stream, options.min_residual_partition_order);
1428
OggFLAC__stream_encoder_set_max_residual_partition_order(e->encoder.ogg.stream, options.max_residual_partition_order);
1429
OggFLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.ogg.stream, options.rice_parameter_search_dist);
1430
OggFLAC__stream_encoder_set_total_samples_estimate(e->encoder.ogg.stream, e->total_samples_to_encode);
1431
OggFLAC__stream_encoder_set_metadata(e->encoder.ogg.stream, (num_metadata > 0)? metadata : 0, num_metadata);
1432
OggFLAC__stream_encoder_set_write_callback(e->encoder.ogg.stream, ogg_stream_encoder_write_callback);
1433
OggFLAC__stream_encoder_set_metadata_callback(e->encoder.ogg.stream, ogg_stream_encoder_metadata_callback);
1434
OggFLAC__stream_encoder_set_client_data(e->encoder.ogg.stream, e);
1436
OggFLAC__stream_encoder_disable_constant_subframes(e->encoder.ogg.stream, options.debug.disable_constant_subframes);
1437
OggFLAC__stream_encoder_disable_fixed_subframes(e->encoder.ogg.stream, options.debug.disable_fixed_subframes);
1438
OggFLAC__stream_encoder_disable_verbatim_subframes(e->encoder.ogg.stream, options.debug.disable_verbatim_subframes);
1440
if(OggFLAC__stream_encoder_init(e->encoder.ogg.stream) != FLAC__STREAM_ENCODER_OK) {
1441
print_error_with_state(e, "ERROR initializing encoder");
1443
FLAC__metadata_object_delete(cuesheet);
1448
OggFLAC__file_encoder_set_serial_number(e->encoder.ogg.file, options.serial_number);
1449
OggFLAC__file_encoder_set_filename(e->encoder.ogg.file, e->outfilename);
1450
OggFLAC__file_encoder_set_verify(e->encoder.ogg.file, options.verify);
1451
OggFLAC__file_encoder_set_streamable_subset(e->encoder.ogg.file, !options.lax);
1452
OggFLAC__file_encoder_set_do_mid_side_stereo(e->encoder.ogg.file, options.do_mid_side);
1453
OggFLAC__file_encoder_set_loose_mid_side_stereo(e->encoder.ogg.file, options.loose_mid_side);
1454
OggFLAC__file_encoder_set_channels(e->encoder.ogg.file, channels);
1455
OggFLAC__file_encoder_set_bits_per_sample(e->encoder.ogg.file, bps);
1456
OggFLAC__file_encoder_set_sample_rate(e->encoder.ogg.file, sample_rate);
1457
OggFLAC__file_encoder_set_blocksize(e->encoder.ogg.file, options.blocksize);
1458
OggFLAC__file_encoder_set_max_lpc_order(e->encoder.ogg.file, options.max_lpc_order);
1459
OggFLAC__file_encoder_set_qlp_coeff_precision(e->encoder.ogg.file, options.qlp_coeff_precision);
1460
OggFLAC__file_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.file, options.do_qlp_coeff_prec_search);
1461
OggFLAC__file_encoder_set_do_escape_coding(e->encoder.ogg.file, options.do_escape_coding);
1462
OggFLAC__file_encoder_set_do_exhaustive_model_search(e->encoder.ogg.file, options.do_exhaustive_model_search);
1463
OggFLAC__file_encoder_set_min_residual_partition_order(e->encoder.ogg.file, options.min_residual_partition_order);
1464
OggFLAC__file_encoder_set_max_residual_partition_order(e->encoder.ogg.file, options.max_residual_partition_order);
1465
OggFLAC__file_encoder_set_rice_parameter_search_dist(e->encoder.ogg.file, options.rice_parameter_search_dist);
1466
OggFLAC__file_encoder_set_total_samples_estimate(e->encoder.ogg.file, e->total_samples_to_encode);
1467
OggFLAC__file_encoder_set_metadata(e->encoder.ogg.file, (num_metadata > 0)? metadata : 0, num_metadata);
1468
OggFLAC__file_encoder_set_progress_callback(e->encoder.ogg.file, ogg_file_encoder_progress_callback);
1469
OggFLAC__file_encoder_set_client_data(e->encoder.ogg.file, e);
1471
OggFLAC__file_encoder_disable_constant_subframes(e->encoder.ogg.file, options.debug.disable_constant_subframes);
1472
OggFLAC__file_encoder_disable_fixed_subframes(e->encoder.ogg.file, options.debug.disable_fixed_subframes);
1473
OggFLAC__file_encoder_disable_verbatim_subframes(e->encoder.ogg.file, options.debug.disable_verbatim_subframes);
1475
if(OggFLAC__file_encoder_init(e->encoder.ogg.file) != OggFLAC__FILE_ENCODER_OK) {
1476
print_error_with_state(e, "ERROR initializing encoder");
1478
FLAC__metadata_object_delete(cuesheet);
2079
FLAC__stream_encoder_set_ogg_serial_number(e->encoder, options.serial_number);
2081
init_status = FLAC__stream_encoder_init_ogg_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
1486
FLAC__stream_encoder_set_verify(e->encoder.flac.stream, options.verify);
1487
FLAC__stream_encoder_set_streamable_subset(e->encoder.flac.stream, !options.lax);
1488
FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.flac.stream, options.do_mid_side);
1489
FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.flac.stream, options.loose_mid_side);
1490
FLAC__stream_encoder_set_channels(e->encoder.flac.stream, channels);
1491
FLAC__stream_encoder_set_bits_per_sample(e->encoder.flac.stream, bps);
1492
FLAC__stream_encoder_set_sample_rate(e->encoder.flac.stream, sample_rate);
1493
FLAC__stream_encoder_set_blocksize(e->encoder.flac.stream, options.blocksize);
1494
FLAC__stream_encoder_set_max_lpc_order(e->encoder.flac.stream, options.max_lpc_order);
1495
FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.flac.stream, options.qlp_coeff_precision);
1496
FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.flac.stream, options.do_qlp_coeff_prec_search);
1497
FLAC__stream_encoder_set_do_escape_coding(e->encoder.flac.stream, options.do_escape_coding);
1498
FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.flac.stream, options.do_exhaustive_model_search);
1499
FLAC__stream_encoder_set_min_residual_partition_order(e->encoder.flac.stream, options.min_residual_partition_order);
1500
FLAC__stream_encoder_set_max_residual_partition_order(e->encoder.flac.stream, options.max_residual_partition_order);
1501
FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.flac.stream, options.rice_parameter_search_dist);
1502
FLAC__stream_encoder_set_total_samples_estimate(e->encoder.flac.stream, e->total_samples_to_encode);
1503
FLAC__stream_encoder_set_metadata(e->encoder.flac.stream, (num_metadata > 0)? metadata : 0, num_metadata);
1504
FLAC__stream_encoder_set_write_callback(e->encoder.flac.stream, flac_stream_encoder_write_callback);
1505
FLAC__stream_encoder_set_metadata_callback(e->encoder.flac.stream, flac_stream_encoder_metadata_callback);
1506
FLAC__stream_encoder_set_client_data(e->encoder.flac.stream, e);
1508
FLAC__stream_encoder_disable_constant_subframes(e->encoder.flac.stream, options.debug.disable_constant_subframes);
1509
FLAC__stream_encoder_disable_fixed_subframes(e->encoder.flac.stream, options.debug.disable_fixed_subframes);
1510
FLAC__stream_encoder_disable_verbatim_subframes(e->encoder.flac.stream, options.debug.disable_verbatim_subframes);
1512
if(FLAC__stream_encoder_init(e->encoder.flac.stream) != FLAC__STREAM_ENCODER_OK) {
1513
print_error_with_state(e, "ERROR initializing encoder");
1515
FLAC__metadata_object_delete(cuesheet);
1520
FLAC__file_encoder_set_filename(e->encoder.flac.file, e->outfilename);
1521
FLAC__file_encoder_set_verify(e->encoder.flac.file, options.verify);
1522
FLAC__file_encoder_set_streamable_subset(e->encoder.flac.file, !options.lax);
1523
FLAC__file_encoder_set_do_mid_side_stereo(e->encoder.flac.file, options.do_mid_side);
1524
FLAC__file_encoder_set_loose_mid_side_stereo(e->encoder.flac.file, options.loose_mid_side);
1525
FLAC__file_encoder_set_channels(e->encoder.flac.file, channels);
1526
FLAC__file_encoder_set_bits_per_sample(e->encoder.flac.file, bps);
1527
FLAC__file_encoder_set_sample_rate(e->encoder.flac.file, sample_rate);
1528
FLAC__file_encoder_set_blocksize(e->encoder.flac.file, options.blocksize);
1529
FLAC__file_encoder_set_max_lpc_order(e->encoder.flac.file, options.max_lpc_order);
1530
FLAC__file_encoder_set_qlp_coeff_precision(e->encoder.flac.file, options.qlp_coeff_precision);
1531
FLAC__file_encoder_set_do_qlp_coeff_prec_search(e->encoder.flac.file, options.do_qlp_coeff_prec_search);
1532
FLAC__file_encoder_set_do_escape_coding(e->encoder.flac.file, options.do_escape_coding);
1533
FLAC__file_encoder_set_do_exhaustive_model_search(e->encoder.flac.file, options.do_exhaustive_model_search);
1534
FLAC__file_encoder_set_min_residual_partition_order(e->encoder.flac.file, options.min_residual_partition_order);
1535
FLAC__file_encoder_set_max_residual_partition_order(e->encoder.flac.file, options.max_residual_partition_order);
1536
FLAC__file_encoder_set_rice_parameter_search_dist(e->encoder.flac.file, options.rice_parameter_search_dist);
1537
FLAC__file_encoder_set_total_samples_estimate(e->encoder.flac.file, e->total_samples_to_encode);
1538
FLAC__file_encoder_set_metadata(e->encoder.flac.file, (num_metadata > 0)? metadata : 0, num_metadata);
1539
FLAC__file_encoder_set_progress_callback(e->encoder.flac.file, flac_file_encoder_progress_callback);
1540
FLAC__file_encoder_set_client_data(e->encoder.flac.file, e);
1542
FLAC__file_encoder_disable_constant_subframes(e->encoder.flac.file, options.debug.disable_constant_subframes);
1543
FLAC__file_encoder_disable_fixed_subframes(e->encoder.flac.file, options.debug.disable_fixed_subframes);
1544
FLAC__file_encoder_disable_verbatim_subframes(e->encoder.flac.file, options.debug.disable_verbatim_subframes);
1546
if(FLAC__file_encoder_init(e->encoder.flac.file) != FLAC__FILE_ENCODER_OK) {
1547
print_error_with_state(e, "ERROR initializing encoder");
1549
FLAC__metadata_object_delete(cuesheet);
2086
init_status = FLAC__stream_encoder_init_file(e->encoder, e->is_stdout? 0 : e->outfilename, encoder_progress_callback, /*client_data=*/e);
2089
if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
2090
print_error_with_init_status(e, "ERROR initializing encoder", init_status);
2091
if(FLAC__stream_encoder_get_state(e->encoder) != FLAC__STREAM_ENCODER_IO_ERROR)
2092
e->outputfile_opened = true;
2094
FLAC__metadata_object_delete(cuesheet);
2098
e->outputfile_opened = true;
2101
(FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) && FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x07 :
2102
(FLAC__stream_encoder_get_do_exhaustive_model_search(e->encoder) || FLAC__stream_encoder_get_do_qlp_coeff_prec_search(e->encoder))? 0x0f :
1554
2105
if(0 != cuesheet)
1555
2106
FLAC__metadata_object_delete(cuesheet);
1722
2318
if(is_unsigned_samples) {
1723
2319
for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
1724
2320
for(channel = 0; channel < channels; channel++, sample++) {
1725
dest[channel][wide_sample] = ucbuffer_[byte++]; dest[channel][wide_sample] <<= 8;
1726
dest[channel][wide_sample] |= ucbuffer_[byte++]; dest[channel][wide_sample] <<= 8;
1727
dest[channel][wide_sample] |= ucbuffer_[byte++];
1728
dest[channel][wide_sample] -= 0x800000;
2321
out[channel][wide_sample] = ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2322
out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2323
out[channel][wide_sample] |= ucbuffer_[byte++];
2324
out[channel][wide_sample] -= 0x800000;
1732
2328
for(byte = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
1733
2329
for(channel = 0; channel < channels; channel++, sample++) {
1734
dest[channel][wide_sample] = scbuffer_[byte++]; dest[channel][wide_sample] <<= 8;
1735
dest[channel][wide_sample] |= ucbuffer_[byte++]; dest[channel][wide_sample] <<= 8;
1736
dest[channel][wide_sample] |= ucbuffer_[byte++];
2330
out[channel][wide_sample] = scbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2331
out[channel][wide_sample] |= ucbuffer_[byte++]; out[channel][wide_sample] <<= 8;
2332
out[channel][wide_sample] |= ucbuffer_[byte++];
1741
2337
FLAC__ASSERT(0);
1745
#ifdef FLAC__HAS_OGG
1746
FLAC__StreamEncoderWriteStatus ogg_stream_encoder_write_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
1748
EncoderSession *encoder_session = (EncoderSession*)client_data;
1752
encoder_session->bytes_written += bytes;
1754
* With Ogg FLAC we don't get one write callback per frame and
1755
* we don't have a good number for 'samples', so we estimate based
1756
* on the frame number and the knowledge that all blocks (except
1757
* the last) are the same size.
1760
encoder_session->samples_written = (current_frame+1) * encoder_session->blocksize;
1762
if(encoder_session->total_samples_to_encode > 0 && !(current_frame & encoder_session->stats_mask))
1763
print_stats(encoder_session);
1765
if(flac__utils_fwrite(buffer, sizeof(FLAC__byte), bytes, encoder_session->fout) == bytes)
1766
return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
1768
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
1771
void ogg_stream_encoder_metadata_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data)
1773
// do nothing, for compatibilty. soon we will be using the ogg file encoder anyway.
1774
(void)encoder, (void)metadata, (void)client_data;
1777
void ogg_file_encoder_progress_callback(const OggFLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
1779
EncoderSession *encoder_session = (EncoderSession*)client_data;
1784
* With Ogg FLAC we don't get a value for 'samples_written', so we
1785
* estimate based on the frames written and the knowledge that all
1786
* blocks (except the last) are the same size.
1788
samples_written = frames_written * encoder_session->blocksize;
1789
flac_file_encoder_progress_callback(0, bytes_written, samples_written, frames_written, total_frames_estimate, client_data);
1794
FLAC__StreamEncoderWriteStatus flac_stream_encoder_write_callback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
1796
EncoderSession *encoder_session = (EncoderSession*)client_data;
1800
encoder_session->bytes_written += bytes;
1801
encoder_session->samples_written += samples;
1803
if(samples && encoder_session->total_samples_to_encode > 0 && !(current_frame & encoder_session->stats_mask))
1804
print_stats(encoder_session);
1806
if(flac__utils_fwrite(buffer, sizeof(FLAC__byte), bytes, encoder_session->fout) == bytes)
1807
return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
1809
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
1812
void flac_stream_encoder_metadata_callback(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data)
1815
* Nothing to do; if we get here, we're decoding to stdout, in
1816
* which case we can't seek backwards to write new metadata.
1818
(void)encoder, (void)metadata, (void)client_data;
1821
void flac_file_encoder_progress_callback(const FLAC__FileEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data)
2340
FLAC__int32 mask = (1<<shift)-1;
2341
for(wide_sample = 0; wide_sample < wide_samples; wide_sample++)
2342
for(channel = 0; channel < channels; channel++) {
2343
if(out[channel][wide_sample] & mask) {
2344
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);
2347
out[channel][wide_sample] >>= shift;
2353
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)
1823
2355
EncoderSession *encoder_session = (EncoderSession*)client_data;