finish reorg, unify encode pipe across formats

This commit is contained in:
Josh Coalson 2007-10-02 00:07:52 +00:00
parent fe975fe175
commit 13c63e4fff
3 changed files with 1128 additions and 1346 deletions

File diff suppressed because it is too large Load Diff

View File

@ -87,6 +87,20 @@ typedef struct {
FLAC__StreamMetadata *pictures[64];
unsigned num_pictures;
FileFormat format;
union {
struct {
FLAC__bool is_big_endian;
FLAC__bool is_unsigned_samples;
unsigned channels;
unsigned bps;
unsigned sample_rate;
} raw;
struct {
foreign_metadata_t *foreign_metadata; /* NULL unless --keep-foreign-metadata requested */
} iff;
} format_options;
struct {
FLAC__bool disable_constant_subframes;
FLAC__bool disable_fixed_subframes;
@ -95,28 +109,6 @@ typedef struct {
} debug;
} encode_options_t;
typedef struct {
encode_options_t common;
foreign_metadata_t *foreign_metadata; /* NULL unless --keep-foreign-metadata requested */
} wav_encode_options_t;
typedef struct {
encode_options_t common;
FLAC__bool is_big_endian;
FLAC__bool is_unsigned_samples;
unsigned channels;
unsigned bps;
unsigned sample_rate;
} raw_encode_options_t;
typedef struct {
encode_options_t common;
} flac_encode_options_t;
int flac__encode_aiff(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, wav_encode_options_t options, FLAC__bool is_aifc);
int flac__encode_wave(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, wav_encode_options_t options);
int flac__encode_raw(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, raw_encode_options_t options);
int flac__encode_flac(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, flac_encode_options_t options, FLAC__bool input_is_ogg);
int flac__encode_file(FILE *infile, off_t infilesize, const char *infilename, const char *outfilename, const FLAC__byte *lookahead, unsigned lookahead_length, encode_options_t options);
#endif

View File

@ -1629,7 +1629,7 @@ int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_
FileFormat input_format = FORMAT_RAW;
int retval;
off_t infilesize;
encode_options_t common_options;
encode_options_t encode_options;
const char *outfilename = get_encoded_outfilename(infilename); /* the final name of the encoded file */
/* internal_outfilename is the file we will actually write to; it will be a temporary name if infilename==outfilename */
char *internal_outfilename = 0; /* NULL implies 'use outfilename' */
@ -1790,56 +1790,57 @@ int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_
return usage_error("ERROR: --replay-gain cannot be used when encoding to Ogg FLAC yet\n");
}
if(!flac__utils_parse_skip_until_specification(option_values.skip_specification, &common_options.skip_specification) || common_options.skip_specification.is_relative) {
if(!flac__utils_parse_skip_until_specification(option_values.skip_specification, &encode_options.skip_specification) || encode_options.skip_specification.is_relative) {
conditional_fclose(encode_infile);
return usage_error("ERROR: invalid value for --skip\n");
}
if(!flac__utils_parse_skip_until_specification(option_values.until_specification, &common_options.until_specification)) { /*@@@@ more checks: no + without --skip, no - unless known total_samples_to_{en,de}code */
if(!flac__utils_parse_skip_until_specification(option_values.until_specification, &encode_options.until_specification)) { /*@@@@ more checks: no + without --skip, no - unless known total_samples_to_{en,de}code */
conditional_fclose(encode_infile);
return usage_error("ERROR: invalid value for --until\n");
}
/* if there is no "--until" we want to default to "--until=-0" */
if(0 == option_values.until_specification)
common_options.until_specification.is_relative = true;
encode_options.until_specification.is_relative = true;
common_options.verify = option_values.verify;
common_options.treat_warnings_as_errors = option_values.treat_warnings_as_errors;
encode_options.verify = option_values.verify;
encode_options.treat_warnings_as_errors = option_values.treat_warnings_as_errors;
#if FLAC__HAS_OGG
common_options.use_ogg = option_values.use_ogg;
encode_options.use_ogg = option_values.use_ogg;
/* set a random serial number if one has not yet been specified */
if(!option_values.has_serial_number) {
option_values.serial_number = rand();
option_values.has_serial_number = true;
}
common_options.serial_number = option_values.serial_number++;
encode_options.serial_number = option_values.serial_number++;
#endif
common_options.lax = option_values.lax;
common_options.padding = option_values.padding;
common_options.num_compression_settings = option_values.num_compression_settings;
FLAC__ASSERT(sizeof(common_options.compression_settings) >= sizeof(option_values.compression_settings));
memcpy(common_options.compression_settings, option_values.compression_settings, sizeof(option_values.compression_settings));
common_options.requested_seek_points = option_values.requested_seek_points;
common_options.num_requested_seek_points = option_values.num_requested_seek_points;
common_options.cuesheet_filename = option_values.cuesheet_filename;
common_options.continue_through_decode_errors = option_values.continue_through_decode_errors;
common_options.cued_seekpoints = option_values.cued_seekpoints;
common_options.channel_map_none = option_values.channel_map_none;
common_options.is_first_file = is_first_file;
common_options.is_last_file = is_last_file;
common_options.align_reservoir = align_reservoir;
common_options.align_reservoir_samples = &align_reservoir_samples;
common_options.replay_gain = option_values.replay_gain;
common_options.ignore_chunk_sizes = option_values.ignore_chunk_sizes;
common_options.sector_align = option_values.sector_align;
common_options.vorbis_comment = option_values.vorbis_comment;
FLAC__ASSERT(sizeof(common_options.pictures) >= sizeof(option_values.pictures));
memcpy(common_options.pictures, option_values.pictures, sizeof(option_values.pictures));
common_options.num_pictures = option_values.num_pictures;
common_options.debug.disable_constant_subframes = option_values.debug.disable_constant_subframes;
common_options.debug.disable_fixed_subframes = option_values.debug.disable_fixed_subframes;
common_options.debug.disable_verbatim_subframes = option_values.debug.disable_verbatim_subframes;
common_options.debug.do_md5 = option_values.debug.do_md5;
encode_options.lax = option_values.lax;
encode_options.padding = option_values.padding;
encode_options.num_compression_settings = option_values.num_compression_settings;
FLAC__ASSERT(sizeof(encode_options.compression_settings) >= sizeof(option_values.compression_settings));
memcpy(encode_options.compression_settings, option_values.compression_settings, sizeof(option_values.compression_settings));
encode_options.requested_seek_points = option_values.requested_seek_points;
encode_options.num_requested_seek_points = option_values.num_requested_seek_points;
encode_options.cuesheet_filename = option_values.cuesheet_filename;
encode_options.continue_through_decode_errors = option_values.continue_through_decode_errors;
encode_options.cued_seekpoints = option_values.cued_seekpoints;
encode_options.channel_map_none = option_values.channel_map_none;
encode_options.is_first_file = is_first_file;
encode_options.is_last_file = is_last_file;
encode_options.align_reservoir = align_reservoir;
encode_options.align_reservoir_samples = &align_reservoir_samples;
encode_options.replay_gain = option_values.replay_gain;
encode_options.ignore_chunk_sizes = option_values.ignore_chunk_sizes;
encode_options.sector_align = option_values.sector_align;
encode_options.vorbis_comment = option_values.vorbis_comment;
FLAC__ASSERT(sizeof(encode_options.pictures) >= sizeof(option_values.pictures));
memcpy(encode_options.pictures, option_values.pictures, sizeof(option_values.pictures));
encode_options.num_pictures = option_values.num_pictures;
encode_options.format = input_format;
encode_options.debug.disable_constant_subframes = option_values.debug.disable_constant_subframes;
encode_options.debug.disable_fixed_subframes = option_values.debug.disable_fixed_subframes;
encode_options.debug.disable_verbatim_subframes = option_values.debug.disable_verbatim_subframes;
encode_options.debug.do_md5 = option_values.debug.do_md5;
/* if infilename and outfilename point to the same file, we need to write to a temporary file */
if(encode_infile != stdin && grabbag__file_are_same(infilename, outfilename)) {
@ -1855,46 +1856,37 @@ int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_
}
if(input_format == FORMAT_RAW) {
raw_encode_options_t options;
encode_options.format_options.raw.is_big_endian = option_values.format_is_big_endian;
encode_options.format_options.raw.is_unsigned_samples = option_values.format_is_unsigned_samples;
encode_options.format_options.raw.channels = option_values.format_channels;
encode_options.format_options.raw.bps = option_values.format_bps;
encode_options.format_options.raw.sample_rate = option_values.format_sample_rate;
options.common = common_options;
options.is_big_endian = option_values.format_is_big_endian;
options.is_unsigned_samples = option_values.format_is_unsigned_samples;
options.channels = option_values.format_channels;
options.bps = option_values.format_bps;
options.sample_rate = option_values.format_sample_rate;
retval = flac__encode_raw(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, options);
retval = flac__encode_file(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, encode_options);
}
else if(input_format == FORMAT_FLAC || input_format == FORMAT_OGGFLAC) {
flac_encode_options_t options;
options.common = common_options;
retval = flac__encode_flac(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, options, input_format==FORMAT_OGGFLAC);
retval = flac__encode_file(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, encode_options);
}
else {
wav_encode_options_t options;
options.common = common_options;
options.foreign_metadata = 0;
else if(input_format == FORMAT_WAVE || input_format == FORMAT_AIFF || input_format == FORMAT_AIFF_C) {
encode_options.format_options.iff.foreign_metadata = 0;
/* read foreign metadata if requested */
if(option_values.keep_foreign_metadata) {
if(0 == (options.foreign_metadata = flac__foreign_metadata_new(input_format==FORMAT_WAVE? FOREIGN_BLOCK_TYPE__RIFF : FOREIGN_BLOCK_TYPE__AIFF))) {
if(0 == (encode_options.format_options.iff.foreign_metadata = flac__foreign_metadata_new(input_format==FORMAT_WAVE? FOREIGN_BLOCK_TYPE__RIFF : FOREIGN_BLOCK_TYPE__AIFF))) {
flac__utils_printf(stderr, 1, "ERROR: creating foreign metadata object\n");
conditional_fclose(encode_infile);
return 1;
}
}
if(input_format == FORMAT_WAVE)
retval = flac__encode_wave(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, options);
else
retval = flac__encode_aiff(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, options, input_format==FORMAT_AIFF_C);
retval = flac__encode_file(encode_infile, infilesize, infilename, internal_outfilename? internal_outfilename : outfilename, lookahead, lookahead_length, encode_options);
if(options.foreign_metadata)
flac__foreign_metadata_delete(options.foreign_metadata);
if(encode_options.format_options.iff.foreign_metadata)
flac__foreign_metadata_delete(encode_options.format_options.iff.foreign_metadata);
}
else {
FLAC__ASSERT(0);
retval = 1; /* double protection */
}
if(retval == 0) {