diff mbox series

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

Message ID 20201006105656.2567-1-chris@miceli.net.au
State New
Headers show
Series [FFmpeg-devel] Convert logfile to AVIOContext to fix file parser | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Chris Miceli Oct. 6, 2020, 10:56 a.m. UTC
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 mbox series

Patch

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;
                 }
             }
         }