From patchwork Thu Mar 18 01:17:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Berclaz X-Patchwork-Id: 26441 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 B5ECF44A81E for ; Thu, 18 Mar 2021 03:49:37 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8CAC16897E3; Thu, 18 Mar 2021 03:49:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f181.google.com (mail-qk1-f181.google.com [209.85.222.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2E058688134 for ; Thu, 18 Mar 2021 03:49:30 +0200 (EET) Received: by mail-qk1-f181.google.com with SMTP id t4so582944qkp.1 for ; Wed, 17 Mar 2021 18:49:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=percipient-ai.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MgIpB9dtxpZxeEcc8xO/RtCBy9ziaMhUEkyMY+cU+wU=; b=rktDL14DMptfxKi8jU/FRs7BhMOAM+2yzkX2LYSIswg03BLwuIzCmnJKzSGZNEzQRj RE4zHNrDUg8iQzathiqNUWwDbjC2rcV6q4YS8IkUHZ2vvszc1eAxnoLCPEJ4AL0H8/R+ ykl7ZRyuufwga69xeGDPut6p4EW4k6GpqFbPcxGzu1VIMHJZyH6efLVOZOkoJ6Wj2LjW eV90M/fVLl6ZdZSwGUD8txLqgBeMHf49TQxLRuFqafimgVNmKhWDBanv4Kl8+LF4VbLf 9wbgYZSEmTWj6LmqMnoYkhyP6l4gvETfsNm5Zj3A0liiyL9Ff8o2Aach1SlWmjsnwiTX 2dYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MgIpB9dtxpZxeEcc8xO/RtCBy9ziaMhUEkyMY+cU+wU=; b=RMjf4TBNTeIjlQwqp3UmuUoSnZuVFvGBqLUpBvqipM6KJ0S2EZNhQHkJ7VW3uLFp8m cvcOuMdY6xyxwRfP2qVZQ3HRd5oPFXRuT4vSSdZz4MRCcP+opsea76A6S6KIfx/aSEyl G5PNe7WbNlf/30kRrSAksZ2Gzsp/TUDSh0Og+gu5nj9dlvga0lkmz2RsedkVsJ6Z/dzn X78Ys4JENWKHFVm42GZUdzu0JH8ad4TRVvyenj/rXc2OViKPAOyCITMWmBaZIQkfaBgY FkBFMEj2VZybw9+7JC96aC/hT0GVohB9iLbyxbohp0N4EdTwZc0qotpe5cUUWT0W5RK8 YQqQ== X-Gm-Message-State: AOAM530+37A2PnSvKxBq38AVvrBqW5eRTTsTdXKW1zdC7TKgbln+ICwt P4TCcxFoRvF1w9R6YWcIjn8JR0Oe/4UI2vfZ X-Google-Smtp-Source: ABdhPJyGCVgnivQo+JwXfHs8Df4GGmzXbzkzTfINMx8Wn6KrS4cLCHVnknQV0Bb67oOyhpQ2BzMMrA== X-Received: by 2002:a62:1889:0:b029:1f6:77d5:b75a with SMTP id 131-20020a6218890000b02901f677d5b75amr1665665pfy.2.1616030320217; Wed, 17 Mar 2021 18:18:40 -0700 (PDT) Received: from vrm-blade2.mirage.percipient.ai (c-73-93-170-180.hsd1.ca.comcast.net. [73.93.170.180]) by smtp.gmail.com with ESMTPSA id x190sm278865pfx.60.2021.03.17.18.18.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Mar 2021 18:18:39 -0700 (PDT) From: Jerome Berclaz To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Mar 2021 18:17:27 -0700 Message-Id: <20210318011727.517496-1-jerome@percipient.ai> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] added parameter to dash encoder for start available time 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: Jerome Berclaz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/dashenc.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 24d43c34ea..81855ca8d0 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -149,6 +149,7 @@ typedef struct DASHContext { int master_publish_rate; int nr_of_streams_to_flush; int nr_of_streams_flushed; + int64_t start_time_ms; } DASHContext; static struct codec_string { @@ -725,13 +726,11 @@ static void write_time(AVIOContext *out, int64_t time) avio_printf(out, "%d.%dS", seconds, fractions / (AV_TIME_BASE / 10)); } -static void format_date_now(char *buf, int size) +static void format_date(uint64_t epoch_ms, char *buf, int size) { struct tm *ptm, tmbuf; - int64_t time_us = av_gettime(); - int64_t time_ms = time_us / 1000; - const time_t time_s = time_ms / 1000; - int millisec = time_ms - (time_s * 1000); + const time_t time_s = epoch_ms / 1000; + int millisec = epoch_ms - (time_s * 1000); ptm = gmtime_r(&time_s, &tmbuf); if (ptm) { int len; @@ -744,6 +743,12 @@ static void format_date_now(char *buf, int size) } } +static void format_date_now(char *buf, int size) +{ + int64_t time_us = av_gettime(); + format_date( time_us / 1000, buf, size); +} + static int write_adaptation_set(AVFormatContext *s, AVIOContext *out, int as_index, int final) { @@ -1712,10 +1717,16 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) os->last_pts = pkt->pts; if (!c->availability_start_time[0]) { - int64_t start_time_us = av_gettime(); - c->start_time_s = start_time_us / 1000000; - format_date_now(c->availability_start_time, + if (c->start_time_ms) { + c->start_time_s = c->start_time_ms / 1000; + format_date(c->start_time_ms, c->availability_start_time, sizeof(c->availability_start_time)); + } else { + int64_t start_time_us = av_gettime(); + c->start_time_s = start_time_us / 1000000; + format_date_now(c->availability_start_time, + sizeof(c->availability_start_time)); + } } if (!os->availability_time_offset && pkt->duration) { @@ -1922,6 +1933,7 @@ static const AVOption options[] = { { "ignore_io_errors", "Ignore IO errors during open and write. Useful for long-duration runs with network output", OFFSET(ignore_io_errors), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, { "lhls", "Enable Low-latency HLS(Experimental). Adds #EXT-X-PREFETCH tag with current segment's URI", OFFSET(lhls), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, { "master_m3u8_publish_rate", "Publish master playlist every after this many segment intervals", OFFSET(master_publish_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, UINT_MAX, E}, + { "start_time_ms", "stream start time in epoch milliseconds", OFFSET(start_time_ms), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, UINT64_MAX, E, "ms"}, { NULL }, };