ffmpeg / libavformat / rtpdec.c @ b7f2fdde
History | View | Annotate | Download (25.2 KB)
1 |
/*
|
---|---|
2 |
* RTP input format
|
3 |
* Copyright (c) 2002 Fabrice Bellard
|
4 |
*
|
5 |
* This file is part of FFmpeg.
|
6 |
*
|
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.
|
11 |
*
|
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.
|
16 |
*
|
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
|
20 |
*/
|
21 |
|
22 |
/* needed for gethostname() */
|
23 |
#define _XOPEN_SOURCE 600 |
24 |
|
25 |
#include "libavcodec/get_bits.h" |
26 |
#include "avformat.h" |
27 |
#include "mpegts.h" |
28 |
|
29 |
#include <unistd.h> |
30 |
#include <strings.h> |
31 |
#include "network.h" |
32 |
|
33 |
#include "rtpdec.h" |
34 |
#include "rtpdec_formats.h" |
35 |
|
36 |
//#define DEBUG
|
37 |
|
38 |
/* TODO: - add RTCP statistics reporting (should be optional).
|
39 |
|
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')
|
45 |
*/
|
46 |
|
47 |
static RTPDynamicProtocolHandler ff_realmedia_mp3_dynamic_handler = {
|
48 |
.enc_name = "X-MP3-draft-00",
|
49 |
.codec_type = AVMEDIA_TYPE_AUDIO, |
50 |
.codec_id = CODEC_ID_MP3ADU, |
51 |
}; |
52 |
|
53 |
/* statistics functions */
|
54 |
static RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; |
55 |
|
56 |
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
|
57 |
{ |
58 |
handler->next= RTPFirstDynamicPayloadHandler; |
59 |
RTPFirstDynamicPayloadHandler= handler; |
60 |
} |
61 |
|
62 |
void av_register_rtp_dynamic_payload_handlers(void) |
63 |
{ |
64 |
ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler); |
65 |
ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); |
66 |
ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler); |
67 |
ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler); |
68 |
ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); |
69 |
ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); |
70 |
ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); |
71 |
ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); |
72 |
ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); |
73 |
ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); |
74 |
ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler); |
75 |
ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler); |
76 |
ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler); |
77 |
ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler); |
78 |
ff_register_dynamic_payload_handler(&ff_realmedia_mp3_dynamic_handler); |
79 |
|
80 |
ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); |
81 |
ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
82 |
|
83 |
ff_register_dynamic_payload_handler(&ff_qt_rtp_aud_handler); |
84 |
ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler); |
85 |
ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler); |
86 |
ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler); |
87 |
} |
88 |
|
89 |
RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name, |
90 |
enum AVMediaType codec_type)
|
91 |
{ |
92 |
RTPDynamicProtocolHandler *handler; |
93 |
for (handler = RTPFirstDynamicPayloadHandler;
|
94 |
handler; handler = handler->next) |
95 |
if (!strcasecmp(name, handler->enc_name) &&
|
96 |
codec_type == handler->codec_type) |
97 |
return handler;
|
98 |
return NULL; |
99 |
} |
100 |
|
101 |
RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
|
102 |
enum AVMediaType codec_type)
|
103 |
{ |
104 |
RTPDynamicProtocolHandler *handler; |
105 |
for (handler = RTPFirstDynamicPayloadHandler;
|
106 |
handler; handler = handler->next) |
107 |
if (handler->static_payload_id && handler->static_payload_id == id &&
|
108 |
codec_type == handler->codec_type) |
109 |
return handler;
|
110 |
return NULL; |
111 |
} |
112 |
|
113 |
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
114 |
{ |
115 |
int payload_len;
|
116 |
while (len >= 2) { |
117 |
switch (buf[1]) { |
118 |
case RTCP_SR:
|
119 |
if (len < 16) { |
120 |
av_log(NULL, AV_LOG_ERROR, "Invalid length for RTCP SR packet\n"); |
121 |
return AVERROR_INVALIDDATA;
|
122 |
} |
123 |
payload_len = (AV_RB16(buf + 2) + 1) * 4; |
124 |
|
125 |
s->last_rtcp_ntp_time = AV_RB64(buf + 8);
|
126 |
s->last_rtcp_timestamp = AV_RB32(buf + 16);
|
127 |
if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
|
128 |
s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; |
129 |
if (!s->base_timestamp)
|
130 |
s->base_timestamp = s->last_rtcp_timestamp; |
131 |
s->rtcp_ts_offset = s->last_rtcp_timestamp - s->base_timestamp; |
132 |
} |
133 |
|
134 |
buf += payload_len; |
135 |
len -= payload_len; |
136 |
break;
|
137 |
case RTCP_BYE:
|
138 |
return -RTCP_BYE;
|
139 |
default:
|
140 |
return -1; |
141 |
} |
142 |
} |
143 |
return -1; |
144 |
} |
145 |
|
146 |
#define RTP_SEQ_MOD (1<<16) |
147 |
|
148 |
/**
|
149 |
* called on parse open packet
|
150 |
*/
|
151 |
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // called on parse open packet. |
152 |
{ |
153 |
memset(s, 0, sizeof(RTPStatistics)); |
154 |
s->max_seq= base_sequence; |
155 |
s->probation= 1;
|
156 |
} |
157 |
|
158 |
/**
|
159 |
* called whenever there is a large jump in sequence numbers, or when they get out of probation...
|
160 |
*/
|
161 |
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) |
162 |
{ |
163 |
s->max_seq= seq; |
164 |
s->cycles= 0;
|
165 |
s->base_seq= seq -1;
|
166 |
s->bad_seq= RTP_SEQ_MOD + 1;
|
167 |
s->received= 0;
|
168 |
s->expected_prior= 0;
|
169 |
s->received_prior= 0;
|
170 |
s->jitter= 0;
|
171 |
s->transit= 0;
|
172 |
} |
173 |
|
174 |
/**
|
175 |
* returns 1 if we should handle this packet.
|
176 |
*/
|
177 |
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq) |
178 |
{ |
179 |
uint16_t udelta= seq - s->max_seq; |
180 |
const int MAX_DROPOUT= 3000; |
181 |
const int MAX_MISORDER = 100; |
182 |
const int MIN_SEQUENTIAL = 2; |
183 |
|
184 |
/* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */
|
185 |
if(s->probation)
|
186 |
{ |
187 |
if(seq==s->max_seq + 1) { |
188 |
s->probation--; |
189 |
s->max_seq= seq; |
190 |
if(s->probation==0) { |
191 |
rtp_init_sequence(s, seq); |
192 |
s->received++; |
193 |
return 1; |
194 |
} |
195 |
} else {
|
196 |
s->probation= MIN_SEQUENTIAL - 1;
|
197 |
s->max_seq = seq; |
198 |
} |
199 |
} else if (udelta < MAX_DROPOUT) { |
200 |
// in order, with permissible gap
|
201 |
if(seq < s->max_seq) {
|
202 |
//sequence number wrapped; count antother 64k cycles
|
203 |
s->cycles += RTP_SEQ_MOD; |
204 |
} |
205 |
s->max_seq= seq; |
206 |
} else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { |
207 |
// sequence made a large jump...
|
208 |
if(seq==s->bad_seq) {
|
209 |
// two sequential packets-- assume that the other side restarted without telling us; just resync.
|
210 |
rtp_init_sequence(s, seq); |
211 |
} else {
|
212 |
s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); |
213 |
return 0; |
214 |
} |
215 |
} else {
|
216 |
// duplicate or reordered packet...
|
217 |
} |
218 |
s->received++; |
219 |
return 1; |
220 |
} |
221 |
|
222 |
#if 0
|
223 |
/**
|
224 |
* This function is currently unused; without a valid local ntp time, I don't see how we could calculate the
|
225 |
* difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values
|
226 |
* never change. I left this in in case someone else can see a way. (rdm)
|
227 |
*/
|
228 |
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
|
229 |
{
|
230 |
uint32_t transit= arrival_timestamp - sent_timestamp;
|
231 |
int d;
|
232 |
s->transit= transit;
|
233 |
d= FFABS(transit - s->transit);
|
234 |
s->jitter += d - ((s->jitter + 8)>>4);
|
235 |
}
|
236 |
#endif
|
237 |
|
238 |
int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count) |
239 |
{ |
240 |
AVIOContext *pb; |
241 |
uint8_t *buf; |
242 |
int len;
|
243 |
int rtcp_bytes;
|
244 |
RTPStatistics *stats= &s->statistics; |
245 |
uint32_t lost; |
246 |
uint32_t extended_max; |
247 |
uint32_t expected_interval; |
248 |
uint32_t received_interval; |
249 |
uint32_t lost_interval; |
250 |
uint32_t expected; |
251 |
uint32_t fraction; |
252 |
uint64_t ntp_time= s->last_rtcp_ntp_time; // TODO: Get local ntp time?
|
253 |
|
254 |
if (!s->rtp_ctx || (count < 1)) |
255 |
return -1; |
256 |
|
257 |
/* TODO: I think this is way too often; RFC 1889 has algorithm for this */
|
258 |
/* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
|
259 |
s->octet_count += count; |
260 |
rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
261 |
RTCP_TX_RATIO_DEN; |
262 |
rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !? |
263 |
if (rtcp_bytes < 28) |
264 |
return -1; |
265 |
s->last_octet_count = s->octet_count; |
266 |
|
267 |
if (url_open_dyn_buf(&pb) < 0) |
268 |
return -1; |
269 |
|
270 |
// Receiver Report
|
271 |
avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
272 |
avio_w8(pb, RTCP_RR); |
273 |
avio_wb16(pb, 7); /* length in words - 1 */ |
274 |
// our own SSRC: we use the server's SSRC + 1 to avoid conflicts
|
275 |
avio_wb32(pb, s->ssrc + 1);
|
276 |
avio_wb32(pb, s->ssrc); // server SSRC
|
277 |
// some placeholders we should really fill...
|
278 |
// RFC 1889/p64
|
279 |
extended_max= stats->cycles + stats->max_seq; |
280 |
expected= extended_max - stats->base_seq + 1;
|
281 |
lost= expected - stats->received; |
282 |
lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits... |
283 |
expected_interval= expected - stats->expected_prior; |
284 |
stats->expected_prior= expected; |
285 |
received_interval= stats->received - stats->received_prior; |
286 |
stats->received_prior= stats->received; |
287 |
lost_interval= expected_interval - received_interval; |
288 |
if (expected_interval==0 || lost_interval<=0) fraction= 0; |
289 |
else fraction = (lost_interval<<8)/expected_interval; |
290 |
|
291 |
fraction= (fraction<<24) | lost;
|
292 |
|
293 |
avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
|
294 |
avio_wb32(pb, extended_max); /* max sequence received */
|
295 |
avio_wb32(pb, stats->jitter>>4); /* jitter */ |
296 |
|
297 |
if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE)
|
298 |
{ |
299 |
avio_wb32(pb, 0); /* last SR timestamp */ |
300 |
avio_wb32(pb, 0); /* delay since last SR */ |
301 |
} else {
|
302 |
uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, right? do we need to handle 64 bit values special? |
303 |
uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time; |
304 |
|
305 |
avio_wb32(pb, middle_32_bits); /* last SR timestamp */
|
306 |
avio_wb32(pb, delay_since_last); /* delay since last SR */
|
307 |
} |
308 |
|
309 |
// CNAME
|
310 |
avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
311 |
avio_w8(pb, RTCP_SDES); |
312 |
len = strlen(s->hostname); |
313 |
avio_wb16(pb, (6 + len + 3) / 4); /* length in words - 1 */ |
314 |
avio_wb32(pb, s->ssrc); |
315 |
avio_w8(pb, 0x01);
|
316 |
avio_w8(pb, len); |
317 |
avio_write(pb, s->hostname, len); |
318 |
// padding
|
319 |
for (len = (6 + len) % 4; len % 4; len++) { |
320 |
avio_w8(pb, 0);
|
321 |
} |
322 |
|
323 |
avio_flush(pb); |
324 |
len = url_close_dyn_buf(pb, &buf); |
325 |
if ((len > 0) && buf) { |
326 |
int result;
|
327 |
av_dlog(s->ic, "sending %d bytes of RR\n", len);
|
328 |
result= url_write(s->rtp_ctx, buf, len); |
329 |
av_dlog(s->ic, "result from url_write: %d\n", result);
|
330 |
av_free(buf); |
331 |
} |
332 |
return 0; |
333 |
} |
334 |
|
335 |
void rtp_send_punch_packets(URLContext* rtp_handle)
|
336 |
{ |
337 |
AVIOContext *pb; |
338 |
uint8_t *buf; |
339 |
int len;
|
340 |
|
341 |
/* Send a small RTP packet */
|
342 |
if (url_open_dyn_buf(&pb) < 0) |
343 |
return;
|
344 |
|
345 |
avio_w8(pb, (RTP_VERSION << 6));
|
346 |
avio_w8(pb, 0); /* Payload type */ |
347 |
avio_wb16(pb, 0); /* Seq */ |
348 |
avio_wb32(pb, 0); /* Timestamp */ |
349 |
avio_wb32(pb, 0); /* SSRC */ |
350 |
|
351 |
avio_flush(pb); |
352 |
len = url_close_dyn_buf(pb, &buf); |
353 |
if ((len > 0) && buf) |
354 |
url_write(rtp_handle, buf, len); |
355 |
av_free(buf); |
356 |
|
357 |
/* Send a minimal RTCP RR */
|
358 |
if (url_open_dyn_buf(&pb) < 0) |
359 |
return;
|
360 |
|
361 |
avio_w8(pb, (RTP_VERSION << 6));
|
362 |
avio_w8(pb, RTCP_RR); /* receiver report */
|
363 |
avio_wb16(pb, 1); /* length in words - 1 */ |
364 |
avio_wb32(pb, 0); /* our own SSRC */ |
365 |
|
366 |
avio_flush(pb); |
367 |
len = url_close_dyn_buf(pb, &buf); |
368 |
if ((len > 0) && buf) |
369 |
url_write(rtp_handle, buf, len); |
370 |
av_free(buf); |
371 |
} |
372 |
|
373 |
|
374 |
/**
|
375 |
* open a new RTP parse context for stream 'st'. 'st' can be NULL for
|
376 |
* MPEG2TS streams to indicate that they should be demuxed inside the
|
377 |
* rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
|
378 |
*/
|
379 |
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, int queue_size) |
380 |
{ |
381 |
RTPDemuxContext *s; |
382 |
|
383 |
s = av_mallocz(sizeof(RTPDemuxContext));
|
384 |
if (!s)
|
385 |
return NULL; |
386 |
s->payload_type = payload_type; |
387 |
s->last_rtcp_ntp_time = AV_NOPTS_VALUE; |
388 |
s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
389 |
s->ic = s1; |
390 |
s->st = st; |
391 |
s->queue_size = queue_size; |
392 |
rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? |
393 |
if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) { |
394 |
s->ts = ff_mpegts_parse_open(s->ic); |
395 |
if (s->ts == NULL) { |
396 |
av_free(s); |
397 |
return NULL; |
398 |
} |
399 |
} else {
|
400 |
switch(st->codec->codec_id) {
|
401 |
case CODEC_ID_MPEG1VIDEO:
|
402 |
case CODEC_ID_MPEG2VIDEO:
|
403 |
case CODEC_ID_MP2:
|
404 |
case CODEC_ID_MP3:
|
405 |
case CODEC_ID_MPEG4:
|
406 |
case CODEC_ID_H263:
|
407 |
case CODEC_ID_H264:
|
408 |
st->need_parsing = AVSTREAM_PARSE_FULL; |
409 |
break;
|
410 |
case CODEC_ID_ADPCM_G722:
|
411 |
/* According to RFC 3551, the stream clock rate is 8000
|
412 |
* even if the sample rate is 16000. */
|
413 |
if (st->codec->sample_rate == 8000) |
414 |
st->codec->sample_rate = 16000;
|
415 |
break;
|
416 |
default:
|
417 |
break;
|
418 |
} |
419 |
} |
420 |
// needed to send back RTCP RR in RTSP sessions
|
421 |
s->rtp_ctx = rtpc; |
422 |
gethostname(s->hostname, sizeof(s->hostname));
|
423 |
return s;
|
424 |
} |
425 |
|
426 |
void
|
427 |
rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, |
428 |
RTPDynamicProtocolHandler *handler) |
429 |
{ |
430 |
s->dynamic_protocol_context = ctx; |
431 |
s->parse_packet = handler->parse_packet; |
432 |
} |
433 |
|
434 |
/**
|
435 |
* This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc.
|
436 |
*/
|
437 |
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) |
438 |
{ |
439 |
if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
|
440 |
return; /* Timestamp already set by depacketizer */ |
441 |
if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && timestamp != RTP_NOTS_VALUE) {
|
442 |
int64_t addend; |
443 |
int delta_timestamp;
|
444 |
|
445 |
/* compute pts from timestamp with received ntp_time */
|
446 |
delta_timestamp = timestamp - s->last_rtcp_timestamp; |
447 |
/* convert to the PTS timebase */
|
448 |
addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time, s->st->time_base.den, (uint64_t)s->st->time_base.num << 32);
|
449 |
pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend + |
450 |
delta_timestamp; |
451 |
return;
|
452 |
} |
453 |
if (timestamp == RTP_NOTS_VALUE)
|
454 |
return;
|
455 |
if (!s->base_timestamp)
|
456 |
s->base_timestamp = timestamp; |
457 |
pkt->pts = s->range_start_offset + timestamp - s->base_timestamp; |
458 |
} |
459 |
|
460 |
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, |
461 |
const uint8_t *buf, int len) |
462 |
{ |
463 |
unsigned int ssrc, h; |
464 |
int payload_type, seq, ret, flags = 0; |
465 |
int ext;
|
466 |
AVStream *st; |
467 |
uint32_t timestamp; |
468 |
int rv= 0; |
469 |
|
470 |
ext = buf[0] & 0x10; |
471 |
payload_type = buf[1] & 0x7f; |
472 |
if (buf[1] & 0x80) |
473 |
flags |= RTP_FLAG_MARKER; |
474 |
seq = AV_RB16(buf + 2);
|
475 |
timestamp = AV_RB32(buf + 4);
|
476 |
ssrc = AV_RB32(buf + 8);
|
477 |
/* store the ssrc in the RTPDemuxContext */
|
478 |
s->ssrc = ssrc; |
479 |
|
480 |
/* NOTE: we can handle only one payload type */
|
481 |
if (s->payload_type != payload_type)
|
482 |
return -1; |
483 |
|
484 |
st = s->st; |
485 |
// only do something with this if all the rtp checks pass...
|
486 |
if(!rtp_valid_packet_in_sequence(&s->statistics, seq))
|
487 |
{ |
488 |
av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", |
489 |
payload_type, seq, ((s->seq + 1) & 0xffff)); |
490 |
return -1; |
491 |
} |
492 |
|
493 |
if (buf[0] & 0x20) { |
494 |
int padding = buf[len - 1]; |
495 |
if (len >= 12 + padding) |
496 |
len -= padding; |
497 |
} |
498 |
|
499 |
s->seq = seq; |
500 |
len -= 12;
|
501 |
buf += 12;
|
502 |
|
503 |
/* RFC 3550 Section 5.3.1 RTP Header Extension handling */
|
504 |
if (ext) {
|
505 |
if (len < 4) |
506 |
return -1; |
507 |
/* calculate the header extension length (stored as number
|
508 |
* of 32-bit words) */
|
509 |
ext = (AV_RB16(buf + 2) + 1) << 2; |
510 |
|
511 |
if (len < ext)
|
512 |
return -1; |
513 |
// skip past RTP header extension
|
514 |
len -= ext; |
515 |
buf += ext; |
516 |
} |
517 |
|
518 |
if (!st) {
|
519 |
/* specific MPEG2TS demux support */
|
520 |
ret = ff_mpegts_parse_packet(s->ts, pkt, buf, len); |
521 |
/* The only error that can be returned from ff_mpegts_parse_packet
|
522 |
* is "no more data to return from the provided buffer", so return
|
523 |
* AVERROR(EAGAIN) for all errors */
|
524 |
if (ret < 0) |
525 |
return AVERROR(EAGAIN);
|
526 |
if (ret < len) {
|
527 |
s->read_buf_size = len - ret; |
528 |
memcpy(s->buf, buf + ret, s->read_buf_size); |
529 |
s->read_buf_index = 0;
|
530 |
return 1; |
531 |
} |
532 |
return 0; |
533 |
} else if (s->parse_packet) { |
534 |
rv = s->parse_packet(s->ic, s->dynamic_protocol_context, |
535 |
s->st, pkt, ×tamp, buf, len, flags); |
536 |
} else {
|
537 |
// at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise.
|
538 |
switch(st->codec->codec_id) {
|
539 |
case CODEC_ID_MP2:
|
540 |
case CODEC_ID_MP3:
|
541 |
/* better than nothing: skip mpeg audio RTP header */
|
542 |
if (len <= 4) |
543 |
return -1; |
544 |
h = AV_RB32(buf); |
545 |
len -= 4;
|
546 |
buf += 4;
|
547 |
av_new_packet(pkt, len); |
548 |
memcpy(pkt->data, buf, len); |
549 |
break;
|
550 |
case CODEC_ID_MPEG1VIDEO:
|
551 |
case CODEC_ID_MPEG2VIDEO:
|
552 |
/* better than nothing: skip mpeg video RTP header */
|
553 |
if (len <= 4) |
554 |
return -1; |
555 |
h = AV_RB32(buf); |
556 |
buf += 4;
|
557 |
len -= 4;
|
558 |
if (h & (1 << 26)) { |
559 |
/* mpeg2 */
|
560 |
if (len <= 4) |
561 |
return -1; |
562 |
buf += 4;
|
563 |
len -= 4;
|
564 |
} |
565 |
av_new_packet(pkt, len); |
566 |
memcpy(pkt->data, buf, len); |
567 |
break;
|
568 |
default:
|
569 |
av_new_packet(pkt, len); |
570 |
memcpy(pkt->data, buf, len); |
571 |
break;
|
572 |
} |
573 |
|
574 |
pkt->stream_index = st->index; |
575 |
} |
576 |
|
577 |
// now perform timestamp things....
|
578 |
finalize_packet(s, pkt, timestamp); |
579 |
|
580 |
return rv;
|
581 |
} |
582 |
|
583 |
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
|
584 |
{ |
585 |
while (s->queue) {
|
586 |
RTPPacket *next = s->queue->next; |
587 |
av_free(s->queue->buf); |
588 |
av_free(s->queue); |
589 |
s->queue = next; |
590 |
} |
591 |
s->seq = 0;
|
592 |
s->queue_len = 0;
|
593 |
s->prev_ret = 0;
|
594 |
} |
595 |
|
596 |
static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len) |
597 |
{ |
598 |
uint16_t seq = AV_RB16(buf + 2);
|
599 |
RTPPacket *cur = s->queue, *prev = NULL, *packet;
|
600 |
|
601 |
/* Find the correct place in the queue to insert the packet */
|
602 |
while (cur) {
|
603 |
int16_t diff = seq - cur->seq; |
604 |
if (diff < 0) |
605 |
break;
|
606 |
prev = cur; |
607 |
cur = cur->next; |
608 |
} |
609 |
|
610 |
packet = av_mallocz(sizeof(*packet));
|
611 |
if (!packet)
|
612 |
return;
|
613 |
packet->recvtime = av_gettime(); |
614 |
packet->seq = seq; |
615 |
packet->len = len; |
616 |
packet->buf = buf; |
617 |
packet->next = cur; |
618 |
if (prev)
|
619 |
prev->next = packet; |
620 |
else
|
621 |
s->queue = packet; |
622 |
s->queue_len++; |
623 |
} |
624 |
|
625 |
static int has_next_packet(RTPDemuxContext *s) |
626 |
{ |
627 |
return s->queue && s->queue->seq == (uint16_t) (s->seq + 1); |
628 |
} |
629 |
|
630 |
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s) |
631 |
{ |
632 |
return s->queue ? s->queue->recvtime : 0; |
633 |
} |
634 |
|
635 |
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt) |
636 |
{ |
637 |
int rv;
|
638 |
RTPPacket *next; |
639 |
|
640 |
if (s->queue_len <= 0) |
641 |
return -1; |
642 |
|
643 |
if (!has_next_packet(s))
|
644 |
av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
|
645 |
"RTP: missed %d packets\n", s->queue->seq - s->seq - 1); |
646 |
|
647 |
/* Parse the first packet in the queue, and dequeue it */
|
648 |
rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len); |
649 |
next = s->queue->next; |
650 |
av_free(s->queue->buf); |
651 |
av_free(s->queue); |
652 |
s->queue = next; |
653 |
s->queue_len--; |
654 |
return rv;
|
655 |
} |
656 |
|
657 |
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, |
658 |
uint8_t **bufptr, int len)
|
659 |
{ |
660 |
uint8_t* buf = bufptr ? *bufptr : NULL;
|
661 |
int ret, flags = 0; |
662 |
uint32_t timestamp; |
663 |
int rv= 0; |
664 |
|
665 |
if (!buf) {
|
666 |
/* If parsing of the previous packet actually returned 0 or an error,
|
667 |
* there's nothing more to be parsed from that packet, but we may have
|
668 |
* indicated that we can return the next enqueued packet. */
|
669 |
if (s->prev_ret <= 0) |
670 |
return rtp_parse_queued_packet(s, pkt);
|
671 |
/* return the next packets, if any */
|
672 |
if(s->st && s->parse_packet) {
|
673 |
/* timestamp should be overwritten by parse_packet, if not,
|
674 |
* the packet is left with pts == AV_NOPTS_VALUE */
|
675 |
timestamp = RTP_NOTS_VALUE; |
676 |
rv= s->parse_packet(s->ic, s->dynamic_protocol_context, |
677 |
s->st, pkt, ×tamp, NULL, 0, flags); |
678 |
finalize_packet(s, pkt, timestamp); |
679 |
return rv;
|
680 |
} else {
|
681 |
// TODO: Move to a dynamic packet handler (like above)
|
682 |
if (s->read_buf_index >= s->read_buf_size)
|
683 |
return AVERROR(EAGAIN);
|
684 |
ret = ff_mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index, |
685 |
s->read_buf_size - s->read_buf_index); |
686 |
if (ret < 0) |
687 |
return AVERROR(EAGAIN);
|
688 |
s->read_buf_index += ret; |
689 |
if (s->read_buf_index < s->read_buf_size)
|
690 |
return 1; |
691 |
else
|
692 |
return 0; |
693 |
} |
694 |
} |
695 |
|
696 |
if (len < 12) |
697 |
return -1; |
698 |
|
699 |
if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) |
700 |
return -1; |
701 |
if (buf[1] >= RTCP_SR && buf[1] <= RTCP_APP) { |
702 |
return rtcp_parse_packet(s, buf, len);
|
703 |
} |
704 |
|
705 |
if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) { |
706 |
/* First packet, or no reordering */
|
707 |
return rtp_parse_packet_internal(s, pkt, buf, len);
|
708 |
} else {
|
709 |
uint16_t seq = AV_RB16(buf + 2);
|
710 |
int16_t diff = seq - s->seq; |
711 |
if (diff < 0) { |
712 |
/* Packet older than the previously emitted one, drop */
|
713 |
av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
|
714 |
"RTP: dropping old packet received too late\n");
|
715 |
return -1; |
716 |
} else if (diff <= 1) { |
717 |
/* Correct packet */
|
718 |
rv = rtp_parse_packet_internal(s, pkt, buf, len); |
719 |
return rv;
|
720 |
} else {
|
721 |
/* Still missing some packet, enqueue this one. */
|
722 |
enqueue_packet(s, buf, len); |
723 |
*bufptr = NULL;
|
724 |
/* Return the first enqueued packet if the queue is full,
|
725 |
* even if we're missing something */
|
726 |
if (s->queue_len >= s->queue_size)
|
727 |
return rtp_parse_queued_packet(s, pkt);
|
728 |
return -1; |
729 |
} |
730 |
} |
731 |
} |
732 |
|
733 |
/**
|
734 |
* Parse an RTP or RTCP packet directly sent as a buffer.
|
735 |
* @param s RTP parse context.
|
736 |
* @param pkt returned packet
|
737 |
* @param bufptr pointer to the input buffer or NULL to read the next packets
|
738 |
* @param len buffer len
|
739 |
* @return 0 if a packet is returned, 1 if a packet is returned and more can follow
|
740 |
* (use buf as NULL to read the next). -1 if no packet (error or no more packet).
|
741 |
*/
|
742 |
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
743 |
uint8_t **bufptr, int len)
|
744 |
{ |
745 |
int rv = rtp_parse_one_packet(s, pkt, bufptr, len);
|
746 |
s->prev_ret = rv; |
747 |
while (rv == AVERROR(EAGAIN) && has_next_packet(s))
|
748 |
rv = rtp_parse_queued_packet(s, pkt); |
749 |
return rv ? rv : has_next_packet(s);
|
750 |
} |
751 |
|
752 |
void rtp_parse_close(RTPDemuxContext *s)
|
753 |
{ |
754 |
ff_rtp_reset_packet_queue(s); |
755 |
if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) { |
756 |
ff_mpegts_parse_close(s->ts); |
757 |
} |
758 |
av_free(s); |
759 |
} |
760 |
|
761 |
int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, |
762 |
int (*parse_fmtp)(AVStream *stream,
|
763 |
PayloadContext *data, |
764 |
char *attr, char *value)) |
765 |
{ |
766 |
char attr[256]; |
767 |
char *value;
|
768 |
int res;
|
769 |
int value_size = strlen(p) + 1; |
770 |
|
771 |
if (!(value = av_malloc(value_size))) {
|
772 |
av_log(stream, AV_LOG_ERROR, "Failed to allocate data for FMTP.");
|
773 |
return AVERROR(ENOMEM);
|
774 |
} |
775 |
|
776 |
// remove protocol identifier
|
777 |
while (*p && *p == ' ') p++; // strip spaces |
778 |
while (*p && *p != ' ') p++; // eat protocol identifier |
779 |
while (*p && *p == ' ') p++; // strip trailing spaces |
780 |
|
781 |
while (ff_rtsp_next_attr_and_value(&p,
|
782 |
attr, sizeof(attr),
|
783 |
value, value_size)) { |
784 |
|
785 |
res = parse_fmtp(stream, data, attr, value); |
786 |
if (res < 0 && res != AVERROR_PATCHWELCOME) { |
787 |
av_free(value); |
788 |
return res;
|
789 |
} |
790 |
} |
791 |
av_free(value); |
792 |
return 0; |
793 |
} |