📄 encode.c
字号:
}
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 + -