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

📄 encode.c

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 C
📖 第 1 页 / 共 5 页
字号:
	}

	return true;
}

void EncoderSession_destroy(EncoderSession *e)
{
	if(e->fin != stdin)
		fclose(e->fin);
	if(0 != e->fout && e->fout != stdout)
		fclose(e->fout);

#ifdef FLAC__HAS_OGG
	if(e->use_ogg) {
		if(e->is_stdout) {
			if(0 != e->encoder.ogg.stream) {
				OggFLAC__stream_encoder_delete(e->encoder.ogg.stream);
				e->encoder.ogg.stream = 0;
			}
		}
		else {
			if(0 != e->encoder.ogg.file) {
				OggFLAC__file_encoder_delete(e->encoder.ogg.file);
				e->encoder.ogg.file = 0;
			}
		}
	}
	else
#endif
	if(e->is_stdout) {
		if(0 != e->encoder.flac.stream) {
			FLAC__stream_encoder_delete(e->encoder.flac.stream);
			e->encoder.flac.stream = 0;
		}
	}
	else {
		if(0 != e->encoder.flac.file) {
			FLAC__file_encoder_delete(e->encoder.flac.file);
			e->encoder.flac.file = 0;
		}
	}

	if(0 != e->seek_table_template) {
		FLAC__metadata_object_delete(e->seek_table_template);
		e->seek_table_template = 0;
	}
}

int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero)
{
	FLAC__StreamEncoderState fse_state = FLAC__STREAM_ENCODER_OK;
	int ret = 0;

#ifdef FLAC__HAS_OGG
	if(e->use_ogg) {
		if(e->is_stdout) {
			if(e->encoder.ogg.stream) {
				fse_state = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.stream);
				OggFLAC__stream_encoder_finish(e->encoder.ogg.stream);
			}
		}
		else {
			if(e->encoder.ogg.file) {
				fse_state = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.file);
				OggFLAC__file_encoder_finish(e->encoder.ogg.file);
			}
		}
	}
	else
#endif
	if(e->is_stdout) {
		if(e->encoder.flac.stream) {
			fse_state = FLAC__stream_encoder_get_state(e->encoder.flac.stream);
			FLAC__stream_encoder_finish(e->encoder.flac.stream);
		}
	}
	else {
		if(e->encoder.flac.file) {
			fse_state = FLAC__file_encoder_get_stream_encoder_state(e->encoder.flac.file);
			FLAC__file_encoder_finish(e->encoder.flac.file);
		}
	}

	if(e->total_samples_to_encode > 0) {
		print_stats(e);
		flac__utils_printf(stderr, 2, "\n");
	}

	if(fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) {
		print_verify_error(e);
		ret = 1;
	}
	else {
		if(info_align_carry >= 0) {
			flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d samples to be carried over\n", e->inbasefilename, info_align_carry);
		}
		if(info_align_zero >= 0) {
			flac__utils_printf(stderr, 1, "%s: INFO: sector alignment causing %d zero samples to be appended\n", e->inbasefilename, info_align_zero);
		}
	}

	EncoderSession_destroy(e);

	return ret;
}

int EncoderSession_finish_error(EncoderSession *e)
{
	FLAC__StreamEncoderState fse_state;

	if(e->total_samples_to_encode > 0)
		flac__utils_printf(stderr, 2, "\n");

#ifdef FLAC__HAS_OGG
	if(e->use_ogg) {
		if(e->is_stdout) {
			fse_state = OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.stream);
		}
		else {
			fse_state = OggFLAC__file_encoder_get_FLAC_stream_encoder_state(e->encoder.ogg.file);
		}
	}
	else
#endif
	if(e->is_stdout) {
		fse_state = FLAC__stream_encoder_get_state(e->encoder.flac.stream);
	}
	else {
		fse_state = FLAC__file_encoder_get_stream_encoder_state(e->encoder.flac.file);
	}

	if(fse_state == FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA)
		print_verify_error(e);
	else
		unlink(e->outfilename);

	EncoderSession_destroy(e);

	return 1;
}

