From patchwork Mon Mar 12 06:35:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 7945 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp1257676jad; Sun, 11 Mar 2018 23:35:49 -0700 (PDT) X-Google-Smtp-Source: AG47ELvUpn+NSvAOpRupEZedr0J6+Q4lV7qx3LvdBcVw9nObXuZ0bonD61JnYdJkrYU6PR2BY/gz X-Received: by 10.223.134.42 with SMTP id 39mr5495392wrv.10.1520836548964; Sun, 11 Mar 2018 23:35:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520836548; cv=none; d=google.com; s=arc-20160816; b=ZOMLm61VvgYDiThZUrYfKwqf8eF7aQzPIlrK7oi2UTbwTTHCLKmAyKi2fj9AecUCfg loSs4cIr4kAhimKMkT26mM9NMQgK8CPEDqhLI2Y52nLUvY02718nAXCScNIa41gyfCsy PwfgMgX9jREV0gV3yZGGYElhjQXFMkwtaLGbglUYoW+0/mD52MM+86UyZMoRoOSwqqOI AoLNoNUWoFBainkxJbqwc5FEk0vaTfRHOWpUMhG2NIlxdPIzp9syGrscfBH2l9L84TPU FIZyosp94PC4Uk1rPsNJumWUyw7HRPZw1s4aQwn0zBVrbjyXqlM5WPuo4hWMx21Evsgf I+MQ== 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=B7quKWArQtog7hptGNCgi56+u7+mx6LZbI2azUoJa58=; b=KeLmipbnJ86ZoN4XWf8pYQaartWsEF79Dft1dO8huRboYI7PIgcJZ67ajCtYnZqoSO mzPxu5Ekf9BY0EBRskPZOFJUQohPzAlDQ/302h5MbMGjH4yWH4MeRu2yf/+T/bgDcxYs t1uR9jyQFGCSdohfttTnDADboLdAWL5zw9UGCqQwOheKFj3Pse7MpFqNJvfzjSaU9T/1 RKLEYXksSnWNl0iaJatHhcneMNE10FtiVYAOwEt7FrBx4/2g0hmpMd4kl9dtTzGKc1dM JF0Gl0cQwbzDJoSTJmzx3zlEVnSXg2vceloS0PpymJHFae/b80TWgOABgKbHdb3l30Sq GugA== 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 a20si2769407wma.13.2018.03.11.23.35.48; Sun, 11 Mar 2018 23:35:48 -0700 (PDT) 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 A077D68A459; Mon, 12 Mar 2018 08:35:36 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbg321.qq.com (smtpbg321.qq.com [14.17.32.30]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CB67F68A39A for ; Mon, 12 Mar 2018 08:35:34 +0200 (EET) X-QQ-mid: bizesmtp4t1520836513tvnce5jlq Received: from localhost (unknown [47.90.47.25]) by esmtp4.qq.com (ESMTP) with id ; Mon, 12 Mar 2018 14:35:13 +0800 (CST) X-QQ-SSF: 01600000000000F0FKF0 X-QQ-FEAT: /A5Igf99+LQ4/piuIt7vjIS+i8MNpdVuu01sDxCmwccOFxU8P1rvuegr2DtFU dDfIC+HgYYixLWRdzwYlaQDt24AyrWHzSOOf/U8V6gv2C6Azy85Cb0CxopsJt0eADsQYGm7 lt22xkSXjAhpuuAAZJEsA2tBzyMCjkAJTQrp4pwha0Ie5WgQ2dpf8LWdkYv9aDFR2R37ejx 9wVmvFKLT7IOLIzZTA/VuhFz6rpngxAwz98tdTJzGC3SAbSZCvr7//PLkpibFglK9B+DX1A r+hKrGZ7yxa9k8yEJa3hTrlyQbrtoatFQZtA== X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Mon, 12 Mar 2018 14:35:11 +0800 Message-Id: <20180312063511.14075-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.10.1.382.ga23ca1b.dirty X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybgforeign:qybgforeign4 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH 4/5] avformat/hlsenc: fix fmp4 single init file problem 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: #7021 Signed-off-by: Steven Liu --- libavformat/hlsenc.c | 66 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index ad9f4d3394..196632d066 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -763,7 +763,11 @@ static int hls_mux_init(AVFormatContext *s, VariantStream *vs) if ((ret = avio_open_dyn_buf(&oc->pb)) < 0) return ret; - ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options); + if (byterange_mode) { + ret = hlsenc_io_open(s, &vs->out, vs->basename, &options); + } else { + ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options); + } av_dict_free(&options); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename); @@ -1395,8 +1399,8 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) } if ((hls->segment_type == SEGMENT_TYPE_FMP4) && (en == vs->segments)) { - ff_hls_write_init_file(hls->m3u8_out, vs->fmp4_init_filename, - hls->flags & HLS_SINGLE_FILE, en->size, en->pos); + ff_hls_write_init_file(hls->m3u8_out, (hls->flags & HLS_SINGLE_FILE) ? en->filename : vs->fmp4_init_filename, + hls->flags & HLS_SINGLE_FILE, vs->init_range_length, 0); } ret = ff_hls_write_file_entry(hls->m3u8_out, en->discont, byterange_mode, @@ -2175,9 +2179,12 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) av_write_frame(vs->avf, NULL); /* Flush any buffered data */ new_start_pos = avio_tell(vs->avf->pb); - vs->size = new_start_pos - vs->start_pos; + if (hls->segment_type != SEGMENT_TYPE_FMP4) { + vs->size = new_start_pos - vs->start_pos; + } else { + vs->size = new_start_pos; + } - if (!byterange_mode) { if (hls->segment_type == SEGMENT_TYPE_FMP4) { if (!vs->init_range_length) { avio_flush(oc->pb); @@ -2186,16 +2193,22 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) vs->init_range_length = range_length; avio_open_dyn_buf(&oc->pb); vs->packets_written = 0; - ff_format_io_close(s, &vs->out); - hlsenc_io_close(s, &vs->out, vs->base_output_dirname); + vs->start_pos = range_length; + if (!byterange_mode) { + ff_format_io_close(s, &vs->out); + hlsenc_io_close(s, &vs->out, vs->base_output_dirname); + } } } else { + if (!byterange_mode) { hlsenc_io_close(s, &oc->pb, oc->url); + } } + if (!byterange_mode) { if (vs->vtt_avf) { hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); } - } + } if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0)) if ((vs->avf->oformat->priv_class && vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4) @@ -2208,6 +2221,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) } if (hls->segment_type == SEGMENT_TYPE_FMP4) { + if (hls->flags & HLS_SINGLE_FILE) { + ret = flush_dynbuf(vs, &range_length); + if (ret < 0) { + av_free(old_filename); + return ret; + } + vs->size = range_length; + } else { ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", @@ -2220,6 +2241,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; } ff_format_io_close(s, &vs->out); + } } old_filename = av_strdup(vs->avf->url); @@ -2227,15 +2249,21 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR(ENOMEM); } - ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size); - vs->start_pos = new_start_pos; - if (ret < 0) { - av_free(old_filename); - return ret; + if (vs->start_pos || hls->segment_type != SEGMENT_TYPE_FMP4) { + ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size); + vs->end_pts = pkt->pts; + vs->duration = 0; + if (ret < 0) { + av_free(old_filename); + return ret; + } } - vs->end_pts = pkt->pts; - vs->duration = 0; + if (hls->segment_type != SEGMENT_TYPE_FMP4) { + vs->start_pos = new_start_pos; + } else { + vs->start_pos += vs->size; + } vs->fmp4_init_mode = 0; if (hls->flags & HLS_SINGLE_FILE) { @@ -2295,12 +2323,14 @@ static int hls_write_trailer(struct AVFormatContext *s) } if ( hls->segment_type == SEGMENT_TYPE_FMP4) { int range_length = 0; + if (!(hls->flags & HLS_SINGLE_FILE)) { ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL); if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url); goto failed; } write_styp(vs->out); + } ret = flush_dynbuf(vs, &range_length); if (ret < 0) { goto failed; @@ -2311,7 +2341,11 @@ static int hls_write_trailer(struct AVFormatContext *s) failed: av_write_trailer(oc); if (oc->pb) { - vs->size = avio_tell(vs->avf->pb) - vs->start_pos; + if (hls->segment_type != SEGMENT_TYPE_FMP4) { + vs->size = avio_tell(vs->avf->pb) - vs->start_pos; + } else { + vs->size = avio_tell(vs->avf->pb); + } if (hls->segment_type != SEGMENT_TYPE_FMP4) ff_format_io_close(s, &oc->pb);