From patchwork Tue Mar 23 19:52:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alok Priyadarshi X-Patchwork-Id: 26574 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 5DFC044AEE7 for ; Tue, 23 Mar 2021 21:59:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 341B168AA24; Tue, 23 Mar 2021 21:59:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f179.google.com (mail-oi1-f179.google.com [209.85.167.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F5AB68A21C for ; Tue, 23 Mar 2021 21:59:08 +0200 (EET) Received: by mail-oi1-f179.google.com with SMTP id k25so18304050oic.4 for ; Tue, 23 Mar 2021 12:59:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ULeNk6YzdJJ3F4Y4Q6kt/jvFbsb5DeBZzsoVJZL5jl0=; b=rzRO9jEen9cuujISNBpV3PJRc/ZGAPEtCAjYdEDlVqau4XzQXFqK+WpQwQH/CZ+Yor w3zIcZi9tBA3kTwQqNcUJ2e618o6TBbdAMctTelYpXYw40fOoBxYp7QtdvQcFR03SXBT coeIIBdYSvMKg2Oen2kxLlD+UeoJ3TccQ068BZm8sLOGvi5qd+UzWQXn90Bp0Grox1d4 FRdMvKXEClQ1+Mde+R41egegzc54XAg6++Ga4XaHf8vCAEl35RpRdm/clTO6IOew5kVh x9Y7xWSytaIIMMHeQb0XutCPzD6uWxvMNxssqaaKIwBz4Hd6FAGFTGuQo3h5GnDLCYNK bTbg== 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=ULeNk6YzdJJ3F4Y4Q6kt/jvFbsb5DeBZzsoVJZL5jl0=; b=KXbqGUd8ZC3b8BVhC6MnNsK9Bu4gYd30gnfPD0snlRW51obmUBUPQcQaUCB0mA5Uox JGiL7N13NgA0hN+BqPPqlg5zlBRQPeeL5na71EbkbaOk8ndktyuQ47zAW6y3cSByYMMQ yVbhBn6soWdRmc5nYLRLUh2Siy/ggDUUKiuw9EE4AqGwUNqTnx+XrD9yo4LkYu0QzhNz f2CcapENG0mP6cCQebsVCDHP++T9mhRagVIX3CspYCAos0tNTlXk1PdvytmA6Ve5u83P r3yfjhsrAOjhg1GkhdjRvja9SgFhKsRE7bruzFDGZ4eoi7UAEiAtnqehzWJKPZRsct3h KNxQ== X-Gm-Message-State: AOAM533jJ6M4AhfC1ONiCkidWmaik+BFUESpWs/GSChYFVsiEJYhC44L jPDH57jJJigu4pJnv+eegO2Q0aMUVjKSvA== X-Google-Smtp-Source: ABdhPJyvnBoJIJY5AG+QmMf1rNugO4OMdaq/AokYwZ7lucwXBLi/0idquHg+my7jrvsJDhJcIWQ8ag== X-Received: by 2002:a17:90b:1007:: with SMTP id gm7mr6126402pjb.17.1616529151751; Tue, 23 Mar 2021 12:52:31 -0700 (PDT) Received: from localhost.localdomain (c-73-223-72-238.hsd1.ca.comcast.net. [73.223.72.238]) by smtp.gmail.com with ESMTPSA id w15sm42929pfn.84.2021.03.23.12.52.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Mar 2021 12:52:31 -0700 (PDT) From: Alok Priyadarshi To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Mar 2021 12:52:21 -0700 Message-Id: <20210323195221.251025-1-alokpr@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/rtpdec: attach producer reference time if available 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: Alok Priyadarshi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This produces true wallclock time at rtp source instead of the local wallclock time at rtp client. --- libavformat/internal.h | 8 ++++++++ libavformat/rtpdec.c | 27 +++++++++++++++++++++++++++ libavformat/utils.c | 9 +++++++++ 3 files changed, 44 insertions(+) diff --git a/libavformat/internal.h b/libavformat/internal.h index 17a6ab07d3..1e10cde00e 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -254,6 +254,14 @@ uint64_t ff_ntp_time(void); */ uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us); +/** + * Parse the NTP time in micro seconds (since NTP epoch). + * + * @param ntp_ts NTP time stamp formatted as per the RFC-5905. + * @return the time in micro seconds (since NTP epoch) + */ +uint64_t ff_parse_ntp_time(uint64_t ntp_ts); + /** * Append the media-specific SDP fragment for the media stream c * to the buffer buff. diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 3d5b200099..61a6c73614 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -30,6 +30,7 @@ #include "url.h" #include "rtpdec.h" #include "rtpdec_formats.h" +#include "internal.h" #define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */ @@ -583,6 +584,26 @@ void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, s->srtp_enabled = 1; } +static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) { + AVProducerReferenceTime *prft; + uint8_t *side_data; + int side_data_size; + + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size); + if (!side_data) { + side_data_size = sizeof(AVProducerReferenceTime); + side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, side_data_size); + } + if (!side_data || side_data_size < sizeof(AVProducerReferenceTime)) + return AVERROR(ENOMEM); + + prft = (AVProducerReferenceTime *)side_data; + prft->wallclock = ff_parse_ntp_time(s->last_rtcp_ntp_time) - NTP_OFFSET_US + + timestamp - s->last_rtcp_timestamp; + prft->flags = 24; + return 0; +} + /** * This was the second switch in rtp_parse packet. * Normalizes time, if required, sets stream_index, etc. @@ -594,6 +615,12 @@ static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestam if (timestamp == RTP_NOTS_VALUE) return; + if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { + if (rtp_set_prft(s, pkt, timestamp) < 0) { + av_log(s->ic, AV_LOG_WARNING, "rtpdec: failed to set prft"); + } + } + if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) { int64_t addend; int delta_timestamp; diff --git a/libavformat/utils.c b/libavformat/utils.c index 7e5767ec60..569922beaf 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4734,6 +4734,15 @@ uint64_t ff_get_formatted_ntp_time(uint64_t ntp_time_us) return ntp_ts; } +uint64_t ff_parse_ntp_time(uint64_t ntp_ts) +{ + uint64_t sec = ntp_ts >> 32; + uint64_t frac_part = ntp_ts & 0xFFFFFFFFULL; + uint64_t usec = (frac_part * 1000000) / 0xFFFFFFFFULL; + + return (sec * 1000000) + usec; +} + int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags) { const char *p;