diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 816b6c4b08..7431482acc 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -318,7 +318,6 @@ static volatile int received_sigterm = 0; static volatile int received_nb_signals = 0; static atomic_int transcode_init_done = ATOMIC_VAR_INIT(0); static volatile int ffmpeg_exited = 0; -int main_return_code = 0; static int64_t copy_ts_first_pts = AV_NOPTS_VALUE; static void @@ -2951,9 +2950,8 @@ static int transcode(void) /* write the trailer if needed */ for (i = 0; i < nb_output_files; i++) { - ret = of_write_trailer(output_files[i]); - if (ret < 0 && exit_on_error) - exit_program(1); + int err = of_write_trailer(output_files[i]); + ret = err_merge(ret, err); } /* dump report by using the first video and audio streams */ @@ -2975,7 +2973,7 @@ static int transcode(void) exit_program(1); } - return 0; + return ret; } static BenchmarkTimeStamps get_benchmark_time_stamps(void) @@ -3061,9 +3059,8 @@ int main(int argc, char **argv) } current_time = ti = get_benchmark_time_stamps(); - if (transcode() < 0) - exit_program(1); - if (do_benchmark) { + ret = transcode(); + if (ret >= 0 && do_benchmark) { int64_t utime, stime, rtime; current_time = get_benchmark_time_stamps(); utime = current_time.user_usec - ti.user_usec; @@ -3078,6 +3075,7 @@ int main(int argc, char **argv) if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1]) exit_program(69); - exit_program(received_nb_signals ? 255 : main_return_code); - return main_return_code; + ret = received_nb_signals ? 255 : ret; + exit_program(ret); + return ret; } diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 84ce017320..ddfeeabf75 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -756,7 +756,6 @@ extern const OptionDef options[]; extern HWDevice *filter_hw_device; extern unsigned nb_output_dumped; -extern int main_return_code; extern int ignore_unknown_streams; extern int copy_unknown_streams; @@ -887,6 +886,17 @@ void close_output_stream(OutputStream *ost); int trigger_fix_sub_duration_heartbeat(OutputStream *ost, const AVPacket *pkt); void update_benchmark(const char *fmt, ...); +/** + * Merge two return codes - return one of the error codes if at least one of + * them was negative, 0 otherwise. + * Currently just picks the first one, eventually we might want to do something + * more sophisticated, like sorting them by priority. + */ +static inline int err_merge(int err0, int err1) +{ + return (err0 < 0) ? err0 : FFMIN(err1, 0); +} + #define SPECIFIER_OPT_FMT_str "%s" #define SPECIFIER_OPT_FMT_i "%i" #define SPECIFIER_OPT_FMT_i64 "%"PRId64 diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 5663b8f11d..c2b7993e66 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -602,7 +602,7 @@ int of_write_trailer(OutputFile *of) { Muxer *mux = mux_from_of(of); AVFormatContext *fc = mux->fc; - int ret; + int ret, mux_result = 0; if (!mux->tq) { av_log(mux, AV_LOG_ERROR, @@ -611,14 +611,12 @@ int of_write_trailer(OutputFile *of) return AVERROR(EINVAL); } - ret = thread_stop(mux); - if (ret < 0) - main_return_code = ret; + mux_result = thread_stop(mux); ret = av_write_trailer(fc); if (ret < 0) { av_log(mux, AV_LOG_ERROR, "Error writing trailer: %s\n", av_err2str(ret)); - return ret; + mux_result = err_merge(mux_result, ret); } mux->last_filesize = filesize(fc->pb); @@ -627,11 +625,11 @@ int of_write_trailer(OutputFile *of) ret = avio_closep(&fc->pb); if (ret < 0) { av_log(mux, AV_LOG_ERROR, "Error closing file: %s\n", av_err2str(ret)); - return ret; + mux_result = err_merge(mux_result, ret); } } - return 0; + return mux_result; } static void ost_free(OutputStream **post)