mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-25 16:52:31 +00:00
avformat/rtpdec: attach producer reference time if available
This produces true wallclock time at rtp source instead of the local wallclock time at rtp client. Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
3220a908ca
commit
adff25412a
@ -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.
|
||||
|
@ -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.
|
||||
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user