⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stream_decoder.c

📁 wince下著名的视频播放器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -