From patchwork Tue Feb 7 20:20:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Stephens X-Patchwork-Id: 2445 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp2439043vsb; Tue, 7 Feb 2017 12:26:00 -0800 (PST) X-Received: by 10.223.161.222 with SMTP id v30mr17765532wrv.114.1486499160051; Tue, 07 Feb 2017 12:26:00 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u188si281383wmd.128.2017.02.07.12.25.59; Tue, 07 Feb 2017 12:26:00 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ustudio.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ustudio.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2A000680A68; Tue, 7 Feb 2017 22:25:54 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot0-f182.google.com (mail-ot0-f182.google.com [74.125.82.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 144C668077F for ; Tue, 7 Feb 2017 22:25:47 +0200 (EET) Received: by mail-ot0-f182.google.com with SMTP id f9so95343799otd.1 for ; Tue, 07 Feb 2017 12:25:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ustudio.com; s=google; h=from:to:cc:subject:date:message-id; bh=K/OLHPiULImlm2yFVigq1fI/sNldUYfI0rO/K0ZhxoM=; b=Bwj/UJ1iUMkB8QKEyJD7DQPJFzROV/j6WhcqcmI+USb/cpmZryQg3DcHVeh+OOfakN g9v58PkR8hVKQZ1/nymiTddDwsIynutL08TwQVIhF9IqAfgxHlAGjtpAvimZQpiR7ve9 YguXZk2yObMpeO622vDja6HvvB0jwPpWvuhFTwpS8ATxwd4yKInnK8RZRdtZ4rTobVq/ DNNsTb+SFTny5UABCT5EBm4raB6DPHLfTLRKrMNp/b6vh2wL7JgOx45gGstHeqkxkMMP CTqIfH5BYZCNLBMNor4DvgdU6AFqNzD1TSZchzuDU/x6qpxWtwcSXp0UA4Y/YzAw8mH0 t0TQ== 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; bh=K/OLHPiULImlm2yFVigq1fI/sNldUYfI0rO/K0ZhxoM=; b=fkVOIcuXeY+p+z8CG0z3mpF9TXcrhpZA/NppSiO8sc036j5tuJQLlN3ytYVd0832wp WZhuWC2lbUuvIQS4XKOgFWrdqR9Q9MMUmxksKZIZpPJapwCX0Eza3obDowvP9nJWbAua CGNm551KgnJQG9eumMdx0QjB2oXExVRsldUIO8ojqYn62K4ORRy7fdXn5dS0a0im7uGL SbfrvLl8yfK0RVV1zZC/bY5+Y1XgHzgs52MlERolIPYgNP+YTJoThhMI5lWzmfN5jeoe H/DtwSO44clLHNeQ4jmohL2je18eElvpauywXoejz2yf4JYTxJoLkChcEzwrrIRyrraP 8lZQ== X-Gm-Message-State: AMke39miDA5zUJfhbOdyE8MFVZFN8Npm3kBD7XHbock2+GvVeaJU518C75E7j5L7H+eUzPYL X-Received: by 10.157.5.144 with SMTP id 16mr10420364otd.2.1486498835232; Tue, 07 Feb 2017 12:20:35 -0800 (PST) Received: from localhost.localdomain (mail.mortgage-pros.biz. [216.201.185.2]) by smtp.gmail.com with ESMTPSA id p8sm2649294otd.27.2017.02.07.12.20.34 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 07 Feb 2017 12:20:34 -0800 (PST) From: Thomas Stephens To: ffmpeg-devel@ffmpeg.org Date: Tue, 7 Feb 2017 14:20:32 -0600 Message-Id: <1486498832-66828-1-git-send-email-thomas@ustudio.com> X-Mailer: git-send-email 2.5.0 Subject: [FFmpeg-devel] [PATCH] avformat/dashenc: Only use temporary files when outputting to file protocol 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: Thomas Stephens MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Skips using temporary files when outputting to a protocol other than "file", which enables dash to output content over network protocols. The logic has been copied from the HLS format. --- libavformat/dashenc.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 534fa75..fa56505 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -444,9 +444,15 @@ static int write_manifest(AVFormatContext *s, int final) AVIOContext *out; char temp_filename[1024]; int ret, i; + const char *proto = avio_find_protocol_name(s->filename); + int use_rename = proto && !strcmp(proto, "file"); + static unsigned int warned_non_file = 0; AVDictionaryEntry *title = av_dict_get(s->metadata, "title", NULL, 0); - snprintf(temp_filename, sizeof(temp_filename), "%s.tmp", s->filename); + if (!use_rename && !warned_non_file++) + av_log(s, AV_LOG_ERROR, "Cannot use rename on non file protocol, this may lead to races and temporary partial files\n"); + + snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", s->filename); ret = s->io_open(s, &out, temp_filename, AVIO_FLAG_WRITE, NULL); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename); @@ -548,7 +554,11 @@ static int write_manifest(AVFormatContext *s, int final) avio_printf(out, "\n"); avio_flush(out); ff_format_io_close(s, &out); - return avpriv_io_move(temp_filename, s->filename); + + if (use_rename) + return avpriv_io_move(temp_filename, s->filename); + + return 0; } static int dash_init(AVFormatContext *s) @@ -796,6 +806,10 @@ static int dash_flush(AVFormatContext *s, int final, int stream) { DASHContext *c = s->priv_data; int i, ret = 0; + + const char *proto = avio_find_protocol_name(s->filename); + int use_rename = proto && !strcmp(proto, "file"); + int cur_flush_segment_index = 0; if (stream >= 0) cur_flush_segment_index = c->streams[stream].segment_index; @@ -833,7 +847,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream) if (!c->single_file) { dash_fill_tmpl_params(filename, sizeof(filename), c->media_seg_name, i, os->segment_index, os->bit_rate, os->start_pts); snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename); - snprintf(temp_path, sizeof(temp_path), "%s.tmp", full_path); + snprintf(temp_path, sizeof(temp_path), use_rename ? "%s.tmp" : "%s", full_path); ret = s->io_open(s, &os->out, temp_path, AVIO_FLAG_WRITE, NULL); if (ret < 0) break; @@ -851,9 +865,12 @@ static int dash_flush(AVFormatContext *s, int final, int stream) find_index_range(s, full_path, start_pos, &index_length); } else { ff_format_io_close(s, &os->out); - ret = avpriv_io_move(temp_path, full_path); - if (ret < 0) - break; + + if (use_rename) { + ret = avpriv_io_move(temp_path, full_path); + if (ret < 0) + break; + } } add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, start_pos, range_length, index_length); av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, full_path);