📄 stream_decoder.c
字号:
FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder){ FLAC__uint32 x; FLAC__bool first = true; /* If we know the total number of samples in the stream, stop if we've read that many. */ /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ if(decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.total_samples) { if(decoder->private_->samples_decoded >= decoder->private_->stream_info.data.stream_info.total_samples) { decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; return true; } } /* make sure we're byte aligned */ if(!FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input)) { if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__bitbuffer_bits_left_for_byte_alignment(decoder->private_->input), read_callback_, decoder)) return false; /* the read_callback_ sets the state for us */ } while(1) { if(decoder->private_->cached) { x = (FLAC__uint32)decoder->private_->lookahead; decoder->private_->cached = false; } else { if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder)) return false; /* the read_callback_ sets the state for us */ } if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ decoder->private_->header_warmup[0] = (FLAC__byte)x; if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder)) return false; /* the read_callback_ sets the state for us */ /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ /* else we have to check if the second byte is the end of a sync code */ if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ decoder->private_->lookahead = (FLAC__byte)x; decoder->private_->cached = true; } else if(x >> 2 == 0x3e) { /* MAGIC NUMBER for the last 6 sync bits */ decoder->private_->header_warmup[1] = (FLAC__byte)x; decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; return true; } } if(first) { decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, decoder->private_->client_data); first = false; } } return true;}FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode){ unsigned channel; unsigned i; FLAC__int32 mid, side, left, right; FLAC__uint16 frame_crc; /* the one we calculate from the input stream */ FLAC__uint32 x; *got_a_frame = false; /* init the CRC */ frame_crc = 0; FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); FLAC__bitbuffer_reset_read_crc16(decoder->private_->input, frame_crc); if(!read_frame_header_(decoder)) return false; if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) return true; if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) return false; for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { /* * first figure the correct bits-per-sample of the subframe */ unsigned bps = decoder->private_->frame.header.bits_per_sample; switch(decoder->private_->frame.header.channel_assignment) { case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: /* no adjustment needed */ break; case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); if(channel == 1) bps++; break; case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); if(channel == 0) bps++; break; case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); if(channel == 1) bps++; break; default: FLAC__ASSERT(0); } /* * now read it */ if(!read_subframe_(decoder, channel, bps, do_full_decode)) return false; if(decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME) { decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; return true; } } if(!read_zero_padding_(decoder)) return false; /* * Read the frame CRC-16 from the footer and check */ frame_crc = FLAC__bitbuffer_get_read_crc16(decoder->private_->input); if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN, read_callback_, decoder)) return false; /* the read_callback_ sets the state for us */ if(frame_crc == (FLAC__uint16)x) { if(do_full_decode) { /* Undo any special channel coding */ switch(decoder->private_->frame.header.channel_assignment) { case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: /* do nothing */ break; case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); for(i = 0; i < decoder->private_->frame.header.blocksize; i++) decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; break; case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); for(i = 0; i < decoder->private_->frame.header.blocksize; i++) decoder->private_->output[0][i] += decoder->private_->output[1][i]; break; case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: FLAC__ASSERT(decoder->private_->frame.header.channels == 2); for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { mid = decoder->private_->output[0][i]; side = decoder->private_->output[1][i]; mid <<= 1; if(side & 1) /* i.e. if 'side' is odd... */ mid++; left = mid + side; right = mid - side; decoder->private_->output[0][i] = left >> 1; decoder->private_->output[1][i] = right >> 1; } break; default: FLAC__ASSERT(0); break; } } } else { /* Bad frame, emit error and zero the output signal */ decoder->private_->error_callback(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, decoder->private_->client_data); if(do_full_decode) { for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); } } } *got_a_frame = true; /* put the latest values into the public section of the decoder instance */ decoder->protected_->channels = decoder->private_->frame.header.channels; decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; /* write it */ if(do_full_decode) { if(decoder->private_->write_callback(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output, decoder->private_->client_data) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) return false; } decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; return true;}FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder){ FLAC__uint32 x; FLAC__uint64 xx; unsigned i, blocksize_hint = 0, sample_rate_hint = 0; FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ unsigned raw_header_len; FLAC__bool is_unparseable = false; const FLAC__bool is_known_variable_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize); const FLAC__bool is_known_fixed_blocksize_stream = (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize); FLAC__ASSERT(FLAC__bitbuffer_is_consumed_byte_aligned(decoder->private_->input)); /* init the raw header with the saved bits from synchronization */ raw_header[0] = decoder->private_->header_warmup[0]; raw_header[1] = decoder->private_->header_warmup[1]; raw_header_len = 2; /* * check to make sure that the reserved bits are 0 */ if(raw_header[1] & 0x03) { /* MAGIC NUMBER */ is_unparseable = true; } /* * Note that along the way as we read the header, we look for a sync * code inside. If we find one it would indicate that our original * sync was bad since there cannot be a sync code in a valid header. */ /* * read in the raw header as bytes so we can CRC it, and parse it on the way */ for(i = 0; i < 2; i++) { if(!FLAC__bitbuffer_read_raw_uint32(decoder->private_->input, &x, 8, read_callback_, decoder)) return false; /* the read_callback_ sets the state for us */ if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ decoder->private_->lookahead = (FLAC__byte)x; 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; } raw_header[raw_header_len++] = (FLAC__byte)x; } switch(x = raw_header[2] >> 4) { case 0: if(is_known_fixed_blocksize_stream) decoder->private_->frame.header.blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; else is_unparseable = true; break; case 1: decoder->private_->frame.header.blocksize = 192; break; case 2: case 3: case 4: case 5: decoder->private_->frame.header.blocksize = 576 << (x-2); break; case 6: case 7: blocksize_hint = x; break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: decoder->private_->frame.header.blocksize = 256 << (x-8); break; default: FLAC__ASSERT(0); break; } switch(x = raw_header[2] & 0x0f) { case 0: if(decoder->private_->has_stream_info) decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; else is_unparseable = true; break; case 1: case 2: case 3: is_unparseable = true; break; case 4: decoder->private_->frame.header.sample_rate = 8000; break; case 5: decoder->private_->frame.header.sample_rate = 16000; break; case 6: decoder->private_->frame.header.sample_rate = 22050; break; case 7: decoder->private_->frame.header.sample_rate = 24000; break; case 8: decoder->private_->frame.header.sample_rate = 32000; break; case 9: decoder->private_->frame.header.sample_rate = 44100; break; case 10: decoder->private_->frame.header.sample_rate = 48000; break; case 11: decoder->private_->frame.header.sample_rate = 96000; break; case 12: case 13: case 14: sample_rate_hint = x; break; case 15: 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; default: FLAC__ASSERT(0); } x = (unsigned)(raw_header[3] >> 4); if(x & 8) { decoder->private_->frame.heade
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -