72 lines
2.6 KiB
Diff
72 lines
2.6 KiB
Diff
|
diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
|
||
|
index 63047beccc..d59ec3dc8c 100644
|
||
|
--- a/libavformat/rtpenc.c
|
||
|
+++ b/libavformat/rtpenc.c
|
||
|
@@ -28,6 +28,8 @@
|
||
|
|
||
|
#include "rtpenc.h"
|
||
|
|
||
|
+#define EXT_ABS_SEND_TIME
|
||
|
+
|
||
|
static const AVOption options[] = {
|
||
|
FF_RTP_FLAG_OPTS(RTPMuxContext, flags),
|
||
|
{ "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
|
||
|
@@ -146,7 +148,11 @@ static int rtp_write_header(AVFormatContext *s1)
|
||
|
s1->pb->max_packet_size);
|
||
|
} else
|
||
|
s1->packet_size = s1->pb->max_packet_size;
|
||
|
+#ifdef EXT_ABS_SEND_TIME
|
||
|
+ if (s1->packet_size <= 20) {
|
||
|
+#else
|
||
|
if (s1->packet_size <= 12) {
|
||
|
+#endif
|
||
|
av_log(s1, AV_LOG_ERROR, "Max packet size %u too low\n", s1->packet_size);
|
||
|
return AVERROR(EIO);
|
||
|
}
|
||
|
@@ -154,7 +160,11 @@ static int rtp_write_header(AVFormatContext *s1)
|
||
|
if (!s->buf) {
|
||
|
return AVERROR(ENOMEM);
|
||
|
}
|
||
|
+#ifdef EXT_ABS_SEND_TIME
|
||
|
+ s->max_payload_size = s1->packet_size - 20;
|
||
|
+#else
|
||
|
s->max_payload_size = s1->packet_size - 12;
|
||
|
+#endif
|
||
|
|
||
|
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||
|
avpriv_set_pts_info(st, 32, 1, st->codecpar->sample_rate);
|
||
|
@@ -332,16 +342,34 @@ static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
|
||
|
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
|
||
|
{
|
||
|
RTPMuxContext *s = s1->priv_data;
|
||
|
+ uint64_t ntp64_time;
|
||
|
+ uint32_t absoluteSendTime;
|
||
|
|
||
|
av_log(s1, AV_LOG_TRACE, "rtp_send_data size=%d\n", len);
|
||
|
|
||
|
/* build the RTP header */
|
||
|
+#ifdef EXT_ABS_SEND_TIME
|
||
|
+ avio_w8(s1->pb, RTP_VERSION << 6 | 0x10); // extention bit
|
||
|
+#else
|
||
|
avio_w8(s1->pb, RTP_VERSION << 6);
|
||
|
+#endif
|
||
|
avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
|
||
|
avio_wb16(s1->pb, s->seq);
|
||
|
avio_wb32(s1->pb, s->timestamp);
|
||
|
avio_wb32(s1->pb, s->ssrc);
|
||
|
|
||
|
+#ifdef EXT_ABS_SEND_TIME
|
||
|
+ avio_wb16(s1->pb, 0xBEDE); // magic word
|
||
|
+ avio_wb16(s1->pb, 0x0001); // length=1
|
||
|
+ avio_w8(s1->pb, 0x32); // ID=3 and lenght=2
|
||
|
+ ntp64_time = ff_get_formatted_ntp_time(ff_ntp_time());
|
||
|
+ absoluteSendTime = (uint32_t)((ntp64_time>> 14) & 0x00ffffff);
|
||
|
+ av_log(s1, AV_LOG_TRACE, "ntp64:%lu, abs_time:%u\n", ntp64_time, absoluteSendTime);
|
||
|
+ avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 16));
|
||
|
+ avio_w8(s1->pb, (uint8_t)(absoluteSendTime >> 8 & 0xff));
|
||
|
+ avio_w8(s1->pb, (uint8_t)(absoluteSendTime & 0xff));
|
||
|
+#endif
|
||
|
+
|
||
|
avio_write(s1->pb, buf1, len);
|
||
|
avio_flush(s1->pb);
|