FLAC__bool EncoderSession_init_encoder(EncoderSession *e, encode_options_t options, unsigned channels, unsigned bps, unsigned sample_rate)
{
	unsigned num_metadata;
	FLAC__StreamMetadata padding, *cuesheet = 0;
	FLAC__StreamMetadata *metadata[4];
	const FLAC__bool is_cdda = (channels == 1 || channels == 2) && (bps == 16) && (sample_rate == 44100);

	e->replay_gain = options.replay_gain;
	e->channels = channels;
	e->bits_per_sample = bps;
	e->sample_rate = sample_rate;

	if(e->replay_gain) {
		if(channels != 1 && channels != 2) {
			flac__utils_printf(stderr, 1, "%s: ERROR, number of channels (%u) must be 1 or 2 for --replay-gain\n", e->inbasefilename, channels);
			return false;
		}
		if(!grabbag__replaygain_is_valid_sample_frequency(sample_rate)) {
			flac__utils_printf(stderr, 1, "%s: ERROR, invalid sample rate (%u) for --replay-gain\n", e->inbasefilename, sample_rate);
			return false;
		}
		if(options.is_first_file) {
			if(!grabbag__replaygain_init(sample_rate)) {
				flac__utils_printf(stderr, 1, "%s: ERROR initializing ReplayGain stage\n", e->inbasefilename);
				return false;
			}
		}
	}

	if(channels != 2)
		options.do_mid_side = options.loose_mid_side = false;

	if(!parse_cuesheet_(&cuesheet, options.cuesheet_filename, e->inbasefilename, is_cdda, e->total_samples_to_encode))
		return false;

	if(!convert_to_seek_table_template(options.requested_seek_points, options.num_requested_seek_points, options.cued_seekpoints? cuesheet : 0, e)) {
		flac__utils_printf(stderr, 1, "%s: ERROR allocating memory for seek table\n", e->inbasefilename);
		if(0 != cuesheet)
			FLAC__metadata_object_delete(cuesheet);
		return false;
	}

	num_metadata = 0;
	if(e->seek_table_template->data.seek_table.num_points > 0) {
		e->seek_table_template->is_last = false; /* the encoder will set this for us */
		metadata[num_metadata++] = e->seek_table_template;
	}
	if(0 != cuesheet)
		metadata[num_metadata++] = cuesheet;
	metadata[num_metadata++] = options.vorbis_comment;
	if(options.padding > 0) {
		padding.is_last = false; /* the encoder will set this for us */
		padding.type = FLAC__METADATA_TYPE_PADDING;
		padding.length = (unsigned)options.padding;
		metadata[num_metadata++] = &padding;
	}

	e->blocksize = options.blocksize;
	e->stats_mask = (options.do_exhaustive_model_search || options.do_qlp_coeff_prec_search)? 0x0f : 0x3f;

#ifdef FLAC__HAS_OGG
	if(e->use_ogg) {
		if(e->is_stdout) {
			OggFLAC__stream_encoder_set_serial_number(e->encoder.ogg.stream, options.serial_number);
			OggFLAC__stream_encoder_set_verify(e->encoder.ogg.stream, options.verify);
			OggFLAC__stream_encoder_set_streamable_subset(e->encoder.ogg.stream, !options.lax);
			OggFLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.ogg.stream, options.do_mid_side);
			OggFLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.ogg.stream, options.loose_mid_side);
			OggFLAC__stream_encoder_set_channels(e->encoder.ogg.stream, channels);
			OggFLAC__stream_encoder_set_bits_per_sample(e->encoder.ogg.stream, bps);
			OggFLAC__stream_encoder_set_sample_rate(e->encoder.ogg.stream, sample_rate);
			OggFLAC__stream_encoder_set_blocksize(e->encoder.ogg.stream, options.blocksize);
			OggFLAC__stream_encoder_set_max_lpc_order(e->encoder.ogg.stream, options.max_lpc_order);
			OggFLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.ogg.stream, options.qlp_coeff_precision);
			OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.stream, options.do_qlp_coeff_prec_search);
			OggFLAC__stream_encoder_set_do_escape_coding(e->encoder.ogg.stream, options.do_escape_coding);
			OggFLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.ogg.stream, options.do_exhaustive_model_search);
			OggFLAC__stream_encoder_set_min_residual_partition_order(e->encoder.ogg.stream, options.min_residual_partition_order);
			OggFLAC__stream_encoder_set_max_residual_partition_order(e->encoder.ogg.stream, options.max_residual_partition_order);
			OggFLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.ogg.stream, options.rice_parameter_search_dist);
			OggFLAC__stream_encoder_set_total_samples_estimate(e->encoder.ogg.stream, e->total_samples_to_encode);
			OggFLAC__stream_encoder_set_metadata(e->encoder.ogg.stream, (num_metadata > 0)? metadata : 0, num_metadata);
			OggFLAC__stream_encoder_set_write_callback(e->encoder.ogg.stream, ogg_stream_encoder_write_callback);
			OggFLAC__stream_encoder_set_metadata_callback(e->encoder.ogg.stream, ogg_stream_encoder_metadata_callback);
			OggFLAC__stream_encoder_set_client_data(e->encoder.ogg.stream, e);

			OggFLAC__stream_encoder_disable_constant_subframes(e->encoder.ogg.stream, options.debug.disable_constant_subframes);
			OggFLAC__stream_encoder_disable_fixed_subframes(e->encoder.ogg.stream, options.debug.disable_fixed_subframes);
			OggFLAC__stream_encoder_disable_verbatim_subframes(e->encoder.ogg.stream, options.debug.disable_verbatim_subframes);

			if(OggFLAC__stream_encoder_init(e->encoder.ogg.stream) != FLAC__STREAM_ENCODER_OK) {
				print_error_with_state(e, "ERROR initializing encoder");
				if(0 != cuesheet)
					FLAC__metadata_object_delete(cuesheet);
				return false;
			}
		}
		else {
			OggFLAC__file_encoder_set_serial_number(e->encoder.ogg.file, options.serial_number);
			OggFLAC__file_encoder_set_filename(e->encoder.ogg.file, e->outfilename);
			OggFLAC__file_encoder_set_verify(e->encoder.ogg.file, options.verify);
			OggFLAC__file_encoder_set_streamable_subset(e->encoder.ogg.file, !options.lax);
			OggFLAC__file_encoder_set_do_mid_side_stereo(e->encoder.ogg.file, options.do_mid_side);
			OggFLAC__file_encoder_set_loose_mid_side_stereo(e->encoder.ogg.file, options.loose_mid_side);
			OggFLAC__file_encoder_set_channels(e->encoder.ogg.file, channels);
			OggFLAC__file_encoder_set_bits_per_sample(e->encoder.ogg.file, bps);
			OggFLAC__file_encoder_set_sample_rate(e->encoder.ogg.file, sample_rate);
			OggFLAC__file_encoder_set_blocksize(e->encoder.ogg.file, options.blocksize);
			OggFLAC__file_encoder_set_max_lpc_order(e->encoder.ogg.file, options.max_lpc_order);
			OggFLAC__file_encoder_set_qlp_coeff_precision(e->encoder.ogg.file, options.qlp_coeff_precision);
			OggFLAC__file_encoder_set_do_qlp_coeff_prec_search(e->encoder.ogg.file, options.do_qlp_coeff_prec_search);
			OggFLAC__file_encoder_set_do_escape_coding(e->encoder.ogg.file, options.do_escape_coding);
			OggFLAC__file_encoder_set_do_exhaustive_model_search(e->encoder.ogg.file, options.do_exhaustive_model_search);
			OggFLAC__file_encoder_set_min_residual_partition_order(e->encoder.ogg.file, options.min_residual_partition_order);
			OggFLAC__file_encoder_set_max_residual_partition_order(e->encoder.ogg.file, options.max_residual_partition_order);
			OggFLAC__file_encoder_set_rice_parameter_search_dist(e->encoder.ogg.file, options.rice_parameter_search_dist);
			OggFLAC__file_encoder_set_total_samples_estimate(e->encoder.ogg.file, e->total_samples_to_encode);
			OggFLAC__file_encoder_set_metadata(e->encoder.ogg.file, (num_metadata > 0)? metadata : 0, num_metadata);
			OggFLAC__file_encoder_set_progress_callback(e->encoder.ogg.file, ogg_file_encoder_progress_callback);
			OggFLAC__file_encoder_set_client_data(e->encoder.ogg.file, e);

			OggFLAC__file_encoder_disable_constant_subframes(e->encoder.ogg.file, options.debug.disable_constant_subframes);
			OggFLAC__file_encoder_disable_fixed_subframes(e->encoder.ogg.file, options.debug.disable_fixed_subframes);
			OggFLAC__file_encoder_disable_verbatim_subframes(e->encoder.ogg.file, options.debug.disable_verbatim_subframes);

			if(OggFLAC__file_encoder_init(e->encoder.ogg.file) != OggFLAC__FILE_ENCODER_OK) {
				print_error_with_state(e, "ERROR initializing encoder");
				if(0 != cuesheet)
					FLAC__metadata_object_delete(cuesheet);
				return false;
			}
		}
	}
	else
