From patchwork Sun Nov 12 13:29:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 6010 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp1074498jah; Sun, 12 Nov 2017 05:30:27 -0800 (PST) X-Google-Smtp-Source: AGs4zMadGSomN46oqrjPBiYvrQVEuT/PXc5x+H3wkHL6RAd+9nRTcMeSq1VJCQHi/qIr/UZoSrWQ X-Received: by 10.28.196.70 with SMTP id u67mr4589813wmf.100.1510493427160; Sun, 12 Nov 2017 05:30:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510493427; cv=none; d=google.com; s=arc-20160816; b=AIHg3T2W43tbT7oQPhhm13U2VWqf4IQ8Ut99iX7dSRY1/KPL0slz7CVbNpALDLAkSe GIzNDfjIFpT/l5k1iitxhzfIRnpQV/ncvnlD3PdkKCv0wOL1NKXCwhobkcRE1dXJEZ3j 572GQnVgfKMWZlVXDE/NnFRSp5gSLDugmXkD1H6kA/fZMysQ+R808GjJLO8iJwfBDV7r 1LaYf2CC118Uxis8PRDXdN/D3LMxvFPhj3PnZ4Yl0hPerT7lkFhFUeRGX6cp8pq6OwVF x2HOYqoqq351rmo7sV3FXXwQAoYfSgJ8IDiFjZJqLLm2EDLKvcjbbYlytfT3S9JAaoT3 yzJw== 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 :delivered-to:arc-authentication-results; bh=o2DlXe+l0OMpmBA5g83D4Z8IGmpd7m+cjboE+LYOx5g=; b=EkYhJK1MMIvThEYf+AYiS5HZjIsqNUvk7T04qXPORbiVaMChrz306ZtbShdpu1RroM N+onVuoY8qNFbh7hIbym5quIFrC2ik8JLHUn+uCTaA+W02v2HbeG7ztxWHUyLB50gecW sRYpeXc9+3VCcxNlS6atFa8uJLuWdr1g+aKj3BfoHg1hkiUOGH3hYxd+BUqzgGymP1EE CKFwWMhPByC3DLGiUbkDQyxy6T2me5iHTuQJOI4NeLlynNUSRKXASbogcDTuq8esS9YY oErnmDyrhliYJ3Oi0trLIoNkH2Gj89QNbuDCXG69ns4dd2fuzXlcyulqcop0m/ruy2ii x2pg== ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b132si485306wmf.23.2017.11.12.05.30.26; Sun, 12 Nov 2017 05:30:27 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 91CB868A3FB; Sun, 12 Nov 2017 15:30:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbg252.qq.com (SMTPBG252.QQ.COM [183.60.52.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4285F68A3E5 for ; Sun, 12 Nov 2017 15:30:03 +0200 (EET) X-QQ-mid: bizesmtp1t1510493378th9cuk0zn Received: from localhost (unknown [123.115.193.168]) by esmtp4.qq.com (ESMTP) with id ; Sun, 12 Nov 2017 21:29:37 +0800 (CST) X-QQ-SSF: 01100000004000F0FI70B00A0000000 X-QQ-FEAT: 7NEolFwWs8XhOupw0bwFr/ERQVEt1l5DzanTHdkl0Ono62UneNlqeP/JyBk70 96koTQBdIQXPg2KyU26SJfdDGGbvGYG4t1BOayJpPuQCiI1Kx4W7n1JW/AgCsTaCu9Or5iI htgVqvujO2JVnwZM+DNCHeX/NAF1nD7pODwTUykESaweY5p5vQlF7al4plUxpdkYphU5NDd q+iLUz3YuZahv/jmTl6jyZSIAqCzKM1Cb07Ar93LmX0TQ40M9NYKtzCh16hHtdCUnNXcluS Rnl3cI/8lNM2543ce23z1a3E0= X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Sun, 12 Nov 2017 21:29:35 +0800 Message-Id: <20171112132935.57691-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.11.0 (Apple Git-81) X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybgforeign:qybgforeign1 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH] avformat/hlsenc: write fmp4 init header after first AV frame 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: Steven Liu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" fix ticket id: 6825 Signed-off-by: Steven Liu --- libavformat/hlsenc.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 5ea9d216a4..3a4c8d65be 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -108,6 +108,9 @@ typedef struct HLSContext { uint32_t start_sequence_source_type; // enum StartSequenceSourceType AVOutputFormat *oformat; AVOutputFormat *vtt_oformat; + AVIOContext *out; + int packets_written; + int init_range_length; AVFormatContext *avf; AVFormatContext *vtt_avf; @@ -607,9 +610,14 @@ static int hls_mux_init(AVFormatContext *s) av_log(s, AV_LOG_WARNING, "Multi-file byterange mode is currently unsupported in the HLS muxer.\n"); return AVERROR_PATCHWELCOME; } + hls->packets_written = 0; + hls->init_range_length = 0; hls->fmp4_init_mode = !byterange_mode; set_http_options(s, &options, hls); - if ((ret = s->io_open(s, &oc->pb, hls->base_output_dirname, AVIO_FLAG_WRITE, &options)) < 0) { + if ((ret = avio_open_dyn_buf(&oc->pb)) < 0) + return ret; + + if ((ret = s->io_open(s, &hls->out, hls->base_output_dirname, AVIO_FLAG_WRITE, &options)) < 0) { av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", hls->fmp4_init_filename); return ret; } @@ -634,6 +642,7 @@ static int hls_mux_init(AVFormatContext *s) av_dict_free(&options); return AVERROR(EINVAL); } + avio_flush(oc->pb); av_dict_free(&options); } return 0; @@ -1600,6 +1609,8 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) int is_ref_pkt = 1; int ret = 0, can_split = 1; int stream_index = 0; + int range_length = 0; + uint8_t *buffer = NULL; if (hls->sequence - hls->nb_entries > hls->start_sequence && hls->init_time > 0) { /* reset end_pts, hls->recording_time at end of the init hls list */ @@ -1645,7 +1656,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) } } - if (hls->fmp4_init_mode || can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base, + if (hls->packets_written && can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base, end_pts, AV_TIME_BASE_Q) >= 0) { int64_t new_start_pos; char *old_filename = av_strdup(hls->avf->filename); @@ -1661,7 +1672,17 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) hls->size = new_start_pos - hls->start_pos; if (!byterange_mode) { - ff_format_io_close(s, &oc->pb); + if (hls->segment_type == SEGMENT_TYPE_FMP4 && !hls->init_range_length) { + avio_flush(oc->pb); + range_length = avio_close_dyn_buf(oc->pb, &buffer); + avio_write(hls->out, buffer, range_length); + hls->init_range_length = range_length; + avio_open_dyn_buf(&oc->pb); + hls->packets_written = 0; + ff_format_io_close(s, &hls->out); + } else { + ff_format_io_close(s, &oc->pb); + } if (hls->vtt_avf) { ff_format_io_close(s, &hls->vtt_avf->pb); } @@ -1719,6 +1740,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) } } + hls->packets_written++; ret = ff_write_chained(oc, stream_index, pkt, s, 0); return ret;