mirror of
https://github.com/claunia/flac.git
synced 2025-12-16 18:54:26 +00:00
Fix bug where using -F with FLAC-to-FLAC transcoding of a corrupted FLAC would have no effect (SF#1615391: https://sourceforge.net/tracker/index.php?func=detail&aid=1615391&group_id=13478&atid=113478)
This commit is contained in:
@@ -86,6 +86,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>Fixed a bug that caused suboptimal default compression settings in some locales (<a href="https://sourceforge.net/tracker/index.php?func=detail&aid=1608883&group_id=13478&atid=113478">SF #1608883</a>).</li>
|
<li>Fixed a bug that caused suboptimal default compression settings in some locales (<a href="https://sourceforge.net/tracker/index.php?func=detail&aid=1608883&group_id=13478&atid=113478">SF #1608883</a>).</li>
|
||||||
<li>Fixed a bug where FLAC-to-FLAC transcoding of a corrupted FLAC file would truncate the transcoded file at the first error (<a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1615019&group_id=13478&atid=113478">SF #1615019</a>).</li>
|
<li>Fixed a bug where FLAC-to-FLAC transcoding of a corrupted FLAC file would truncate the transcoded file at the first error (<a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1615019&group_id=13478&atid=113478">SF #1615019</a>).</li>
|
||||||
|
<li>Fixed a bug where using <span class="argument"><a href="documentation.html#flac_options_decode_through_errors">-F</a></span> with FLAC-to-FLAC transcoding of a corrupted FLAC would have no effect (<a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1615391&group_id=13478&atid=113478">SF #1615391</a>).</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ typedef struct {
|
|||||||
|
|
||||||
FLAC__uint64 skip;
|
FLAC__uint64 skip;
|
||||||
FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
|
FLAC__uint64 until; /* a value of 0 mean end-of-stream (i.e. --until=-0) */
|
||||||
|
FLAC__bool continue_through_decode_errors;
|
||||||
FLAC__bool replay_gain;
|
FLAC__bool replay_gain;
|
||||||
unsigned channels;
|
unsigned channels;
|
||||||
unsigned bits_per_sample;
|
unsigned bits_per_sample;
|
||||||
@@ -118,7 +119,7 @@ extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEn
|
|||||||
/*
|
/*
|
||||||
* local routines
|
* local routines
|
||||||
*/
|
*/
|
||||||
static FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FILE *infile, const char *infilename, const char *outfilename);
|
static FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FLAC__bool continue_through_decode_errors, FILE *infile, const char *infilename, const char *outfilename);
|
||||||
static void EncoderSession_destroy(EncoderSession *e);
|
static void EncoderSession_destroy(EncoderSession *e);
|
||||||
static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero);
|
static int EncoderSession_finish_ok(EncoderSession *e, int info_align_carry, int info_align_zero);
|
||||||
static int EncoderSession_finish_error(EncoderSession *e);
|
static int EncoderSession_finish_error(EncoderSession *e);
|
||||||
@@ -178,6 +179,7 @@ int flac__encode_aif(FILE *infile, off_t infilesize, const char *infilename, con
|
|||||||
/*use_ogg=*/false,
|
/*use_ogg=*/false,
|
||||||
#endif
|
#endif
|
||||||
options.common.verify,
|
options.common.verify,
|
||||||
|
options.common.continue_through_decode_errors,
|
||||||
infile,
|
infile,
|
||||||
infilename,
|
infilename,
|
||||||
outfilename
|
outfilename
|
||||||
@@ -590,6 +592,7 @@ int flac__encode_wav(FILE *infile, off_t infilesize, const char *infilename, con
|
|||||||
/*use_ogg=*/false,
|
/*use_ogg=*/false,
|
||||||
#endif
|
#endif
|
||||||
options.common.verify,
|
options.common.verify,
|
||||||
|
options.common.continue_through_decode_errors,
|
||||||
infile,
|
infile,
|
||||||
infilename,
|
infilename,
|
||||||
outfilename
|
outfilename
|
||||||
@@ -1111,6 +1114,7 @@ int flac__encode_raw(FILE *infile, off_t infilesize, const char *infilename, con
|
|||||||
/*use_ogg=*/false,
|
/*use_ogg=*/false,
|
||||||
#endif
|
#endif
|
||||||
options.common.verify,
|
options.common.verify,
|
||||||
|
options.common.continue_through_decode_errors,
|
||||||
infile,
|
infile,
|
||||||
infilename,
|
infilename,
|
||||||
outfilename
|
outfilename
|
||||||
@@ -1365,6 +1369,7 @@ int flac__encode_flac(FILE *infile, off_t infilesize, const char *infilename, co
|
|||||||
/*use_ogg=*/false,
|
/*use_ogg=*/false,
|
||||||
#endif
|
#endif
|
||||||
options.common.verify,
|
options.common.verify,
|
||||||
|
options.common.continue_through_decode_errors,
|
||||||
infile,
|
infile,
|
||||||
infilename,
|
infilename,
|
||||||
outfilename
|
outfilename
|
||||||
@@ -1481,6 +1486,12 @@ int flac__encode_flac(FILE *infile, off_t infilesize, const char *infilename, co
|
|||||||
* now do samples from the file
|
* now do samples from the file
|
||||||
*/
|
*/
|
||||||
while(!decoder_data.fatal_error && decoder_data.samples_left_to_process > 0) {
|
while(!decoder_data.fatal_error && decoder_data.samples_left_to_process > 0) {
|
||||||
|
/* We can also hit the end of stream without samples_left_to_process
|
||||||
|
* going to 0 if there are errors and continue_through_decode_errors
|
||||||
|
* is on, so we want to break in that case too:
|
||||||
|
*/
|
||||||
|
if(encoder_session.continue_through_decode_errors && FLAC__stream_decoder_get_state(decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
|
||||||
|
break;
|
||||||
if(!FLAC__stream_decoder_process_single(decoder)) {
|
if(!FLAC__stream_decoder_process_single(decoder)) {
|
||||||
flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
|
flac__utils_printf(stderr, 1, "%s: ERROR: while decoding FLAC input, state = %s\n", encoder_session.inbasefilename, FLAC__stream_decoder_get_resolved_state_string(decoder));
|
||||||
goto fubar2; /*@@@ yuck */
|
goto fubar2; /*@@@ yuck */
|
||||||
@@ -1507,7 +1518,7 @@ fubar1:
|
|||||||
return EncoderSession_finish_error(&encoder_session);
|
return EncoderSession_finish_error(&encoder_session);
|
||||||
}
|
}
|
||||||
|
|
||||||
FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FILE *infile, const char *infilename, const char *outfilename)
|
FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC__bool verify, FLAC__bool continue_through_decode_errors, FILE *infile, const char *infilename, const char *outfilename)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
FLAC__uint32 test = 1;
|
FLAC__uint32 test = 1;
|
||||||
@@ -1532,6 +1543,7 @@ FLAC__bool EncoderSession_construct(EncoderSession *e, FLAC__bool use_ogg, FLAC_
|
|||||||
(void)use_ogg;
|
(void)use_ogg;
|
||||||
#endif
|
#endif
|
||||||
e->verify = verify;
|
e->verify = verify;
|
||||||
|
e->continue_through_decode_errors = continue_through_decode_errors;
|
||||||
|
|
||||||
e->is_stdout = (0 == strcmp(outfilename, "-"));
|
e->is_stdout = (0 == strcmp(outfilename, "-"));
|
||||||
e->outputfile_opened = false;
|
e->outputfile_opened = false;
|
||||||
@@ -2379,7 +2391,8 @@ void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__Strea
|
|||||||
(void)decoder;
|
(void)decoder;
|
||||||
|
|
||||||
flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", data->encoder_session->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
|
flac__utils_printf(stderr, 1, "%s: ERROR got %s while decoding FLAC input\n", data->encoder_session->inbasefilename, FLAC__StreamDecoderErrorStatusString[status]);
|
||||||
data->fatal_error = true;
|
if(!data->encoder_session->continue_through_decode_errors)
|
||||||
|
data->fatal_error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset)
|
FLAC__bool parse_cuesheet(FLAC__StreamMetadata **cuesheet, const char *cuesheet_filename, const char *inbasefilename, FLAC__bool is_cdda, FLAC__uint64 lead_out_offset)
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ typedef struct {
|
|||||||
char *requested_seek_points;
|
char *requested_seek_points;
|
||||||
int num_requested_seek_points;
|
int num_requested_seek_points;
|
||||||
const char *cuesheet_filename;
|
const char *cuesheet_filename;
|
||||||
|
FLAC__bool continue_through_decode_errors; /* currently only obeyed when encoding from FLAC or Ogg FLAC */
|
||||||
FLAC__bool cued_seekpoints;
|
FLAC__bool cued_seekpoints;
|
||||||
FLAC__bool channel_map_none; /* --channel-map=none specified, eventually will expand to take actual channel map */
|
FLAC__bool channel_map_none; /* --channel-map=none specified, eventually will expand to take actual channel map */
|
||||||
|
|
||||||
|
|||||||
@@ -1680,6 +1680,7 @@ int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_
|
|||||||
common_options.requested_seek_points = option_values.requested_seek_points;
|
common_options.requested_seek_points = option_values.requested_seek_points;
|
||||||
common_options.num_requested_seek_points = option_values.num_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.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.cued_seekpoints = option_values.cued_seekpoints;
|
||||||
common_options.channel_map_none = option_values.channel_map_none;
|
common_options.channel_map_none = option_values.channel_map_none;
|
||||||
common_options.is_first_file = is_first_file;
|
common_options.is_first_file = is_first_file;
|
||||||
|
|||||||
Reference in New Issue
Block a user