1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003,2004,2005,2006 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.
27 #if defined _MSC_VER || defined __MINGW32__
28 #if _MSC_VER <= 1200 /* @@@ [2G limit] */
34 #include "FLAC/assert.h"
35 #include "FLAC/stream_decoder.h"
36 #include "share/grabbag.h"
37 #include "test_libs_common/file_utils_flac.h"
38 #include "test_libs_common/metadata_utils.h"
41 LAYER_STREAM = 0, /* FLAC__stream_decoder_init_[ogg_]stream() without seeking */
42 LAYER_SEEKABLE_STREAM, /* FLAC__stream_decoder_init_[ogg_]stream() with seeking */
43 LAYER_FILE, /* FLAC__stream_decoder_init_[ogg_]FILE() */
44 LAYER_FILENAME /* FLAC__stream_decoder_init_[ogg_]file() */
47 static const char * const LayerString[] = {
57 unsigned current_metadata_number;
58 FLAC__bool ignore_errors;
59 FLAC__bool error_occurred;
60 } StreamDecoderClientData;
62 static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, picture_, unknown_;
63 static FLAC__StreamMetadata *expected_metadata_sequence_[9];
64 static unsigned num_expected_;
65 static off_t flacfilesize_;
67 static const char *flacfilename(FLAC__bool is_ogg)
69 return is_ogg? "metadata.ogg" : "metadata.flac";
72 static FLAC__bool die_(const char *msg)
74 printf("ERROR: %s\n", msg);
78 static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder)
80 FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);
83 printf("FAILED, %s", msg);
87 printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);
92 static void init_metadata_blocks_()
94 mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
97 static void free_metadata_blocks_()
99 mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &picture_, &unknown_);
102 static FLAC__bool generate_file_(FLAC__bool is_ogg)
104 printf("\n\ngenerating %sFLAC file for decoder tests...\n", is_ogg? "Ogg ":"");
107 expected_metadata_sequence_[num_expected_++] = &padding_;
108 expected_metadata_sequence_[num_expected_++] = &seektable_;
109 expected_metadata_sequence_[num_expected_++] = &application1_;
110 expected_metadata_sequence_[num_expected_++] = &application2_;
111 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
112 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
113 expected_metadata_sequence_[num_expected_++] = &picture_;
114 expected_metadata_sequence_[num_expected_++] = &unknown_;
115 /* WATCHOUT: for Ogg FLAC the encoder should move the VORBIS_COMMENT block to the front, right after STREAMINFO */
117 if(!file_utils__generate_flacfile(is_ogg, flacfilename(is_ogg), &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))
118 return die_("creating the encoded file");
123 static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
125 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
126 const size_t requested_bytes = *bytes;
131 printf("ERROR: client_data in read callback is NULL\n");
132 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
135 if(dcd->error_occurred)
136 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
138 if(feof(dcd->file)) {
140 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
142 else if(requested_bytes > 0) {
143 *bytes = fread(buffer, 1, requested_bytes, dcd->file);
146 return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
148 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
151 return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
155 return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */
158 static FLAC__StreamDecoderSeekStatus stream_decoder_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
160 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
165 printf("ERROR: client_data in seek callback is NULL\n");
166 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
169 if(dcd->error_occurred)
170 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
172 if(fseeko(dcd->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) {
173 dcd->error_occurred = true;
174 return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
177 return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
180 static FLAC__StreamDecoderTellStatus stream_decoder_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
182 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
188 printf("ERROR: client_data in tell callback is NULL\n");
189 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
192 if(dcd->error_occurred)
193 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
195 offset = ftello(dcd->file);
196 *absolute_byte_offset = (FLAC__uint64)offset;
199 dcd->error_occurred = true;
200 return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
203 return FLAC__STREAM_DECODER_TELL_STATUS_OK;
206 static FLAC__StreamDecoderLengthStatus stream_decoder_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
208 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
213 printf("ERROR: client_data in length callback is NULL\n");
214 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
217 if(dcd->error_occurred)
218 return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
220 *stream_length = (FLAC__uint64)flacfilesize_;
221 return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
224 static FLAC__bool stream_decoder_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data)
226 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
231 printf("ERROR: client_data in eof callback is NULL\n");
235 if(dcd->error_occurred)
238 return feof(dcd->file);
241 static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
243 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
245 (void)decoder, (void)buffer;
248 printf("ERROR: client_data in write callback is NULL\n");
249 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
252 if(dcd->error_occurred)
253 return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
256 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||
257 (frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)
259 printf("content... ");
263 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
266 static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
268 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
273 printf("ERROR: client_data in metadata callback is NULL\n");
277 if(dcd->error_occurred)
280 printf("%d... ", dcd->current_metadata_number);
283 if(dcd->current_metadata_number >= num_expected_) {
284 (void)die_("got more metadata blocks than expected");
285 dcd->error_occurred = true;
288 if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {
289 (void)die_("metadata block mismatch");
290 dcd->error_occurred = true;
293 dcd->current_metadata_number++;
296 static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
298 StreamDecoderClientData *dcd = (StreamDecoderClientData*)client_data;
303 printf("ERROR: client_data in error callback is NULL\n");
307 if(!dcd->ignore_errors) {
308 printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);
309 dcd->error_occurred = true;
313 static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, StreamDecoderClientData *dcd, FLAC__bool is_ogg)
315 FLAC__StreamDecoderInitStatus init_status;
317 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
318 return die_s_("at FLAC__stream_decoder_set_md5_checking(), returned false", decoder);
320 /* for FLAC__stream_encoder_init_FILE(), the FLAC__stream_encoder_finish() closes the file so we have to keep re-opening: */
321 if(dcd->layer == LAYER_FILE) {
322 printf("opening %sFLAC file... ", is_ogg? "Ogg ":"");
323 dcd->file = fopen(flacfilename(is_ogg), "rb");
325 printf("ERROR (%s)\n", strerror(errno));
333 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
334 init_status = is_ogg?
335 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) :
336 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)
339 case LAYER_SEEKABLE_STREAM:
340 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
341 init_status = is_ogg?
342 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) :
343 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);
346 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
347 init_status = is_ogg?
348 FLAC__stream_decoder_init_ogg_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
349 FLAC__stream_decoder_init_FILE(decoder, dcd->file, stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
352 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
353 init_status = is_ogg?
354 FLAC__stream_decoder_init_ogg_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd) :
355 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, dcd);
358 die_("internal error 000");
361 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
362 return die_s_(0, decoder);
365 dcd->current_metadata_number = 0;
367 if(dcd->layer < LAYER_FILE && fseeko(dcd->file, 0, SEEK_SET) < 0) {
368 printf("FAILED rewinding input, errno = %d\n", errno);
372 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
373 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
374 return die_s_("returned false", decoder);
377 printf("testing FLAC__stream_decoder_finish()... ");
378 if(!FLAC__stream_decoder_finish(decoder))
379 return die_s_("returned false", decoder);
385 static FLAC__bool test_stream_decoder(Layer layer, FLAC__bool is_ogg)
387 FLAC__StreamDecoder *decoder;
388 FLAC__StreamDecoderInitStatus init_status;
389 FLAC__StreamDecoderState state;
390 StreamDecoderClientData decoder_client_data;
393 decoder_client_data.layer = layer;
395 printf("\n+++ libFLAC unit test: FLAC__StreamDecoder (layer: %s, format: %s)\n\n", LayerString[layer], is_ogg? "Ogg FLAC" : "FLAC");
397 printf("testing FLAC__stream_decoder_new()... ");
398 decoder = FLAC__stream_decoder_new();
400 printf("FAILED, returned NULL\n");
405 printf("testing FLAC__stream_decoder_delete()... ");
406 FLAC__stream_decoder_delete(decoder);
409 printf("testing FLAC__stream_decoder_new()... ");
410 decoder = FLAC__stream_decoder_new();
412 printf("FAILED, returned NULL\n");
419 case LAYER_SEEKABLE_STREAM:
420 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
421 init_status = is_ogg?
422 FLAC__stream_decoder_init_ogg_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0) :
423 FLAC__stream_decoder_init_stream(decoder, 0, 0, 0, 0, 0, 0, 0, 0, 0);
426 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
427 init_status = is_ogg?
428 FLAC__stream_decoder_init_ogg_FILE(decoder, stdin, 0, 0, 0, 0) :
429 FLAC__stream_decoder_init_FILE(decoder, stdin, 0, 0, 0, 0);
432 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
433 init_status = is_ogg?
434 FLAC__stream_decoder_init_ogg_file(decoder, flacfilename(is_ogg), 0, 0, 0, 0) :
435 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), 0, 0, 0, 0);
438 die_("internal error 003");
441 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS)
442 return die_s_(0, decoder);
445 printf("testing FLAC__stream_decoder_delete()... ");
446 FLAC__stream_decoder_delete(decoder);
450 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
452 printf("testing FLAC__stream_decoder_new()... ");
453 decoder = FLAC__stream_decoder_new();
455 printf("FAILED, returned NULL\n");
461 printf("testing FLAC__stream_decoder_set_ogg_serial_number()... ");
462 if(!FLAC__stream_decoder_set_ogg_serial_number(decoder, file_utils__ogg_serial_number))
463 return die_s_("returned false", decoder);
467 printf("testing FLAC__stream_decoder_set_md5_checking()... ");
468 if(!FLAC__stream_decoder_set_md5_checking(decoder, true))
469 return die_s_("returned false", decoder);
472 if(layer < LAYER_FILENAME) {
473 printf("opening %sFLAC file... ", is_ogg? "Ogg ":"");
474 decoder_client_data.file = fopen(flacfilename(is_ogg), "rb");
475 if(0 == decoder_client_data.file) {
476 printf("ERROR (%s)\n", strerror(errno));
484 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
485 init_status = is_ogg?
486 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) :
487 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);
489 case LAYER_SEEKABLE_STREAM:
490 printf("testing FLAC__stream_decoder_init_%sstream()... ", is_ogg? "ogg_":"");
491 init_status = is_ogg?
492 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) :
493 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);
496 printf("testing FLAC__stream_decoder_init_%sFILE()... ", is_ogg? "ogg_":"");
497 init_status = is_ogg?
498 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) :
499 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);
502 printf("testing FLAC__stream_decoder_init_%sfile()... ", is_ogg? "ogg_":"");
503 init_status = is_ogg?
504 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) :
505 FLAC__stream_decoder_init_file(decoder, flacfilename(is_ogg), stream_decoder_write_callback_, stream_decoder_metadata_callback_, stream_decoder_error_callback_, &decoder_client_data);
508 die_("internal error 009");
511 if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
512 return die_s_(0, decoder);
515 printf("testing FLAC__stream_decoder_get_state()... ");
516 state = FLAC__stream_decoder_get_state(decoder);
517 printf("returned state = %u (%s)... OK\n", state, FLAC__StreamDecoderStateString[state]);
519 decoder_client_data.current_metadata_number = 0;
520 decoder_client_data.ignore_errors = false;
521 decoder_client_data.error_occurred = false;
523 printf("testing FLAC__stream_decoder_get_md5_checking()... ");
524 if(!FLAC__stream_decoder_get_md5_checking(decoder)) {
525 printf("FAILED, returned false, expected true\n");
530 printf("testing FLAC__stream_decoder_process_until_end_of_metadata()... ");
531 if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
532 return die_s_("returned false", decoder);
535 printf("testing FLAC__stream_decoder_process_single()... ");
536 if(!FLAC__stream_decoder_process_single(decoder))
537 return die_s_("returned false", decoder);
540 printf("testing FLAC__stream_decoder_skip_single_frame()... ");
541 if(!FLAC__stream_decoder_skip_single_frame(decoder))
542 return die_s_("returned false", decoder);
545 if(layer < LAYER_FILE) {
546 printf("testing FLAC__stream_decoder_flush()... ");
547 if(!FLAC__stream_decoder_flush(decoder))
548 return die_s_("returned false", decoder);
551 decoder_client_data.ignore_errors = true;
552 printf("testing FLAC__stream_decoder_process_single()... ");
553 if(!FLAC__stream_decoder_process_single(decoder))
554 return die_s_("returned false", decoder);
556 decoder_client_data.ignore_errors = false;
559 expect = (layer != LAYER_STREAM);
560 printf("testing FLAC__stream_decoder_seek_absolute()... ");
561 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
562 return die_s_(expect? "returned false" : "returned true", decoder);
565 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
566 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
567 return die_s_("returned false", decoder);
570 expect = (layer != LAYER_STREAM);
571 printf("testing FLAC__stream_decoder_seek_absolute()... ");
572 if(FLAC__stream_decoder_seek_absolute(decoder, 0) != expect)
573 return die_s_(expect? "returned false" : "returned true", decoder);
576 printf("testing FLAC__stream_decoder_get_channels()... ");
578 unsigned channels = FLAC__stream_decoder_get_channels(decoder);
579 if(channels != streaminfo_.data.stream_info.channels) {
580 printf("FAILED, returned %u, expected %u\n", channels, streaminfo_.data.stream_info.channels);
586 printf("testing FLAC__stream_decoder_get_bits_per_sample()... ");
588 unsigned bits_per_sample = FLAC__stream_decoder_get_bits_per_sample(decoder);
589 if(bits_per_sample != streaminfo_.data.stream_info.bits_per_sample) {
590 printf("FAILED, returned %u, expected %u\n", bits_per_sample, streaminfo_.data.stream_info.bits_per_sample);
596 printf("testing FLAC__stream_decoder_get_sample_rate()... ");
598 unsigned sample_rate = FLAC__stream_decoder_get_sample_rate(decoder);
599 if(sample_rate != streaminfo_.data.stream_info.sample_rate) {
600 printf("FAILED, returned %u, expected %u\n", sample_rate, streaminfo_.data.stream_info.sample_rate);
606 printf("testing FLAC__stream_decoder_get_blocksize()... ");
608 unsigned blocksize = FLAC__stream_decoder_get_blocksize(decoder);
609 /* value could be anything since we're at the last block, so accept any reasonable answer */
610 printf("returned %u... %s\n", blocksize, blocksize>0? "OK" : "FAILED");
615 printf("testing FLAC__stream_decoder_get_channel_assignment()... ");
617 FLAC__ChannelAssignment ca = FLAC__stream_decoder_get_channel_assignment(decoder);
618 printf("returned %u (%s)... OK\n", (unsigned)ca, FLAC__ChannelAssignmentString[ca]);
621 if(layer < LAYER_FILE) {
622 printf("testing FLAC__stream_decoder_reset()... ");
623 if(!FLAC__stream_decoder_reset(decoder)) {
624 state = FLAC__stream_decoder_get_state(decoder);
625 printf("FAILED, returned false, state = %u (%s)\n", state, FLAC__StreamDecoderStateString[state]);
630 if(layer == LAYER_STREAM) {
631 /* after a reset() we have to rewind the input ourselves */
632 printf("rewinding input... ");
633 if(fseeko(decoder_client_data.file, 0, SEEK_SET) < 0) {
634 printf("FAILED, errno = %d\n", errno);
640 decoder_client_data.current_metadata_number = 0;
642 printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");
643 if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
644 return die_s_("returned false", decoder);
648 printf("testing FLAC__stream_decoder_finish()... ");
649 if(!FLAC__stream_decoder_finish(decoder))
650 return die_s_("returned false", decoder);
657 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
658 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
659 return die_s_("returned false", decoder);
663 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
664 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
665 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
666 expected_metadata_sequence_[num_expected_++] = &padding_;
667 expected_metadata_sequence_[num_expected_++] = &seektable_;
668 expected_metadata_sequence_[num_expected_++] = &application1_;
669 expected_metadata_sequence_[num_expected_++] = &application2_;
670 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
671 expected_metadata_sequence_[num_expected_++] = &picture_;
672 expected_metadata_sequence_[num_expected_++] = &unknown_;
675 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
676 expected_metadata_sequence_[num_expected_++] = &padding_;
677 expected_metadata_sequence_[num_expected_++] = &seektable_;
678 expected_metadata_sequence_[num_expected_++] = &application1_;
679 expected_metadata_sequence_[num_expected_++] = &application2_;
680 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
681 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
682 expected_metadata_sequence_[num_expected_++] = &picture_;
683 expected_metadata_sequence_[num_expected_++] = &unknown_;
686 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
693 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
694 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
695 return die_s_("returned false", decoder);
700 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
704 * respond all, ignore VORBIS_COMMENT
707 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
708 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
709 return die_s_("returned false", decoder);
712 printf("testing FLAC__stream_decoder_set_metadata_ignore(VORBIS_COMMENT)... ");
713 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
714 return die_s_("returned false", decoder);
718 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
719 expected_metadata_sequence_[num_expected_++] = &padding_;
720 expected_metadata_sequence_[num_expected_++] = &seektable_;
721 expected_metadata_sequence_[num_expected_++] = &application1_;
722 expected_metadata_sequence_[num_expected_++] = &application2_;
723 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
724 expected_metadata_sequence_[num_expected_++] = &picture_;
725 expected_metadata_sequence_[num_expected_++] = &unknown_;
727 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
731 * respond all, ignore APPLICATION
734 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
735 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
736 return die_s_("returned false", decoder);
739 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
740 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
741 return die_s_("returned false", decoder);
745 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
746 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
747 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
748 expected_metadata_sequence_[num_expected_++] = &padding_;
749 expected_metadata_sequence_[num_expected_++] = &seektable_;
750 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
751 expected_metadata_sequence_[num_expected_++] = &picture_;
752 expected_metadata_sequence_[num_expected_++] = &unknown_;
755 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
756 expected_metadata_sequence_[num_expected_++] = &padding_;
757 expected_metadata_sequence_[num_expected_++] = &seektable_;
758 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
759 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
760 expected_metadata_sequence_[num_expected_++] = &picture_;
761 expected_metadata_sequence_[num_expected_++] = &unknown_;
764 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
768 * respond all, ignore APPLICATION id of app#1
771 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
772 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
773 return die_s_("returned false", decoder);
776 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
777 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
778 return die_s_("returned false", decoder);
782 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
783 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
784 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
785 expected_metadata_sequence_[num_expected_++] = &padding_;
786 expected_metadata_sequence_[num_expected_++] = &seektable_;
787 expected_metadata_sequence_[num_expected_++] = &application2_;
788 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
789 expected_metadata_sequence_[num_expected_++] = &picture_;
790 expected_metadata_sequence_[num_expected_++] = &unknown_;
793 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
794 expected_metadata_sequence_[num_expected_++] = &padding_;
795 expected_metadata_sequence_[num_expected_++] = &seektable_;
796 expected_metadata_sequence_[num_expected_++] = &application2_;
797 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
798 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
799 expected_metadata_sequence_[num_expected_++] = &picture_;
800 expected_metadata_sequence_[num_expected_++] = &unknown_;
803 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
807 * respond all, ignore APPLICATION id of app#1 & app#2
810 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
811 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
812 return die_s_("returned false", decoder);
815 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
816 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
817 return die_s_("returned false", decoder);
820 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #2)... ");
821 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application2_.data.application.id))
822 return die_s_("returned false", decoder);
826 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
827 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
828 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
829 expected_metadata_sequence_[num_expected_++] = &padding_;
830 expected_metadata_sequence_[num_expected_++] = &seektable_;
831 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
832 expected_metadata_sequence_[num_expected_++] = &picture_;
833 expected_metadata_sequence_[num_expected_++] = &unknown_;
836 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
837 expected_metadata_sequence_[num_expected_++] = &padding_;
838 expected_metadata_sequence_[num_expected_++] = &seektable_;
839 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
840 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
841 expected_metadata_sequence_[num_expected_++] = &picture_;
842 expected_metadata_sequence_[num_expected_++] = &unknown_;
845 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
849 * ignore all, respond VORBIS_COMMENT
852 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
853 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
854 return die_s_("returned false", decoder);
857 printf("testing FLAC__stream_decoder_set_metadata_respond(VORBIS_COMMENT)... ");
858 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT))
859 return die_s_("returned false", decoder);
863 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
865 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
869 * ignore all, respond APPLICATION
872 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
873 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
874 return die_s_("returned false", decoder);
877 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
878 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
879 return die_s_("returned false", decoder);
883 expected_metadata_sequence_[num_expected_++] = &application1_;
884 expected_metadata_sequence_[num_expected_++] = &application2_;
886 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
890 * ignore all, respond APPLICATION id of app#1
893 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
894 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
895 return die_s_("returned false", decoder);
898 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
899 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
900 return die_s_("returned false", decoder);
904 expected_metadata_sequence_[num_expected_++] = &application1_;
906 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
910 * ignore all, respond APPLICATION id of app#1 & app#2
913 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
914 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
915 return die_s_("returned false", decoder);
918 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
919 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
920 return die_s_("returned false", decoder);
923 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #2)... ");
924 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application2_.data.application.id))
925 return die_s_("returned false", decoder);
929 expected_metadata_sequence_[num_expected_++] = &application1_;
930 expected_metadata_sequence_[num_expected_++] = &application2_;
932 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
936 * respond all, ignore APPLICATION, respond APPLICATION id of app#1
939 printf("testing FLAC__stream_decoder_set_metadata_respond_all()... ");
940 if(!FLAC__stream_decoder_set_metadata_respond_all(decoder))
941 return die_s_("returned false", decoder);
944 printf("testing FLAC__stream_decoder_set_metadata_ignore(APPLICATION)... ");
945 if(!FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_APPLICATION))
946 return die_s_("returned false", decoder);
949 printf("testing FLAC__stream_decoder_set_metadata_respond_application(of app block #1)... ");
950 if(!FLAC__stream_decoder_set_metadata_respond_application(decoder, application1_.data.application.id))
951 return die_s_("returned false", decoder);
955 if(is_ogg) { /* encoder moves vorbis comment after streaminfo according to ogg mapping */
956 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
957 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
958 expected_metadata_sequence_[num_expected_++] = &padding_;
959 expected_metadata_sequence_[num_expected_++] = &seektable_;
960 expected_metadata_sequence_[num_expected_++] = &application1_;
961 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
962 expected_metadata_sequence_[num_expected_++] = &picture_;
963 expected_metadata_sequence_[num_expected_++] = &unknown_;
966 expected_metadata_sequence_[num_expected_++] = &streaminfo_;
967 expected_metadata_sequence_[num_expected_++] = &padding_;
968 expected_metadata_sequence_[num_expected_++] = &seektable_;
969 expected_metadata_sequence_[num_expected_++] = &application1_;
970 expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;
971 expected_metadata_sequence_[num_expected_++] = &cuesheet_;
972 expected_metadata_sequence_[num_expected_++] = &picture_;
973 expected_metadata_sequence_[num_expected_++] = &unknown_;
976 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
980 * ignore all, respond APPLICATION, ignore APPLICATION id of app#1
983 printf("testing FLAC__stream_decoder_set_metadata_ignore_all()... ");
984 if(!FLAC__stream_decoder_set_metadata_ignore_all(decoder))
985 return die_s_("returned false", decoder);
988 printf("testing FLAC__stream_decoder_set_metadata_respond(APPLICATION)... ");
989 if(!FLAC__stream_decoder_set_metadata_respond(decoder, FLAC__METADATA_TYPE_APPLICATION))
990 return die_s_("returned false", decoder);
993 printf("testing FLAC__stream_decoder_set_metadata_ignore_application(of app block #1)... ");
994 if(!FLAC__stream_decoder_set_metadata_ignore_application(decoder, application1_.data.application.id))
995 return die_s_("returned false", decoder);
999 expected_metadata_sequence_[num_expected_++] = &application2_;
1001 if(!stream_decoder_test_respond_(decoder, &decoder_client_data, is_ogg))
1004 if(layer < LAYER_FILE) /* for LAYER_FILE, FLAC__stream_decoder_finish() closes the file */
1005 fclose(decoder_client_data.file);
1007 printf("testing FLAC__stream_decoder_delete()... ");
1008 FLAC__stream_decoder_delete(decoder);
1011 printf("\nPASSED!\n");
1016 FLAC__bool test_decoders()
1018 FLAC__bool is_ogg = false;
1021 init_metadata_blocks_();
1023 if(!generate_file_(is_ogg))
1026 if(!test_stream_decoder(LAYER_STREAM, is_ogg))
1029 if(!test_stream_decoder(LAYER_SEEKABLE_STREAM, is_ogg))
1032 if(!test_stream_decoder(LAYER_FILE, is_ogg))
1035 if(!test_stream_decoder(LAYER_FILENAME, is_ogg))
1038 (void) grabbag__file_remove_file(flacfilename(is_ogg));
1040 free_metadata_blocks_();
1042 if(!FLAC_API_SUPPORTS_OGG_FLAC || is_ogg)