19
19
#include "encoders.h"
21
#include "file_utils.h"
22
#include "metadata_utils.h"
24
20
#include "FLAC/assert.h"
25
21
#include "FLAC++/encoder.h"
22
#include "share/grabbag.h"
24
#include "test_libs_common/file_utils_flac.h"
25
#include "test_libs_common/metadata_utils.h"
27
29
#include <stdlib.h>
28
30
#include <string.h>
30
static ::FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;
31
static ::FLAC__StreamMetadata *metadata_sequence_[] = { &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_ };
33
LAYER_STREAM = 0, /* FLAC__stream_encoder_init_stream() without seeking */
34
LAYER_SEEKABLE_STREAM, /* FLAC__stream_encoder_init_stream() with seeking */
35
LAYER_FILE, /* FLAC__stream_encoder_init_FILE() */
36
LAYER_FILENAME /* FLAC__stream_encoder_init_file() */
39
static const char * const LayerString[] = {
46
static ::FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, picture_, unknown_;
47
static ::FLAC__StreamMetadata *metadata_sequence_[] = { &vorbiscomment_, &padding_, &seektable_, &application1_, &application2_, &cuesheet_, &picture_, &unknown_ };
32
48
static const unsigned num_metadata_ = sizeof(metadata_sequence_) / sizeof(metadata_sequence_[0]);
33
static const char *flacfilename_ = "metadata.flac";
50
static const char *flacfilename(bool is_ogg)
52
return is_ogg? "metadata.oga" : "metadata.flac";
55
static bool die_(const char *msg)
57
printf("ERROR: %s\n", msg);
61
static bool die_s_(const char *msg, const FLAC::Encoder::Stream *encoder)
63
FLAC::Encoder::Stream::State state = encoder->get_state();
66
printf("FAILED, %s", msg);
70
printf(", state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
71
if(state == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
72
FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
73
printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
35
79
static void init_metadata_blocks_()
37
mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
81
mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
40
84
static void free_metadata_blocks_()
42
mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);
86
mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
45
89
class StreamEncoder : public FLAC::Encoder::Stream {
47
StreamEncoder(): FLAC::Encoder::Stream() { }
94
StreamEncoder(Layer layer): FLAC::Encoder::Stream(), layer_(layer), file_(0) { }
48
95
~StreamEncoder() { }
50
97
// from FLAC::Encoder::Stream
51
::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame);
98
::FLAC__StreamEncoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes);
99
::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame);
100
::FLAC__StreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset);
101
::FLAC__StreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset);
52
102
void metadata_callback(const ::FLAC__StreamMetadata *metadata);
54
bool die(const char *msg = 0) const;
57
::FLAC__StreamEncoderWriteStatus StreamEncoder::write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame)
59
(void)buffer, (void)bytes, (void)samples, (void)current_frame;
61
return ::FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
105
::FLAC__StreamEncoderReadStatus StreamEncoder::read_callback(FLAC__byte buffer[], size_t *bytes)
108
*bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file_);
110
return ::FLAC__STREAM_ENCODER_READ_STATUS_ABORT;
112
return ::FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM;
114
return ::FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE;
117
return ::FLAC__STREAM_ENCODER_READ_STATUS_ABORT;
120
::FLAC__StreamEncoderWriteStatus StreamEncoder::write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame)
122
(void)samples, (void)current_frame;
124
if(fwrite(buffer, 1, bytes, file_) != bytes)
125
return ::FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
127
return ::FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
130
::FLAC__StreamEncoderSeekStatus StreamEncoder::seek_callback(FLAC__uint64 absolute_byte_offset)
132
if(layer_==LAYER_STREAM)
133
return ::FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED;
134
else if(fseek(file_, (long)absolute_byte_offset, SEEK_SET) < 0)
135
return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR;
137
return FLAC__STREAM_ENCODER_SEEK_STATUS_OK;
140
::FLAC__StreamEncoderTellStatus StreamEncoder::tell_callback(FLAC__uint64 *absolute_byte_offset)
143
if(layer_==LAYER_STREAM)
144
return ::FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED;
145
else if((pos = ftell(file_)) < 0)
146
return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR;
148
*absolute_byte_offset = (FLAC__uint64)pos;
149
return FLAC__STREAM_ENCODER_TELL_STATUS_OK;
64
153
void StreamEncoder::metadata_callback(const ::FLAC__StreamMetadata *metadata)
69
bool StreamEncoder::die(const char *msg) const
71
State state = get_state();
74
printf("FAILED, %s", msg);
78
printf(", state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
79
if(state == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
80
FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
81
printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
87
static bool test_stream_encoder()
89
StreamEncoder *encoder;
90
FLAC__int32 samples[1024];
91
FLAC__int32 *samples_array[1] = { samples };
94
printf("\n+++ libFLAC++ unit test: FLAC::Encoder::Stream\n\n");
96
printf("allocating encoder instance... ");
97
encoder = new StreamEncoder();
99
printf("FAILED, new returned NULL\n");
104
printf("testing is_valid()... ");
105
if(!encoder->is_valid()) {
106
printf("FAILED, returned false\n");
111
printf("testing set_verify()... ");
112
if(!encoder->set_verify(true))
113
return encoder->die("returned false");
116
printf("testing set_streamable_subset()... ");
117
if(!encoder->set_streamable_subset(true))
118
return encoder->die("returned false");
121
printf("testing set_do_mid_side_stereo()... ");
122
if(!encoder->set_do_mid_side_stereo(false))
123
return encoder->die("returned false");
126
printf("testing set_loose_mid_side_stereo()... ");
127
if(!encoder->set_loose_mid_side_stereo(false))
128
return encoder->die("returned false");
131
printf("testing set_channels()... ");
132
if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
133
return encoder->die("returned false");
136
printf("testing set_bits_per_sample()... ");
137
if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
138
return encoder->die("returned false");
141
printf("testing set_sample_rate()... ");
142
if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
143
return encoder->die("returned false");
146
printf("testing set_blocksize()... ");
147
if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
148
return encoder->die("returned false");
151
printf("testing set_max_lpc_order()... ");
152
if(!encoder->set_max_lpc_order(0))
153
return encoder->die("returned false");
156
printf("testing set_qlp_coeff_precision()... ");
157
if(!encoder->set_qlp_coeff_precision(0))
158
return encoder->die("returned false");
161
printf("testing set_do_qlp_coeff_prec_search()... ");
162
if(!encoder->set_do_qlp_coeff_prec_search(false))
163
return encoder->die("returned false");
166
printf("testing set_do_escape_coding()... ");
167
if(!encoder->set_do_escape_coding(false))
168
return encoder->die("returned false");
171
printf("testing set_do_exhaustive_model_search()... ");
172
if(!encoder->set_do_exhaustive_model_search(false))
173
return encoder->die("returned false");
176
printf("testing set_min_residual_partition_order()... ");
177
if(!encoder->set_min_residual_partition_order(0))
178
return encoder->die("returned false");
181
printf("testing set_max_residual_partition_order()... ");
182
if(!encoder->set_max_residual_partition_order(0))
183
return encoder->die("returned false");
186
printf("testing set_rice_parameter_search_dist()... ");
187
if(!encoder->set_rice_parameter_search_dist(0))
188
return encoder->die("returned false");
191
printf("testing set_total_samples_estimate()... ");
192
if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
193
return encoder->die("returned false");
196
printf("testing set_metadata()... ");
197
if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
198
return encoder->die("returned false");
201
printf("testing init()... ");
202
if(encoder->init() != ::FLAC__STREAM_ENCODER_OK)
203
return encoder->die();
206
printf("testing get_state()... ");
207
FLAC::Encoder::Stream::State state = encoder->get_state();
208
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
210
printf("testing get_verify_decoder_state()... ");
211
FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
212
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
215
FLAC__uint64 absolute_sample;
216
unsigned frame_number;
219
FLAC__int32 expected;
222
printf("testing get_verify_decoder_error_stats()... ");
223
encoder->get_verify_decoder_error_stats(&absolute_sample, &frame_number, &channel, &sample, &expected, &got);
227
printf("testing get_verify()... ");
228
if(encoder->get_verify() != true) {
229
printf("FAILED, expected true, got false\n");
234
printf("testing get_streamable_subset()... ");
235
if(encoder->get_streamable_subset() != true) {
236
printf("FAILED, expected true, got false\n");
241
printf("testing get_do_mid_side_stereo()... ");
242
if(encoder->get_do_mid_side_stereo() != false) {
243
printf("FAILED, expected false, got true\n");
248
printf("testing get_loose_mid_side_stereo()... ");
249
if(encoder->get_loose_mid_side_stereo() != false) {
250
printf("FAILED, expected false, got true\n");
255
printf("testing get_channels()... ");
256
if(encoder->get_channels() != streaminfo_.data.stream_info.channels) {
257
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, encoder->get_channels());
262
printf("testing get_bits_per_sample()... ");
263
if(encoder->get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample) {
264
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, encoder->get_bits_per_sample());
269
printf("testing get_sample_rate()... ");
270
if(encoder->get_sample_rate() != streaminfo_.data.stream_info.sample_rate) {
271
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, encoder->get_sample_rate());
276
printf("testing get_blocksize()... ");
277
if(encoder->get_blocksize() != streaminfo_.data.stream_info.min_blocksize) {
278
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, encoder->get_blocksize());
283
printf("testing get_max_lpc_order()... ");
284
if(encoder->get_max_lpc_order() != 0) {
285
printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_lpc_order());
290
printf("testing get_qlp_coeff_precision()... ");
291
(void)encoder->get_qlp_coeff_precision();
292
/* we asked the encoder to auto select this so we accept anything */
295
printf("testing get_do_qlp_coeff_prec_search()... ");
296
if(encoder->get_do_qlp_coeff_prec_search() != false) {
297
printf("FAILED, expected false, got true\n");
302
printf("testing get_do_escape_coding()... ");
303
if(encoder->get_do_escape_coding() != false) {
304
printf("FAILED, expected false, got true\n");
309
printf("testing get_do_exhaustive_model_search()... ");
310
if(encoder->get_do_exhaustive_model_search() != false) {
311
printf("FAILED, expected false, got true\n");
316
printf("testing get_min_residual_partition_order()... ");
317
if(encoder->get_min_residual_partition_order() != 0) {
318
printf("FAILED, expected %u, got %u\n", 0, encoder->get_min_residual_partition_order());
323
printf("testing get_max_residual_partition_order()... ");
324
if(encoder->get_max_residual_partition_order() != 0) {
325
printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_residual_partition_order());
330
printf("testing get_rice_parameter_search_dist()... ");
331
if(encoder->get_rice_parameter_search_dist() != 0) {
332
printf("FAILED, expected %u, got %u\n", 0, encoder->get_rice_parameter_search_dist());
337
printf("testing get_total_samples_estimate()... ");
338
if(encoder->get_total_samples_estimate() != streaminfo_.data.stream_info.total_samples) {
339
printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, encoder->get_total_samples_estimate());
344
/* init the dummy sample buffer */
345
for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
348
printf("testing process()... ");
349
if(!encoder->process(samples_array, sizeof(samples) / sizeof(FLAC__int32)))
350
return encoder->die("returned false");
353
printf("testing process_interleaved()... ");
354
if(!encoder->process_interleaved(samples, sizeof(samples) / sizeof(FLAC__int32)))
355
return encoder->die("returned false");
358
printf("testing finish()... ");
362
printf("freeing encoder instance... ");
366
printf("\nPASSED!\n");
371
class SeekableStreamEncoder : public FLAC::Encoder::SeekableStream {
373
SeekableStreamEncoder(): FLAC::Encoder::SeekableStream() { }
374
~SeekableStreamEncoder() { }
376
// from FLAC::Encoder::SeekableStream
377
::FLAC__SeekableStreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset);
378
::FLAC__SeekableStreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset);
379
::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame);
381
bool die(const char *msg = 0) const;
384
::FLAC__SeekableStreamEncoderSeekStatus SeekableStreamEncoder::seek_callback(FLAC__uint64 absolute_byte_offset)
386
(void)absolute_byte_offset;
388
return ::FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_OK;
391
::FLAC__SeekableStreamEncoderTellStatus SeekableStreamEncoder::tell_callback(FLAC__uint64 *absolute_byte_offset)
393
*absolute_byte_offset = 0;
395
return ::FLAC__SEEKABLE_STREAM_ENCODER_TELL_STATUS_OK;
398
::FLAC__StreamEncoderWriteStatus SeekableStreamEncoder::write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame)
400
(void)buffer, (void)bytes, (void)samples, (void)current_frame;
402
return ::FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
405
bool SeekableStreamEncoder::die(const char *msg) const
407
State state = get_state();
410
printf("FAILED, %s", msg);
414
printf(", state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state), state.as_cstring());
415
if(state == ::FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR) {
416
FLAC::Encoder::Stream::State state_ = get_stream_encoder_state();
417
printf(" stream encoder state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state_), state_.as_cstring());
418
if(state_ == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
419
FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
420
printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
427
static bool test_seekable_stream_encoder()
429
SeekableStreamEncoder *encoder;
430
FLAC__int32 samples[1024];
431
FLAC__int32 *samples_array[1] = { samples };
434
printf("\n+++ libFLAC++ unit test: FLAC::Encoder::SeekableStream\n\n");
436
printf("allocating encoder instance... ");
437
encoder = new SeekableStreamEncoder();
439
printf("FAILED, new returned NULL\n");
444
printf("testing is_valid()... ");
445
if(!encoder->is_valid()) {
446
printf("FAILED, returned false\n");
451
printf("testing set_verify()... ");
452
if(!encoder->set_verify(true))
453
return encoder->die("returned false");
456
printf("testing set_streamable_subset()... ");
457
if(!encoder->set_streamable_subset(true))
458
return encoder->die("returned false");
461
printf("testing set_do_mid_side_stereo()... ");
462
if(!encoder->set_do_mid_side_stereo(false))
463
return encoder->die("returned false");
466
printf("testing set_loose_mid_side_stereo()... ");
467
if(!encoder->set_loose_mid_side_stereo(false))
468
return encoder->die("returned false");
471
printf("testing set_channels()... ");
472
if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
473
return encoder->die("returned false");
476
printf("testing set_bits_per_sample()... ");
477
if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
478
return encoder->die("returned false");
481
printf("testing set_sample_rate()... ");
482
if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
483
return encoder->die("returned false");
486
printf("testing set_blocksize()... ");
487
if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
488
return encoder->die("returned false");
491
printf("testing set_max_lpc_order()... ");
492
if(!encoder->set_max_lpc_order(0))
493
return encoder->die("returned false");
496
printf("testing set_qlp_coeff_precision()... ");
497
if(!encoder->set_qlp_coeff_precision(0))
498
return encoder->die("returned false");
501
printf("testing set_do_qlp_coeff_prec_search()... ");
502
if(!encoder->set_do_qlp_coeff_prec_search(false))
503
return encoder->die("returned false");
506
printf("testing set_do_escape_coding()... ");
507
if(!encoder->set_do_escape_coding(false))
508
return encoder->die("returned false");
511
printf("testing set_do_exhaustive_model_search()... ");
512
if(!encoder->set_do_exhaustive_model_search(false))
513
return encoder->die("returned false");
516
printf("testing set_min_residual_partition_order()... ");
517
if(!encoder->set_min_residual_partition_order(0))
518
return encoder->die("returned false");
521
printf("testing set_max_residual_partition_order()... ");
522
if(!encoder->set_max_residual_partition_order(0))
523
return encoder->die("returned false");
526
printf("testing set_rice_parameter_search_dist()... ");
527
if(!encoder->set_rice_parameter_search_dist(0))
528
return encoder->die("returned false");
531
printf("testing set_total_samples_estimate()... ");
532
if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
533
return encoder->die("returned false");
536
printf("testing set_metadata()... ");
537
if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
538
return encoder->die("returned false");
541
printf("testing init()... ");
542
if(encoder->init() != ::FLAC__SEEKABLE_STREAM_ENCODER_OK)
543
return encoder->die();
546
printf("testing get_state()... ");
547
FLAC::Encoder::SeekableStream::State state = encoder->get_state();
548
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state), state.as_cstring());
550
printf("testing get_stream_encoder_state()... ");
551
FLAC::Encoder::Stream::State state_ = encoder->get_stream_encoder_state();
552
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state_), state_.as_cstring());
554
printf("testing get_verify_decoder_state()... ");
555
FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
556
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
559
FLAC__uint64 absolute_sample;
560
unsigned frame_number;
563
FLAC__int32 expected;
566
printf("testing get_verify_decoder_error_stats()... ");
567
encoder->get_verify_decoder_error_stats(&absolute_sample, &frame_number, &channel, &sample, &expected, &got);
571
printf("testing get_verify()... ");
572
if(encoder->get_verify() != true) {
573
printf("FAILED, expected true, got false\n");
578
printf("testing get_streamable_subset()... ");
579
if(encoder->get_streamable_subset() != true) {
580
printf("FAILED, expected true, got false\n");
585
printf("testing get_do_mid_side_stereo()... ");
586
if(encoder->get_do_mid_side_stereo() != false) {
587
printf("FAILED, expected false, got true\n");
592
printf("testing get_loose_mid_side_stereo()... ");
593
if(encoder->get_loose_mid_side_stereo() != false) {
594
printf("FAILED, expected false, got true\n");
599
printf("testing get_channels()... ");
600
if(encoder->get_channels() != streaminfo_.data.stream_info.channels) {
601
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, encoder->get_channels());
606
printf("testing get_bits_per_sample()... ");
607
if(encoder->get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample) {
608
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, encoder->get_bits_per_sample());
613
printf("testing get_sample_rate()... ");
614
if(encoder->get_sample_rate() != streaminfo_.data.stream_info.sample_rate) {
615
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, encoder->get_sample_rate());
620
printf("testing get_blocksize()... ");
621
if(encoder->get_blocksize() != streaminfo_.data.stream_info.min_blocksize) {
622
printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, encoder->get_blocksize());
627
printf("testing get_max_lpc_order()... ");
628
if(encoder->get_max_lpc_order() != 0) {
629
printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_lpc_order());
634
printf("testing get_qlp_coeff_precision()... ");
635
(void)encoder->get_qlp_coeff_precision();
636
/* we asked the encoder to auto select this so we accept anything */
639
printf("testing get_do_qlp_coeff_prec_search()... ");
640
if(encoder->get_do_qlp_coeff_prec_search() != false) {
641
printf("FAILED, expected false, got true\n");
646
printf("testing get_do_escape_coding()... ");
647
if(encoder->get_do_escape_coding() != false) {
648
printf("FAILED, expected false, got true\n");
653
printf("testing get_do_exhaustive_model_search()... ");
654
if(encoder->get_do_exhaustive_model_search() != false) {
655
printf("FAILED, expected false, got true\n");
660
printf("testing get_min_residual_partition_order()... ");
661
if(encoder->get_min_residual_partition_order() != 0) {
662
printf("FAILED, expected %u, got %u\n", 0, encoder->get_min_residual_partition_order());
667
printf("testing get_max_residual_partition_order()... ");
668
if(encoder->get_max_residual_partition_order() != 0) {
669
printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_residual_partition_order());
674
printf("testing get_rice_parameter_search_dist()... ");
675
if(encoder->get_rice_parameter_search_dist() != 0) {
676
printf("FAILED, expected %u, got %u\n", 0, encoder->get_rice_parameter_search_dist());
681
printf("testing get_total_samples_estimate()... ");
682
if(encoder->get_total_samples_estimate() != streaminfo_.data.stream_info.total_samples) {
683
printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, encoder->get_total_samples_estimate());
688
/* init the dummy sample buffer */
689
for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
692
printf("testing process()... ");
693
if(!encoder->process(samples_array, sizeof(samples) / sizeof(FLAC__int32)))
694
return encoder->die("returned false");
697
printf("testing process_interleaved()... ");
698
if(!encoder->process_interleaved(samples, sizeof(samples) / sizeof(FLAC__int32)))
699
return encoder->die("returned false");
702
printf("testing finish()... ");
706
printf("freeing encoder instance... ");
710
printf("\nPASSED!\n");
715
158
class FileEncoder : public FLAC::Encoder::File {
717
FileEncoder(): FLAC::Encoder::File() { }
162
FileEncoder(Layer layer): FLAC::Encoder::File(), layer_(layer) { }
718
163
~FileEncoder() { }
720
165
// from FLAC::Encoder::File
721
166
void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate);
723
bool die(const char *msg = 0) const;
726
void FileEncoder::progress_callback(FLAC__uint64, FLAC__uint64, unsigned, unsigned)
169
void FileEncoder::progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate)
171
(void)bytes_written, (void)samples_written, (void)frames_written, (void)total_frames_estimate;
730
bool FileEncoder::die(const char *msg) const
174
static FLAC::Encoder::Stream *new_by_layer(Layer layer)
732
State state = get_state();
735
printf("FAILED, %s", msg);
176
if(layer < LAYER_FILE)
177
return new StreamEncoder(layer);
739
printf(", state = %u (%s)\n", (unsigned)((::FLAC__FileEncoderState)state), state.as_cstring());
740
if(state == ::FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR) {
741
FLAC::Encoder::SeekableStream::State state_ = get_seekable_stream_encoder_state();
742
printf(" seekable stream encoder state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state_), state_.as_cstring());
743
if(state_ == ::FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR) {
744
FLAC::Encoder::Stream::State state__ = get_stream_encoder_state();
745
printf(" stream encoder state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state__), state__.as_cstring());
746
if(state__ == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
747
FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
748
printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
179
return new FileEncoder(layer);
756
static bool test_file_encoder()
182
static bool test_stream_encoder(Layer layer, bool is_ogg)
758
FileEncoder *encoder;
184
FLAC::Encoder::Stream *encoder;
185
::FLAC__StreamEncoderInitStatus init_status;
759
187
FLAC__int32 samples[1024];
760
188
FLAC__int32 *samples_array[1] = { samples };
763
printf("\n+++ libFLAC++ unit test: FLAC::Encoder::File\n\n");
191
printf("\n+++ libFLAC++ unit test: FLAC::Encoder::%s (layer: %s, format: %s)\n\n", layer<LAYER_FILE? "Stream":"File", LayerString[layer], is_ogg? "Ogg FLAC":"FLAC");
765
193
printf("allocating encoder instance... ");
766
encoder = new FileEncoder();
194
encoder = new_by_layer(layer);
767
195
if(0 == encoder) {
768
196
printf("FAILED, new returned NULL\n");
209
printf("testing set_ogg_serial_number()... ");
210
if(!encoder->set_ogg_serial_number(file_utils__ogg_serial_number))
211
return die_s_("returned false", encoder);
780
215
printf("testing set_verify()... ");
781
216
if(!encoder->set_verify(true))
782
return encoder->die("returned false");
217
return die_s_("returned false", encoder);
785
220
printf("testing set_streamable_subset()... ");
786
221
if(!encoder->set_streamable_subset(true))
787
return encoder->die("returned false");
790
printf("testing set_do_mid_side_stereo()... ");
791
if(!encoder->set_do_mid_side_stereo(false))
792
return encoder->die("returned false");
795
printf("testing set_loose_mid_side_stereo()... ");
796
if(!encoder->set_loose_mid_side_stereo(false))
797
return encoder->die("returned false");
222
return die_s_("returned false", encoder);
800
225
printf("testing set_channels()... ");
801
226
if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
802
return encoder->die("returned false");
227
return die_s_("returned false", encoder);
805
230
printf("testing set_bits_per_sample()... ");
806
231
if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
807
return encoder->die("returned false");
232
return die_s_("returned false", encoder);
810
235
printf("testing set_sample_rate()... ");
811
236
if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
812
return encoder->die("returned false");
237
return die_s_("returned false", encoder);
240
printf("testing set_compression_level()... ");
241
if(!encoder->set_compression_level((unsigned)(-1)))
242
return die_s_("returned false", encoder);
815
245
printf("testing set_blocksize()... ");
816
246
if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
817
return encoder->die("returned false");
247
return die_s_("returned false", encoder);
250
printf("testing set_do_mid_side_stereo()... ");
251
if(!encoder->set_do_mid_side_stereo(false))
252
return die_s_("returned false", encoder);
255
printf("testing set_loose_mid_side_stereo()... ");
256
if(!encoder->set_loose_mid_side_stereo(false))
257
return die_s_("returned false", encoder);
820
260
printf("testing set_max_lpc_order()... ");
821
261
if(!encoder->set_max_lpc_order(0))
822
return encoder->die("returned false");
262
return die_s_("returned false", encoder);
825
265
printf("testing set_qlp_coeff_precision()... ");
826
266
if(!encoder->set_qlp_coeff_precision(0))
827
return encoder->die("returned false");
267
return die_s_("returned false", encoder);
830
270
printf("testing set_do_qlp_coeff_prec_search()... ");
831
271
if(!encoder->set_do_qlp_coeff_prec_search(false))
832
return encoder->die("returned false");
272
return die_s_("returned false", encoder);
835
275
printf("testing set_do_escape_coding()... ");
836
276
if(!encoder->set_do_escape_coding(false))
837
return encoder->die("returned false");
277
return die_s_("returned false", encoder);
840
280
printf("testing set_do_exhaustive_model_search()... ");
841
281
if(!encoder->set_do_exhaustive_model_search(false))
842
return encoder->die("returned false");
282
return die_s_("returned false", encoder);
845
285
printf("testing set_min_residual_partition_order()... ");
846
286
if(!encoder->set_min_residual_partition_order(0))
847
return encoder->die("returned false");
287
return die_s_("returned false", encoder);
850
290
printf("testing set_max_residual_partition_order()... ");
851
291
if(!encoder->set_max_residual_partition_order(0))
852
return encoder->die("returned false");
292
return die_s_("returned false", encoder);
855
295
printf("testing set_rice_parameter_search_dist()... ");
856
296
if(!encoder->set_rice_parameter_search_dist(0))
857
return encoder->die("returned false");
297
return die_s_("returned false", encoder);
860
300
printf("testing set_total_samples_estimate()... ");
861
301
if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
862
return encoder->die("returned false");
302
return die_s_("returned false", encoder);
865
305
printf("testing set_metadata()... ");
866
306
if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
867
return encoder->die("returned false");
870
printf("testing set_filename()... ");
871
if(!encoder->set_filename(flacfilename_))
872
return encoder->die("returned false");
875
printf("testing init()... ");
876
if(encoder->init() != ::FLAC__FILE_ENCODER_OK)
877
return encoder->die();
307
return die_s_("returned false", encoder);
310
if(layer < LAYER_FILENAME) {
311
printf("opening file for FLAC output... ");
312
file = ::fopen(flacfilename(is_ogg), "w+b");
314
printf("ERROR (%s)\n", strerror(errno));
318
if(layer < LAYER_FILE)
319
dynamic_cast<StreamEncoder*>(encoder)->file_ = file;
324
case LAYER_SEEKABLE_STREAM:
325
printf("testing init%s()... ", is_ogg? "_ogg":"");
326
init_status = is_ogg? encoder->init_ogg() : encoder->init();
329
printf("testing init%s()... ", is_ogg? "_ogg":"");
330
init_status = is_ogg?
331
dynamic_cast<FLAC::Encoder::File*>(encoder)->init_ogg(file) :
332
dynamic_cast<FLAC::Encoder::File*>(encoder)->init(file);
335
printf("testing init%s()... ", is_ogg? "_ogg":"");
336
init_status = is_ogg?
337
dynamic_cast<FLAC::Encoder::File*>(encoder)->init_ogg(flacfilename(is_ogg)) :
338
dynamic_cast<FLAC::Encoder::File*>(encoder)->init(flacfilename(is_ogg));
341
die_("internal error 001");
344
if(init_status != ::FLAC__STREAM_ENCODER_INIT_STATUS_OK)
345
return die_s_(0, encoder);
880
348
printf("testing get_state()... ");
881
FLAC::Encoder::File::State state = encoder->get_state();
882
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__FileEncoderState)state), state.as_cstring());
884
printf("testing get_seekable_stream_encoder_state()... ");
885
FLAC::Encoder::SeekableStream::State state_ = encoder->get_seekable_stream_encoder_state();
886
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state_), state_.as_cstring());
888
printf("testing get_stream_encoder_state()... ");
889
FLAC::Encoder::Stream::State state__ = encoder->get_stream_encoder_state();
890
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state__), state__.as_cstring());
349
FLAC::Encoder::Stream::State state = encoder->get_state();
350
printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
892
352
printf("testing get_verify_decoder_state()... ");
893
353
FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();