2 * RTP input/output format
3 * Copyright (c) 2002 Fabrice Bellard.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "bitstream.h"
26 #include <sys/types.h>
27 #include <sys/socket.h>
28 #include <netinet/in.h>
29 #include <arpa/inet.h>
32 #include "rtp_internal.h"
38 /* TODO: - add RTCP statistics reporting (should be optional).
40 - add support for h263/mpeg4 packetized output : IDEA: send a
41 buffer to 'rtp_write_packet' contains all the packets for ONE
42 frame. Each packet should have a four byte header containing
43 the length in big endian format (same trick as
44 'url_open_dyn_packet_buf')
47 /* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
48 AVRtpPayloadType_t AVRtpPayloadTypes
[]=
50 {0, "PCMU", CODEC_TYPE_AUDIO
, CODEC_ID_PCM_MULAW
, 8000, 1},
51 {1, "Reserved", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
52 {2, "Reserved", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
53 {3, "GSM", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
54 {4, "G723", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
55 {5, "DVI4", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
56 {6, "DVI4", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 16000, 1},
57 {7, "LPC", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
58 {8, "PCMA", CODEC_TYPE_AUDIO
, CODEC_ID_PCM_ALAW
, 8000, 1},
59 {9, "G722", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
60 {10, "L16", CODEC_TYPE_AUDIO
, CODEC_ID_PCM_S16BE
, 44100, 2},
61 {11, "L16", CODEC_TYPE_AUDIO
, CODEC_ID_PCM_S16BE
, 44100, 1},
62 {12, "QCELP", CODEC_TYPE_AUDIO
, CODEC_ID_QCELP
, 8000, 1},
63 {13, "CN", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
64 {14, "MPA", CODEC_TYPE_AUDIO
, CODEC_ID_MP2
, 90000, -1},
65 {15, "G728", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
66 {16, "DVI4", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 11025, 1},
67 {17, "DVI4", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 22050, 1},
68 {18, "G729", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, 8000, 1},
69 {19, "reserved", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, -1, -1},
70 {20, "unassigned", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, -1, -1},
71 {21, "unassigned", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, -1, -1},
72 {22, "unassigned", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, -1, -1},
73 {23, "unassigned", CODEC_TYPE_AUDIO
, CODEC_ID_NONE
, -1, -1},
74 {24, "unassigned", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, -1, -1},
75 {25, "CelB", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, 90000, -1},
76 {26, "JPEG", CODEC_TYPE_VIDEO
, CODEC_ID_MJPEG
, 90000, -1},
77 {27, "unassigned", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, -1, -1},
78 {28, "nv", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, 90000, -1},
79 {29, "unassigned", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, -1, -1},
80 {30, "unassigned", CODEC_TYPE_VIDEO
, CODEC_ID_NONE
, -1, -1},
81 {31, "H261", CODEC_TYPE_VIDEO
, CODEC_ID_H261
, 90000, -1},
82 {32, "MPV", CODEC_TYPE_VIDEO
, CODEC_ID_MPEG1VIDEO
, 90000, -1},
83 {33, "MP2T", CODEC_TYPE_DATA
, CODEC_ID_MPEG2TS
, 90000, -1},
84 {34, "H263", CODEC_TYPE_VIDEO
, CODEC_ID_H263
, 90000, -1},
85 {35, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
86 {36, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
87 {37, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
88 {38, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
89 {39, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
90 {40, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
91 {41, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
92 {42, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
93 {43, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
94 {44, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
95 {45, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
96 {46, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
97 {47, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
98 {48, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
99 {49, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
100 {50, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
101 {51, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
102 {52, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
103 {53, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
104 {54, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
105 {55, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
106 {56, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
107 {57, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
108 {58, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
109 {59, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
110 {60, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
111 {61, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
112 {62, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
113 {63, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
114 {64, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
115 {65, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
116 {66, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
117 {67, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
118 {68, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
119 {69, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
120 {70, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
121 {71, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
122 {72, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
123 {73, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
124 {74, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
125 {75, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
126 {76, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
127 {77, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
128 {78, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
129 {79, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
130 {80, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
131 {81, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
132 {82, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
133 {83, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
134 {84, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
135 {85, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
136 {86, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
137 {87, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
138 {88, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
139 {89, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
140 {90, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
141 {91, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
142 {92, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
143 {93, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
144 {94, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
145 {95, "unassigned", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
146 {96, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
147 {97, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
148 {98, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
149 {99, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
150 {100, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
151 {101, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
152 {102, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
153 {103, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
154 {104, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
155 {105, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
156 {106, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
157 {107, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
158 {108, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
159 {109, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
160 {110, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
161 {111, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
162 {112, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
163 {113, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
164 {114, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
165 {115, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
166 {116, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
167 {117, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
168 {118, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
169 {119, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
170 {120, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
171 {121, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
172 {122, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
173 {123, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
174 {124, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
175 {125, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
176 {126, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
177 {127, "dynamic", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1},
178 {-1, "", CODEC_TYPE_UNKNOWN
, CODEC_ID_NONE
, -1, -1}
181 /* statistics functions */
182 RTPDynamicProtocolHandler
*RTPFirstDynamicPayloadHandler
= NULL
;
184 static RTPDynamicProtocolHandler mp4v_es_handler
= {"MP4V-ES", CODEC_TYPE_VIDEO
, CODEC_ID_MPEG4
};
185 static RTPDynamicProtocolHandler mpeg4_generic_handler
= {"mpeg4-generic", CODEC_TYPE_AUDIO
, CODEC_ID_AAC
};
187 static void register_dynamic_payload_handler(RTPDynamicProtocolHandler
*handler
)
189 handler
->next
= RTPFirstDynamicPayloadHandler
;
190 RTPFirstDynamicPayloadHandler
= handler
;
193 void av_register_rtp_dynamic_payload_handlers()
195 register_dynamic_payload_handler(&mp4v_es_handler
);
196 register_dynamic_payload_handler(&mpeg4_generic_handler
);
197 register_dynamic_payload_handler(&ff_h264_dynamic_handler
);
200 int rtp_get_codec_info(AVCodecContext
*codec
, int payload_type
)
202 if (AVRtpPayloadTypes
[payload_type
].codec_id
!= CODEC_ID_NONE
) {
203 codec
->codec_type
= AVRtpPayloadTypes
[payload_type
].codec_type
;
204 codec
->codec_id
= AVRtpPayloadTypes
[payload_type
].codec_id
;
205 if (AVRtpPayloadTypes
[payload_type
].audio_channels
> 0)
206 codec
->channels
= AVRtpPayloadTypes
[payload_type
].audio_channels
;
207 if (AVRtpPayloadTypes
[payload_type
].clock_rate
> 0)
208 codec
->sample_rate
= AVRtpPayloadTypes
[payload_type
].clock_rate
;
214 /* return < 0 if unknown payload type */
215 int rtp_get_payload_type(AVCodecContext
*codec
)
219 /* compute the payload type */
220 for (payload_type
= -1, i
= 0; AVRtpPayloadTypes
[i
].pt
>= 0; ++i
)
221 if (AVRtpPayloadTypes
[i
].codec_id
== codec
->codec_id
) {
222 if (codec
->codec_id
== CODEC_ID_PCM_S16BE
)
223 if (codec
->channels
!= AVRtpPayloadTypes
[i
].audio_channels
)
225 payload_type
= AVRtpPayloadTypes
[i
].pt
;
230 static inline uint32_t decode_be32(const uint8_t *p
)
232 return (p
[0] << 24) | (p
[1] << 16) | (p
[2] << 8) | p
[3];
235 static inline uint64_t decode_be64(const uint8_t *p
)
237 return ((uint64_t)decode_be32(p
) << 32) | decode_be32(p
+ 4);
240 static int rtcp_parse_packet(RTPDemuxContext
*s
, const unsigned char *buf
, int len
)
244 s
->last_rtcp_ntp_time
= decode_be64(buf
+ 8);
245 if (s
->first_rtcp_ntp_time
== AV_NOPTS_VALUE
)
246 s
->first_rtcp_ntp_time
= s
->last_rtcp_ntp_time
;
247 s
->last_rtcp_timestamp
= decode_be32(buf
+ 16);
251 #define RTP_SEQ_MOD (1<<16)
254 * called on parse open packet
256 static void rtp_init_statistics(RTPStatistics
*s
, uint16_t base_sequence
) // called on parse open packet.
258 memset(s
, 0, sizeof(RTPStatistics
));
259 s
->max_seq
= base_sequence
;
264 * called whenever there is a large jump in sequence numbers, or when they get out of probation...
266 static void rtp_init_sequence(RTPStatistics
*s
, uint16_t seq
)
271 s
->bad_seq
= RTP_SEQ_MOD
+ 1;
273 s
->expected_prior
= 0;
274 s
->received_prior
= 0;
280 * returns 1 if we should handle this packet.
282 static int rtp_valid_packet_in_sequence(RTPStatistics
*s
, uint16_t seq
)
284 uint16_t udelta
= seq
- s
->max_seq
;
285 const int MAX_DROPOUT
= 3000;
286 const int MAX_MISORDER
= 100;
287 const int MIN_SEQUENTIAL
= 2;
289 /* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */
292 if(seq
==s
->max_seq
+ 1) {
295 if(s
->probation
==0) {
296 rtp_init_sequence(s
, seq
);
301 s
->probation
= MIN_SEQUENTIAL
- 1;
304 } else if (udelta
< MAX_DROPOUT
) {
305 // in order, with permissible gap
306 if(seq
< s
->max_seq
) {
307 //sequence number wrapped; count antother 64k cycles
308 s
->cycles
+= RTP_SEQ_MOD
;
311 } else if (udelta
<= RTP_SEQ_MOD
- MAX_MISORDER
) {
312 // sequence made a large jump...
313 if(seq
==s
->bad_seq
) {
314 // two sequential packets-- assume that the other side restarted without telling us; just resync.
315 rtp_init_sequence(s
, seq
);
317 s
->bad_seq
= (seq
+ 1) & (RTP_SEQ_MOD
-1);
321 // duplicate or reordered packet...
329 * This function is currently unused; without a valid local ntp time, I don't see how we could calculate the
330 * difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values
331 * never change. I left this in in case someone else can see a way. (rdm)
333 static void rtcp_update_jitter(RTPStatistics
*s
, uint32_t sent_timestamp
, uint32_t arrival_timestamp
)
335 uint32_t transit
= arrival_timestamp
- sent_timestamp
;
338 d
= FFABS(transit
- s
->transit
);
339 s
->jitter
+= d
- ((s
->jitter
+ 8)>>4);
344 * some rtp servers assume client is dead if they don't hear from them...
345 * so we send a Receiver Report to the provided ByteIO context
346 * (we don't have access to the rtcp handle from here)
348 int rtp_check_and_send_back_rr(RTPDemuxContext
*s
, int count
)
354 RTPStatistics
*stats
= &s
->statistics
;
356 uint32_t extended_max
;
357 uint32_t expected_interval
;
358 uint32_t received_interval
;
359 uint32_t lost_interval
;
362 uint64_t ntp_time
= s
->last_rtcp_ntp_time
; // TODO: Get local ntp time?
364 if (!s
->rtp_ctx
|| (count
< 1))
367 /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
368 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
369 s
->octet_count
+= count
;
370 rtcp_bytes
= ((s
->octet_count
- s
->last_octet_count
) * RTCP_TX_RATIO_NUM
) /
372 rtcp_bytes
/= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
375 s
->last_octet_count
= s
->octet_count
;
377 if (url_open_dyn_buf(&pb
) < 0)
381 put_byte(&pb
, (RTP_VERSION
<< 6) + 1); /* 1 report block */
383 put_be16(&pb
, 7); /* length in words - 1 */
384 put_be32(&pb
, s
->ssrc
); // our own SSRC
385 put_be32(&pb
, s
->ssrc
); // XXX: should be the server's here!
386 // some placeholders we should really fill...
388 extended_max
= stats
->cycles
+ stats
->max_seq
;
389 expected
= extended_max
- stats
->base_seq
+ 1;
390 lost
= expected
- stats
->received
;
391 lost
= FFMIN(lost
, 0xffffff); // clamp it since it's only 24 bits...
392 expected_interval
= expected
- stats
->expected_prior
;
393 stats
->expected_prior
= expected
;
394 received_interval
= stats
->received
- stats
->received_prior
;
395 stats
->received_prior
= stats
->received
;
396 lost_interval
= expected_interval
- received_interval
;
397 if (expected_interval
==0 || lost_interval
<=0) fraction
= 0;
398 else fraction
= (lost_interval
<<8)/expected_interval
;
400 fraction
= (fraction
<<24) | lost
;
402 put_be32(&pb
, fraction
); /* 8 bits of fraction, 24 bits of total packets lost */
403 put_be32(&pb
, extended_max
); /* max sequence received */
404 put_be32(&pb
, stats
->jitter
>>4); /* jitter */
406 if(s
->last_rtcp_ntp_time
==AV_NOPTS_VALUE
)
408 put_be32(&pb
, 0); /* last SR timestamp */
409 put_be32(&pb
, 0); /* delay since last SR */
411 uint32_t middle_32_bits
= s
->last_rtcp_ntp_time
>>16; // this is valid, right? do we need to handle 64 bit values special?
412 uint32_t delay_since_last
= ntp_time
- s
->last_rtcp_ntp_time
;
414 put_be32(&pb
, middle_32_bits
); /* last SR timestamp */
415 put_be32(&pb
, delay_since_last
); /* delay since last SR */
419 put_byte(&pb
, (RTP_VERSION
<< 6) + 1); /* 1 report block */
421 len
= strlen(s
->hostname
);
422 put_be16(&pb
, (6 + len
+ 3) / 4); /* length in words - 1 */
423 put_be32(&pb
, s
->ssrc
);
426 put_buffer(&pb
, s
->hostname
, len
);
428 for (len
= (6 + len
) % 4; len
% 4; len
++) {
432 put_flush_packet(&pb
);
433 len
= url_close_dyn_buf(&pb
, &buf
);
434 if ((len
> 0) && buf
) {
437 printf("sending %d bytes of RR\n", len
);
439 result
= url_write(s
->rtp_ctx
, buf
, len
);
441 printf("result from url_write: %d\n", result
);
449 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
450 * MPEG2TS streams to indicate that they should be demuxed inside the
451 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
452 * TODO: change this to not take rtp_payload data, and use the new dynamic payload system.
454 RTPDemuxContext
*rtp_parse_open(AVFormatContext
*s1
, AVStream
*st
, URLContext
*rtpc
, int payload_type
, rtp_payload_data_t
*rtp_payload_data
)
458 s
= av_mallocz(sizeof(RTPDemuxContext
));
461 s
->payload_type
= payload_type
;
462 s
->last_rtcp_ntp_time
= AV_NOPTS_VALUE
;
463 s
->first_rtcp_ntp_time
= AV_NOPTS_VALUE
;
466 s
->rtp_payload_data
= rtp_payload_data
;
467 rtp_init_statistics(&s
->statistics
, 0); // do we know the initial sequence from sdp?
468 if (!strcmp(AVRtpPayloadTypes
[payload_type
].enc_name
, "MP2T")) {
469 s
->ts
= mpegts_parse_open(s
->ic
);
475 switch(st
->codec
->codec_id
) {
476 case CODEC_ID_MPEG1VIDEO
:
477 case CODEC_ID_MPEG2VIDEO
:
482 st
->need_parsing
= 1;
488 // needed to send back RTCP RR in RTSP sessions
490 gethostname(s
->hostname
, sizeof(s
->hostname
));
494 static int rtp_parse_mp4_au(RTPDemuxContext
*s
, const uint8_t *buf
)
496 int au_headers_length
, au_header_size
, i
;
497 GetBitContext getbitcontext
;
498 rtp_payload_data_t
*infos
;
500 infos
= s
->rtp_payload_data
;
505 /* decode the first 2 bytes where are stored the AUHeader sections
507 au_headers_length
= AV_RB16(buf
);
509 if (au_headers_length
> RTP_MAX_PACKET_LENGTH
)
512 infos
->au_headers_length_bytes
= (au_headers_length
+ 7) / 8;
514 /* skip AU headers length section (2 bytes) */
517 init_get_bits(&getbitcontext
, buf
, infos
->au_headers_length_bytes
* 8);
519 /* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */
520 au_header_size
= infos
->sizelength
+ infos
->indexlength
;
521 if (au_header_size
<= 0 || (au_headers_length
% au_header_size
!= 0))
524 infos
->nb_au_headers
= au_headers_length
/ au_header_size
;
525 infos
->au_headers
= av_malloc(sizeof(struct AUHeaders
) * infos
->nb_au_headers
);
527 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
528 In my test, the faad decoder doesnt behave correctly when sending each AU one by one
529 but does when sending the whole as one big packet... */
530 infos
->au_headers
[0].size
= 0;
531 infos
->au_headers
[0].index
= 0;
532 for (i
= 0; i
< infos
->nb_au_headers
; ++i
) {
533 infos
->au_headers
[0].size
+= get_bits_long(&getbitcontext
, infos
->sizelength
);
534 infos
->au_headers
[0].index
= get_bits_long(&getbitcontext
, infos
->indexlength
);
537 infos
->nb_au_headers
= 1;
543 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc.
545 static void finalize_packet(RTPDemuxContext
*s
, AVPacket
*pkt
, uint32_t timestamp
)
547 switch(s
->st
->codec
->codec_id
) {
549 case CODEC_ID_MPEG1VIDEO
:
550 if (s
->last_rtcp_ntp_time
!= AV_NOPTS_VALUE
) {
554 /* XXX: is it really necessary to unify the timestamp base ? */
555 /* compute pts from timestamp with received ntp_time */
556 delta_timestamp
= timestamp
- s
->last_rtcp_timestamp
;
557 /* convert to 90 kHz without overflow */
558 addend
= (s
->last_rtcp_ntp_time
- s
->first_rtcp_ntp_time
) >> 14;
559 addend
= (addend
* 5625) >> 14;
560 pkt
->pts
= addend
+ delta_timestamp
;
566 pkt
->pts
= timestamp
;
569 /* no timestamp info yet */
572 pkt
->stream_index
= s
->st
->index
;
576 * Parse an RTP or RTCP packet directly sent as a buffer.
577 * @param s RTP parse context.
578 * @param pkt returned packet
579 * @param buf input buffer or NULL to read the next packets
580 * @param len buffer len
581 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
582 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
584 int rtp_parse_packet(RTPDemuxContext
*s
, AVPacket
*pkt
,
585 const uint8_t *buf
, int len
)
587 unsigned int ssrc
, h
;
588 int payload_type
, seq
, ret
;
594 /* return the next packets, if any */
595 if(s
->st
&& s
->parse_packet
) {
596 timestamp
= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
597 rv
= s
->parse_packet(s
, pkt
, ×tamp
, NULL
, 0);
598 finalize_packet(s
, pkt
, timestamp
);
601 // TODO: Move to a dynamic packet handler (like above)
602 if (s
->read_buf_index
>= s
->read_buf_size
)
604 ret
= mpegts_parse_packet(s
->ts
, pkt
, s
->buf
+ s
->read_buf_index
,
605 s
->read_buf_size
- s
->read_buf_index
);
608 s
->read_buf_index
+= ret
;
609 if (s
->read_buf_index
< s
->read_buf_size
)
619 if ((buf
[0] & 0xc0) != (RTP_VERSION
<< 6))
621 if (buf
[1] >= 200 && buf
[1] <= 204) {
622 rtcp_parse_packet(s
, buf
, len
);
625 payload_type
= buf
[1] & 0x7f;
626 seq
= (buf
[2] << 8) | buf
[3];
627 timestamp
= decode_be32(buf
+ 4);
628 ssrc
= decode_be32(buf
+ 8);
629 /* store the ssrc in the RTPDemuxContext */
632 /* NOTE: we can handle only one payload type */
633 if (s
->payload_type
!= payload_type
)
637 // only do something with this if all the rtp checks pass...
638 if(!rtp_valid_packet_in_sequence(&s
->statistics
, seq
))
640 av_log(st
?st
->codec
:NULL
, AV_LOG_ERROR
, "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
641 payload_type
, seq
, ((s
->seq
+ 1) & 0xffff));
650 /* specific MPEG2TS demux support */
651 ret
= mpegts_parse_packet(s
->ts
, pkt
, buf
, len
);
655 s
->read_buf_size
= len
- ret
;
656 memcpy(s
->buf
, buf
+ ret
, s
->read_buf_size
);
657 s
->read_buf_index
= 0;
661 // at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise.
662 switch(st
->codec
->codec_id
) {
664 /* better than nothing: skip mpeg audio RTP header */
667 h
= decode_be32(buf
);
670 av_new_packet(pkt
, len
);
671 memcpy(pkt
->data
, buf
, len
);
673 case CODEC_ID_MPEG1VIDEO
:
674 /* better than nothing: skip mpeg video RTP header */
677 h
= decode_be32(buf
);
687 av_new_packet(pkt
, len
);
688 memcpy(pkt
->data
, buf
, len
);
690 // moved from below, verbatim. this is because this section handles packets, and the lower switch handles
692 // TODO: Put this into a dynamic packet handler...
694 if (rtp_parse_mp4_au(s
, buf
))
697 rtp_payload_data_t
*infos
= s
->rtp_payload_data
;
700 buf
+= infos
->au_headers_length_bytes
+ 2;
701 len
-= infos
->au_headers_length_bytes
+ 2;
703 /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define
705 av_new_packet(pkt
, infos
->au_headers
[0].size
);
706 memcpy(pkt
->data
, buf
, infos
->au_headers
[0].size
);
707 buf
+= infos
->au_headers
[0].size
;
708 len
-= infos
->au_headers
[0].size
;
710 s
->read_buf_size
= len
;
715 if(s
->parse_packet
) {
716 rv
= s
->parse_packet(s
, pkt
, ×tamp
, buf
, len
);
718 av_new_packet(pkt
, len
);
719 memcpy(pkt
->data
, buf
, len
);
724 // now perform timestamp things....
725 finalize_packet(s
, pkt
, timestamp
);
730 void rtp_parse_close(RTPDemuxContext
*s
)
732 // TODO: fold this into the protocol specific data fields.
733 if (!strcmp(AVRtpPayloadTypes
[s
->payload_type
].enc_name
, "MP2T")) {
734 mpegts_parse_close(s
->ts
);
741 static int rtp_write_header(AVFormatContext
*s1
)
743 RTPDemuxContext
*s
= s1
->priv_data
;
744 int payload_type
, max_packet_size
, n
;
747 if (s1
->nb_streams
!= 1)
751 payload_type
= rtp_get_payload_type(st
->codec
);
752 if (payload_type
< 0)
753 payload_type
= RTP_PT_PRIVATE
; /* private payload type */
754 s
->payload_type
= payload_type
;
756 // following 2 FIXMies could be set based on the current time, theres normaly no info leak, as rtp will likely be transmitted immedeatly
757 s
->base_timestamp
= 0; /* FIXME: was random(), what should this be? */
758 s
->timestamp
= s
->base_timestamp
;
759 s
->ssrc
= 0; /* FIXME: was random(), what should this be? */
762 max_packet_size
= url_fget_max_packet_size(&s1
->pb
);
763 if (max_packet_size
<= 12)
765 s
->max_payload_size
= max_packet_size
- 12;
767 switch(st
->codec
->codec_id
) {
770 s
->buf_ptr
= s
->buf
+ 4;
771 s
->cur_timestamp
= 0;
773 case CODEC_ID_MPEG1VIDEO
:
774 s
->cur_timestamp
= 0;
776 case CODEC_ID_MPEG2TS
:
777 n
= s
->max_payload_size
/ TS_PACKET_SIZE
;
780 s
->max_payload_size
= n
* TS_PACKET_SIZE
;
791 /* send an rtcp sender report packet */
792 static void rtcp_send_sr(AVFormatContext
*s1
, int64_t ntp_time
)
794 RTPDemuxContext
*s
= s1
->priv_data
;
796 printf("RTCP: %02x %"PRIx64
" %x\n", s
->payload_type
, ntp_time
, s
->timestamp
);
798 put_byte(&s1
->pb
, (RTP_VERSION
<< 6));
799 put_byte(&s1
->pb
, 200);
800 put_be16(&s1
->pb
, 6); /* length in words - 1 */
801 put_be32(&s1
->pb
, s
->ssrc
);
802 put_be64(&s1
->pb
, ntp_time
);
803 put_be32(&s1
->pb
, s
->timestamp
);
804 put_be32(&s1
->pb
, s
->packet_count
);
805 put_be32(&s1
->pb
, s
->octet_count
);
806 put_flush_packet(&s1
->pb
);
809 /* send an rtp packet. sequence number is incremented, but the caller
810 must update the timestamp itself */
811 static void rtp_send_data(AVFormatContext
*s1
, const uint8_t *buf1
, int len
, int m
)
813 RTPDemuxContext
*s
= s1
->priv_data
;
816 printf("rtp_send_data size=%d\n", len
);
819 /* build the RTP header */
820 put_byte(&s1
->pb
, (RTP_VERSION
<< 6));
821 put_byte(&s1
->pb
, (s
->payload_type
& 0x7f) | ((m
& 0x01) << 7));
822 put_be16(&s1
->pb
, s
->seq
);
823 put_be32(&s1
->pb
, s
->timestamp
);
824 put_be32(&s1
->pb
, s
->ssrc
);
826 put_buffer(&s1
->pb
, buf1
, len
);
827 put_flush_packet(&s1
->pb
);
830 s
->octet_count
+= len
;
834 /* send an integer number of samples and compute time stamp and fill
835 the rtp send buffer before sending. */
836 static void rtp_send_samples(AVFormatContext
*s1
,
837 const uint8_t *buf1
, int size
, int sample_size
)
839 RTPDemuxContext
*s
= s1
->priv_data
;
840 int len
, max_packet_size
, n
;
842 max_packet_size
= (s
->max_payload_size
/ sample_size
) * sample_size
;
843 /* not needed, but who nows */
844 if ((size
% sample_size
) != 0)
847 len
= (max_packet_size
- (s
->buf_ptr
- s
->buf
));
852 memcpy(s
->buf_ptr
, buf1
, len
);
856 n
= (s
->buf_ptr
- s
->buf
);
857 /* if buffer full, then send it */
858 if (n
>= max_packet_size
) {
859 rtp_send_data(s1
, s
->buf
, n
, 0);
861 /* update timestamp */
862 s
->timestamp
+= n
/ sample_size
;
867 /* NOTE: we suppose that exactly one frame is given as argument here */
869 static void rtp_send_mpegaudio(AVFormatContext
*s1
,
870 const uint8_t *buf1
, int size
)
872 RTPDemuxContext
*s
= s1
->priv_data
;
873 AVStream
*st
= s1
->streams
[0];
874 int len
, count
, max_packet_size
;
876 max_packet_size
= s
->max_payload_size
;
878 /* test if we must flush because not enough space */
879 len
= (s
->buf_ptr
- s
->buf
);
880 if ((len
+ size
) > max_packet_size
) {
882 rtp_send_data(s1
, s
->buf
, s
->buf_ptr
- s
->buf
, 0);
883 s
->buf_ptr
= s
->buf
+ 4;
884 /* 90 KHz time stamp */
885 s
->timestamp
= s
->base_timestamp
+
886 (s
->cur_timestamp
* 90000LL) / st
->codec
->sample_rate
;
891 if (size
> max_packet_size
) {
892 /* big packet: fragment */
895 len
= max_packet_size
- 4;
898 /* build fragmented packet */
901 s
->buf
[2] = count
>> 8;
903 memcpy(s
->buf
+ 4, buf1
, len
);
904 rtp_send_data(s1
, s
->buf
, len
+ 4, 0);
910 if (s
->buf_ptr
== s
->buf
+ 4) {
911 /* no fragmentation possible */
917 memcpy(s
->buf_ptr
, buf1
, size
);
920 s
->cur_timestamp
+= st
->codec
->frame_size
;
923 /* NOTE: a single frame must be passed with sequence header if
924 needed. XXX: use slices. */
925 static void rtp_send_mpegvideo(AVFormatContext
*s1
,
926 const uint8_t *buf1
, int size
)
928 RTPDemuxContext
*s
= s1
->priv_data
;
929 AVStream
*st
= s1
->streams
[0];
930 int len
, h
, max_packet_size
;
933 max_packet_size
= s
->max_payload_size
;
936 /* XXX: more correct headers */
938 if (st
->codec
->sub_id
== 2)
939 h
|= 1 << 26; /* mpeg 2 indicator */
946 if (st
->codec
->sub_id
== 2) {
954 len
= max_packet_size
- (q
- s
->buf
);
958 memcpy(q
, buf1
, len
);
961 /* 90 KHz time stamp */
962 s
->timestamp
= s
->base_timestamp
+
963 av_rescale((int64_t)s
->cur_timestamp
* st
->codec
->time_base
.num
, 90000, st
->codec
->time_base
.den
); //FIXME pass timestamps
964 rtp_send_data(s1
, s
->buf
, q
- s
->buf
, (len
== size
));
972 static void rtp_send_raw(AVFormatContext
*s1
,
973 const uint8_t *buf1
, int size
)
975 RTPDemuxContext
*s
= s1
->priv_data
;
976 AVStream
*st
= s1
->streams
[0];
977 int len
, max_packet_size
;
979 max_packet_size
= s
->max_payload_size
;
982 len
= max_packet_size
;
986 /* 90 KHz time stamp */
987 s
->timestamp
= s
->base_timestamp
+
988 av_rescale((int64_t)s
->cur_timestamp
* st
->codec
->time_base
.num
, 90000, st
->codec
->time_base
.den
); //FIXME pass timestamps
989 rtp_send_data(s1
, buf1
, len
, (len
== size
));
997 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
998 static void rtp_send_mpegts_raw(AVFormatContext
*s1
,
999 const uint8_t *buf1
, int size
)
1001 RTPDemuxContext
*s
= s1
->priv_data
;
1004 while (size
>= TS_PACKET_SIZE
) {
1005 len
= s
->max_payload_size
- (s
->buf_ptr
- s
->buf
);
1008 memcpy(s
->buf_ptr
, buf1
, len
);
1013 out_len
= s
->buf_ptr
- s
->buf
;
1014 if (out_len
>= s
->max_payload_size
) {
1015 rtp_send_data(s1
, s
->buf
, out_len
, 0);
1016 s
->buf_ptr
= s
->buf
;
1021 /* write an RTP packet. 'buf1' must contain a single specific frame. */
1022 static int rtp_write_packet(AVFormatContext
*s1
, AVPacket
*pkt
)
1024 RTPDemuxContext
*s
= s1
->priv_data
;
1025 AVStream
*st
= s1
->streams
[0];
1028 int size
= pkt
->size
;
1029 uint8_t *buf1
= pkt
->data
;
1032 printf("%d: write len=%d\n", pkt
->stream_index
, size
);
1035 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
1036 rtcp_bytes
= ((s
->octet_count
- s
->last_octet_count
) * RTCP_TX_RATIO_NUM
) /
1038 if (s
->first_packet
|| rtcp_bytes
>= 28) {
1039 /* compute NTP time */
1040 /* XXX: 90 kHz timestamp hardcoded */
1041 ntp_time
= (pkt
->pts
<< 28) / 5625;
1042 rtcp_send_sr(s1
, ntp_time
);
1043 s
->last_octet_count
= s
->octet_count
;
1044 s
->first_packet
= 0;
1047 switch(st
->codec
->codec_id
) {
1048 case CODEC_ID_PCM_MULAW
:
1049 case CODEC_ID_PCM_ALAW
:
1050 case CODEC_ID_PCM_U8
:
1051 case CODEC_ID_PCM_S8
:
1052 rtp_send_samples(s1
, buf1
, size
, 1 * st
->codec
->channels
);
1054 case CODEC_ID_PCM_U16BE
:
1055 case CODEC_ID_PCM_U16LE
:
1056 case CODEC_ID_PCM_S16BE
:
1057 case CODEC_ID_PCM_S16LE
:
1058 rtp_send_samples(s1
, buf1
, size
, 2 * st
->codec
->channels
);
1062 rtp_send_mpegaudio(s1
, buf1
, size
);
1064 case CODEC_ID_MPEG1VIDEO
:
1065 rtp_send_mpegvideo(s1
, buf1
, size
);
1067 case CODEC_ID_MPEG2TS
:
1068 rtp_send_mpegts_raw(s1
, buf1
, size
);
1071 /* better than nothing : send the codec raw data */
1072 rtp_send_raw(s1
, buf1
, size
);
1078 static int rtp_write_trailer(AVFormatContext
*s1
)
1080 // RTPDemuxContext *s = s1->priv_data;
1084 AVOutputFormat rtp_muxer
= {
1086 "RTP output format",
1089 sizeof(RTPDemuxContext
),