|
|
|
@@ -35,6 +35,7 @@ static const AVOption options[] = { |
|
|
|
{ "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM }, |
|
|
|
{ "ssrc", "Stream identifier", offsetof(RTPMuxContext, ssrc), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, |
|
|
|
{ "cname", "CNAME to include in RTCP SR packets", offsetof(RTPMuxContext, cname), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, |
|
|
|
{ "seq", "Starting sequence number", offsetof(RTPMuxContext, seq), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 65535, AV_OPT_FLAG_ENCODING_PARAM }, |
|
|
|
{ NULL }, |
|
|
|
}; |
|
|
|
|
|
|
|
@@ -124,6 +125,13 @@ static int rtp_write_header(AVFormatContext *s1) |
|
|
|
/* Round the NTP time to whole milliseconds. */ |
|
|
|
s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 + |
|
|
|
NTP_OFFSET_US; |
|
|
|
// Pick a random sequence start number, but in the lower end of the |
|
|
|
// available range, so that any wraparound doesn't happen immediately. |
|
|
|
// (Immediate wraparound would be an issue for SRTP.) |
|
|
|
if (s->seq < 0) |
|
|
|
s->seq = av_get_random_seed() & 0x0fff; |
|
|
|
else |
|
|
|
s->seq &= 0xffff; // Use the given parameter, wrapped to the right interval |
|
|
|
|
|
|
|
if (s1->packet_size) { |
|
|
|
if (s1->pb->max_packet_size) |
|
|
|
@@ -309,7 +317,7 @@ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) |
|
|
|
avio_write(s1->pb, buf1, len); |
|
|
|
avio_flush(s1->pb); |
|
|
|
|
|
|
|
s->seq++; |
|
|
|
s->seq = (s->seq + 1) & 0xffff; |
|
|
|
s->octet_count += len; |
|
|
|
s->packet_count++; |
|
|
|
} |
|
|
|
|