When decoding a FLAC file with bits per sample that is not a multiple
of 8 and outputting in raw format, the decoder gets as far as the write
callback before realising that it doesn't know how to write the data.
It then fails with an unhelpful message (or trips an assert() in debug
mode). The attached patch performs the check earlier, and gives a more
helpful error message.
Kind regards,
Christopher Key
#v+
# metaflac --show-bps data_20bps.flac
20
#v-
without patch:
#v+
# flac -dc --force-raw-format --sign signed --endian little data_20bps.flac
flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh
Coalson
flac comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it under certain conditions. Type `flac' for
details.
data_20bps.flac: ERROR while decoding data
state = FLAC__STREAM_DECODER_READ_FRAME
#v-
with patch:
#v+
# flac -dc --force-raw-format --sign signed --endian little data_20bps.flac
flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh
Coalson
flac comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it under certain conditions. Type `flac' for
details.
data_20bps.flac: ERROR: bits per sample is 20, must be 8/16/24 for raw
format output
#v-
--- src/flac/decode.c.orig 2010-07-14 11:00:36.000000000 +0100
+++ src/flac/decode.c 2010-07-14 11:32:13.000000000 +0100
@@ -1245,10 +1245,19 @@
decoder_session->total_samples -=
(metadata->data.stream_info.total_samples - until);
}
- if(decoder_session->bps < 4 || decoder_session->bps > 24) {
- flac__utils_printf(stderr, 1, "%s: ERROR: bits per
sample is %u, must be 4-24\n", decoder_session->inbasefilename,
decoder_session->bps);
- decoder_session->abort_flag = true;
- return;
+ if(decoder_session->analysis_mode || decoder_session->test_only
|| decoder_session->is_wave_out || decoder_session->is_aiff_out) {
+ if(decoder_session->bps < 4 || decoder_session->bps >
24) {
+ flac__utils_printf(stderr, 1, "%s: ERROR: bits
per sample is %u, must be 4-24\n", decoder_session->inbasefilename,
decoder_session->bps);
+ decoder_session->abort_flag = true;
+ return;
+ }
+ }
+ else {
+ if ((decoder_session->bps % 8) != 0) {
+ flac__utils_printf(stderr, 1, "%s: ERROR: bits
per sample is %u, must be 8/16/24 for raw format output\n",
decoder_session->inbasefilename, decoder_session->bps);
+ decoder_session->abort_flag = true;
+ return;
+ }
}
}
else if(metadata->type == FLAC__METADATA_TYPE_CUESHEET) {
_______________________________________________
Flac-dev mailing list
[email protected]
http://lists.xiph.org/mailman/listinfo/flac-dev