From patchwork Tue Oct 6 10:56:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Miceli X-Patchwork-Id: 22738 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C56BC44B467 for ; Tue, 6 Oct 2020 14:23:51 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 954D368B570; Tue, 6 Oct 2020 14:23:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AC2B168A315 for ; Tue, 6 Oct 2020 14:23:44 +0300 (EEST) Received: by mail-pf1-f196.google.com with SMTP id w21so8830220pfc.7 for ; Tue, 06 Oct 2020 04:23:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=miceli-net-au.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kdwvHn8AfinWb7+uhR7kkEnKUcCzcUgPkah/ye59YjY=; b=SXADEdEsQ1N+ZtwXWIWdnsHVv3F5k4s4aQ3R6Uk+ziRnJXaoc0loO1Rs4NcFbPqYZl PQuoA1Dkk6Eu6po+xtwc811TGRbHLlFauwBrvC3EChe8zff2LQuZMBnCCFmjQcSCE9QY XJDjIjI8+AwT6XtJTBWE59w4wdoeGZgVeAJQsmZV8vVAAagp3ouceQwJNJ01LrESEL76 CvYkjs8z+GPu0Fq6iJTZQeiJ3LBWcboX8NeKiadkc4QpNO3imOP1kKJi4NeROZ4MzT4e RpJIS2p80Wzc6qzjGH36ADiDYw7ST85FgtijoiXQy/lS6sv1czRi+zFlsk28a433ckdV gFyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kdwvHn8AfinWb7+uhR7kkEnKUcCzcUgPkah/ye59YjY=; b=UAec7FKKNOcphyZnCJF4VjFRaJulPk+8C9ZBmSYxkcE7RL3rxeOF8eh9Laqmfn9qUx GgSc65QdlXYe9dX6SEGY6RyZdA5gmNdYTpCFmIwjju+TW31ADIwwkir06TXIP77IGhCe /Ai7hUtlQi+/HYcm+7nyH2XUt8bQEazWdrQr6TWGSRm//j9iCta6E1QXyDFQIobX1ra6 QKx+VPaCWAkVzMoVq9ppshtxmfJ+j10LVUN2eDwJm1ENRAeW7Zr62FsWqW9Au3+zS8b1 2gsOGG106xERa7KmOd64E9ESQng5DiKFuxypjZWaCHII6VweA28/QpQHCjP+7AueHVvg XarQ== X-Gm-Message-State: AOAM532YRt//0+n287bleyz4O9G5KGkgKfLxBaVvJr3pyyzQDOlcOQAy Hvs8qU9TMsCXchQyEz2BTu1gF1aQ7NzixY0d X-Google-Smtp-Source: ABdhPJxpOnHOBRR/I+zNV/R+sPQE6umAcDCKxpAV/wOqs8uzM5fY78aXIEHtZT9yYUQIGGIrxISLQw== X-Received: by 2002:a17:902:b785:b029:d3:d779:7806 with SMTP id e5-20020a170902b785b02900d3d7797806mr2677412pls.70.1601981828029; Tue, 06 Oct 2020 03:57:08 -0700 (PDT) Received: from edna.localdomain (119-18-3-107.771203.syd.nbn.aussiebb.net. [119.18.3.107]) by smtp.gmail.com with ESMTPSA id i24sm3195125pfd.15.2020.10.06.03.57.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Oct 2020 03:57:07 -0700 (PDT) From: Chris Miceli To: ffmpeg-devel@ffmpeg.org Date: Tue, 6 Oct 2020 21:56:56 +1100 Message-Id: <20201006105656.2567-1-chris@miceli.net.au> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] Convert logfile to AVIOContext to fix file parser X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Chris Miceli Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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; } } }