From patchwork Fri Oct 27 03:59:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Johansen X-Patchwork-Id: 44373 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bf16:b0:15d:8365:d4b8 with SMTP id gc22csp1103060pzb; Thu, 26 Oct 2023 21:00:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHKDC4oaYY2gqUKGWwKvDJbxsxs61nykgcNCnbLVqCBwMv890jL5QCKfiQkcEgAnTf23UtH X-Received: by 2002:a17:907:cc82:b0:9c3:cd12:1929 with SMTP id up2-20020a170907cc8200b009c3cd121929mr933628ejc.60.1698379211485; Thu, 26 Oct 2023 21:00:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698379211; cv=none; d=google.com; s=arc-20160816; b=fP4B+Lqp7BX38JT6c/QrUStkxkCyy4dFOY5RBgGnkLihW8wc906M86akTl6XVVavDb jP3BMDJnEaEexz8ZvCPc2DsZPbb0GHdHG7IO8VJLCsRuL+5MmAu2XfZgaKnglWxj2MNa bTVFnh3lJoq3DKpe6hcUJIDdRbcodBFxHPCxgr44WiEgjybaqQRJjoxcmEHLWd2VzdrX cjzIPG+rsKPjajL/MSlveOUWIMm5PcjP9HV94jILOjp5tjn+Otac8HhGerYfNsG82CdC jK+NyZtJ39XId1qM5isQTzIXr3jCboBVb6f0bg5zNKwxsGEBSMsdcjD89aQuCoFKPVmS OsOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=qJ2EDwq4wxN2kFxtBB32n8tBwrj6oBKGArTNMdnciWc=; fh=BNczk7MtTFTHa4uMdKY29AxmcfAa404kNGyDf0xbsP0=; b=lMfOS48Ucv+w3txZYcWCafoVjL5WuzVjYLwtn2NYS3n6T8cssGl6Mr5qMBtikHjrpL 0ePS6zi8Z/WYUPSAqORCaL2zd0rreMxb0Ht5YPuTO404Qgw+BH50g/FADZJy9Ayypf8Z 5oD1n8ksOWCtvwvLfjO/Oyeb4O16hQZw9AtO9x42Gwy1x5GKc3Er3CtrdXN6XOYa/iYl rNiw/WV4QIgAut10KViH6qPw1qZBnOpvhgHRlb3JqrJPo5MWlgO96ooXlJ7kOjw52joy K9nfspxI0LXajGKFJIVtYGrjjTM/4y0Mqk3QexMcYynOyyY8gd8U320h4QVAZSt5Ajxo N3ew== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=L6JBSFI0; 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 sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hq18-20020a1709073f1200b009c6a4a5ac98si389872ejc.178.2023.10.26.21.00.11; Thu, 26 Oct 2023 21:00:11 -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 header.s=20230601 header.b=L6JBSFI0; 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 sp=QUARANTINE 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 159F468CBDF; Fri, 27 Oct 2023 07:00:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA76868CBD4 for ; Fri, 27 Oct 2023 06:59:55 +0300 (EEST) Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-6934202b8bdso1633148b3a.1 for ; Thu, 26 Oct 2023 20:59:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1698379193; x=1698983993; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nGutxRhorpkIFsQ6AOKUwkmD4d74Bc85Ze8EiwBO8/s=; b=L6JBSFI0TpO83gGmdCMMolW7ml/vRY/Rvg0eK3iQqhB4tLDTkLbznO5Ovin8NR8mdD 0ge9FTiRnAQzb5RLLuCg+uWRo9qw1b4Xw1T9ghN+IVnJfqjEObsH5tYs+BlSjMuuKhkY DvKNoRBCsOlIJTTi4ppeVJp+nv+bRhUFeAOsef12fKifdqqwmiukQZUt6ohiXflqkWXM SDhkIqnUvaxnJ6jLi63mNmPijEM8Wa1Jde0PHYqNXsxEvjTAGsC6uhCULIdf5+Q8Xaue NVVARhLH4+GR3OiHCsGIIJfIyTlgoZiu7cmoMVJWqFJMk7pYa+84iXH461Z7g5Yt/QMk jRFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698379193; x=1698983993; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nGutxRhorpkIFsQ6AOKUwkmD4d74Bc85Ze8EiwBO8/s=; b=RImie21knofe/XWPblf+LBHe+E6Z9PSBldfD+t9iWsAus5Yau/g8ZXiGTFlZsUZcBf bV1rcfrxK3+P4GhWYcL39og1BCElA9RZQFDMjvvPwGP1bjidF/D/Ds8nZ7a027TMSAw1 qWlp2oA1PxMy5PmfopODsF8v6kcc31iNZSfBs3uLGAr3bjSEJuC5TMoGU8DOSSH1i8n9 Oqc8BFoeTiQArNta7MYhwgzD435K6qbzgoEKHFz36oKXnEUchohFVjVME2BvsC7vrue9 EJbx4i+HtNyythh2hgxBKIRPAuzpd1uBLsxj9UQASHfEOkjCTf4G84HNpMBugeoRoLDX OwrA== X-Gm-Message-State: AOJu0Yx6T7HINJV4hN5H6rYz6NuDvhszNrsiM27xor+KfHvwTXSMzRMr Ad9fhHmtg8zjafADkWSqirutYY0gYJhGcg== X-Received: by 2002:a05:6a00:1515:b0:68e:4303:edb8 with SMTP id q21-20020a056a00151500b0068e4303edb8mr1775998pfu.30.1698379192790; Thu, 26 Oct 2023 20:59:52 -0700 (PDT) Received: from localhost.localdomain ([2605:a601:a98f:6200:f8bd:26eb:4d2d:1b2b]) by smtp.gmail.com with ESMTPSA id ey22-20020a056a0038d600b0069302c3c050sm364489pfb.218.2023.10.26.20.59.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Oct 2023 20:59:52 -0700 (PDT) From: Dave Johansen To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Oct 2023 21:59:39 -0600 Message-Id: <20231027035941.23491-2-davejohansen@gmail.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20231027035941.23491-1-davejohansen@gmail.com> References: <20231027035941.23491-1-davejohansen@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] avformat/hlsenc: Add strftime_prog for using PROGRAM-DATE-TIME in the segment filename X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Dave Johansen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: q6Eo2Hmr07e/ --- libavformat/hlsenc.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 5dfff6b2b6..24a0304f78 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -159,6 +159,7 @@ typedef struct VariantStream { char *m3u8_name; double initial_prog_date_time; + double curr_prog_date_time; char current_segment_final_filename_fmt[MAX_URL_SIZE]; // when renaming segments char *fmp4_init_filename; @@ -208,6 +209,7 @@ typedef struct HLSContext { int use_localtime; ///< flag to expand filename with localtime int use_localtime_mkdir;///< flag to mkdir dirname in timebased filename + int use_localtime_prog; ///< flag to expand filename with prog date time int allowcache; int64_t recording_time; int64_t max_seg_size; // every segment file max size @@ -259,10 +261,9 @@ typedef struct HLSContext { int has_video_m3u8; /* has video stream m3u8 list */ } HLSContext; -static int strftime_expand(const char *fmt, char **dest) +static int strftime_expand_time_t(const char *fmt, const time_t *value, char **dest) { int r = 1; - time_t now0; struct tm *tm, tmpbuf; char *buf; @@ -270,8 +271,7 @@ static int strftime_expand(const char *fmt, char **dest) if (!buf) return AVERROR(ENOMEM); - time(&now0); - tm = localtime_r(&now0, &tmpbuf); + tm = localtime_r(value, &tmpbuf); r = strftime(buf, MAX_URL_SIZE, fmt, tm); if (!r) { av_free(buf); @@ -282,6 +282,19 @@ static int strftime_expand(const char *fmt, char **dest) return r; } +static int strftime_expand(const char *fmt, char **dest) +{ + time_t now0; + time(&now0); + return strftime_expand_time_t(fmt, &now0, dest); +} + +static int strftime_expand_prog(const char *fmt, const double prog_date_time, char **dest) +{ + time_t value = (time_t)prog_date_time; + return strftime_expand_time_t(fmt, &value, dest); +} + static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, const char *filename, AVDictionary **options) { @@ -1721,7 +1734,11 @@ static int hls_start(AVFormatContext *s, VariantStream *vs) int r; char *expanded = NULL; - r = strftime_expand(vs->basename, &expanded); + if (c->use_localtime_prog) { + r = strftime_expand_prog(vs->basename, vs->curr_prog_date_time, &expanded); + } else { + r = strftime_expand(vs->basename, &expanded); + } if (r < 0) { av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n"); return r; @@ -2615,6 +2632,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) if (vs->start_pos || hls->segment_type != SEGMENT_TYPE_FMP4) { double cur_duration = (double)(pkt->pts - vs->end_pts) * st->time_base.num / st->time_base.den; ret = hls_append_segment(s, hls, vs, cur_duration, vs->start_pos, vs->size); + vs->curr_prog_date_time += cur_duration; vs->end_pts = pkt->pts; vs->duration = 0; if (ret < 0) { @@ -2971,6 +2989,7 @@ static int hls_init(AVFormatContext *s) vs->end_pts = AV_NOPTS_VALUE; vs->current_segment_final_filename_fmt[0] = '\0'; vs->initial_prog_date_time = initial_program_date_time; + vs->curr_prog_date_time = initial_program_date_time; for (j = 0; j < vs->nb_streams; j++) { vs->has_video += vs->streams[j]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO; @@ -3038,7 +3057,11 @@ static int hls_init(AVFormatContext *s) int r; char *expanded = NULL; - r = strftime_expand(vs->fmp4_init_filename, &expanded); + if (hls->use_localtime_prog) { + r = strftime_expand_prog(vs->fmp4_init_filename, vs->curr_prog_date_time, &expanded); + } else { + r = strftime_expand(vs->fmp4_init_filename, &expanded); + } if (r < 0) { av_log(s, AV_LOG_ERROR, "Could not get segment filename with strftime\n"); return r; @@ -3158,6 +3181,7 @@ static const AVOption options[] = { {"iframes_only", "add EXT-X-I-FRAMES-ONLY, whenever applicable", 0, AV_OPT_TYPE_CONST, { .i64 = HLS_I_FRAMES_ONLY }, 0, UINT_MAX, E, "flags"}, {"strftime", "set filename expansion with strftime at segment creation", OFFSET(use_localtime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, {"strftime_mkdir", "create last directory component in strftime-generated filename", OFFSET(use_localtime_mkdir), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, + {"strftime_prog", "set filename expanish with program date time", OFFSET(use_localtime_prog), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, {"hls_playlist_type", "set the HLS playlist type", OFFSET(pl_type), AV_OPT_TYPE_INT, {.i64 = PLAYLIST_TYPE_NONE }, 0, PLAYLIST_TYPE_NB-1, E, "pl_type" }, {"event", "EVENT playlist", 0, AV_OPT_TYPE_CONST, {.i64 = PLAYLIST_TYPE_EVENT }, INT_MIN, INT_MAX, E, "pl_type" }, {"vod", "VOD playlist", 0, AV_OPT_TYPE_CONST, {.i64 = PLAYLIST_TYPE_VOD }, INT_MIN, INT_MAX, E, "pl_type" },