3 * @brief Real-Time Protocol (RTP) demux module for VLC media player
5 /*****************************************************************************
6 * Copyright (C) 2001-2005 VLC authors and VideoLAN
7 * Copyright © 2007-2009 Rémi Denis-Courmont
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 ****************************************************************************/
30 #include <vlc_common.h>
31 #include <vlc_demux.h>
32 #include <vlc_network.h>
33 #include <vlc_plugin.h>
34 #include <vlc_dialog.h>
35 #include <vlc_aout.h> /* aout_FormatPrepare() */
41 # include <vlc_gcrypt.h>
44 #define RTCP_PORT_TEXT N_("RTCP (local) port")
45 #define RTCP_PORT_LONGTEXT N_( \
46 "RTCP packets will be received on this transport protocol port. " \
47 "If zero, multiplexed RTP/RTCP is used.")
49 #define SRTP_KEY_TEXT N_("SRTP key (hexadecimal)")
50 #define SRTP_KEY_LONGTEXT N_( \
51 "RTP packets will be authenticated and deciphered "\
52 "with this Secure RTP master shared secret key. "\
53 "This must be a 32-character-long hexadecimal string.")
55 #define SRTP_SALT_TEXT N_("SRTP salt (hexadecimal)")
56 #define SRTP_SALT_LONGTEXT N_( \
57 "Secure RTP requires a (non-secret) master salt value. " \
58 "This must be a 28-character-long hexadecimal string.")
60 #define RTP_MAX_SRC_TEXT N_("Maximum RTP sources")
61 #define RTP_MAX_SRC_LONGTEXT N_( \
62 "How many distinct active RTP sources are allowed at a time." )
64 #define RTP_TIMEOUT_TEXT N_("RTP source timeout (sec)")
65 #define RTP_TIMEOUT_LONGTEXT N_( \
66 "How long to wait for any packet before a source is expired.")
68 #define RTP_MAX_DROPOUT_TEXT N_("Maximum RTP sequence number dropout")
69 #define RTP_MAX_DROPOUT_LONGTEXT N_( \
70 "RTP packets will be discarded if they are too much ahead (i.e. in the " \
71 "future) by this many packets from the last received packet." )
73 #define RTP_MAX_MISORDER_TEXT N_("Maximum RTP sequence number misordering")
74 #define RTP_MAX_MISORDER_LONGTEXT N_( \
75 "RTP packets will be discarded if they are too far behind (i.e. in the " \
76 "past) by this many packets from the last received packet." )
78 #define RTP_DYNAMIC_PT_TEXT N_("RTP payload format assumed for dynamic " \
80 #define RTP_DYNAMIC_PT_LONGTEXT N_( \
81 "This payload format will be assumed for dynamic payload types " \
82 "(between 96 and 127) if it can't be determined otherwise with " \
83 "out-of-band mappings (SDP)" )
85 static const char *const dynamic_pt_list
[] = { "theora" };
86 static const char *const dynamic_pt_list_text
[] = { "Theora Encoded Video" };
88 static int Open (vlc_object_t
*);
89 static void Close (vlc_object_t
*);
95 set_shortname (N_("RTP"))
96 set_description (N_("Real-Time Protocol (RTP) input"))
97 set_category (CAT_INPUT
)
98 set_subcategory (SUBCAT_INPUT_DEMUX
)
99 set_capability ("access_demux", 0)
100 set_callbacks (Open
, Close
)
102 add_integer ("rtcp-port", 0, RTCP_PORT_TEXT
,
103 RTCP_PORT_LONGTEXT
, false)
104 change_integer_range (0, 65535)
107 add_string ("srtp-key", "",
108 SRTP_KEY_TEXT
, SRTP_KEY_LONGTEXT
, false)
110 add_string ("srtp-salt", "",
111 SRTP_SALT_TEXT
, SRTP_SALT_LONGTEXT
, false)
114 add_integer ("rtp-max-src", 1, RTP_MAX_SRC_TEXT
,
115 RTP_MAX_SRC_LONGTEXT
, true)
116 change_integer_range (1, 255)
117 add_integer ("rtp-timeout", 5, RTP_TIMEOUT_TEXT
,
118 RTP_TIMEOUT_LONGTEXT
, true)
119 add_integer ("rtp-max-dropout", 3000, RTP_MAX_DROPOUT_TEXT
,
120 RTP_MAX_DROPOUT_LONGTEXT
, true)
121 change_integer_range (0, 32767)
122 add_integer ("rtp-max-misorder", 100, RTP_MAX_MISORDER_TEXT
,
123 RTP_MAX_MISORDER_LONGTEXT
, true)
124 change_integer_range (0, 32767)
125 add_string ("rtp-dynamic-pt", NULL
, RTP_DYNAMIC_PT_TEXT
,
126 RTP_DYNAMIC_PT_LONGTEXT
, true)
127 change_string_list (dynamic_pt_list
, dynamic_pt_list_text
)
129 /*add_shortcut ("sctp")*/
130 add_shortcut ("dccp", "rtptcp", /* "tcp" is already taken :( */
135 * TODO: so much stuff
136 * - send RTCP-RR and RTCP-BYE
137 * - dynamic payload types (need SDP parser)
138 * - multiple medias (need SDP parser, and RTCP-SR parser for lip-sync)
139 * - support for stream_filter in case of chained demux (MPEG-TS)
143 # define IPPROTO_DCCP 33 /* IANA */
146 #ifndef IPPROTO_UDPLITE
147 # define IPPROTO_UDPLITE 136 /* from IANA */
154 static int Control (demux_t
*, int i_query
, va_list args
);
155 static int extract_port (char **phost
);
158 * Probes and initializes.
160 static int Open (vlc_object_t
*obj
)
162 demux_t
*demux
= (demux_t
*)obj
;
163 int tp
; /* transport protocol */
165 if (!strcasecmp(demux
->psz_name
, "dccp"))
168 if (!strcasecmp(demux
->psz_name
, "rtptcp"))
171 if (!strcasecmp(demux
->psz_name
, "rtp"))
174 if (!strcasecmp(demux
->psz_name
, "udplite"))
175 tp
= IPPROTO_UDPLITE
;
179 char *tmp
= strdup (demux
->psz_location
);
184 char *dhost
= strchr (tmp
, '@');
196 /* Parses the port numbers */
197 int sport
= 0, dport
= 0;
199 sport
= extract_port (&shost
);
201 dport
= extract_port (&dhost
);
203 dport
= 5004; /* avt-profile-1 port */
205 int rtcp_dport
= var_CreateGetInteger (obj
, "rtcp-port");
208 int fd
= -1, rtcp_fd
= -1;
213 case IPPROTO_UDPLITE
:
214 fd
= net_OpenDgram (obj
, dhost
, dport
, shost
, sport
, tp
);
217 if (rtcp_dport
> 0) /* XXX: source port is unknown */
218 rtcp_fd
= net_OpenDgram (obj
, dhost
, rtcp_dport
, shost
, 0, tp
);
222 #ifndef SOCK_DCCP /* provisional API (FIXME) */
228 var_Create (obj
, "dccp-service", VLC_VAR_STRING
);
229 var_SetString (obj
, "dccp-service", "RTPV"); /* FIXME: RTPA? */
230 fd
= net_Connect (obj
, dhost
, dport
, SOCK_DCCP
, tp
);
232 msg_Err (obj
, "DCCP support not included");
237 fd
= net_Connect (obj
, dhost
, dport
, SOCK_STREAM
, tp
);
244 net_SetCSCov (fd
, -1, 12);
246 /* Initializes demux */
247 demux_sys_t
*p_sys
= malloc (sizeof (*p_sys
));
256 p_sys
->chained_demux
= NULL
;
261 p_sys
->rtcp_fd
= rtcp_fd
;
262 p_sys
->max_src
= var_CreateGetInteger (obj
, "rtp-max-src");
263 p_sys
->timeout
= var_CreateGetInteger (obj
, "rtp-timeout")
265 p_sys
->max_dropout
= var_CreateGetInteger (obj
, "rtp-max-dropout");
266 p_sys
->max_misorder
= var_CreateGetInteger (obj
, "rtp-max-misorder");
267 p_sys
->thread_ready
= false;
268 p_sys
->autodetect
= true;
270 demux
->pf_demux
= NULL
;
271 demux
->pf_control
= Control
;
272 demux
->p_sys
= p_sys
;
274 p_sys
->session
= rtp_session_create (demux
);
275 if (p_sys
->session
== NULL
)
279 char *key
= var_CreateGetNonEmptyString (demux
, "srtp-key");
283 p_sys
->srtp
= srtp_create (SRTP_ENCR_AES_CM
, SRTP_AUTH_HMAC_SHA1
, 10,
284 SRTP_PRF_AES_CM
, SRTP_RCC_MODE1
);
285 if (p_sys
->srtp
== NULL
)
291 char *salt
= var_CreateGetNonEmptyString (demux
, "srtp-salt");
292 int val
= srtp_setkeystring (p_sys
->srtp
, key
, salt
? salt
: "");
297 msg_Err (obj
, "bad SRTP key/salt combination (%s)",
298 vlc_strerror_c(val
));
304 if (vlc_clone (&p_sys
->thread
,
305 (tp
!= IPPROTO_TCP
) ? rtp_dgram_thread
: rtp_stream_thread
,
306 demux
, VLC_THREAD_PRIORITY_INPUT
))
308 p_sys
->thread_ready
= true;
320 static void Close (vlc_object_t
*obj
)
322 demux_t
*demux
= (demux_t
*)obj
;
323 demux_sys_t
*p_sys
= demux
->p_sys
;
325 if (p_sys
->thread_ready
)
327 vlc_cancel (p_sys
->thread
);
328 vlc_join (p_sys
->thread
, NULL
);
333 srtp_destroy (p_sys
->srtp
);
336 rtp_session_destroy (demux
, p_sys
->session
);
337 if (p_sys
->rtcp_fd
!= -1)
338 net_Close (p_sys
->rtcp_fd
);
339 net_Close (p_sys
->fd
);
345 * Extracts port number from "[host]:port" or "host:port" strings,
346 * and remove brackets from the host name.
347 * @param phost pointer to the string upon entry,
348 * pointer to the hostname upon return.
349 * @return port number, 0 if missing.
351 static int extract_port (char **phost
)
353 char *host
= *phost
, *port
;
357 host
= ++*phost
; /* skip '[' */
358 port
= strchr (host
, ']');
360 *port
++ = '\0'; /* skip ']' */
363 port
= strchr (host
, ':');
367 *port
++ = '\0'; /* skip ':' */
375 static int Control (demux_t
*demux
, int query
, va_list args
)
377 demux_sys_t
*sys
= demux
->p_sys
;
381 case DEMUX_GET_PTS_DELAY
:
383 int64_t *v
= va_arg (args
, int64_t *);
384 *v
= INT64_C(1000) * var_InheritInteger (demux
, "network-caching");
388 case DEMUX_CAN_PAUSE
:
390 case DEMUX_CAN_CONTROL_PACE
:
392 bool *v
= va_arg( args
, bool * );
398 if (sys
->chained_demux
!= NULL
)
399 return vlc_demux_chained_ControlVa (sys
->chained_demux
, query
, args
);
403 case DEMUX_GET_POSITION
:
405 float *v
= va_arg (args
, float *);
410 case DEMUX_GET_LENGTH
:
413 int64_t *v
= va_arg (args
, int64_t *);
424 * Generic packet handlers
427 void *codec_init (demux_t
*demux
, es_format_t
*fmt
)
429 if (fmt
->i_cat
== AUDIO_ES
)
430 aout_FormatPrepare (&fmt
->audio
);
431 return es_out_Add (demux
->out
, fmt
);
434 void codec_destroy (demux_t
*demux
, void *data
)
437 es_out_Del (demux
->out
, (es_out_id_t
*)data
);
440 /* Send a packet to decoder */
441 void codec_decode (demux_t
*demux
, void *data
, block_t
*block
)
445 block
->i_dts
= VLC_TS_INVALID
; /* RTP does not specify this */
446 es_out_SetPCR(demux
->out
, block
->i_pts
);
447 es_out_Send (demux
->out
, (es_out_id_t
*)data
, block
);
450 block_Release (block
);
453 static void *stream_init (demux_t
*demux
, const char *name
)
455 demux_sys_t
*p_sys
= demux
->p_sys
;
457 if (p_sys
->chained_demux
!= NULL
)
459 p_sys
->chained_demux
= vlc_demux_chained_New(VLC_OBJECT(demux
), name
,
461 return p_sys
->chained_demux
;
464 static void stream_destroy (demux_t
*demux
, void *data
)
466 demux_sys_t
*p_sys
= demux
->p_sys
;
470 vlc_demux_chained_Delete(data
);
471 p_sys
->chained_demux
= NULL
;
475 static void stream_header (demux_t
*demux
, void *data
, block_t
*block
)
479 if(block
->p_buffer
[1] & 0x80) /* TS M-bit == discontinuity (RFC 2250, 2.1) */
481 block
->i_flags
|= BLOCK_FLAG_DISCONTINUITY
;
485 /* Send a packet to a chained demuxer */
486 static void stream_decode (demux_t
*demux
, void *data
, block_t
*block
)
489 vlc_demux_chained_Send(data
, block
);
491 block_Release (block
);
496 * Static payload types handler
500 * PCMU: G.711 µ-law (RFC3551)
502 static void *pcmu_init (demux_t
*demux
)
506 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_MULAW
);
507 fmt
.audio
.i_rate
= 8000;
508 fmt
.audio
.i_physical_channels
= AOUT_CHAN_CENTER
;
509 return codec_init (demux
, &fmt
);
515 static void *gsm_init (demux_t
*demux
)
519 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_GSM
);
520 fmt
.audio
.i_rate
= 8000;
521 fmt
.audio
.i_physical_channels
= AOUT_CHAN_CENTER
;
522 return codec_init (demux
, &fmt
);
526 * PCMA: G.711 A-law (RFC3551)
528 static void *pcma_init (demux_t
*demux
)
532 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_ALAW
);
533 fmt
.audio
.i_rate
= 8000;
534 fmt
.audio
.i_physical_channels
= AOUT_CHAN_CENTER
;
535 return codec_init (demux
, &fmt
);
539 * L16: 16-bits (network byte order) PCM
541 static void *l16s_init (demux_t
*demux
)
545 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_S16B
);
546 fmt
.audio
.i_rate
= 44100;
547 fmt
.audio
.i_physical_channels
= AOUT_CHANS_STEREO
;
548 return codec_init (demux
, &fmt
);
551 static void *l16m_init (demux_t
*demux
)
555 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_S16B
);
556 fmt
.audio
.i_rate
= 44100;
557 fmt
.audio
.i_physical_channels
= AOUT_CHAN_CENTER
;
558 return codec_init (demux
, &fmt
);
564 static void *qcelp_init (demux_t
*demux
)
568 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_QCELP
);
569 fmt
.audio
.i_rate
= 8000;
570 fmt
.audio
.i_physical_channels
= AOUT_CHAN_CENTER
;
571 return codec_init (demux
, &fmt
);
575 * MPA: MPEG Audio (RFC2250, §3.4)
577 static void *mpa_init (demux_t
*demux
)
581 es_format_Init (&fmt
, AUDIO_ES
, VLC_CODEC_MPGA
);
582 fmt
.audio
.i_physical_channels
= AOUT_CHANS_STEREO
;
583 fmt
.b_packetized
= false;
584 return codec_init (demux
, &fmt
);
587 static void mpa_decode (demux_t
*demux
, void *data
, block_t
*block
)
589 if (block
->i_buffer
< 4)
591 block_Release (block
);
595 block
->i_buffer
-= 4; /* 32-bits RTP/MPA header */
596 block
->p_buffer
+= 4;
598 codec_decode (demux
, data
, block
);
603 * MPV: MPEG Video (RFC2250, §3.5)
605 static void *mpv_init (demux_t
*demux
)
609 es_format_Init (&fmt
, VIDEO_ES
, VLC_CODEC_MPGV
);
610 fmt
.b_packetized
= false;
611 return codec_init (demux
, &fmt
);
614 static void mpv_decode (demux_t
*demux
, void *data
, block_t
*block
)
616 if (block
->i_buffer
< 4)
618 block_Release (block
);
622 block
->i_buffer
-= 4; /* 32-bits RTP/MPV header */
623 block
->p_buffer
+= 4;
625 if (block
->p_buffer
[-3] & 0x4)
627 /* MPEG2 Video extension header */
628 /* TODO: shouldn't we skip this too ? */
631 codec_decode (demux
, data
, block
);
636 * MP2: MPEG TS (RFC2250, §2)
638 static void *ts_init (demux_t
*demux
)
640 char const* name
= demux
->psz_name
;
642 if (*name
== '\0' || !strcasecmp(name
, "any"))
645 return stream_init (demux
, name
? name
: "ts");
649 /* Not using SDP, we need to guess the payload format used */
650 /* see http://www.iana.org/assignments/rtp-parameters */
651 void rtp_autodetect (demux_t
*demux
, rtp_session_t
*session
,
652 const block_t
*block
)
654 uint8_t ptype
= rtp_ptype (block
);
657 .destroy
= codec_destroy
,
659 .decode
= codec_decode
,
664 /* Remember to keep this in sync with modules/services_discovery/sap.c */
668 msg_Dbg (demux
, "detected G.711 mu-law");
674 msg_Dbg (demux
, "detected GSM");
680 msg_Dbg (demux
, "detected G.711 A-law");
686 msg_Dbg (demux
, "detected stereo PCM");
688 pt
.frequency
= 44100;
692 msg_Dbg (demux
, "detected mono PCM");
694 pt
.frequency
= 44100;
698 msg_Dbg (demux
, "detected QCELP");
699 pt
.init
= qcelp_init
;
704 msg_Dbg (demux
, "detected MPEG Audio");
706 pt
.decode
= mpa_decode
;
707 pt
.frequency
= 90000;
711 msg_Dbg (demux
, "detected MPEG Video");
713 pt
.decode
= mpv_decode
;
714 pt
.frequency
= 90000;
718 msg_Dbg (demux
, "detected MPEG2 TS");
720 pt
.destroy
= stream_destroy
;
721 pt
.header
= stream_header
;
722 pt
.decode
= stream_decode
;
723 pt
.frequency
= 90000;
729 char *dynamic
= var_InheritString(demux
, "rtp-dynamic-pt");
732 else if (!strcmp(dynamic
, "theora"))
734 msg_Dbg (demux
, "assuming Theora Encoded Video");
735 pt
.init
= theora_init
;
736 pt
.destroy
= xiph_destroy
;
737 pt
.decode
= xiph_decode
;
738 pt
.frequency
= 90000;
744 msg_Err (demux
, "unknown dynamic payload format `%s' "
745 "specified", dynamic
);
749 msg_Err (demux
, "unspecified payload format (type %"PRIu8
")", ptype
);
750 msg_Info (demux
, "A valid SDP is needed to parse this RTP stream.");
751 vlc_dialog_display_error (demux
, N_("SDP required"),
752 N_("A description in SDP format is required to receive the RTP "
753 "stream. Note that rtp:// URIs cannot work with dynamic "
754 "RTP payload format (%"PRIu8
")."), ptype
);
757 rtp_add_type (demux
, session
, &pt
);
761 * Dynamic payload type handlers
762 * Hmm, none implemented yet apart from Xiph ones.