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

📄 stream_encoder.c

📁 wince下著名的视频播放器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_QLP_COEFF_PRECISION;	if(encoder->protected_->streamable_subset) {		if(			encoder->protected_->blocksize != 192 &&			encoder->protected_->blocksize != 576 &&			encoder->protected_->blocksize != 1152 &&			encoder->protected_->blocksize != 2304 &&			encoder->protected_->blocksize != 4608 &&			encoder->protected_->blocksize != 256 &&			encoder->protected_->blocksize != 512 &&			encoder->protected_->blocksize != 1024 &&			encoder->protected_->blocksize != 2048 &&			encoder->protected_->blocksize != 4096 &&			encoder->protected_->blocksize != 8192 &&			encoder->protected_->blocksize != 16384		)			return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;		if(			encoder->protected_->sample_rate != 8000 &&			encoder->protected_->sample_rate != 16000 &&			encoder->protected_->sample_rate != 22050 &&			encoder->protected_->sample_rate != 24000 &&			encoder->protected_->sample_rate != 32000 &&			encoder->protected_->sample_rate != 44100 &&			encoder->protected_->sample_rate != 48000 &&			encoder->protected_->sample_rate != 96000		)			return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;		if(			encoder->protected_->bits_per_sample != 8 &&			encoder->protected_->bits_per_sample != 12 &&			encoder->protected_->bits_per_sample != 16 &&			encoder->protected_->bits_per_sample != 20 &&			encoder->protected_->bits_per_sample != 24		)			return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;		if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER)			return encoder->protected_->state = FLAC__STREAM_ENCODER_NOT_STREAMABLE;	}	if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))		encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1;	if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order)		encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order;	/* validate metadata */	if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0)		return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;	metadata_has_seektable = false;	metadata_has_vorbis_comment = false;	for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {		if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_STREAMINFO)			return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;		else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) {			if(metadata_has_seektable) /* only one is allowed */				return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;			metadata_has_seektable = true;			if(!FLAC__format_seektable_is_legal(&encoder->protected_->metadata[i]->data.seek_table))				return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;		}		else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {			if(metadata_has_vorbis_comment) /* only one is allowed */				return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;			metadata_has_vorbis_comment = true;		}		else if(encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_CUESHEET) {			if(!FLAC__format_cuesheet_is_legal(&encoder->protected_->metadata[i]->data.cue_sheet, encoder->protected_->metadata[i]->data.cue_sheet.is_cd, /*violation=*/0))				return encoder->protected_->state = FLAC__STREAM_ENCODER_INVALID_METADATA;		}	}	encoder->private_->input_capacity = 0;	for(i = 0; i < encoder->protected_->channels; i++) {		encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0;#ifndef FLAC__INTEGER_ONLY_LIBRARY		encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0;#endif	}	for(i = 0; i < 2; i++) {		encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0;#ifndef FLAC__INTEGER_ONLY_LIBRARY		encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0;#endif	}	for(i = 0; i < encoder->protected_->channels; i++) {		encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0;		encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0;		encoder->private_->best_subframe[i] = 0;	}	for(i = 0; i < 2; i++) {		encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0;		encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0;		encoder->private_->best_subframe_mid_side[i] = 0;	}	encoder->private_->abs_residual_unaligned = encoder->private_->abs_residual = 0;	encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0;	encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0;#ifndef FLAC__INTEGER_ONLY_LIBRARY	encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5);#else	/* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */	/* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply&divide by hand */	FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350);	FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535);	FLAC__ASSERT(encoder->protected_->sample_rate <= 655350);	FLAC__ASSERT(encoder->protected_->blocksize <= 65535);	encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF);#endif	if(encoder->private_->loose_mid_side_stereo_frames == 0)		encoder->private_->loose_mid_side_stereo_frames = 1;	encoder->private_->loose_mid_side_stereo_frame_count = 0;	encoder->private_->current_sample_number = 0;	encoder->private_->current_frame_number = 0;	encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30);	encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */	encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */	/*	 * get the CPU info and set the function pointers	 */	FLAC__cpu_info(&encoder->private_->cpuinfo);	/* first default to the non-asm routines */#ifndef FLAC__INTEGER_ONLY_LIBRARY	encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation;#endif	encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor;#ifndef FLAC__INTEGER_ONLY_LIBRARY	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients;	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide;	encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients;#endif	/* now override with asm where appropriate */#ifndef FLAC__INTEGER_ONLY_LIBRARY# ifndef FLAC__NO_ASM	if(encoder->private_->cpuinfo.use_asm) {#  ifdef FLAC__CPU_IA32		FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32);#   ifdef FLAC__HAS_NASM#    ifdef FLAC__SSE_OS		if(encoder->private_->cpuinfo.data.ia32.sse) {			if(encoder->protected_->max_lpc_order < 4)				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4;			else if(encoder->protected_->max_lpc_order < 8)				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8;			else if(encoder->protected_->max_lpc_order < 12)				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12;			else				encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;		}		else#    endif /* FLAC__SSE_OS */		if(encoder->private_->cpuinfo.data.ia32._3dnow)			encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow;		else			encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32;		if(encoder->private_->cpuinfo.data.ia32.mmx) {			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx;		}		else {			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;			encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32;		}		if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov)			encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov;#   endif /* FLAC__HAS_NASM */#  endif /* FLAC__CPU_IA32 */	}# endif /* !FLAC__NO_ASM */#endif /* !FLAC__INTEGER_ONLY_LIBRARY */	/* finally override based on wide-ness if necessary */	if(encoder->private_->use_wide_by_block) {		encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide;	}	/* we require precompute_partition_sums if do_escape_coding because of their intertwined nature */	encoder->private_->precompute_partition_sums = (encoder->protected_->max_residual_partition_order > encoder->protected_->min_residual_partition_order) || encoder->protected_->do_escape_coding;	if(!resize_buffers_(encoder, encoder->protected_->blocksize)) {		/* the above function sets the state for us in case of an error */		return encoder->protected_->state;	}	if(!FLAC__bitbuffer_init(encoder->private_->frame))		return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;	/*	 * Set up the verify stuff if necessary	 */	if(encoder->protected_->verify) {		/*		 * First, set up the fifo which will hold the		 * original signal to compare against		 */		encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize;		for(i = 0; i < encoder->protected_->channels; i++) {			if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)malloc(sizeof(FLAC__int32) * encoder->private_->verify.input_fifo.size)))				return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;		}		encoder->private_->verify.input_fifo.tail = 0;		/*		 * Now set up a stream decoder for verification		 */		encoder->private_->verify.decoder = FLAC__stream_decoder_new();		if(0 == encoder->private_->verify.decoder)			return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;		FLAC__stream_decoder_set_read_callback(encoder->private_->verify.decoder, verify_read_callback_);		FLAC__stream_decoder_set_write_callback(encoder->private_->verify.decoder, verify_write_callback_);		FLAC__stream_decoder_set_metadata_callback(encoder->private_->verify.decoder, verify_metadata_callback_);		FLAC__stream_decoder_set_error_callback(encoder->private_->verify.decoder, verify_error_callback_);		FLAC__stream_decoder_set_client_data(encoder->private_->verify.decoder, encoder);		if(FLAC__stream_decoder_init(encoder->private_->verify.decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)			return encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR;	}	encoder->private_->verify.error_stats.absolute_sample = 0;	encoder->private_->verify.error_stats.frame_number = 0;	encoder->private_->verify.error_stats.channel = 0;	encoder->private_->verify.error_stats.sample = 0;	encoder->private_->verify.error_stats.expected = 0;	encoder->private_->verify.error_stats.got = 0;	/*	 * write the stream header	 */	if(encoder->protected_->verify)		encoder->private_->verify.state_hint = ENCODER_IN_MAGIC;	if(!FLAC__bitbuffer_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN))		return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;	if(!write_bitbuffer_(encoder, 0)) {		/* the above function sets the state for us in case of an error */		return encoder->protected_->state;	}	/*	 * write the STREAMINFO metadata block	 */	if(encoder->protected_->verify)		encoder->private_->verify.state_hint = ENCODER_IN_METADATA;	encoder->private_->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;	encoder->private_->metadata.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */	encoder->private_->metadata.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;	encoder->private_->metadata.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */	encoder->private_->metadata.data.stream_info.max_blocksize = encoder->protected_->blocksize;	encoder->private_->metadata.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */	encoder->private_->metadata.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */	encoder->private_->metadata.data.stream_info.sample_rate = encoder->protected_->sample_rate;	encoder->private_->metadata.data.stream_info.channels = encoder->protected_->channels;	encoder->private_->metadata.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample;	encoder->private_->metadata.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */	memset(encoder->private_->metadata.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */	FLAC__MD5Init(&encoder->private_->md5context);	if(!FLAC__bitbuffer_clear(encoder->private_->frame))		return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;	if(!FLAC__add_metadata_block(&encoder->private_->metadata, encoder->private_->frame))		return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;	if(!write_bitbuffer_(encoder, 0)) {		/* the above function sets the state for us in case of an error */		return encoder->protected_->state;	}	/*	 * Now that the STREAMINFO block is written, we can init this to an	 * absurdly-high value...	 */	encoder->private_->metadata.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1;	/* ... and clear this to 0 */	encoder->private_->metadata.data.stream_info.total_samples = 0;	/*	 * Check to see if the supplied metadata contains a VORBIS_COMMENT;	 * if not, we will write an empty one (FLAC__add_metadata_block()	 * automatically supplies the vendor string).	 *	 * WATCHOUT: libOggFLAC depends on us to write this block after the	 * STREAMINFO since that's what the mapping requires.  (In the case	 * that metadata_has_vorbis_comment is true it will have already	 * insured that the metadata list is properly ordered.)	 */	if(!metadata_has_vorbis_comment) {		FLAC__StreamMetadata vorbis_comment;		vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT;		vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0);		vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */		vorbis_comment.data.vorbis_comment.vendor_string.length = 0;		vorbis_comment.data.vorbis_comment.vendor_string.entry = 0;		vorbis_comment.data.vorbis_comment.num_comments = 0;		vorbis_comment.data.vorbis_comment.comments = 0;		if(!FLAC__bitbuffer_clear(encoder->private_->frame))			return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;		if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame))			return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;		if(!write_bitbuffer_(encoder, 0)) {			/* the above function sets the state for us in case of an error */			return encoder->protected_->state;		}	}	/*	 * write the user's metadata blocks	 */	for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) {		encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1);		if(!FLAC__bitbuffer_clear(encoder->private_->frame))			return encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;		if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame))			return encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;		if(!write_bitbuffer_(encoder, 0)) {			/* the above function sets the state for us in case of an error */			return encoder->protected_->state;		}	}	if(encoder->protected_->verify)		encoder->private_->verify.state_hint = ENCODER_IN_AUDIO;	return encoder->protected_->state;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -