From patchwork Tue Feb 18 16:13:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 17833 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 DC00044A270 for ; Tue, 18 Feb 2020 18:21:11 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B2B8F6898D5; Tue, 18 Feb 2020 18:21:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 100ED688288 for ; Tue, 18 Feb 2020 18:21:06 +0200 (EET) Received: by mail-qk1-f196.google.com with SMTP id z19so20023708qkj.5 for ; Tue, 18 Feb 2020 08:21:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=Y0LETgYrvRirdvm04u0FB5MzjmYgujD8+Hm8mhmwmoo=; b=MnoVjCrIpKe/DcOChxd8mXiOZ0P+Z5uGY702OvS19+Q5TnFdBLNNbVxUcjfeCVy278 ebyzYDiIDW6kVRELmgJfdqVcLE+WCpgZtlLJpVzeSkOzyYQqVb01tKGK5Nvi6zUzB7CY G6s2EmXFP1GAeAoeq6XL8BMEeNM8fsvqJbmzJs3HSqFMmzu1Mc1p5UgAcOFXaTQCdt28 0sjuBeNue/K+B2zmcKOgemcC3p5Xg7d5feDFWciMGU1fW4tjsQ+pVK1pb2IqK9jiePTO DuVXwAq7eEc1RsqdY5+utCRUDsASnSGtHZbAjAHE27TZ6tZbFytPAX4p/F+hrGap7pvL ogeQ== 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:mime-version :content-transfer-encoding; bh=Y0LETgYrvRirdvm04u0FB5MzjmYgujD8+Hm8mhmwmoo=; b=eOeNcXQ01YxyPUkTRlYsmckr/UvyD9umxkprX51xcszWdevlZ+A/orCwMhRP7FTwqt 6oW885QI+uuoYtQgyrdVVrlyqtm4QmD+liqOiSgj3+e+c0N6gqhGRvFJgOhvewpGIU+y z1UnrdxLtgxgB6EMqZ3Qq22uLkAX/9zYFP2dvnhhOFZ6RhFLH5TnKXalken4qj/VmcZZ nHSRbSM8w+BzKbXUcOaucuQ0D+r8XUUaQOwP4moIvDMu2YWmmDFayX25ONP+ITINHN/F YewizNnk8UzvomGek6oDt6+xgfaABauruEQAo5euo1mlxO0swoyocTuiCq/h76fKF4Kb WJGg== X-Gm-Message-State: APjAAAU+A2oF5VxVn9dnCub99c6dkKGOGsMM7CL9VV8asNvJWVsApCX1 2g952z/XUFWIyG5lYkmWkScJfZdA X-Google-Smtp-Source: APXvYqz5YcvVUwQfAbj0c6+Lp7eD08tHjg56hUWtDNkMgeSpxgPuBRVpZxFQuFtAwUtugZ/BYL1VRw== X-Received: by 2002:a37:a389:: with SMTP id m131mr3748968qke.251.1582042486318; Tue, 18 Feb 2020 08:14:46 -0800 (PST) Received: from localhost.localdomain ([191.83.214.166]) by smtp.gmail.com with ESMTPSA id 123sm745040qkj.113.2020.02.18.08.14.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2020 08:14:45 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Feb 2020 13:13:34 -0300 Message-Id: <20200218161336.1804-1-jamrial@gmail.com> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avformat/dashenc: write the styp box when the first frame of a segment is ready 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" This ensures it's written at the beginning of a segment in non streaming mode when segment duration differs from fragment duration. Signed-off-by: James Almer --- libavformat/dashenc.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index c89aa3a32c..5c1d24d3e2 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -1911,12 +1911,8 @@ static int dash_flush(AVFormatContext *s, int final, int stream) continue; } - if (!c->single_file) { - if (os->segment_type == SEGMENT_TYPE_MP4 && !os->written_len) - write_styp(os->ctx->pb); - } else { + if (c->single_file) snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile); - } ret = flush_dynbuf(c, os, &range_length); if (ret < 0) @@ -2188,6 +2184,8 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) AVDictionary *opts = NULL; const char *proto = avio_find_protocol_name(s->url); int use_rename = proto && !strcmp(proto, "file"); + if (os->segment_type == SEGMENT_TYPE_MP4) + write_styp(os->ctx->pb); os->filename[0] = os->full_path[0] = os->temp_path[0] = '\0'; ff_dash_fill_tmpl_params(os->filename, sizeof(os->filename), os->media_seg_name, pkt->stream_index, @@ -2212,8 +2210,6 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) if (c->streaming && os->segment_type == SEGMENT_TYPE_MP4) { int len = 0; uint8_t *buf = NULL; - if (!os->written_len) - write_styp(os->ctx->pb); avio_flush(os->ctx->pb); len = avio_get_dyn_buf (os->ctx->pb, &buf); if (os->out) { From patchwork Tue Feb 18 16:13:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 17834 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 CBFED44A283 for ; Tue, 18 Feb 2020 18:22:42 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B5ACD6898D5; Tue, 18 Feb 2020 18:22:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0AF9680C96 for ; Tue, 18 Feb 2020 18:22:35 +0200 (EET) Received: by mail-qk1-f193.google.com with SMTP id o28so18704564qkj.9 for ; Tue, 18 Feb 2020 08:22:35 -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=SxyrWlxfqIolUhXiYgALc24ZnfhMDpxXJmDzSNaaOGI=; b=d2fulrXj37Cy9OC62jVeJs+yNbY2XzxMnmeOUBzr9c7RDw2OHa0CMt/ENeKXY9uoC7 rLUahQ4rvb6YMmPXxwSM0V/xOsOw7e+vavHBZSQilz7JMoSHdXU+AhmbzEAudhuHL6/k qtXPe3RFI2HAnq5RM+SNECJ8IOP/406tgus2KX9idgmSNTpBJYLkKLDoQhvp8SKYUbsT qsvxj5qcucqu2OSEDNdvRbo1j23c8UNLCRJqt8jvq1EoMccNZjwYM0qwGtH69osBTUdz VITQnCZ4EA5TDzHUUDyAMR4DJ75sxCx6AZ4nV6Z6jPK2KPQrm1I4rGIUNAG3Upl2bCLr MEjA== 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=SxyrWlxfqIolUhXiYgALc24ZnfhMDpxXJmDzSNaaOGI=; b=VvKia4Qq5Ep18XLA53vRXX/fq5O2lWnJtvcNBSio8bruzVlOS/dkkzc3kUXqns53s5 2k+uTEOADJv6dRW6HMsL+VajFabOcrwb5N9Nefwt9j0+VPBWn55f8QHwt6vOCBl5zjXr XADew3uaj1+N1nT6lTl3OdDc/YXrypF0qAlTQedX0AVKKlLIQDrVUC5rvJy7/1wpcyob P7tGKX88qob4/Hz9maNqZ8IXAKOuvY7broHckPnqza93vSAtnQXkq06dK1e8/hNPz1Zt 3nK5GTQ3yvlC3FpV2e2BKrn9W6f0xu1Yink/c2vtBnxHrtE2Ffn/3rYTRNByo1Fc3u4s mjfQ== X-Gm-Message-State: APjAAAVcq6Co2OUxII5GRexmwBP2Cwj7rzZWxS3RW5qytmqICq/UFOX2 ZPzh0pdMrJFP2McGYCabIFwfVfx+ X-Google-Smtp-Source: APXvYqwR4CIw1EhXI+OLyU9VuDuKGnlmjA91zJQYRw0LYoVIyD4Ai+Mx7f3/GuxHfv5+4JSoBA4bHg== X-Received: by 2002:ac8:5208:: with SMTP id r8mr18206909qtn.131.1582042487654; Tue, 18 Feb 2020 08:14:47 -0800 (PST) Received: from localhost.localdomain ([191.83.214.166]) by smtp.gmail.com with ESMTPSA id 123sm745040qkj.113.2020.02.18.08.14.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2020 08:14:47 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Feb 2020 13:13:35 -0300 Message-Id: <20200218161336.1804-2-jamrial@gmail.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200218161336.1804-1-jamrial@gmail.com> References: <20200218161336.1804-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avformat/dashenc: write a capture time Producer Reference Time element when none is provided by the encoder 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" This way, the element will be present in any scenario when the write_prft option is used. Signed-off-by: James Almer --- libavformat/dashenc.c | 46 +++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 5c1d24d3e2..b910cc22d0 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -129,6 +129,7 @@ typedef struct OutputStream { char temp_path[1024]; double availability_time_offset; int64_t producer_reference_time; + int producer_reference_time_flags; char producer_reference_time_str[100]; int total_pkt_size; int64_t total_pkt_duration; @@ -864,8 +865,8 @@ static int write_adaptation_set(AVFormatContext *s, AVIOContext *out, int as_ind s->streams[i]->codecpar->channels); } if (!final && c->write_prft && os->producer_reference_time_str[0]) { - avio_printf(out, "\t\t\t\t\n", - i, os->producer_reference_time_str, c->presentation_time_offset); + avio_printf(out, "\t\t\t\t\n", + i, os->producer_reference_time_flags ? "captured" : "encoder", os->producer_reference_time_str, c->presentation_time_offset); avio_printf(out, "\t\t\t\t\t\n", c->utc_timing_url); avio_printf(out, "\t\t\t\t\n"); } @@ -2002,6 +2003,35 @@ static int dash_flush(AVFormatContext *s, int final, int stream) return ret; } +static int dash_parse_prft(DASHContext *c, AVPacket *pkt) +{ + OutputStream *os = &c->streams[pkt->stream_index]; + int side_data_size; + AVProducerReferenceTime *prft; + + if (!c->write_prft) + return 0; + + prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size); + if (!prft || side_data_size != sizeof(AVProducerReferenceTime) || prft->flags) { + // No encoder generated AVProducerReferenceTime side data. Instead of letting the mov muxer + // generate a capture-time one for the first packet, do it here so we can also use it for the + // manifest. + prft = (AVProducerReferenceTime *)av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, + sizeof(AVProducerReferenceTime)); + if (!prft) + return AVERROR(ENOMEM); + prft->wallclock = av_gettime(); + prft->flags = 24; + } + os->producer_reference_time = prft->wallclock; + os->producer_reference_time_flags = prft->flags; + if (c->target_latency_refid < 0) + c->target_latency_refid = pkt->stream_index; + + return 0; +} + static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) { DASHContext *c = s->priv_data; @@ -2034,15 +2064,11 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) } if (os->first_pts == AV_NOPTS_VALUE) { - 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) { - os->producer_reference_time = prft->wallclock; - if (c->target_latency_refid < 0) - c->target_latency_refid = pkt->stream_index; - } os->first_pts = pkt->pts; + + ret = dash_parse_prft(c, pkt); + if (ret > 0) + return ret; } os->last_pts = pkt->pts; From patchwork Tue Feb 18 16:13:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 17835 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 DC16744B522 for ; Tue, 18 Feb 2020 18:41:12 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B38EB680987; Tue, 18 Feb 2020 18:41:12 +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 DA126680987 for ; Tue, 18 Feb 2020 18:41:05 +0200 (EET) Received: by mail-io1-f67.google.com with SMTP id z16so22967665iod.11 for ; Tue, 18 Feb 2020 08:41:05 -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=od0fgp4cX2+0ox3soQ4xg66m2nSWvOMgiuL+/Rua4d0=; b=Nf4WQ+vJRkFiZSKRc19voxfdSuV55LjQrQJxOQedXK7hclGMQWhT4hXy3z70/sEESb i7KRlBk1W5eaj4kWBjP8EL/Qgya7UKn3PywcrLrPWSrHmA1Ra9D4GC832fA1oVm77She vZTp502e+55xrmPn1PdsGVX5Ku9DEllf6ri5GVQNMqxjaVi5ArEtsD6pxvRTjYpRuyZv 0RpwgZdQqlAcA94HHAV8UMbpT0kYwvZcXfvbTO+HRUyfZCm64id4C/98Pk+g6IJ6Jscl wiYwN0xDEOU2vBfkgAE/fVNLc2SbXz7Q+FJsJlpmocOUKhZiX64HLA0H1OQC/nH5y6bX K/rw== 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=od0fgp4cX2+0ox3soQ4xg66m2nSWvOMgiuL+/Rua4d0=; b=DtjXzNfazV2lUgtqqszHP0qSmujiGzEFAghct/zuqQ34y/yMbMaHwPAdOeDqsi+Bor ks560ddENNjtvAG1uU5jwPPZuBs6I9D6UBFW0iMgitvOqzsFjSnATbxyUfvHsAQ34JgI +HvW9AHBMB15tpawObbFdlAntIhTKdV3B9fWC1Ct2rdn/+6vTMEww7lh/mPCL4uAJIdo 6LgaoJqcle28RaSkcHqn6QAWDmIO+judiF3eWEbI2B+SF/11F7tP3n2fezvFRRJLiN5v fzwu89SUJOEfhFkBalJiUTukpgrDET9xVXo3ZdJwb6jFEOkFXRbAuqAOIhN/Up2HRmuZ j86Q== X-Gm-Message-State: APjAAAVuz82fB+c1jr/pduFJA4SgNrAmGiB5tgXWQmr64FJCSF0A9E0O 93LMlkafnvVYTq0TxilbG+gTFbY4 X-Google-Smtp-Source: APXvYqwGmBmkh4I3Nf9iof0ID+ydJerOs+CQwhNHr0MBsyxh6yc8LS/6dbpYUo0/RUG9yITNBDYiYw== X-Received: by 2002:a05:620a:39a:: with SMTP id q26mr4128652qkm.188.1582042488734; Tue, 18 Feb 2020 08:14:48 -0800 (PST) Received: from localhost.localdomain ([191.83.214.166]) by smtp.gmail.com with ESMTPSA id 123sm745040qkj.113.2020.02.18.08.14.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2020 08:14:48 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 18 Feb 2020 13:13:36 -0300 Message-Id: <20200218161336.1804-3-jamrial@gmail.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200218161336.1804-1-jamrial@gmail.com> References: <20200218161336.1804-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] avformat/dashenc: always attempt to enable prft on ldash mode 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" Signed-off-by: James Almer --- libavformat/dashenc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index b910cc22d0..045d2f4df6 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -1395,6 +1395,11 @@ static int dash_init(AVFormatContext *s) c->frag_type = FRAG_TYPE_EVERY_FRAME; } + if (c->ldash && !c->write_prft) { + av_log(s, AV_LOG_INFO, "Enabling Producer Reference Time element for Low Latency mode\n"); + c->write_prft = 1; + } + if (c->write_prft && !c->utc_timing_url) { av_log(s, AV_LOG_WARNING, "Producer Reference Time element option will be ignored as utc_timing_url is not set\n"); c->write_prft = 0;