From 633f0035c2290c9ea3c6f7419834570abdf6deef Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 16 Dec 2022 14:56:44 -0600 Subject: [PATCH] Send a valid PTS in the RTP video header (#529) --- src/stream.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/stream.cpp b/src/stream.cpp index 240ca7e4..4d530998 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -905,6 +905,7 @@ void recvThread(broadcast_ctx_t &ctx) { void videoBroadcastThread(udp::socket &sock) { auto shutdown_event = mail::man->event(mail::broadcast_shutdown); auto packets = mail::man->queue(mail::video_packets); + auto timebase = boost::posix_time::microsec_clock::universal_time(); while(auto packet = packets->pop()) { if(shutdown_event->peek()) { @@ -1017,6 +1018,10 @@ void videoBroadcastThread(udp::socket &sock) { for(auto x = 0; x < shards.size(); ++x) { auto *inspect = (video_packet_raw_t *)shards.data(x); + // RTP video timestamps use a 90 KHz clock + auto now = boost::posix_time::microsec_clock::universal_time(); + auto timestamp = (now - timebase).total_microseconds() / (1000 / 90); + inspect->packet.fecInfo = (x << 12 | shards.data_shards << 22 | @@ -1024,12 +1029,11 @@ void videoBroadcastThread(udp::socket &sock) { inspect->rtp.header = 0x80 | FLAG_EXTENSION; inspect->rtp.sequenceNumber = util::endian::big(lowseq + x); + inspect->rtp.timestamp = util::endian::big(timestamp); inspect->packet.multiFecBlocks = (blockIndex << 4) | lastBlockIndex; inspect->packet.frameIndex = av_packet->pts; - } - for(auto x = 0; x < shards.size(); ++x) { sock.send_to(asio::buffer(shards[x]), session->video.peer); }