From patchwork Fri Aug 26 09:30:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 304 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp255266vsd; Fri, 26 Aug 2016 02:31:03 -0700 (PDT) X-Received: by 10.194.95.105 with SMTP id dj9mr2829000wjb.20.1472203863582; Fri, 26 Aug 2016 02:31:03 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b205si36218773wmd.1.2016.08.26.02.31.01; Fri, 26 Aug 2016 02:31:03 -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=@gmail.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; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EF9BC689AC9; Fri, 26 Aug 2016 12:30:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f172.google.com (mail-qt0-f172.google.com [209.85.216.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2ACA6689B30 for ; Fri, 26 Aug 2016 12:30:40 +0300 (EEST) Received: by mail-qt0-f172.google.com with SMTP id u25so35049859qtb.1 for ; Fri, 26 Aug 2016 02:30:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to; bh=HTS2agEZPAXmnYqDJxPDcsUdZVJ0/6QHwNqW7KNy8BQ=; b=KFMxi+mNTAXlc3gI6XQYj9Xnbl4KmNlSJToE5Glaq5ac7CLjFIRuOSqAkHVaTdFX5K cO23UeRbYmMugtuPEgbLOhMD6is2knkNGQIJAuqKca03m3eiaM5tGY+ZG0sK0iItkVud dLKA4UA0MhtwgWay18If3QdXJJOh4UQlnJhieVmJ3J5pbSLU5uCz+gr+3AV2HfA8vr0t 0uYIb6H6WVDiQN0/blqVzVlITMV4EhwHi7fGIOn2vR+s+SSu7aAA2SWQpbNpwVVb5zTR mw4W3lBvRTb5JSFjTaNuUW92TdTv28fVswV0iTYYqBke7waa7bJWqZWtn3C+1zCBMhXd QQMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=HTS2agEZPAXmnYqDJxPDcsUdZVJ0/6QHwNqW7KNy8BQ=; b=laXcIqeE0sjyo7Hv2Pc+kGU8yZBq/598o7PvVYnGLQfXNyks9WECJKd17Oi9PdkZLY 3SlMR/eyUMDEBWP9Kqg/a79ERUHF/F5hRZhC/DVfBKWnMfXcJfN959HVDlYOABemAR6/ IzgJ+IbhmIfQ0X546dw0ycDDKVRBWd1rNnYipWW0zLZvUBl1fBXd9nfy/Z/UminLYump FnMIYebSs7FlBp5WZuH8wSRGIcE00124qWAtg43ChoJPtns6PfGVlqpXEfJaQReEG01e miwtM7WncKTzYr6LgsW3n99TkqjtPKvzE7YP8RooHqV9PKbx5c4jKup1eW0p5xSrzEmK y1Jw== X-Gm-Message-State: AE9vXwOUxnQQNhEZ/0INkGxQwPT00YJ9tl1hXzD5OXYJL7M9u1wqHC4RvOucA21X3Ylmk3NTjzDyeYg+bvQlvw== X-Received: by 10.237.52.101 with SMTP id w92mr2068416qtd.51.1472203841839; Fri, 26 Aug 2016 02:30:41 -0700 (PDT) MIME-Version: 1.0 Received: by 10.237.56.42 with HTTP; Fri, 26 Aug 2016 02:30:41 -0700 (PDT) From: Steven Liu Date: Fri, 26 Aug 2016 17:30:41 +0800 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH 1/2] add option hls_init_time to set init hls window segment 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" recover segments duration time by hls_time after init hls window. This is reuqested by Ibrahim Tachijian Signed-off-by: LiuQi --- libavformat/hlsenc.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) if (hls->format_options_str) { @@ -860,9 +861,19 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) AVStream *st = s->streams[pkt->stream_index]; int64_t end_pts = hls->recording_time * hls->number; int is_ref_pkt = 1; + int init_list_dur = 0; + int after_init_list_dur = 0; int ret, can_split = 1; int stream_index = 0; + 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 */ + init_list_dur = hls->init_time * hls->nb_entries * AV_TIME_BASE; + after_init_list_dur = (hls->sequence - hls->nb_entries ) * hls->time * AV_TIME_BASE; + hls->recording_time = hls->time * AV_TIME_BASE; + end_pts = init_list_dur + after_init_list_dur ; + } + if( st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ) { oc = hls->vtt_avf; stream_index = 0; @@ -972,6 +983,7 @@ static int hls_write_trailer(struct AVFormatContext *s) static const AVOption options[] = { {"start_number", "set first number in the sequence", OFFSET(start_sequence),AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, E}, {"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_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}, -- 2.7.4 (Apple Git-66) Test : /root/ffmpeg_patched -analyzeduration 1000000 -i udp://MCAST_ADDR:3301 -map 0:0 -map 0:1 -c:v libx264 -preset superfast -g 25 -b:v 900k -maxrate 900k -bufsize 2000k -filter:v yadif -c:a libfdk_aac -b:a 64k -hls_time 5 *-hls_init_time 1* -hls_list_size 10 -hls_allow_cache 0 -hls_flags delete_segments -f hls /tmp/playlist.m3u8 The output M3U8 of patched ffmpeg: #EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:NO #EXT-X-TARGETDURATION:5 #EXT-X-MEDIA-SEQUENCE:3 #EXTINF:1.000000, playlist3.ts #EXTINF:1.000000, playlist4.ts #EXTINF:1.000000, playlist5.ts #EXTINF:1.000000, playlist6.ts #EXTINF:1.000000, playlist7.ts #EXTINF:1.000000, playlist8.ts #EXTINF:1.600000, playlist9.ts #EXTINF:1.000000, playlist10.ts #EXTINF:4.000000, playlist11.ts #EXTINF:5.000000, playlist12.ts diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index e65f002..f5ceb60 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -85,6 +85,7 @@ typedef struct HLSContext { AVFormatContext *vtt_avf; 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 wrap; // Set by a private option. uint32_t flags; // enum HLSFlags @@ -706,7 +707,7 @@ static int hls_write_header(AVFormatContext *s) int vtt_basename_size; hls->sequence = hls->start_sequence; - hls->recording_time = hls->time * AV_TIME_BASE; + hls->recording_time = (hls->init_time ? hls->init_time : hls->time) * AV_TIME_BASE; hls->start_pts = AV_NOPTS_VALUE;