From patchwork Thu Apr 12 00:38:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 8412 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp1314417jad; Wed, 11 Apr 2018 17:39:13 -0700 (PDT) X-Google-Smtp-Source: AIpwx49GkMQdApgHnB3G+9uC5ajcIt4Jq7dvf5ZXBbIvvHXNtwhAoUneCtKn4lOQPgklN6r/Y6YP X-Received: by 10.223.176.237 with SMTP id j42mr4906759wra.25.1523493553696; Wed, 11 Apr 2018 17:39:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523493553; cv=none; d=google.com; s=arc-20160816; b=TpppuCwh4oBa/lb2cVQEvgikhc1JpOKw/OMaG2Chp29IwWH6sARtGDhHNHYwWQD+3U e1Fh4zlde1mvEc86jxbuSrtrqoMMJfubk8o/j8IJ+RUSagEOhNypbdAQsSK9KtR5ltbY UHOxi3z3AwS2L2Iis3Xb95nLKAFl/qTIjoaMQYG6R6F9TFOZChM/p9hwBPb5w01rR0SE 5clVgUb3lGmSymLUF9/wG5LRzhTPtMPxwy0T/wnE+r5P9tLXJuJ5c7zUUYJESqTVk2KD lEKQq5KZqff3SKMePL9Ia6sz5HLEyxlFHJjw1Ffalrl2uGI6uZCREV2ZwohsHuxQ4kID vH/g== 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:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=ut7xi5MUbzUn9HHlQe36m7VajQfmpG4SLcvNsr+XPao=; b=Q5oxAgllycPC/ZCfBr9IbVOeSQIhpmJs/4V/5VrCmGPlyFOIWN7kXcMmS/NuTNeRSh ZPpgKamCija9GGNUA5kx8VWyP5HCZk7vVGRB1Uee1V2CHwvX7mrQhlkIqXrWkWMg14AJ AFjv4pb9zQhkQp1d4L6MpFTmVeiG+XramawXzxLJJc00+nR2ITHbz1PpkNPPiD/MHqRl /eCpNT9crCqsa2LsZnsyqslJfFJs8zLk2rToMZwmxgyI7AHEm4fSD3WkAp8R0TLb4mZy xZ1u3+bL3fyRyisZar0FmtUXnVtGmJV05O/wLy/ahns+ltE7o25HWxCy0P0PcH9lynXp Udjg== 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=EJcrHyQH; 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 70si1716021wmb.75.2018.04.11.17.39.12; Wed, 11 Apr 2018 17:39:13 -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=EJcrHyQH; 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 A360268A335; Thu, 12 Apr 2018 03:38:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f178.google.com (mail-pf0-f178.google.com [209.85.192.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4CB87689F81 for ; Thu, 12 Apr 2018 03:38:40 +0300 (EEST) Received: by mail-pf0-f178.google.com with SMTP id u8so1757286pfg.10 for ; Wed, 11 Apr 2018 17:39:04 -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:in-reply-to:references; bh=K8RzCLJmVDEaKp/b9oP1LREIW97KpiKNbmdbMLq9Gdg=; b=EJcrHyQHTx7/DR339jfdpq64ASsuKwns+H23ecXYMafGLi8ilbxq807SQ+w492dNL5 1Ld7vboSGwhRw0bNq1NGdzU83ZSyNS2acoHXKE7z55QU815jFsDb/xjS4ZuIC5YB+ZTV Ghp118+VgT5al2VW+8hBR8qSpiobrI21tYzs+FmW0yeAfNOAtUYSGxPab+CjxwoMW1ft YqgwAC8X6+x/andTA3XGa5JAmyY+tB2kCtnUpAyQdMPy2ysaYH6nM+nJVPBfNdp7SEcb rq6JFkD+1f7eDMHFSb2NOf36reH+c3weaUgLa4vXpZX+mkwSdiwoQKYNzm04StxB427Z 570Q== 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 :in-reply-to:references; bh=K8RzCLJmVDEaKp/b9oP1LREIW97KpiKNbmdbMLq9Gdg=; b=MDYXbP6dXw5svXHpF2Ou8D0osJtlYM8o/nK/f2CZaR0JYpRz9CwzHAzfCwDrm0lJ0E 3MhjXXUqiJLNVVs3NBftZh4FVkKxYfW+pNdrJRHzb/Z30DN92s9fw0KzzZiovScVPO4N G47Qb7jhDzEcprE2X8Y+CRHx1JOTUuchod0gbcT/QfOQIo7jIZYCu9ZhwryT+NV3bVOZ caANqXDNIkaZ7xhYJTt0Rl7pZ5SFwQVA0gE8tfc4uultq6oesBuq/iorzFuLjVpGypNu Fum7h2rAJqzdYmW4NvTR8ZhbwN/js7yS+KJxmlB+G8VBIn1cL7p0CqTMYL5W3FmBHhRq Je1w== X-Gm-Message-State: ALQs6tARjz5UI4oLlKyHVuY5/GsQXBxVhhfrWqZkzmpbOd6HcAdC0++M qqUIxQJQa3GTTFT7XWnVGwidkiLr X-Received: by 10.99.164.18 with SMTP id c18mr4984893pgf.85.1523493542691; Wed, 11 Apr 2018 17:39:02 -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 w17sm5457577pfa.141.2018.04.11.17.39.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 11 Apr 2018 17:39:02 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Apr 2018 17:38:58 -0700 Message-Id: <20180412003858.1254-1-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180410082826.10169-1-lq@chinaffmpeg.org> References: <20180410082826.10169-1-lq@chinaffmpeg.org> Subject: [FFmpeg-devel] [PATCH v2] avformat/hlsenc: add option hls_delete_threshold 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Steven Liu When using hls_list_size with hls_flags delete_segments, currently hls_list_size * 2 +- segments remain on disk. With this new option, the amount of disk space used can be controlled by the user. fix ticket: #7131 Signed-off-by: Steven Liu Signed-off-by: Aman Gupta --- doc/muxers.texi | 6 ++++++ libavformat/hlsenc.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/doc/muxers.texi b/doc/muxers.texi index cb75c261c5..f288764a23 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -513,6 +513,12 @@ Segment will be cut on the next key frame after this time has passed. Set the maximum number of playlist entries. If set to 0 the list file will contain all the segments. Default value is 5. +@item hls_delete_threshold @var{size} +Set the number of unreferenced segments to keep on disk before @code{hls_flags delete_segments} +deletes them. Increase this to allow continue clients to download segments which +were recently referenced in the playlist. Default value is 1, meaning segments older than +@code{hls_list_size+1} will be deleted. + @item hls_ts_options @var{options_list} Set output format options using a :-separated list of key=value parameters. Values containing @code{:} special characters must be diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 8eb84212a0..1b4f84b653 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -173,6 +173,7 @@ typedef struct HLSContext { float time; // Set by a private option. float init_time; // Set by a private option. int max_nb_segments; // Set by a private option. + int hls_delete_threshold; // Set by a private option. #if FF_API_HLS_WRAP int wrap; // Set by a private option. #endif @@ -445,6 +446,7 @@ static int hls_delete_old_segments(AVFormatContext *s, HLSContext *hls, HLSSegment *segment, *previous_segment = NULL; float playlist_duration = 0.0f; int ret = 0, path_size, sub_path_size; + int segment_cnt = 0; char *dirname = NULL, *p, *sub_path; char *path = NULL; AVDictionary *options = NULL; @@ -458,14 +460,20 @@ static int hls_delete_old_segments(AVFormatContext *s, HLSContext *hls, } segment = vs->old_segments; + segment_cnt = 0; while (segment) { playlist_duration -= segment->duration; previous_segment = segment; segment = previous_segment->next; + segment_cnt++; if (playlist_duration <= -previous_segment->duration) { previous_segment->next = NULL; break; } + if (segment_cnt >= hls->hls_delete_threshold) { + previous_segment->next = NULL; + break; + } } if (segment && !hls->use_localtime_mkdir) { @@ -2799,6 +2807,7 @@ static const AVOption options[] = { {"hls_time", "set segment length in seconds", OFFSET(time), AV_OPT_TYPE_FLOAT, {.dbl = 2}, 0, FLT_MAX, E}, {"hls_init_time", "set segment length in seconds at init list", OFFSET(init_time), AV_OPT_TYPE_FLOAT, {.dbl = 0}, 0, FLT_MAX, E}, {"hls_list_size", "set maximum number of playlist entries", OFFSET(max_nb_segments), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E}, + {"hls_delete_threshold", "set number of unreferenced segments to keep before deleting", OFFSET(hls_delete_threshold), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, E}, {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, {"hls_vtt_options","set hls vtt list of options for the container format used for hls", OFFSET(vtt_format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, #if FF_API_HLS_WRAP