1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002-2009 Josh Coalson
3 * Copyright (C) 2011-2013 Xiph.Org Foundation
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 #include "FLAC/assert.h"
30 #include "FLAC/stream_decoder.h"
31 #include "share/grabbag.h"
32 #include "share/compat.h"
33 #include "share/safe_str.h"
34 #include "test_libs_common/file_utils_flac.h"
35 #include "test_libs_common/metadata_utils.h"
38 LAYER_STREAM = 0, /* FLAC__stream_decoder_init_[ogg_]stream() without seeking */
39 LAYER_SEEKABLE_STREAM, /* FLAC__stream_decoder_init_[ogg_]stream() with seeking */
40 LAYER_FILE, /* FLAC__stream_decoder_init_[ogg_]FILE() */
41 LAYER_FILENAME /* FLAC__stream_decoder_init_[ogg_]file() */
44 static const char * const LayerString[] = {
55 unsigned current_metadata_number;
56 FLAC__bool ignore_errors;
57 FLAC__bool error_occurred;
58 } StreamDecoderClientData;
60 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, picture_, unknown_;
61 static FLAC__StreamMetadata *expected_metadata_sequence_[9];
62 static unsigned num_expected_;
63 static FLAC__off_t flacfilesize_;
65 static const char *flacfilename(FLAC__bool is_ogg)
67 return is_ogg? "metadata.oga" : "metadata.flac";
70 static FLAC__bool die_(const char *msg)
72 printf("ERROR: %s\n", msg);
76 static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
78 FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
81 printf("FAILED, %s", msg);
85 printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
90 static void open_test_file(StreamDecoderClientData * pdcd, int is_ogg, const char * mode)
92 pdcd->file = flac_fopen(flacfilename(is_ogg), mode);
93 safe_strncpy(pdcd->filename, flacfilename(is_ogg), sizeof (pdcd->filename));
96 static void init_metadata_blocks_(void)
98 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
101 static void free_metadata_blocks_(void)
103 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
106 static FLAC__bool generate_file_(FLAC__bool is_ogg)
108 printf("\n\ngenerating %sFLAC file for decoder tests...\n", is_ogg? "Ogg ":"");
111 expected_metadata_sequence_[num_expected_++] = &padding_;
112 expected_metadata_sequence_[num_expected_++] = &seektable_;
113 expected_metadata_sequence_[num_expected_++] = &application1_;
114 expected_metadata_sequence_[num_expected_++] = &application2_;
115 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
116 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
117 expected_metadata_sequence_[num_expected_++] = &picture_;
118 expected_metadata_sequence_[num_expected_++] = &unknown_;
119 /* WATCHOUT: for Ogg FLAC the encoder should move the VORBIS_COMMENT block to the front, right after STREAMINFO */
121 if(!file_utils__generate_flacfile(is_ogg, flacfilename(is_ogg), &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
122 return die_("creating the encoded file");
127 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
129 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
130 const size_t requested_bytes = *bytes;
135 printf("ERROR: client_data in read callback is NULL\n");
136 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
139 if(dcd->error_occurred)
140 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
142 if(feof(dcd->file)) {
144 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
146 else if(requested_bytes > 0) {
147 *bytes = fread(buffer, 1, requested_bytes, dcd->file);
150 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
152 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
155 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
159 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
162 static FLAC__StreamDecoderSeekStatus stream_decoder_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
164 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
169 printf("ERROR: client_data in seek callback is NULL\n");
170 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
173 if(dcd->error_occurred)
174 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
176 if(fseeko(dcd->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) {
177 dcd->error_occurred = true;
178 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
181 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
184 static FLAC__StreamDecoderTellStatus stream_decoder_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
186 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
192 printf("ERROR: client_data in tell callback is NULL\n");
193 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
196 if(dcd->error_occurred)
197 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
199 offset = ftello(dcd->file);
200 *absolute_byte_offset = (FLAC__uint64)offset;
203 dcd->error_occurred = true;
204 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
207 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
210 static FLAC__StreamDecoderLengthStatus stream_decoder_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
212 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
217 printf("ERROR: client_data in length callback is NULL\n");
218 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
221 if(dcd->error_occurred)
222 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
224 *stream_length = (FLAC__uint64)flacfilesize_;
225 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
228 static FLAC__bool stream_decoder_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data)
230 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
235 printf("ERROR: client_data in eof callback is NULL\n");
239 if(dcd->error_occurred)
242 return feof(dcd->file);
245 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
247 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
249 (void)decoder, (void)buffer;
252 printf("ERROR: client_data in write callback is NULL\n");
253 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
256 if(dcd->error_occurred)
257 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
260 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
261 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
263 printf("content... ");
267 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
270 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
272 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
277 printf("ERROR: client_data in metadata callback is NULL\n");
281 if(dcd->error_occurred)
284 printf("%d... ", dcd->current_metadata_number);
287 if(dcd->current_metadata_number >= num_expected_) {
288 (void)die_("got more metadata blocks than expected");
289 dcd->error_occurred = true;
292 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
293 (void)die_("metadata block mismatch");
294 dcd->error_occurred = true;
297 dcd->current_metadata_number++;
300 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
302 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
307 printf("ERROR: client_data in error callback is NULL\n");
311 if(!dcd->ignore_errors) {
312 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
313 dcd->error_occurred = true;
317 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, StreamDecoderClientData *dcd, FLAC__bool is_ogg)
319 FLAC__StreamDecoderInitStatus init_status;
321 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
322 return die_s_("at FLAC__stream_decoder_set_md5_checking(), returned false", decoder);
324 /* for FLAC__stream_encoder_init_FILE(), the FLAC__stream_encoder_finish() closes the file so we have to keep re-opening: */
325 if(dcd->layer == LAYER_FILE) {
326 printf("opening %sFLAC file... ", is_ogg? "Ogg ":"");
327 open_test_file(dcd, is_ogg, "rb");
329 printf("ERROR (%s)\n", strerror(errno));
337 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
338 init_status = is_ogg?
339 FLAC__stream_decoder_init_ogg_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
340 FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd)
343 case LAYER_SEEKABLE_STREAM:
344 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
345 init_status = is_ogg?
346 FLAC__stream_decoder_init_ogg_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
347 FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
350 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
351 init_status = is_ogg?
352 FLAC__stream_decoder_init_ogg_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
353 FLAC__stream_decoder_init_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
356 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
357 init_status = is_ogg?
358 FLAC__stream_decoder_init_ogg_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
359 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
362 die_("internal error 000");
365 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
366 return die_s_(0, decoder);
369 dcd->current_metadata_number = 0;
371 if(dcd->layer < LAYER_FILE && fseeko(dcd->file, 0, SEEK_SET) < 0) {
372 printf("FAILED rewinding input, errno = %d\n", errno);
376 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
377 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
378 return die_s_("returned false", decoder);
381 printf("testing FLAC__stream_decoder_finish()... ");
382 if(!FLAC__stream_decoder_finish(decoder))
383 return die_s_("returned false", decoder);
389 static FLAC__bool test_stream_decoder(Layer layer, FLAC__bool is_ogg)
391 FLAC__StreamDecoder *decoder;
392 FLAC__StreamDecoderInitStatus init_status;
393 FLAC__StreamDecoderState state;
394 StreamDecoderClientData decoder_client_data;
397 decoder_client_data.layer = layer;
399 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder (layer: %s, format: %s)\n\n", LayerString[layer], is_ogg? "Ogg FLAC" : "FLAC");
401 printf("testing FLAC__stream_decoder_new()... ");
402 decoder = FLAC__stream_decoder_new();
404 printf("FAILED, returned NULL\n");
409 printf("testing FLAC__stream_decoder_delete()... ");
410 FLAC__stream_decoder_delete(decoder);
413 printf("testing FLAC__stream_decoder_new()... ");
414 decoder = FLAC__stream_decoder_new();
416 printf("FAILED, returned NULL\n");
423 case LAYER_SEEKABLE_STREAM:
424 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
425 init_status = is_ogg?
426 FLAC__stream_decoder_init_ogg_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0) :
427 FLAC__stream_decoder_init_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0);
430 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
431 init_status = is_ogg?
432 FLAC__stream_decoder_init_ogg_FILE(decoder, stdin, 0, 0, 0, 0) :
433 FLAC__stream_decoder_init_FILE(decoder, stdin, 0, 0, 0, 0);
436 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
437 init_status = is_ogg?
438 FLAC__stream_decoder_init_ogg_file(decoder, flacfilename(is_ogg), 0, 0, 0, 0) :
439 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), 0, 0, 0, 0);
442 die_("internal error 003");
445 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS)
446 return die_s_(0, decoder);
449 printf("testing FLAC__stream_decoder_delete()... ");
450 FLAC__stream_decoder_delete(decoder);
454 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
456 printf("testing FLAC__stream_decoder_new()... ");
457 decoder = FLAC__stream_decoder_new();
459 printf("FAILED, returned NULL\n");
465 printf("testing FLAC__stream_decoder_set_ogg_serial_number()... ");
466 if(!FLAC__stream_decoder_set_ogg_serial_number(decoder, file_utils__ogg_serial_number))
467 return die_s_("returned false", decoder);
471 printf("testing FLAC__stream_decoder_set_md5_checking()... ");
472 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
473 return die_s_("returned false", decoder);
476 if(layer < LAYER_FILENAME) {
477 printf("opening %sFLAC file... ", is_ogg? "Ogg ":"");
478 open_test_file(&decoder_client_data, is_ogg, "rb");
479 if(0 == decoder_client_data.file) {
480 printf("ERROR (%s)\n", strerror(errno));
488 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
489 init_status = is_ogg?
490 FLAC__stream_decoder_init_ogg_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) :
491 FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data);
493 case LAYER_SEEKABLE_STREAM:
494 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
495 init_status = is_ogg?
496 FLAC__stream_decoder_init_ogg_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) :
497 FLAC__stream_decoder_init_stream(decoder, stream_decoder_read_callback_, stream_decoder_seek_callback_, stream_decoder_tell_callback_, stream_decoder_length_callback_, stream_decoder_eof_callback_, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data);
500 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
501 init_status = is_ogg?
502 FLAC__stream_decoder_init_ogg_FILE(decoder, decoder_client_data.file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) :
503 FLAC__stream_decoder_init_FILE(decoder, decoder_client_data.file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data);
506 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
507 init_status = is_ogg?
508 FLAC__stream_decoder_init_ogg_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data) :
509 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data);
512 die_("internal error 009");
515 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
516 return die_s_(0, decoder);
519 printf("testing FLAC__stream_decoder_get_state()... ");
520 state = FLAC__stream_decoder_get_state(decoder);
521 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
523 decoder_client_data.current_metadata_number = 0;
524 decoder_client_data.ignore_errors = false;
525 decoder_client_data.error_occurred = false;
527 printf("testing FLAC__stream_decoder_get_md5_checking()... ");
528 if(!FLAC__stream_decoder_get_md5_checking(decoder)) {
529 printf("FAILED, returned false, expected true\n");
534 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
535 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
536 return die_s_("returned false", decoder);
539 printf("testing FLAC__stream_decoder_process_single()... ");
540 if(!FLAC__stream_decoder_process_single(decoder))
541 return die_s_("returned false", decoder);
544 printf("testing FLAC__stream_decoder_skip_single_frame()... ");
545 if(!FLAC__stream_decoder_skip_single_frame(decoder))
546 return die_s_("returned false", decoder);
549 if(layer < LAYER_FILE) {
550 printf("testing FLAC__stream_decoder_flush()... ");
551 if(!FLAC__stream_decoder_flush(decoder))
552 return die_s_("returned false", decoder);
555 decoder_client_data.ignore_errors = true;
556 printf("testing FLAC__stream_decoder_process_single()... ");
557 if(!FLAC__stream_decoder_process_single(decoder))
558 return die_s_("returned false", decoder);
560 decoder_client_data.ignore_errors = false;
563 expect = (layer != LAYER_STREAM);
564 printf("testing FLAC__stream_decoder_seek_absolute()... ");
565 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
566 return die_s_(expect? "returned false" : "returned true", decoder);
569 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
570 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
571 return die_s_("returned false", decoder);
574 expect = (layer != LAYER_STREAM);
575 printf("testing FLAC__stream_decoder_seek_absolute()... ");
576 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
577 return die_s_(expect? "returned false" : "returned true", decoder);
580 printf("testing FLAC__stream_decoder_get_channels()... ");
582 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
583 if(channels != streaminfo_.data.stream_info.channels) {
584 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
590 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
592 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
593 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
594 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
600 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
602 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
603 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
604 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
610 printf("testing FLAC__stream_decoder_get_blocksize()... ");
612 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
613 /* value could be anything since we're at the last block, so accept any reasonable answer */
614 printf("returned %u... %s\n", blocksize, blocksize>0? "OK" : "FAILED");
619 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
621 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
622 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
625 if(layer < LAYER_FILE) {
626 printf("testing FLAC__stream_decoder_reset()... ");
627 if(!FLAC__stream_decoder_reset(decoder)) {
628 state = FLAC__stream_decoder_get_state(decoder);
629 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
634 if(layer == LAYER_STREAM) {
635 /* after a reset() we have to rewind the input ourselves */
636 printf("rewinding input... ");
637 if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) {
638 printf("FAILED, errno = %d\n", errno);
644 decoder_client_data.current_metadata_number = 0;
646 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
647 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
648 return die_s_("returned false", decoder);
652 printf("testing FLAC__stream_decoder_finish()... ");
653 if(!FLAC__stream_decoder_finish(decoder))
654 return die_s_("returned false", decoder);
661 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
662 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
663 return die_s_("returned false", decoder);
667 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
668 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
669 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
670 expected_metadata_sequence_[num_expected_++] = &padding_;
671 expected_metadata_sequence_[num_expected_++] = &seektable_;
672 expected_metadata_sequence_[num_expected_++] = &application1_;
673 expected_metadata_sequence_[num_expected_++] = &application2_;
674 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
675 expected_metadata_sequence_[num_expected_++] = &picture_;
676 expected_metadata_sequence_[num_expected_++] = &unknown_;
679 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
680 expected_metadata_sequence_[num_expected_++] = &padding_;
681 expected_metadata_sequence_[num_expected_++] = &seektable_;
682 expected_metadata_sequence_[num_expected_++] = &application1_;
683 expected_metadata_sequence_[num_expected_++] = &application2_;
684 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
685 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
686 expected_metadata_sequence_[num_expected_++] = &picture_;
687 expected_metadata_sequence_[num_expected_++] = &unknown_;
690 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
697 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
698 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
699 return die_s_("returned false", decoder);
704 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
708 * respond all, ignore VORBIS_COMMENT
711 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
712 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
713 return die_s_("returned false", decoder);
716 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
717 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
718 return die_s_("returned false", decoder);
722 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
723 expected_metadata_sequence_[num_expected_++] = &padding_;
724 expected_metadata_sequence_[num_expected_++] = &seektable_;
725 expected_metadata_sequence_[num_expected_++] = &application1_;
726 expected_metadata_sequence_[num_expected_++] = &application2_;
727 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
728 expected_metadata_sequence_[num_expected_++] = &picture_;
729 expected_metadata_sequence_[num_expected_++] = &unknown_;
731 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
735 * respond all, ignore APPLICATION
738 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
739 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
740 return die_s_("returned false", decoder);
743 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
744 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
745 return die_s_("returned false", decoder);
749 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
750 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
751 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
752 expected_metadata_sequence_[num_expected_++] = &padding_;
753 expected_metadata_sequence_[num_expected_++] = &seektable_;
754 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
755 expected_metadata_sequence_[num_expected_++] = &picture_;
756 expected_metadata_sequence_[num_expected_++] = &unknown_;
759 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
760 expected_metadata_sequence_[num_expected_++] = &padding_;
761 expected_metadata_sequence_[num_expected_++] = &seektable_;
762 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
763 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
764 expected_metadata_sequence_[num_expected_++] = &picture_;
765 expected_metadata_sequence_[num_expected_++] = &unknown_;
768 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
772 * respond all, ignore APPLICATION id of app#1
775 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
776 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
777 return die_s_("returned false", decoder);
780 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
781 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
782 return die_s_("returned false", decoder);
786 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
787 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
788 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
789 expected_metadata_sequence_[num_expected_++] = &padding_;
790 expected_metadata_sequence_[num_expected_++] = &seektable_;
791 expected_metadata_sequence_[num_expected_++] = &application2_;
792 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
793 expected_metadata_sequence_[num_expected_++] = &picture_;
794 expected_metadata_sequence_[num_expected_++] = &unknown_;
797 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
798 expected_metadata_sequence_[num_expected_++] = &padding_;
799 expected_metadata_sequence_[num_expected_++] = &seektable_;
800 expected_metadata_sequence_[num_expected_++] = &application2_;
801 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
802 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
803 expected_metadata_sequence_[num_expected_++] = &picture_;
804 expected_metadata_sequence_[num_expected_++] = &unknown_;
807 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
811 * respond all, ignore APPLICATION id of app#1 & app#2
814 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
815 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
816 return die_s_("returned false", decoder);
819 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
820 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
821 return die_s_("returned false", decoder);
824 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
825 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
826 return die_s_("returned false", decoder);
830 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
831 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
832 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
833 expected_metadata_sequence_[num_expected_++] = &padding_;
834 expected_metadata_sequence_[num_expected_++] = &seektable_;
835 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
836 expected_metadata_sequence_[num_expected_++] = &picture_;
837 expected_metadata_sequence_[num_expected_++] = &unknown_;
840 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
841 expected_metadata_sequence_[num_expected_++] = &padding_;
842 expected_metadata_sequence_[num_expected_++] = &seektable_;
843 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
844 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
845 expected_metadata_sequence_[num_expected_++] = &picture_;
846 expected_metadata_sequence_[num_expected_++] = &unknown_;
849 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
853 * ignore all, respond VORBIS_COMMENT
856 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
857 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
858 return die_s_("returned false", decoder);
861 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
862 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
863 return die_s_("returned false", decoder);
867 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
869 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
873 * ignore all, respond APPLICATION
876 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
877 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
878 return die_s_("returned false", decoder);
881 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
882 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
883 return die_s_("returned false", decoder);
887 expected_metadata_sequence_[num_expected_++] = &application1_;
888 expected_metadata_sequence_[num_expected_++] = &application2_;
890 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
894 * ignore all, respond APPLICATION id of app#1
897 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
898 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
899 return die_s_("returned false", decoder);
902 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
903 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
904 return die_s_("returned false", decoder);
908 expected_metadata_sequence_[num_expected_++] = &application1_;
910 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
914 * ignore all, respond APPLICATION id of app#1 & app#2
917 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
918 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
919 return die_s_("returned false", decoder);
922 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
923 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
924 return die_s_("returned false", decoder);
927 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
928 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
929 return die_s_("returned false", decoder);
933 expected_metadata_sequence_[num_expected_++] = &application1_;
934 expected_metadata_sequence_[num_expected_++] = &application2_;
936 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
940 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
943 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
944 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
945 return die_s_("returned false", decoder);
948 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
949 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
950 return die_s_("returned false", decoder);
953 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
954 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
955 return die_s_("returned false", decoder);
959 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
960 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
961 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
962 expected_metadata_sequence_[num_expected_++] = &padding_;
963 expected_metadata_sequence_[num_expected_++] = &seektable_;
964 expected_metadata_sequence_[num_expected_++] = &application1_;
965 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
966 expected_metadata_sequence_[num_expected_++] = &picture_;
967 expected_metadata_sequence_[num_expected_++] = &unknown_;
970 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
971 expected_metadata_sequence_[num_expected_++] = &padding_;
972 expected_metadata_sequence_[num_expected_++] = &seektable_;
973 expected_metadata_sequence_[num_expected_++] = &application1_;
974 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
975 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
976 expected_metadata_sequence_[num_expected_++] = &picture_;
977 expected_metadata_sequence_[num_expected_++] = &unknown_;
980 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
984 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
987 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
988 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
989 return die_s_("returned false", decoder);
992 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
993 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
994 return die_s_("returned false", decoder);
997 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
998 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
999 return die_s_("returned false", decoder);
1003 expected_metadata_sequence_[num_expected_++] = &application2_;
1005 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
1008 if(layer < LAYER_FILE) /* for LAYER_FILE, FLAC__stream_decoder_finish() closes the file */
1009 fclose(decoder_client_data.file);
1011 printf("testing FLAC__stream_decoder_delete()... ");
1012 FLAC__stream_decoder_delete(decoder);
1015 printf("\nPASSED!\n");
1020 FLAC__bool test_decoders(void)
1022 FLAC__bool is_ogg = false;
1025 init_metadata_blocks_();
1027 if(!generate_file_(is_ogg))
1030 if(!test_stream_decoder(LAYER_STREAM, is_ogg))
1033 if(!test_stream_decoder(LAYER_SEEKABLE_STREAM, is_ogg))
1036 if(!test_stream_decoder(LAYER_FILE, is_ogg))
1039 if(!test_stream_decoder(LAYER_FILENAME, is_ogg))
1042 (void) grabbag__file_remove_file(flacfilename(is_ogg));
1044 free_metadata_blocks_();
1046 if(!FLAC_API_SUPPORTS_OGG_FLAC || is_ogg)