Skip to content

Commit

Permalink
avformat/rtpdec: attach producer reference time if available
Browse files Browse the repository at this point in the history
This produces true wallclock time at rtp source instead of the
local wallclock time at rtp client.

Signed-off-by: James Almer <[email protected]>
  • Loading branch information
alokpr authored and jamrial committed Mar 23, 2021
1 parent 3220a90 commit adff254
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
8 changes: 8 additions & 0 deletions libavformat/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,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.
Expand Down
19 changes: 19 additions & 0 deletions libavformat/rtpdec.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,19 @@ 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 =
(AVProducerReferenceTime *) av_packet_new_side_data(
pkt, AV_PKT_DATA_PRFT, sizeof(AVProducerReferenceTime));
if (!prft)
return AVERROR(ENOMEM);

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.
Expand All @@ -633,6 +646,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;
Expand Down
9 changes: 9 additions & 0 deletions libavformat/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -4706,6 +4706,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;
Expand Down

0 comments on commit adff254

Please sign in to comment.