From patchwork Tue Apr 24 16:45:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 8628 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp2091219jad; Tue, 24 Apr 2018 10:16:42 -0700 (PDT) X-Google-Smtp-Source: AB8JxZobyKY/VnJZ9LjGGOTvpkD7gUPK+9eDM3QOIGlg1I7tUfMLb8e7IOIlb3nm9caZe5crJ8xP X-Received: by 10.28.90.197 with SMTP id o188mr13231936wmb.151.1524590202602; Tue, 24 Apr 2018 10:16:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524590202; cv=none; d=google.com; s=arc-20160816; b=bLJWo3DE00doTFP3Ydv2lJmsZQnJ78+TOtcX5a1wACOrIvbgQmERRQ/ovHOnNsn8bu RsOOHmWzsPxJ/Tf6x937gi9SggLTta4YWh/DW1JtpLb1gg/nukO9QXTVdXBVOBUAK7wN Oo3hfubokK13mKvLOUNd2++dWTC7zIkqHznlPnZ+utMEX0lWPZPVr5VeW7r+HXp6OFrj Yp2PZOMc2Q8BmVXONh1HAflMsvQ2O5k+d4LI0oAaq5bLlhNwb0rXhNfj/lLJ1crBtZF2 2dtoJyvM7RPp8DjWG9FJblmK954zzORFdrp+J76rB/J1BEBQgYBCcxOKwj+vaiRIEfdg 3ZXQ== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=xD8qnyAmerO1wHpJ3+s+lGz0lEbYI77IGgIzAZmbwB0=; b=ek47xwc9QW8R72Q5RieCEmCDW7sLjIAMToDRL6n31FOvTiqRfTzkSZm6Sk35ZewZnO UQzg0i/Ms4ZWAaRG2FhoDmllf/Uqra3lXIfnkl6nbqhB9lLKI7BMZqz+0efbJQkbB7VT ZProltQ0SdovD1DoilOeZEkfUepXPdpuRWqf5lsglz+X1jSrGQ/A18yQVdMCEbZiSm+t 3YnFmyWgwH+2oCiHVl2KgQOhybSFTdES/Jd7Y7lillDZkccnpbkrGyVUHbkKI8mqqUZ7 /pdbOHz8DtF1Tze3r6174Za77gLiYA3Cs43VJ5kKnwllDTzhLK4oaqWhZx4rnrZI41Yy PwLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.com header.s=20150623 header.b=u8xg/vkH; 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 x123si7357550wme.21.2018.04.24.10.16.42; Tue, 24 Apr 2018 10:16:42 -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; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.com header.s=20150623 header.b=u8xg/vkH; 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 E35E268A1CD; Tue, 24 Apr 2018 20:16:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DD5E768A148 for ; Tue, 24 Apr 2018 20:16:03 +0300 (EEST) Received: by mail-pf0-f193.google.com with SMTP id g14so12812775pfh.3 for ; Tue, 24 Apr 2018 10:16:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tmm1-net.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=GSw+UEC+NV23uS8A7ndwQEB9vdnei4JmKqHUTywl3GI=; b=u8xg/vkHWYHiyFFLf5/rAN0LtFT9YD24kUx9S3PziTmbV4FwFfLTup1y71h4lJSJmK AgbGun9zpeA36yW+DxZk6dImZIMJQDh1vemZfKJcjQHfBYuUlaxwYGGd8VoSfjo/Sqn+ FoZ279+XpMJucnQBDFt3RgYO0gsC54DLyetdMeGIS+QUTxC1AD4lbH3y+K/+gb1iqtXi nkSsQpAIGOzG2aV0wNYzB/huy4glwl+zWDvZxD+AACFr5HYO5+9F1uR3znaQZiE4g71m U4bol4SfyL2eWLFcd5DriJ9ksYBxRZNjF3ifGqraIpJby3gJNzymph5dXHX9Y8NaMNmS dS1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=GSw+UEC+NV23uS8A7ndwQEB9vdnei4JmKqHUTywl3GI=; b=hnJaevjMO/4L1Cv9pk4pVYenHtlNXlUWGRyzqCFV+T3yfEWIyd/ojWQsglTF3D2X+V nhkbbntEQ09dzjVw0FKQix2jORZP2KO4CuChpEvFbbs0zh7ofNj5i5gZCXh6OIUN1NF9 3s4+N3EeLdM0Ufk5tyRvNwmuMi7vujKSRFFfBWJU8OFBY41C5t6c+XIG4Eoq7ER6+/Aw CqE+7GiU262ArpLwosAD0QyqOYgE0k8+cHZWs6Q5+IcwYEdNNqtOIpWH/pUTNF6WSLhi iK8V06bIoyg3hAxXTNZcSChQuuCo8wYNKnjlSmturcNlRUg9/isld4kLO/6wTyvL2/VK Bk/g== X-Gm-Message-State: ALQs6tBtiTSEjcK207wW7gJ97UzIim1/kV3ohlDCdGlY9HE121u5J3h+ 5jC7UK3GyWMhgodjCd2xick9i6Xj X-Received: by 2002:a17:902:5902:: with SMTP id o2-v6mr3354342pli.79.1524588360014; Tue, 24 Apr 2018 09:46:00 -0700 (PDT) Received: from localhost.localdomain (c-69-181-54-242.hsd1.ca.comcast.net. [69.181.54.242]) by smtp.gmail.com with ESMTPSA id p1sm31522182pgc.15.2018.04.24.09.45.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 24 Apr 2018 09:45:58 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Tue, 24 Apr 2018 09:45:49 -0700 Message-Id: <20180424164549.36591-1-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.14.2 Subject: [FFmpeg-devel] [PATCH] avformat/hls: fix seeking around EVENT playlist after media sequence changes 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: lq@chinaffmpeg.org, Aman Gupta , nfxjfg@googlemail.com MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta The seek functions use first_timestamp, so keep that up to date as old segments drop off the playlist. --- libavformat/hls.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index ffec124818..8eb20a666e 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -211,16 +211,21 @@ typedef struct HLSContext { AVIOContext *playlist_pb; } HLSContext; -static void free_segment_list(struct playlist *pls) +static void free_segment_dynarray(struct segment **segments, int n_segments) { int i; - for (i = 0; i < pls->n_segments; i++) { - av_freep(&pls->segments[i]->key); - av_freep(&pls->segments[i]->url); - av_freep(&pls->segments[i]); + for (i = 0; i < n_segments; i++) { + av_freep(&segments[i]->key); + av_freep(&segments[i]->url); + av_freep(&segments[i]); } - av_freep(&pls->segments); - pls->n_segments = 0; +} + +static void free_segment_list(struct playlist *pls) +{ + free_segment_dynarray(pls->segments, pls->n_segments); + av_freep(&pls->segments); + pls->n_segments = 0; } static void free_init_section_list(struct playlist *pls) @@ -698,6 +703,9 @@ static int parse_playlist(HLSContext *c, const char *url, char tmp_str[MAX_URL_SIZE]; struct segment *cur_init_section = NULL; int is_http = av_strstart(url, "http", NULL); + struct segment **prev_segments = NULL; + int prev_n_segments = 0; + int prev_start_seq_no = -1; if (is_http && !in && c->http_persistent && c->playlist_pb) { in = c->playlist_pb; @@ -741,7 +749,12 @@ static int parse_playlist(HLSContext *c, const char *url, } if (pls) { - free_segment_list(pls); + prev_start_seq_no = pls->start_seq_no; + prev_segments = pls->segments; + prev_n_segments = pls->n_segments; + pls->segments = NULL; + pls->n_segments = 0; + pls->finished = 0; pls->type = PLS_TYPE_UNSPECIFIED; } @@ -881,6 +894,23 @@ static int parse_playlist(HLSContext *c, const char *url, } } } + if (prev_segments) { + if (pls->start_seq_no > prev_start_seq_no && c->first_timestamp != AV_NOPTS_VALUE) { + int64_t prev_timestamp = c->first_timestamp; + int i, diff = pls->start_seq_no - prev_start_seq_no; + for (i = 0; i < prev_n_segments && i < diff; i++) { + c->first_timestamp += prev_segments[i]->duration; + } + av_log(c->ctx, AV_LOG_DEBUG, "Media sequence change (%d -> %d)" + " reflected in first_timestamp: %"PRId64" -> %"PRId64"\n", + prev_start_seq_no, pls->start_seq_no, + prev_timestamp, c->first_timestamp); + } else if (pls->start_seq_no < prev_start_seq_no) { + av_log(c->ctx, AV_LOG_WARNING, "Media sequence changed unexpectedly: %d -> %d\n", + prev_start_seq_no, pls->start_seq_no); + } + free_segment_dynarray(prev_segments, prev_n_segments); + } if (pls) pls->last_load_time = av_gettime_relative();