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;