#endif
	if(e->is_stdout) {
		FLAC__stream_encoder_set_verify(e->encoder.flac.stream, options.verify);
		FLAC__stream_encoder_set_streamable_subset(e->encoder.flac.stream, !options.lax);
		FLAC__stream_encoder_set_do_mid_side_stereo(e->encoder.flac.stream, options.do_mid_side);
		FLAC__stream_encoder_set_loose_mid_side_stereo(e->encoder.flac.stream, options.loose_mid_side);
		FLAC__stream_encoder_set_channels(e->encoder.flac.stream, channels);
		FLAC__stream_encoder_set_bits_per_sample(e->encoder.flac.stream, bps);
		FLAC__stream_encoder_set_sample_rate(e->encoder.flac.stream, sample_rate);
		FLAC__stream_encoder_set_blocksize(e->encoder.flac.stream, options.blocksize);
		FLAC__stream_encoder_set_max_lpc_order(e->encoder.flac.stream, options.max_lpc_order);
		FLAC__stream_encoder_set_qlp_coeff_precision(e->encoder.flac.stream, options.qlp_coeff_precision);
		FLAC__stream_encoder_set_do_qlp_coeff_prec_search(e->encoder.flac.stream, options.do_qlp_coeff_prec_search);
		FLAC__stream_encoder_set_do_escape_coding(e->encoder.flac.stream, options.do_escape_coding);
		FLAC__stream_encoder_set_do_exhaustive_model_search(e->encoder.flac.stream, options.do_exhaustive_model_search);
		FLAC__stream_encoder_set_min_residual_partition_order(e->encoder.flac.stream, options.min_residual_partition_order);
		FLAC__stream_encoder_set_max_residual_partition_order(e->encoder.flac.stream, options.max_residual_partition_order);
		FLAC__stream_encoder_set_rice_parameter_search_dist(e->encoder.flac.stream, options.rice_parameter_search_dist);
		FLAC__stream_encoder_set_total_samples_estimate(e->encoder.flac.stream, e->total_samples_to_encode);
		FLAC__stream_encoder_set_metadata(e->encoder.flac.stream, (num_metadata > 0)? metadata : 0, num_metadata);
		FLAC__stream_encoder_set_write_callback(e->encoder.flac.stream, flac_stream_encoder_write_callback);
		FLAC__stream_encoder_set_metadata_callback(e->encoder.flac.stream, flac_stream_encoder_metadata_callback);
		FLAC__stream_encoder_set_client_data(e->encoder.flac.stream, e);

		F

⌨️ 快捷键说明

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