From patchwork Sat Dec 21 18:02:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 16918 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 DAD5E44A78E for ; Sat, 21 Dec 2019 20:24:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B6C4E68A969; Sat, 21 Dec 2019 20:24:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f67.google.com (mail-io1-f67.google.com [209.85.166.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5AD3468819F for ; Sat, 21 Dec 2019 20:24:28 +0200 (EET) Received: by mail-io1-f67.google.com with SMTP id v3so12610906ioj.5 for ; Sat, 21 Dec 2019 10:24:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=BXOMRm2Xex5xvD0/BJy9wtS1k+56BxrPMzVOENah4AE=; b=uz0uCeeZXORUWifClEum2ad5gGQ/ao/YqqKMGa6sQV+u312G3814eGpNAEgNbjoGRd HNJl9QZijTgtiPGbPR6+eTZL+7hiTn8cnfa+ozHzYQMI+ijzpxEP/nO5XEvMlfpTh3f3 cx3eWuzNj6p2RaIADsGYcf+HJacDUX072PB1CVDEZUGWutptrQdnxGQ5jsYkbsKkUQhn 6XtsKTPY0GC1xx8QJGrJuRYQPZ1AIe/W9GXCl7O78fX5bekY+wc5jNtGCLa5StupyEC8 MA35rUYw8wkOrg+AXWRlVrSTfxNaQeHdQ7kxIFEcI8pFL4Y9l9LNwGYDf/f11yYMqs3/ HGJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BXOMRm2Xex5xvD0/BJy9wtS1k+56BxrPMzVOENah4AE=; b=gk/VutiLV8aWjpLLBZDzl/QLERyCUQuflaB0gWuIA24BtjHGntKmDhyHkZsBRTPFkj yJNw8PbcDHTbwNSRabsbouUyKWqjsiFY3gRduw+afSqugmc0Ed8EJcDcNelkG/yvXO4p AiKrS/BNiyLghpZNkB6B39gqv0hJTtLS24qWSHYv4t1QFhGHsjCzhHvmI0a/VRiaPSDC 1oVg3vPrmKWt0kq5qtlTqRDzYp2a9b2FHqM1pn7T5W0AAh7WGkmj4PANbuxnO7/rUC9a Z6Huc7yIpigENIRP/pdqVH5NNm+OEVTsgBQi3tpUZcAGq3WZOj8UspWg//Bn+78QUkc1 qVIw== X-Gm-Message-State: APjAAAVfo2iOV7bRIX70a+sUPo5nKc+P3wHslL7GlRMrgwHqnIW7wqg3 h0++2hshr55w0Czn5lAMHcw358il X-Google-Smtp-Source: APXvYqwFIKZfj7q+TRNCSVq7g63bs6eB3MRA1x1fNQ/CV8gnQRPw26IEhjsML2TZKc6WDxNT2/5b7g== X-Received: by 2002:a63:224d:: with SMTP id t13mr21851865pgm.373.1576951424989; Sat, 21 Dec 2019 10:03:44 -0800 (PST) Received: from localhost.localdomain ([191.83.216.116]) by smtp.gmail.com with ESMTPSA id s196sm18223564pfs.136.2019.12.21.10.03.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Dec 2019 10:03:44 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 21 Dec 2019 15:02:51 -0300 Message-Id: <20191221180252.6091-14-jamrial@gmail.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191221180252.6091-1-jamrial@gmail.com> References: <20191221180252.6091-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/15] avformat/dashenc: add an option to write a Latency element 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" Allows to set an intended target latency while streaming that clients can use to measure when using low latency mode. Signed-off-by: James Almer --- libavformat/dashenc.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 18b5fe0b70..58536f38d5 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -184,6 +184,8 @@ typedef struct DASHContext { int frag_type; int write_prft; int profile; + int target_latency; + int target_latency_refid; } DASHContext; static struct codec_string { @@ -1112,6 +1114,14 @@ static int write_manifest(AVFormatContext *s, int final) av_free(escaped); } avio_printf(out, "\t\n"); + if (!final && c->target_latency && c->target_latency_refid >= 0) { + avio_printf(out, "\t\n"); + avio_printf(out, "\t\ttarget_latency / 1000); + if (s->nb_streams > 1) + avio_printf(out, " referenceId=\"%d\"", c->target_latency_refid); + avio_printf(out, "/>\n"); + avio_printf(out, "\t\n"); + } if (c->window_size && s->nb_streams > 0 && c->streams[0].nb_segments > 0 && !c->use_template) { OutputStream *os = &c->streams[0]; @@ -1280,6 +1290,11 @@ static int dash_init(AVFormatContext *s) c->ldash = 0; } + if (c->target_latency && !c->streaming) { + av_log(s, AV_LOG_WARNING, "Target latency option will be ignored as streaming is not enabled\n"); + c->target_latency = 0; + } + if (c->global_sidx && !c->single_file) { av_log(s, AV_LOG_WARNING, "Global SIDX option will be ignored as single_file is not enabled\n"); c->global_sidx = 0; @@ -1304,6 +1319,11 @@ static int dash_init(AVFormatContext *s) c->write_prft = 0; } + if (c->target_latency && !c->write_prft) { + av_log(s, AV_LOG_WARNING, "Target latency option will be ignored as Producer Reference Time element will not be written\n"); + c->target_latency = 0; + } + av_strlcpy(c->dirname, s->url, sizeof(c->dirname)); ptr = strrchr(c->dirname, '/'); if (ptr) { @@ -1543,6 +1563,7 @@ static int dash_init(AVFormatContext *s) av_log(s, AV_LOG_WARNING, "no video stream and P-frame fragmentation set\n"); c->nr_of_streams_flushed = 0; + c->target_latency_refid = -1; return 0; } @@ -1904,8 +1925,11 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) int side_data_size; AVProducerReferenceTime *prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size); - if (prft && side_data_size == sizeof(AVProducerReferenceTime) && !prft->flags) + if (prft && side_data_size == sizeof(AVProducerReferenceTime) && !prft->flags) { os->producer_reference_time = prft->wallclock; + if (c->target_latency_refid < 0) + c->target_latency_refid = pkt->stream_index; + } os->first_pts = pkt->pts; } os->last_pts = pkt->pts; @@ -2186,6 +2210,7 @@ static const AVOption options[] = { { "dash", "MPEG-DASH ISO Base media file format live profile", 0, AV_OPT_TYPE_CONST, {.i64 = MPD_PROFILE_DASH }, 0, UINT_MAX, E, "mpd_profile"}, { "dvb_dash", "DVB-DASH profile", 0, AV_OPT_TYPE_CONST, {.i64 = MPD_PROFILE_DVB }, 0, UINT_MAX, E, "mpd_profile"}, { "http_opts", "HTTP protocol options", OFFSET(http_opts), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E }, + { "target_latency", "Set desired target latency for Low-latency dash", OFFSET(target_latency), AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT_MAX, E }, { NULL }, };