1 /* test_libFLAC++ - Unit tester for libFLAC++
2 * Copyright (C) 2002 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include "file_utils.h"
23 #include "FLAC/assert.h"
24 #include "FLAC++/encoder.h"
29 static ::FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_;
30 static ::FLAC__StreamMetadata *metadata_sequence_[] = { &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_ };
31 static const unsigned num_metadata_ = 5;
32 static const char *flacfilename_ = "metadata.flac";
34 static void *malloc_or_die_(size_t size)
36 void *x = malloc(size);
38 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
44 static void init_metadata_blocks_()
47 most of the actual numbers and data in the blocks don't matter,
48 we just want to make sure the encoder encodes them correctly
50 remember, the metadata interface gets tested after the encoders,
51 so we do all the metadata manipulation here without it.
54 /* min/max_framesize and md5sum don't get written at first, so we have to leave them 0 */
55 streaminfo_.is_last = false;
56 streaminfo_.type = ::FLAC__METADATA_TYPE_STREAMINFO;
57 streaminfo_.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
58 streaminfo_.data.stream_info.min_blocksize = 576;
59 streaminfo_.data.stream_info.max_blocksize = 576;
60 streaminfo_.data.stream_info.min_framesize = 0;
61 streaminfo_.data.stream_info.max_framesize = 0;
62 streaminfo_.data.stream_info.sample_rate = 44100;
63 streaminfo_.data.stream_info.channels = 1;
64 streaminfo_.data.stream_info.bits_per_sample = 8;
65 streaminfo_.data.stream_info.total_samples = 0;
66 memset(streaminfo_.data.stream_info.md5sum, 0, 16);
68 padding_.is_last = false;
69 padding_.type = ::FLAC__METADATA_TYPE_PADDING;
70 padding_.length = 1234;
72 seektable_.is_last = false;
73 seektable_.type = ::FLAC__METADATA_TYPE_SEEKTABLE;
74 seektable_.data.seek_table.num_points = 2;
75 seektable_.length = seektable_.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
76 seektable_.data.seek_table.points = (::FLAC__StreamMetadata_SeekPoint*)malloc_or_die_(seektable_.data.seek_table.num_points * sizeof(::FLAC__StreamMetadata_SeekPoint));
77 seektable_.data.seek_table.points[0].sample_number = 0;
78 seektable_.data.seek_table.points[0].stream_offset = 0;
79 seektable_.data.seek_table.points[0].frame_samples = streaminfo_.data.stream_info.min_blocksize;
80 seektable_.data.seek_table.points[1].sample_number = ::FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
81 seektable_.data.seek_table.points[1].stream_offset = 1000;
82 seektable_.data.seek_table.points[1].frame_samples = streaminfo_.data.stream_info.min_blocksize;
84 application1_.is_last = false;
85 application1_.type = ::FLAC__METADATA_TYPE_APPLICATION;
86 application1_.length = 8;
87 memcpy(application1_.data.application.id, "\xfe\xdc\xba\x98", 4);
88 application1_.data.application.data = (FLAC__byte*)malloc_or_die_(4);
89 memcpy(application1_.data.application.data, "\xf0\xe1\xd2\xc3", 4);
91 application2_.is_last = false;
92 application2_.type = ::FLAC__METADATA_TYPE_APPLICATION;
93 application2_.length = 4;
94 memcpy(application2_.data.application.id, "\x76\x54\x32\x10", 4);
95 application2_.data.application.data = 0;
97 vorbiscomment_.is_last = true;
98 vorbiscomment_.type = ::FLAC__METADATA_TYPE_VORBIS_COMMENT;
99 vorbiscomment_.length = (4 + 8) + 4 + (4 + 5) + (4 + 0);
100 vorbiscomment_.data.vorbis_comment.vendor_string.length = 8;
101 vorbiscomment_.data.vorbis_comment.vendor_string.entry = (FLAC__byte*)malloc_or_die_(8);
102 memcpy(vorbiscomment_.data.vorbis_comment.vendor_string.entry, "flac 1.x", 8);
103 vorbiscomment_.data.vorbis_comment.num_comments = 2;
104 vorbiscomment_.data.vorbis_comment.comments = (::FLAC__StreamMetadata_VorbisComment_Entry*)malloc_or_die_(vorbiscomment_.data.vorbis_comment.num_comments * sizeof(::FLAC__StreamMetadata_VorbisComment_Entry));
105 vorbiscomment_.data.vorbis_comment.comments[0].length = 5;
106 vorbiscomment_.data.vorbis_comment.comments[0].entry = (FLAC__byte*)malloc_or_die_(5);
107 memcpy(vorbiscomment_.data.vorbis_comment.comments[0].entry, "ab=cd", 5);
108 vorbiscomment_.data.vorbis_comment.comments[1].length = 0;
109 vorbiscomment_.data.vorbis_comment.comments[1].entry = 0;
112 static void free_metadata_blocks_()
114 free(seektable_.data.seek_table.points);
115 free(application1_.data.application.data);
116 free(vorbiscomment_.data.vorbis_comment.vendor_string.entry);
117 free(vorbiscomment_.data.vorbis_comment.comments[0].entry);
118 free(vorbiscomment_.data.vorbis_comment.comments);
121 class StreamEncoder : public FLAC::Encoder::Stream {
123 StreamEncoder(): FLAC::Encoder::Stream() { }
126 // from FLAC::Encoder::Stream
127 ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame);
128 void metadata_callback(const ::FLAC__StreamMetadata *metadata);
130 bool die(const char *msg = 0) const;
133 ::FLAC__StreamEncoderWriteStatus StreamEncoder::write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame)
135 (void)buffer, (void)bytes, (void)samples, (void)current_frame;
137 return ::FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
140 void StreamEncoder::metadata_callback(const ::FLAC__StreamMetadata *metadata)
145 bool StreamEncoder::die(const char *msg) const
147 State state = get_state();
150 printf("FAILED, %s", msg);
154 printf(", state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
155 if(state == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
156 FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
157 printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
163 static bool test_stream_encoder()
165 StreamEncoder *encoder;
166 FLAC__int32 samples[1024];
167 FLAC__int32 *samples_array[1] = { samples };
170 printf("\n+++ libFLAC++ unit test: FLAC::Encoder::Stream\n\n");
172 printf("allocating encoder instance... ");
173 encoder = new StreamEncoder();
175 printf("FAILED, new returned NULL\n");
180 printf("testing is_valid()... ");
181 if(!encoder->is_valid()) {
182 printf("FAILED, returned false\n");
187 printf("testing set_verify()... ");
188 if(!encoder->set_verify(true))
189 return encoder->die("returned false");
192 printf("testing set_streamable_subset()... ");
193 if(!encoder->set_streamable_subset(true))
194 return encoder->die("returned false");
197 printf("testing set_do_mid_side_stereo()... ");
198 if(!encoder->set_do_mid_side_stereo(false))
199 return encoder->die("returned false");
202 printf("testing set_loose_mid_side_stereo()... ");
203 if(!encoder->set_loose_mid_side_stereo(false))
204 return encoder->die("returned false");
207 printf("testing set_channels()... ");
208 if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
209 return encoder->die("returned false");
212 printf("testing set_bits_per_sample()... ");
213 if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
214 return encoder->die("returned false");
217 printf("testing set_sample_rate()... ");
218 if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
219 return encoder->die("returned false");
222 printf("testing set_blocksize()... ");
223 if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
224 return encoder->die("returned false");
227 printf("testing set_max_lpc_order()... ");
228 if(!encoder->set_max_lpc_order(0))
229 return encoder->die("returned false");
232 printf("testing set_qlp_coeff_precision()... ");
233 if(!encoder->set_qlp_coeff_precision(0))
234 return encoder->die("returned false");
237 printf("testing set_do_qlp_coeff_prec_search()... ");
238 if(!encoder->set_do_qlp_coeff_prec_search(false))
239 return encoder->die("returned false");
242 printf("testing set_do_escape_coding()... ");
243 if(!encoder->set_do_escape_coding(false))
244 return encoder->die("returned false");
247 printf("testing set_do_exhaustive_model_search()... ");
248 if(!encoder->set_do_exhaustive_model_search(false))
249 return encoder->die("returned false");
252 printf("testing set_min_residual_partition_order()... ");
253 if(!encoder->set_min_residual_partition_order(0))
254 return encoder->die("returned false");
257 printf("testing set_max_residual_partition_order()... ");
258 if(!encoder->set_max_residual_partition_order(0))
259 return encoder->die("returned false");
262 printf("testing set_rice_parameter_search_dist()... ");
263 if(!encoder->set_rice_parameter_search_dist(0))
264 return encoder->die("returned false");
267 printf("testing set_total_samples_estimate()... ");
268 if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
269 return encoder->die("returned false");
272 printf("testing set_metadata()... ");
273 if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
274 return encoder->die("returned false");
277 printf("testing init()... ");
278 if(encoder->init() != ::FLAC__STREAM_ENCODER_OK)
279 return encoder->die();
282 printf("testing get_state()... ");
283 FLAC::Encoder::Stream::State state = encoder->get_state();
284 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state), state.as_cstring());
286 printf("testing get_verify_decoder_state()... ");
287 FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
288 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
291 FLAC__uint64 absolute_sample;
292 unsigned frame_number;
295 FLAC__int32 expected;
298 printf("testing get_verify_decoder_error_stats()... ");
299 encoder->get_verify_decoder_error_stats(&absolute_sample, &frame_number, &channel, &sample, &expected, &got);
303 printf("testing get_verify()... ");
304 if(encoder->get_verify() != true) {
305 printf("FAILED, expected true, got false\n");
310 printf("testing get_streamable_subset()... ");
311 if(encoder->get_streamable_subset() != true) {
312 printf("FAILED, expected true, got false\n");
317 printf("testing get_do_mid_side_stereo()... ");
318 if(encoder->get_do_mid_side_stereo() != false) {
319 printf("FAILED, expected false, got true\n");
324 printf("testing get_loose_mid_side_stereo()... ");
325 if(encoder->get_loose_mid_side_stereo() != false) {
326 printf("FAILED, expected false, got true\n");
331 printf("testing get_channels()... ");
332 if(encoder->get_channels() != streaminfo_.data.stream_info.channels) {
333 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, encoder->get_channels());
338 printf("testing get_bits_per_sample()... ");
339 if(encoder->get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample) {
340 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, encoder->get_bits_per_sample());
345 printf("testing get_sample_rate()... ");
346 if(encoder->get_sample_rate() != streaminfo_.data.stream_info.sample_rate) {
347 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, encoder->get_sample_rate());
352 printf("testing get_blocksize()... ");
353 if(encoder->get_blocksize() != streaminfo_.data.stream_info.min_blocksize) {
354 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, encoder->get_blocksize());
359 printf("testing get_max_lpc_order()... ");
360 if(encoder->get_max_lpc_order() != 0) {
361 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_lpc_order());
366 printf("testing get_qlp_coeff_precision()... ");
367 (void)encoder->get_qlp_coeff_precision();
368 /* we asked the encoder to auto select this so we accept anything */
371 printf("testing get_do_qlp_coeff_prec_search()... ");
372 if(encoder->get_do_qlp_coeff_prec_search() != false) {
373 printf("FAILED, expected false, got true\n");
378 printf("testing get_do_escape_coding()... ");
379 if(encoder->get_do_escape_coding() != false) {
380 printf("FAILED, expected false, got true\n");
385 printf("testing get_do_exhaustive_model_search()... ");
386 if(encoder->get_do_exhaustive_model_search() != false) {
387 printf("FAILED, expected false, got true\n");
392 printf("testing get_min_residual_partition_order()... ");
393 if(encoder->get_min_residual_partition_order() != 0) {
394 printf("FAILED, expected %u, got %u\n", 0, encoder->get_min_residual_partition_order());
399 printf("testing get_max_residual_partition_order()... ");
400 if(encoder->get_max_residual_partition_order() != 0) {
401 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_residual_partition_order());
406 printf("testing get_rice_parameter_search_dist()... ");
407 if(encoder->get_rice_parameter_search_dist() != 0) {
408 printf("FAILED, expected %u, got %u\n", 0, encoder->get_rice_parameter_search_dist());
413 printf("testing get_total_samples_estimate()... ");
414 if(encoder->get_total_samples_estimate() != streaminfo_.data.stream_info.total_samples) {
415 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, encoder->get_total_samples_estimate());
420 /* init the dummy sample buffer */
421 for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
424 printf("testing process()... ");
425 if(!encoder->process(samples_array, sizeof(samples) / sizeof(FLAC__int32)))
426 return encoder->die("returned false");
429 printf("testing process_interleaved()... ");
430 if(!encoder->process_interleaved(samples, sizeof(samples) / sizeof(FLAC__int32)))
431 return encoder->die("returned false");
434 printf("testing finish()... ");
438 printf("freeing encoder instance... ");
442 printf("\nPASSED!\n");
447 class SeekableStreamEncoder : public FLAC::Encoder::SeekableStream {
449 SeekableStreamEncoder(): FLAC::Encoder::SeekableStream() { }
450 ~SeekableStreamEncoder() { }
452 // from FLAC::Encoder::SeekableStream
453 ::FLAC__SeekableStreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset);
454 ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame);
456 bool die(const char *msg = 0) const;
459 ::FLAC__SeekableStreamEncoderSeekStatus SeekableStreamEncoder::seek_callback(FLAC__uint64 absolute_byte_offset)
461 (void)absolute_byte_offset;
463 return ::FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_OK;
466 ::FLAC__StreamEncoderWriteStatus SeekableStreamEncoder::write_callback(const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame)
468 (void)buffer, (void)bytes, (void)samples, (void)current_frame;
470 return ::FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
473 bool SeekableStreamEncoder::die(const char *msg) const
475 State state = get_state();
478 printf("FAILED, %s", msg);
482 printf(", state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state), state.as_cstring());
483 if(state == ::FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR) {
484 FLAC::Encoder::Stream::State state_ = get_stream_encoder_state();
485 printf(" stream encoder state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state_), state_.as_cstring());
486 if(state_ == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
487 FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
488 printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
495 static bool test_seekable_stream_encoder()
497 SeekableStreamEncoder *encoder;
498 FLAC__int32 samples[1024];
499 FLAC__int32 *samples_array[1] = { samples };
502 printf("\n+++ libFLAC++ unit test: FLAC::Encoder::SeekableStream\n\n");
504 printf("allocating encoder instance... ");
505 encoder = new SeekableStreamEncoder();
507 printf("FAILED, new returned NULL\n");
512 printf("testing is_valid()... ");
513 if(!encoder->is_valid()) {
514 printf("FAILED, returned false\n");
519 printf("testing set_verify()... ");
520 if(!encoder->set_verify(true))
521 return encoder->die("returned false");
524 printf("testing set_streamable_subset()... ");
525 if(!encoder->set_streamable_subset(true))
526 return encoder->die("returned false");
529 printf("testing set_do_mid_side_stereo()... ");
530 if(!encoder->set_do_mid_side_stereo(false))
531 return encoder->die("returned false");
534 printf("testing set_loose_mid_side_stereo()... ");
535 if(!encoder->set_loose_mid_side_stereo(false))
536 return encoder->die("returned false");
539 printf("testing set_channels()... ");
540 if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
541 return encoder->die("returned false");
544 printf("testing set_bits_per_sample()... ");
545 if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
546 return encoder->die("returned false");
549 printf("testing set_sample_rate()... ");
550 if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
551 return encoder->die("returned false");
554 printf("testing set_blocksize()... ");
555 if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
556 return encoder->die("returned false");
559 printf("testing set_max_lpc_order()... ");
560 if(!encoder->set_max_lpc_order(0))
561 return encoder->die("returned false");
564 printf("testing set_qlp_coeff_precision()... ");
565 if(!encoder->set_qlp_coeff_precision(0))
566 return encoder->die("returned false");
569 printf("testing set_do_qlp_coeff_prec_search()... ");
570 if(!encoder->set_do_qlp_coeff_prec_search(false))
571 return encoder->die("returned false");
574 printf("testing set_do_escape_coding()... ");
575 if(!encoder->set_do_escape_coding(false))
576 return encoder->die("returned false");
579 printf("testing set_do_exhaustive_model_search()... ");
580 if(!encoder->set_do_exhaustive_model_search(false))
581 return encoder->die("returned false");
584 printf("testing set_min_residual_partition_order()... ");
585 if(!encoder->set_min_residual_partition_order(0))
586 return encoder->die("returned false");
589 printf("testing set_max_residual_partition_order()... ");
590 if(!encoder->set_max_residual_partition_order(0))
591 return encoder->die("returned false");
594 printf("testing set_rice_parameter_search_dist()... ");
595 if(!encoder->set_rice_parameter_search_dist(0))
596 return encoder->die("returned false");
599 printf("testing set_total_samples_estimate()... ");
600 if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
601 return encoder->die("returned false");
604 printf("testing set_metadata()... ");
605 if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
606 return encoder->die("returned false");
609 printf("testing init()... ");
610 if(encoder->init() != ::FLAC__SEEKABLE_STREAM_ENCODER_OK)
611 return encoder->die();
614 printf("testing get_state()... ");
615 FLAC::Encoder::SeekableStream::State state = encoder->get_state();
616 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state), state.as_cstring());
618 printf("testing get_stream_encoder_state()... ");
619 FLAC::Encoder::Stream::State state_ = encoder->get_stream_encoder_state();
620 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state_), state_.as_cstring());
622 printf("testing get_verify_decoder_state()... ");
623 FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
624 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
627 FLAC__uint64 absolute_sample;
628 unsigned frame_number;
631 FLAC__int32 expected;
634 printf("testing get_verify_decoder_error_stats()... ");
635 encoder->get_verify_decoder_error_stats(&absolute_sample, &frame_number, &channel, &sample, &expected, &got);
639 printf("testing get_verify()... ");
640 if(encoder->get_verify() != true) {
641 printf("FAILED, expected true, got false\n");
646 printf("testing get_streamable_subset()... ");
647 if(encoder->get_streamable_subset() != true) {
648 printf("FAILED, expected true, got false\n");
653 printf("testing get_do_mid_side_stereo()... ");
654 if(encoder->get_do_mid_side_stereo() != false) {
655 printf("FAILED, expected false, got true\n");
660 printf("testing get_loose_mid_side_stereo()... ");
661 if(encoder->get_loose_mid_side_stereo() != false) {
662 printf("FAILED, expected false, got true\n");
667 printf("testing get_channels()... ");
668 if(encoder->get_channels() != streaminfo_.data.stream_info.channels) {
669 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, encoder->get_channels());
674 printf("testing get_bits_per_sample()... ");
675 if(encoder->get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample) {
676 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, encoder->get_bits_per_sample());
681 printf("testing get_sample_rate()... ");
682 if(encoder->get_sample_rate() != streaminfo_.data.stream_info.sample_rate) {
683 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, encoder->get_sample_rate());
688 printf("testing get_blocksize()... ");
689 if(encoder->get_blocksize() != streaminfo_.data.stream_info.min_blocksize) {
690 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, encoder->get_blocksize());
695 printf("testing get_max_lpc_order()... ");
696 if(encoder->get_max_lpc_order() != 0) {
697 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_lpc_order());
702 printf("testing get_qlp_coeff_precision()... ");
703 (void)encoder->get_qlp_coeff_precision();
704 /* we asked the encoder to auto select this so we accept anything */
707 printf("testing get_do_qlp_coeff_prec_search()... ");
708 if(encoder->get_do_qlp_coeff_prec_search() != false) {
709 printf("FAILED, expected false, got true\n");
714 printf("testing get_do_escape_coding()... ");
715 if(encoder->get_do_escape_coding() != false) {
716 printf("FAILED, expected false, got true\n");
721 printf("testing get_do_exhaustive_model_search()... ");
722 if(encoder->get_do_exhaustive_model_search() != false) {
723 printf("FAILED, expected false, got true\n");
728 printf("testing get_min_residual_partition_order()... ");
729 if(encoder->get_min_residual_partition_order() != 0) {
730 printf("FAILED, expected %u, got %u\n", 0, encoder->get_min_residual_partition_order());
735 printf("testing get_max_residual_partition_order()... ");
736 if(encoder->get_max_residual_partition_order() != 0) {
737 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_residual_partition_order());
742 printf("testing get_rice_parameter_search_dist()... ");
743 if(encoder->get_rice_parameter_search_dist() != 0) {
744 printf("FAILED, expected %u, got %u\n", 0, encoder->get_rice_parameter_search_dist());
749 printf("testing get_total_samples_estimate()... ");
750 if(encoder->get_total_samples_estimate() != streaminfo_.data.stream_info.total_samples) {
751 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, encoder->get_total_samples_estimate());
756 /* init the dummy sample buffer */
757 for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
760 printf("testing process()... ");
761 if(!encoder->process(samples_array, sizeof(samples) / sizeof(FLAC__int32)))
762 return encoder->die("returned false");
765 printf("testing process_interleaved()... ");
766 if(!encoder->process_interleaved(samples, sizeof(samples) / sizeof(FLAC__int32)))
767 return encoder->die("returned false");
770 printf("testing finish()... ");
774 printf("freeing encoder instance... ");
778 printf("\nPASSED!\n");
783 class FileEncoder : public FLAC::Encoder::File {
785 FileEncoder(): FLAC::Encoder::File() { }
788 // from FLAC::Encoder::File
789 void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate);
791 bool die(const char *msg = 0) const;
794 void FileEncoder::progress_callback(FLAC__uint64, FLAC__uint64, unsigned, unsigned)
798 bool FileEncoder::die(const char *msg) const
800 State state = get_state();
803 printf("FAILED, %s", msg);
807 printf(", state = %u (%s)\n", (unsigned)((::FLAC__FileEncoderState)state), state.as_cstring());
808 if(state == ::FLAC__FILE_ENCODER_SEEKABLE_STREAM_ENCODER_ERROR) {
809 FLAC::Encoder::SeekableStream::State state_ = get_seekable_stream_encoder_state();
810 printf(" seekable stream encoder state = %u (%s)\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state_), state_.as_cstring());
811 if(state_ == ::FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR) {
812 FLAC::Encoder::Stream::State state__ = get_stream_encoder_state();
813 printf(" stream encoder state = %u (%s)\n", (unsigned)((::FLAC__StreamEncoderState)state__), state__.as_cstring());
814 if(state__ == ::FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) {
815 FLAC::Decoder::Stream::State dstate = get_verify_decoder_state();
816 printf(" verify decoder state = %u (%s)\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
824 static bool test_file_encoder()
826 FileEncoder *encoder;
827 FLAC__int32 samples[1024];
828 FLAC__int32 *samples_array[1] = { samples };
831 printf("\n+++ libFLAC++ unit test: FLAC::Encoder::File\n\n");
833 printf("allocating encoder instance... ");
834 encoder = new FileEncoder();
836 printf("FAILED, new returned NULL\n");
841 printf("testing is_valid()... ");
842 if(!encoder->is_valid()) {
843 printf("FAILED, returned false\n");
848 printf("testing set_verify()... ");
849 if(!encoder->set_verify(true))
850 return encoder->die("returned false");
853 printf("testing set_streamable_subset()... ");
854 if(!encoder->set_streamable_subset(true))
855 return encoder->die("returned false");
858 printf("testing set_do_mid_side_stereo()... ");
859 if(!encoder->set_do_mid_side_stereo(false))
860 return encoder->die("returned false");
863 printf("testing set_loose_mid_side_stereo()... ");
864 if(!encoder->set_loose_mid_side_stereo(false))
865 return encoder->die("returned false");
868 printf("testing set_channels()... ");
869 if(!encoder->set_channels(streaminfo_.data.stream_info.channels))
870 return encoder->die("returned false");
873 printf("testing set_bits_per_sample()... ");
874 if(!encoder->set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample))
875 return encoder->die("returned false");
878 printf("testing set_sample_rate()... ");
879 if(!encoder->set_sample_rate(streaminfo_.data.stream_info.sample_rate))
880 return encoder->die("returned false");
883 printf("testing set_blocksize()... ");
884 if(!encoder->set_blocksize(streaminfo_.data.stream_info.min_blocksize))
885 return encoder->die("returned false");
888 printf("testing set_max_lpc_order()... ");
889 if(!encoder->set_max_lpc_order(0))
890 return encoder->die("returned false");
893 printf("testing set_qlp_coeff_precision()... ");
894 if(!encoder->set_qlp_coeff_precision(0))
895 return encoder->die("returned false");
898 printf("testing set_do_qlp_coeff_prec_search()... ");
899 if(!encoder->set_do_qlp_coeff_prec_search(false))
900 return encoder->die("returned false");
903 printf("testing set_do_escape_coding()... ");
904 if(!encoder->set_do_escape_coding(false))
905 return encoder->die("returned false");
908 printf("testing set_do_exhaustive_model_search()... ");
909 if(!encoder->set_do_exhaustive_model_search(false))
910 return encoder->die("returned false");
913 printf("testing set_min_residual_partition_order()... ");
914 if(!encoder->set_min_residual_partition_order(0))
915 return encoder->die("returned false");
918 printf("testing set_max_residual_partition_order()... ");
919 if(!encoder->set_max_residual_partition_order(0))
920 return encoder->die("returned false");
923 printf("testing set_rice_parameter_search_dist()... ");
924 if(!encoder->set_rice_parameter_search_dist(0))
925 return encoder->die("returned false");
928 printf("testing set_total_samples_estimate()... ");
929 if(!encoder->set_total_samples_estimate(streaminfo_.data.stream_info.total_samples))
930 return encoder->die("returned false");
933 printf("testing set_metadata()... ");
934 if(!encoder->set_metadata(metadata_sequence_, num_metadata_))
935 return encoder->die("returned false");
938 printf("testing set_filename()... ");
939 if(!encoder->set_filename(flacfilename_))
940 return encoder->die("returned false");
943 printf("testing init()... ");
944 if(encoder->init() != ::FLAC__FILE_ENCODER_OK)
945 return encoder->die();
948 printf("testing get_state()... ");
949 FLAC::Encoder::File::State state = encoder->get_state();
950 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__FileEncoderState)state), state.as_cstring());
952 printf("testing get_seekable_stream_encoder_state()... ");
953 FLAC::Encoder::SeekableStream::State state_ = encoder->get_seekable_stream_encoder_state();
954 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__SeekableStreamEncoderState)state_), state_.as_cstring());
956 printf("testing get_stream_encoder_state()... ");
957 FLAC::Encoder::Stream::State state__ = encoder->get_stream_encoder_state();
958 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamEncoderState)state__), state__.as_cstring());
960 printf("testing get_verify_decoder_state()... ");
961 FLAC::Decoder::Stream::State dstate = encoder->get_verify_decoder_state();
962 printf("returned state = %u (%s)... OK\n", (unsigned)((::FLAC__StreamDecoderState)dstate), dstate.as_cstring());
965 FLAC__uint64 absolute_sample;
966 unsigned frame_number;
969 FLAC__int32 expected;
972 printf("testing get_verify_decoder_error_stats()... ");
973 encoder->get_verify_decoder_error_stats(&absolute_sample, &frame_number, &channel, &sample, &expected, &got);
977 printf("testing get_verify()... ");
978 if(encoder->get_verify() != true) {
979 printf("FAILED, expected true, got false\n");
984 printf("testing get_streamable_subset()... ");
985 if(encoder->get_streamable_subset() != true) {
986 printf("FAILED, expected true, got false\n");
991 printf("testing get_do_mid_side_stereo()... ");
992 if(encoder->get_do_mid_side_stereo() != false) {
993 printf("FAILED, expected false, got true\n");
998 printf("testing get_loose_mid_side_stereo()... ");
999 if(encoder->get_loose_mid_side_stereo() != false) {
1000 printf("FAILED, expected false, got true\n");
1005 printf("testing get_channels()... ");
1006 if(encoder->get_channels() != streaminfo_.data.stream_info.channels) {
1007 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.channels, encoder->get_channels());
1012 printf("testing get_bits_per_sample()... ");
1013 if(encoder->get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample) {
1014 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.bits_per_sample, encoder->get_bits_per_sample());
1019 printf("testing get_sample_rate()... ");
1020 if(encoder->get_sample_rate() != streaminfo_.data.stream_info.sample_rate) {
1021 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.sample_rate, encoder->get_sample_rate());
1026 printf("testing get_blocksize()... ");
1027 if(encoder->get_blocksize() != streaminfo_.data.stream_info.min_blocksize) {
1028 printf("FAILED, expected %u, got %u\n", streaminfo_.data.stream_info.min_blocksize, encoder->get_blocksize());
1033 printf("testing get_max_lpc_order()... ");
1034 if(encoder->get_max_lpc_order() != 0) {
1035 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_lpc_order());
1040 printf("testing get_qlp_coeff_precision()... ");
1041 (void)encoder->get_qlp_coeff_precision();
1042 /* we asked the encoder to auto select this so we accept anything */
1045 printf("testing get_do_qlp_coeff_prec_search()... ");
1046 if(encoder->get_do_qlp_coeff_prec_search() != false) {
1047 printf("FAILED, expected false, got true\n");
1052 printf("testing get_do_escape_coding()... ");
1053 if(encoder->get_do_escape_coding() != false) {
1054 printf("FAILED, expected false, got true\n");
1059 printf("testing get_do_exhaustive_model_search()... ");
1060 if(encoder->get_do_exhaustive_model_search() != false) {
1061 printf("FAILED, expected false, got true\n");
1066 printf("testing get_min_residual_partition_order()... ");
1067 if(encoder->get_min_residual_partition_order() != 0) {
1068 printf("FAILED, expected %u, got %u\n", 0, encoder->get_min_residual_partition_order());
1073 printf("testing get_max_residual_partition_order()... ");
1074 if(encoder->get_max_residual_partition_order() != 0) {
1075 printf("FAILED, expected %u, got %u\n", 0, encoder->get_max_residual_partition_order());
1080 printf("testing get_rice_parameter_search_dist()... ");
1081 if(encoder->get_rice_parameter_search_dist() != 0) {
1082 printf("FAILED, expected %u, got %u\n", 0, encoder->get_rice_parameter_search_dist());
1087 printf("testing get_total_samples_estimate()... ");
1088 if(encoder->get_total_samples_estimate() != streaminfo_.data.stream_info.total_samples) {
1089 printf("FAILED, expected %llu, got %llu\n", streaminfo_.data.stream_info.total_samples, encoder->get_total_samples_estimate());
1094 /* init the dummy sample buffer */
1095 for(i = 0; i < sizeof(samples) / sizeof(FLAC__int32); i++)
1098 printf("testing process()... ");
1099 if(!encoder->process(samples_array, sizeof(samples) / sizeof(FLAC__int32)))
1100 return encoder->die("returned false");
1103 printf("testing process_interleaved()... ");
1104 if(!encoder->process_interleaved(samples, sizeof(samples) / sizeof(FLAC__int32)))
1105 return encoder->die("returned false");
1108 printf("testing finish()... ");
1112 printf("freeing encoder instance... ");
1116 printf("\nPASSED!\n");
1121 bool test_encoders()
1123 init_metadata_blocks_();
1125 if(!test_stream_encoder())
1128 if(!test_seekable_stream_encoder())
1131 if(!test_file_encoder())
1134 free_metadata_blocks_();