[FFmpeg-devel] [PATCH] Convert logfile to AVIOContext to fix file parser

Chris Miceli chris at miceli.net.au
Tue Oct 6 13:56:56 EEST 2020


The lack of AVIOContext means that ffmpeg was attempting to open
logfiles for two pass encoding with the "protocol" part of the url on
the first pass. This manifested mainly when a user needed to have a
colon in the filename as they would require a url style path (according
to #8898).
---
 fftools/ffmpeg.c     | 12 +++---------
 fftools/ffmpeg.h     |  2 +-
 fftools/ffmpeg_opt.c |  7 +++----
 3 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 84306818a2..d292e346a9 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -1313,7 +1313,7 @@ static void do_video_out(OutputFile *of,
 
             /* if two pass, output log */
             if (ost->logfile && enc->stats_out) {
-                fprintf(ost->logfile, "%s", enc->stats_out);
+                avio_write(ost->logfile, enc->stats_out, strlen(enc->stats_out));
             }
         }
         ost->sync_opts++;
@@ -1937,7 +1937,7 @@ static void flush_encoders(void)
                 exit_program(1);
             }
             if (ost->logfile && enc->stats_out) {
-                fprintf(ost->logfile, "%s", enc->stats_out);
+                avio_write(ost->logfile, enc->stats_out, strlen(enc->stats_out));
             }
             if (ret == AVERROR_EOF) {
                 output_packet(of, &pkt, ost, 1);
@@ -4751,13 +4751,7 @@ static int transcode(void)
         for (i = 0; i < nb_output_streams; i++) {
             ost = output_streams[i];
             if (ost) {
-                if (ost->logfile) {
-                    if (fclose(ost->logfile))
-                        av_log(NULL, AV_LOG_ERROR,
-                               "Error closing logfile, loss of information possible: %s\n",
-                               av_err2str(AVERROR(errno)));
-                    ost->logfile = NULL;
-                }
+                avio_closep(&ost->logfile);
                 av_freep(&ost->forced_kf_pts);
                 av_freep(&ost->apad);
                 av_freep(&ost->disposition);
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 8665218dcf..d907d4a6ad 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -500,7 +500,7 @@ typedef struct OutputStream {
     int audio_channels_mapped;           /* number of channels in audio_channels_map */
 
     char *logfile_prefix;
-    FILE *logfile;
+    AVIOContext *logfile;
 
     OutputFilter *filter;
     char *avfilter;
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 19f719e3ff..e3e6054b06 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -1813,7 +1813,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
 
         if (do_pass) {
             char logfilename[1024];
-            FILE *f;
 
             snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
                      ost->logfile_prefix ? ost->logfile_prefix :
@@ -1833,14 +1832,14 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
                     video_enc->stats_in = logbuffer;
                 }
                 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
-                    f = av_fopen_utf8(logfilename, "wb");
-                    if (!f) {
+                    int ret = avio_open(&ost->logfile, logfilename, AVIO_FLAG_WRITE);
+
+                    if (ret < 0) {
                         av_log(NULL, AV_LOG_FATAL,
                                "Cannot write log file '%s' for pass-1 encoding: %s\n",
                                logfilename, strerror(errno));
                         exit_program(1);
                     }
-                    ost->logfile = f;
                 }
             }
         }
-- 
2.28.0



More information about the ffmpeg-devel mailing list