- if(blocksize_hint && is_known_variable_blocksize_stream) {
- if(!FLAC__bitbuffer_read_utf8_uint64(decoder->private_->input, &xx, read_callback_, decoder, raw_header, &raw_header_len))
- return false; /* the read_callback_ sets the state for us */
- if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */
- decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
- decoder->private_->cached = true;
- decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, decoder->private_->client_data);
- decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
- return true;
+ /*
+ * Now we get to the regrettable consequences of not knowing for sure
+ * whether we got a frame number or a sample number. There are no
+ * encoders that do variable-blocksize encoding so unless we know from
+ * the STREAMINFO that it is variable-blocksize we will assume it is
+ * fixed-blocksize. The trouble comes when we have no STREAMINFO; again
+ * we will guess that is fixed-blocksize. Where this can go wrong: 1) a
+ * variable-blocksize stream with no STREAMINFO; 2) a fixed-blocksize
+ * stream that was edited such that one or more frames before or
+ * including this one do not have the same number of samples as the
+ * STREAMINFO's min and max blocksize.
+ */
+ if(is_known_variable_blocksize_stream) {
+ if(blocksize_hint) {
+ if(!FLAC__bitbuffer_read_utf8_uint64(decoder->private_->input, &xx, read_callback_, decoder, raw_header, &raw_header_len))
+ return false; /* the read_callback_ sets the state for us */
+ if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */
+ decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */
+ decoder->private_->cached = true;
+ decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, decoder->private_->client_data);
+ decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
+ return true;
+ }
+ decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER;
+ decoder->private_->frame.header.number.sample_number = xx;