From patchwork Mon Nov 18 09:42:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 16316 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 0002744A8C1 for ; Mon, 18 Nov 2019 11:42:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE0D368A610; Mon, 18 Nov 2019 11:42:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpproxy21.qq.com (smtpbg704.qq.com [203.205.195.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C6EC1688116 for ; Mon, 18 Nov 2019 11:42:11 +0200 (EET) X-QQ-mid: bizesmtp25t1574070123t4meqzdm Received: from localhost (unknown [47.90.47.25]) by esmtp10.qq.com (ESMTP) with id ; Mon, 18 Nov 2019 17:42:01 +0800 (CST) X-QQ-SSF: 01100000002000K0ZSF1000A0000000 X-QQ-FEAT: p/Y2uUKTrsxt+t42IH91EtIAojDptQPNH7GZ0oRjFADGxJRXCGv3zotGA88bf zoueB7o7EGLxKFKxS2KeTIdnbuBjZ8z8KTg/OgJQdZmeL1rvHG5LU7OH/zDPRdinyhkEDKu dN/o638ywaOHsMxHlj4ecCVv0H2en/tszP622XLCISD4LaRlg4UbloQZTqk72GgIElA+TuJ n7Xg2FAi6oCeM+cYQpkl5Ylbc9Tz+dYsQbA4uRZfQ6nN+jzxUBpN7u0xntkR7hIfNS7M7u1 7TbmDEbzNKMVBRvEiSXEcfWyuF+rXI4rABrTpkblSWvxh5W+No7hcwphRcTP2Q6Ku7iQ== X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 Nov 2019 17:42:00 +0800 Message-Id: <20191118094200.21810-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:qybgforeign7 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH] avformat/hls: add option for the m3u8 list load max times 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" set max times for load m3u8 when the m3u8 list refresh do not with new segments any times. Signed-off-by: Steven Liu --- doc/demuxers.texi | 4 ++++ libavformat/hls.c | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/doc/demuxers.texi b/doc/demuxers.texi index fe766a5de7..4e1a5cb6aa 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -331,6 +331,10 @@ segment index to start live streams at (negative values are from the end). Maximum number of times a insufficient list is attempted to be reloaded. Default value is 1000. +@item m3u8_hold_counters +Maximum number of times to load m3u8 when the m3u8 dose not refresh with new segments. +Default value is 1000. + @item http_persistent Use persistent HTTP connections. Applicable only for HTTP streams. Enabled by default. diff --git a/libavformat/hls.c b/libavformat/hls.c index 8dc0e4e385..0e6a2d5eb6 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -118,6 +118,8 @@ struct playlist { int needed; int broken; int cur_seq_no; + int last_seq_no; + int m3u8_hold_counters; int64_t cur_seg_offset; int64_t last_load_time; @@ -198,6 +200,7 @@ typedef struct HLSContext { struct rendition **renditions; int cur_seq_no; + int m3u8_hold_counters; int live_start_index; int first_packet; int64_t first_timestamp; @@ -1428,6 +1431,17 @@ reload: v->start_seq_no - v->cur_seq_no); v->cur_seq_no = v->start_seq_no; } + if (v->cur_seq_no > v->last_seq_no) { + v->last_seq_no = v->cur_seq_no; + v->m3u8_hold_counters = 0; + } else if (v->last_seq_no == v->cur_seq_no) { + v->m3u8_hold_counters++; + if (v->m3u8_hold_counters >= c->m3u8_hold_counters) { + return AVERROR_EOF; + } + } else { + av_log(v->parent, AV_LOG_WARNING, "maybe the m3u8 list sequence have been wraped.\n"); + } if (v->cur_seq_no >= v->start_seq_no + v->n_segments) { if (v->finished) return AVERROR_EOF; @@ -1816,6 +1830,7 @@ static int hls_read_header(AVFormatContext *s) if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) { for (i = 0; i < c->n_playlists; i++) { struct playlist *pls = c->playlists[i]; + pls->m3u8_hold_counters = 0; if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0) { av_log(s, AV_LOG_WARNING, "parse_playlist error %s [%s]\n", av_err2str(ret), pls->url); pls->broken = 1; @@ -2317,6 +2332,8 @@ static const AVOption hls_options[] = { INT_MIN, INT_MAX, FLAGS}, {"max_reload", "Maximum number of times a insufficient list is attempted to be reloaded", OFFSET(max_reload), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS}, + {"m3u8_hold_counters", "Maximum number of times requests when the m3u8 file not be refresh", + OFFSET(m3u8_hold_counters), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS}, {"http_persistent", "Use persistent HTTP connections", OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS }, {"http_multiple", "Use multiple HTTP connections for fetching segments",