| OLD | NEW |
| 1 /* | 1 /* |
| 2 * RTP input format | 2 * RTP input format |
| 3 * Copyright (c) 2002 Fabrice Bellard | 3 * Copyright (c) 2002 Fabrice Bellard |
| 4 * | 4 * |
| 5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
| 6 * | 6 * |
| 7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); | 58 ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); |
| 59 ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler); | 59 ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler); |
| 60 ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler); | 60 ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler); |
| 61 ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); | 61 ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); |
| 62 ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); | 62 ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); |
| 63 ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); | 63 ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); |
| 64 ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); | 64 ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); |
| 65 ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); | 65 ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); |
| 66 ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); | 66 ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); |
| 67 ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler); | 67 ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler); |
| 68 ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler); |
| 69 ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler); |
| 68 | 70 |
| 69 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); | 71 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); |
| 70 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); | 72 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
| 71 } | 73 } |
| 72 | 74 |
| 73 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l
en) | 75 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l
en) |
| 74 { | 76 { |
| 75 if (buf[1] != 200) | 77 int payload_len; |
| 76 return -1; | 78 while (len >= 2) { |
| 77 s->last_rtcp_ntp_time = AV_RB64(buf + 8); | 79 switch (buf[1]) { |
| 78 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) | 80 case RTCP_SR: |
| 79 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; | 81 if (len < 16) { |
| 80 s->last_rtcp_timestamp = AV_RB32(buf + 16); | 82 av_log(NULL, AV_LOG_ERROR, "Invalid length for RTCP SR packet\n"
); |
| 81 return 0; | 83 return AVERROR_INVALIDDATA; |
| 84 } |
| 85 payload_len = (AV_RB16(buf + 2) + 1) * 4; |
| 86 |
| 87 s->last_rtcp_ntp_time = AV_RB64(buf + 8); |
| 88 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) |
| 89 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; |
| 90 s->last_rtcp_timestamp = AV_RB32(buf + 16); |
| 91 |
| 92 buf += payload_len; |
| 93 len -= payload_len; |
| 94 break; |
| 95 case RTCP_BYE: |
| 96 return -RTCP_BYE; |
| 97 default: |
| 98 return -1; |
| 99 } |
| 100 } |
| 101 return -1; |
| 82 } | 102 } |
| 83 | 103 |
| 84 #define RTP_SEQ_MOD (1<<16) | 104 #define RTP_SEQ_MOD (1<<16) |
| 85 | 105 |
| 86 /** | 106 /** |
| 87 * called on parse open packet | 107 * called on parse open packet |
| 88 */ | 108 */ |
| 89 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // cal
led on parse open packet. | 109 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // cal
led on parse open packet. |
| 90 { | 110 { |
| 91 memset(s, 0, sizeof(RTPStatistics)); | 111 memset(s, 0, sizeof(RTPStatistics)); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less bt
w !? | 220 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less bt
w !? |
| 201 if (rtcp_bytes < 28) | 221 if (rtcp_bytes < 28) |
| 202 return -1; | 222 return -1; |
| 203 s->last_octet_count = s->octet_count; | 223 s->last_octet_count = s->octet_count; |
| 204 | 224 |
| 205 if (url_open_dyn_buf(&pb) < 0) | 225 if (url_open_dyn_buf(&pb) < 0) |
| 206 return -1; | 226 return -1; |
| 207 | 227 |
| 208 // Receiver Report | 228 // Receiver Report |
| 209 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ | 229 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
| 210 put_byte(pb, 201); | 230 put_byte(pb, RTCP_RR); |
| 211 put_be16(pb, 7); /* length in words - 1 */ | 231 put_be16(pb, 7); /* length in words - 1 */ |
| 212 put_be32(pb, s->ssrc); // our own SSRC | 232 // our own SSRC: we use the server's SSRC + 1 to avoid conflicts |
| 213 put_be32(pb, s->ssrc); // XXX: should be the server's here! | 233 put_be32(pb, s->ssrc + 1); |
| 234 put_be32(pb, s->ssrc); // server SSRC |
| 214 // some placeholders we should really fill... | 235 // some placeholders we should really fill... |
| 215 // RFC 1889/p64 | 236 // RFC 1889/p64 |
| 216 extended_max= stats->cycles + stats->max_seq; | 237 extended_max= stats->cycles + stats->max_seq; |
| 217 expected= extended_max - stats->base_seq + 1; | 238 expected= extended_max - stats->base_seq + 1; |
| 218 lost= expected - stats->received; | 239 lost= expected - stats->received; |
| 219 lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits... | 240 lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits... |
| 220 expected_interval= expected - stats->expected_prior; | 241 expected_interval= expected - stats->expected_prior; |
| 221 stats->expected_prior= expected; | 242 stats->expected_prior= expected; |
| 222 received_interval= stats->received - stats->received_prior; | 243 received_interval= stats->received - stats->received_prior; |
| 223 stats->received_prior= stats->received; | 244 stats->received_prior= stats->received; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 238 } else { | 259 } else { |
| 239 uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, ri
ght? do we need to handle 64 bit values special? | 260 uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, ri
ght? do we need to handle 64 bit values special? |
| 240 uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time; | 261 uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time; |
| 241 | 262 |
| 242 put_be32(pb, middle_32_bits); /* last SR timestamp */ | 263 put_be32(pb, middle_32_bits); /* last SR timestamp */ |
| 243 put_be32(pb, delay_since_last); /* delay since last SR */ | 264 put_be32(pb, delay_since_last); /* delay since last SR */ |
| 244 } | 265 } |
| 245 | 266 |
| 246 // CNAME | 267 // CNAME |
| 247 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ | 268 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
| 248 put_byte(pb, 202); | 269 put_byte(pb, RTCP_SDES); |
| 249 len = strlen(s->hostname); | 270 len = strlen(s->hostname); |
| 250 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ | 271 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ |
| 251 put_be32(pb, s->ssrc); | 272 put_be32(pb, s->ssrc); |
| 252 put_byte(pb, 0x01); | 273 put_byte(pb, 0x01); |
| 253 put_byte(pb, len); | 274 put_byte(pb, len); |
| 254 put_buffer(pb, s->hostname, len); | 275 put_buffer(pb, s->hostname, len); |
| 255 // padding | 276 // padding |
| 256 for (len = (6 + len) % 4; len % 4; len++) { | 277 for (len = (6 + len) % 4; len % 4; len++) { |
| 257 put_byte(pb, 0); | 278 put_byte(pb, 0); |
| 258 } | 279 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 289 len = url_close_dyn_buf(pb, &buf); | 310 len = url_close_dyn_buf(pb, &buf); |
| 290 if ((len > 0) && buf) | 311 if ((len > 0) && buf) |
| 291 url_write(rtp_handle, buf, len); | 312 url_write(rtp_handle, buf, len); |
| 292 av_free(buf); | 313 av_free(buf); |
| 293 | 314 |
| 294 /* Send a minimal RTCP RR */ | 315 /* Send a minimal RTCP RR */ |
| 295 if (url_open_dyn_buf(&pb) < 0) | 316 if (url_open_dyn_buf(&pb) < 0) |
| 296 return; | 317 return; |
| 297 | 318 |
| 298 put_byte(pb, (RTP_VERSION << 6)); | 319 put_byte(pb, (RTP_VERSION << 6)); |
| 299 put_byte(pb, 201); /* receiver report */ | 320 put_byte(pb, RTCP_RR); /* receiver report */ |
| 300 put_be16(pb, 1); /* length in words - 1 */ | 321 put_be16(pb, 1); /* length in words - 1 */ |
| 301 put_be32(pb, 0); /* our own SSRC */ | 322 put_be32(pb, 0); /* our own SSRC */ |
| 302 | 323 |
| 303 put_flush_packet(pb); | 324 put_flush_packet(pb); |
| 304 len = url_close_dyn_buf(pb, &buf); | 325 len = url_close_dyn_buf(pb, &buf); |
| 305 if ((len > 0) && buf) | 326 if ((len > 0) && buf) |
| 306 url_write(rtp_handle, buf, len); | 327 url_write(rtp_handle, buf, len); |
| 307 av_free(buf); | 328 av_free(buf); |
| 308 } | 329 } |
| 309 | 330 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 else | 445 else |
| 425 return 0; | 446 return 0; |
| 426 } | 447 } |
| 427 } | 448 } |
| 428 | 449 |
| 429 if (len < 12) | 450 if (len < 12) |
| 430 return -1; | 451 return -1; |
| 431 | 452 |
| 432 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | 453 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) |
| 433 return -1; | 454 return -1; |
| 434 if (buf[1] >= 200 && buf[1] <= 204) { | 455 if (buf[1] >= RTCP_SR && buf[1] <= RTCP_APP) { |
| 435 rtcp_parse_packet(s, buf, len); | 456 return rtcp_parse_packet(s, buf, len); |
| 436 return -1; | |
| 437 } | 457 } |
| 438 payload_type = buf[1] & 0x7f; | 458 payload_type = buf[1] & 0x7f; |
| 439 if (buf[1] & 0x80) | 459 if (buf[1] & 0x80) |
| 440 flags |= RTP_FLAG_MARKER; | 460 flags |= RTP_FLAG_MARKER; |
| 441 seq = AV_RB16(buf + 2); | 461 seq = AV_RB16(buf + 2); |
| 442 timestamp = AV_RB32(buf + 4); | 462 timestamp = AV_RB32(buf + 4); |
| 443 ssrc = AV_RB32(buf + 8); | 463 ssrc = AV_RB32(buf + 8); |
| 444 /* store the ssrc in the RTPDemuxContext */ | 464 /* store the ssrc in the RTPDemuxContext */ |
| 445 s->ssrc = ssrc; | 465 s->ssrc = ssrc; |
| 446 | 466 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 | 577 |
| 558 res = parse_fmtp(stream, data, attr, value); | 578 res = parse_fmtp(stream, data, attr, value); |
| 559 if (res < 0 && res != AVERROR_PATCHWELCOME) { | 579 if (res < 0 && res != AVERROR_PATCHWELCOME) { |
| 560 av_free(value); | 580 av_free(value); |
| 561 return res; | 581 return res; |
| 562 } | 582 } |
| 563 } | 583 } |
| 564 av_free(value); | 584 av_free(value); |
| 565 return 0; | 585 return 0; |
| 566 } | 586 } |
| OLD | NEW |