From patchwork Mon Feb 19 05:55:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dixit, Vishwanath" X-Patchwork-Id: 7649 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.150.33 with SMTP id c30csp1143939jai; Sun, 18 Feb 2018 21:55:43 -0800 (PST) X-Google-Smtp-Source: AH8x22706+Gmlrfz9Tgnx67XUEnTRQ3NSRU8nuX+LsCZ8ZndoFUymQzV/0ik8fOIONifIWlgW5lI X-Received: by 10.223.135.232 with SMTP id c37mr11048755wrc.168.1519019743446; Sun, 18 Feb 2018 21:55:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519019743; cv=none; d=google.com; s=arc-20160816; b=eAqUfL6t1aDa0g6QRyFHiZvhZnloLTCApeMiMO5CX6nlh/uVQT8gprizT6iF0C0K/2 gfWav+TPNr23+soua/FOWQToFJ/89evvJvopWgAdobe7E/mOpoJIH2SrVhdoLcEKMkWV j24yRshg95QiYX9xEJDuLn3PpWZ1UboezrYt7wLFtbUWODhxAyLqzAgOUpnGZtKC6BP9 Z9D5jzh98ZJeu9a7hnZHDXTZr8MltX4Hc2T4hblapL1YWpf4n4zhBY4r0y6/9JUxvvnh xMTdnzJPx4ALnzvkVKdoHlc39SSQiqRM1gQ/9DdrBjVo8sGsea7qsss+6T5MfLS7V/yw rw4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:message-id:date:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=QhkIcb9ATKgsMpW9uQWTCYctPbczK6nIWSlClV4FQ4A=; b=x+MV4dDjBVXz+5/l5aVerKbpbiIWPsHDC2Z8lSS21wJcvU70aB2CM3lPE69mPLoeVb vXSjlAaF1ikpLHItkmUlsn6imb7ZmQGXcucGFfTD7UBKfUGbf/RzbAQ9erIksrAGu+Th 6yJPhLrVrVStYb3eUgw0LPgf89aOyuTWWX8qifE3BaymGHMoLijWod+5Wmuh6UY4L5C1 k/SuZpI7S4D477BmaO8hGeH9FKt4Yr9xh7NnIPZ7oE5C3XBMY10IW1vdCrQ+AXG3Q5TO AauO8bkIxmLcnvmhjwdBLdx0n86o2hkpd/SnILmSnpS1qWf3UD/Pnl1x8lOz6YzEXoQO tVrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=xPVGUfGT; 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=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y133si7586053wmd.98.2018.02.18.21.55.43; Sun, 18 Feb 2018 21:55:43 -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=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=xPVGUfGT; 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=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 70D4F689E35; Mon, 19 Feb 2018 07:55:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from a2i831.smtp2go.com (a2i831.smtp2go.com [103.47.207.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 35B98689E1C for ; Mon, 19 Feb 2018 07:55:35 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1519020641; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=n/120Eus1fo9lSNoo0/jPOSObFHMa96k9k6ixDN0eVk=; b=xPVGUfGT PWK0yE/Au+5DuKO1GQCx7XVIvWi28oCUungWu2xEh5IeikKNMYCIOtF393sy2xFhGphKFpMPBxDot d4+4Vn2J4qD+MZTQ0ivQx5iQe15sN+hU99H0f1T3FCNESywC3H+J2GKWVb5suOxboQA0Mdye+la7a WZjn1jNejdiSY/qwTPjBQGXsNyTtdmxLhuVrNKTxAfob2yQITEXJ9zKceoYO7/FAd/mFRZsLme824 4I3P3eG5pMHu+N+3E6dJmQ3i0pnsLXp8gmbqY+6qWM6VFsQYsUNrgXTbueg8rQeGpsIZSIXDk7R8/ RaynGHc8hrBJAy+F+xXX8o9sFA==; From: vdixit@akamai.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 19 Feb 2018 11:25:25 +0530 Message-Id: <1519019725-12472-1-git-send-email-vdixit@akamai.com> X-Mailer: git-send-email 1.9.1 X-Smtpcorp-Track: 1-n-QFRyIuEXuk.iiPSGlTez Feedback-ID: 337386m:337386asVRLGB:337386sbnA6rsNn2:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH 2/3] avformat/dashenc: opening a segment file when its first frame is ready 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: Vishwanath Dixit MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Vishwanath Dixit --- libavformat/dashenc.c | 57 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 0f6f4f2..0eb4b25 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -81,6 +81,9 @@ typedef struct OutputStream { char bandwidth_str[64]; char codec_str[100]; + char filename[1024]; + char full_path[1024]; + char temp_path[1024]; } OutputStream; typedef struct DASHContext { @@ -1134,7 +1137,6 @@ static int dash_flush(AVFormatContext *s, int final, int stream) for (i = 0; i < s->nb_streams; i++) { OutputStream *os = &c->streams[i]; AVStream *st = s->streams[i]; - char filename[1024] = "", full_path[1024], temp_path[1024]; int range_length, index_length = 0; if (!os->packets_written) @@ -1152,24 +1154,11 @@ static int dash_flush(AVFormatContext *s, int final, int stream) continue; } - if (!os->init_range_length) { - flush_init_segment(s, os); - } - if (!c->single_file) { - AVDictionary *opts = NULL; - ff_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), use_rename ? "%s.tmp" : "%s", full_path); - set_http_options(&opts, c); - ret = dashenc_io_open(s, &os->out, temp_path, &opts); - if (ret < 0) - break; - av_dict_free(&opts); if (!strcmp(os->format_name, "mp4")) write_styp(os->ctx->pb); } else { - snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, os->initfile); + snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile); } ret = flush_dynbuf(os, &range_length); @@ -1178,12 +1167,12 @@ static int dash_flush(AVFormatContext *s, int final, int stream) os->packets_written = 0; if (c->single_file) { - find_index_range(s, full_path, os->pos, &index_length); + find_index_range(s, os->full_path, os->pos, &index_length); } else { - dashenc_io_close(s, &os->out, temp_path); + dashenc_io_close(s, &os->out, os->temp_path); if (use_rename) { - ret = avpriv_io_move(temp_path, full_path); + ret = avpriv_io_move(os->temp_path, os->full_path); if (ret < 0) break; } @@ -1200,8 +1189,8 @@ static int dash_flush(AVFormatContext *s, int final, int stream) " bandwidth=\"%d\"", os->bit_rate); } } - add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, os->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); + add_segment(os, os->filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length); + av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, os->full_path); os->pos += range_length; } @@ -1303,7 +1292,33 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) else os->max_pts = FFMAX(os->max_pts, pkt->pts + pkt->duration); os->packets_written++; - return ff_write_chained(os->ctx, 0, pkt, s, 0); + if ((ret = ff_write_chained(os->ctx, 0, pkt, s, 0)) < 0) + return ret; + + if (!os->init_range_length) + flush_init_segment(s, os); + + //open the output context when the first frame of a segment is ready + if (!c->single_file && !os->out) { + AVDictionary *opts = NULL; + const char *proto = avio_find_protocol_name(s->filename); + int use_rename = proto && !strcmp(proto, "file"); + os->filename[0] = os->full_path[0] = os->temp_path[0] = '\0'; + ff_dash_fill_tmpl_params(os->filename, sizeof(os->filename), + c->media_seg_name, pkt->stream_index, + os->segment_index, os->bit_rate, os->start_pts); + snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, + os->filename); + snprintf(os->temp_path, sizeof(os->temp_path), + use_rename ? "%s.tmp" : "%s", os->full_path); + set_http_options(&opts, c); + ret = dashenc_io_open(s, &os->out, os->temp_path, &opts); + if (ret < 0) + return ret; + av_dict_free(&opts); + } + + return ret; } static int dash_write_trailer(AVFormatContext *s)