]> git.sesse.net Git - vlc/blob - modules/demux/rtp.c
RTP: add UDP-Lite support
[vlc] / modules / demux / rtp.c
1 /**
2  * @file rtp.c
3  * @brief Real-Time Protocol (RTP) demux module for VLC media player
4  */
5 /*****************************************************************************
6  * Copyright (C) 2001-2005 the VideoLAN team
7  * Copyright © 2007-2008 Rémi Denis-Courmont
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2.0
12  * of the License, or (at your option) any later version.
13  *
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 General Public License for more details.
18  *
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  ****************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 # include <config.h>
26 #endif
27 #include <stdarg.h>
28 #include <assert.h>
29
30 #include <vlc_common.h>
31 #include <vlc_demux.h>
32 #include <vlc_aout.h>
33 #include <vlc_network.h>
34 #include <vlc_plugin.h>
35
36 #include <vlc_codecs.h>
37
38 #include "rtp.h"
39
40 #define RTP_CACHING_TEXT N_("RTP de-jitter buffer length (msec)")
41 #define RTP_CACHING_LONGTEXT N_( \
42     "How long to wait for late RTP packets (and delay the performance)." )
43
44 #define RTP_MAX_SRC_TEXT N_("Maximum RTP sources")
45 #define RTP_MAX_SRC_LONGTEXT N_( \
46     "How many distinct active RTP sources are allowed at a time." )
47
48 #define RTP_TIMEOUT_TEXT N_("RTP source timeout (sec)")
49 #define RTP_TIMEOUT_LONGTEXT N_( \
50     "How long to wait for any packet before a source is expired.")
51
52 #define RTP_MAX_DROPOUT_TEXT N_("Maximum RTP sequence number dropout")
53 #define RTP_MAX_DROPOUT_LONGTEXT N_( \
54     "RTP packets will be discarded if they are too much ahead (i.e. in the " \
55     "future) by this many packets from the last received packet." )
56
57 #define RTP_MAX_MISORDER_TEXT N_("Maximum RTP sequence number misordering")
58 #define RTP_MAX_MISORDER_LONGTEXT N_( \
59     "RTP packets will be discarded if they are too far behind (i.e. in the " \
60     "past) by this many packets from the last received packet." )
61
62 static int  Open (vlc_object_t *);
63 static void Close (vlc_object_t *);
64
65 /*
66  * Module descriptor
67  */
68 vlc_module_begin ();
69     set_shortname (_("RTP"));
70     set_description (_("(Experimental) Real-Time Protocol demuxer"));
71     set_category (CAT_INPUT);
72     set_subcategory (SUBCAT_INPUT_DEMUX);
73     set_capability ("access_demux", 10);
74     set_callbacks (Open, Close);
75
76     add_integer ("rtp-caching", 1000, NULL, RTP_CACHING_TEXT,
77                  RTP_CACHING_LONGTEXT, true);
78         change_integer_range (0, 65535);
79     add_integer ("rtp-max-src", 1, NULL, RTP_MAX_SRC_TEXT,
80                  RTP_MAX_SRC_LONGTEXT, true);
81         change_integer_range (1, 255);
82     add_integer ("rtp-timeout", 5, NULL, RTP_TIMEOUT_TEXT,
83                  RTP_TIMEOUT_LONGTEXT, true);
84     add_integer ("rtp-max-dropout", 3000, NULL, RTP_MAX_DROPOUT_TEXT,
85                  RTP_MAX_DROPOUT_LONGTEXT, true);
86         change_integer_range (0, 32767);
87     add_integer ("rtp-max-misorder", 100, NULL, RTP_MAX_MISORDER_TEXT,
88                  RTP_MAX_MISORDER_LONGTEXT, true);
89         change_integer_range (0, 32767);
90
91     add_shortcut ("rtp");
92     add_shortcut ("udplite");
93 vlc_module_end ();
94
95 /*
96  * TODO: so much stuff
97  * - send RTCP-RR and RTCP-BYE
98  * - dynamic payload types (need SDP parser)
99  * - multiple medias (need SDP parser, and RTCP-SR parser for lip-sync)
100  * - support for access_filter in case of stream_Demux (MPEG-TS)
101  */
102
103 #ifndef IPPROTO_DCCP
104 # define IPPROTO_DCCP 33 /* IANA */
105 #endif
106
107 #ifndef IPPROTO_UDPLITE
108 # define IPPROTO_UDPLITE 136 /* from IANA */
109 #endif
110
111
112 /*
113  * Local prototypes
114  */
115 static int Demux (demux_t *);
116 static int Control (demux_t *, int i_query, va_list args);
117 static int extract_port (char **phost);
118
119 /**
120  * Probes and initializes.
121  */
122 static int Open (vlc_object_t *obj)
123 {
124     demux_t *demux = (demux_t *)obj;
125     int tp; /* transport protocol */
126
127     if (!strcmp (demux->psz_access, "rtp"))
128         tp = IPPROTO_UDP;
129     else
130     if (!strcmp (demux->psz_access, "udplite"))
131         tp = IPPROTO_UDPLITE;
132     else
133         return VLC_EGENERIC;
134
135     char *tmp = strdup (demux->psz_path);
136     char *shost = tmp;
137     if (shost == NULL)
138         return VLC_ENOMEM;
139
140     char *dhost = strchr (shost, '@');
141     if (dhost)
142         *dhost++ = '\0';
143
144     /* Parses the port numbers */
145     int sport = 0, dport = 0;
146     sport = extract_port (&shost);
147     if (dhost != NULL)
148         dport = extract_port (&dhost);
149     if (dport == 0)
150         dport = 5004; /* avt-profile-1 port */
151
152     /* Try to connect */
153     int fd = net_OpenDgram (obj, dhost, dport, shost, sport, AF_UNSPEC, tp);
154     free (tmp);
155     if (fd == -1)
156         return VLC_EGENERIC;
157     net_SetCSCov (fd, -1, 12);
158
159     /* Initializes demux */
160     demux_sys_t *p_sys = malloc (sizeof (*p_sys));
161     if (p_sys == NULL)
162         goto error;
163
164     p_sys->caching      = var_CreateGetInteger (obj, "rtp-caching");
165     p_sys->max_src      = var_CreateGetInteger (obj, "rtp-max-src");
166     p_sys->timeout      = var_CreateGetInteger (obj, "rtp-timeout");
167     p_sys->max_dropout  = var_CreateGetInteger (obj, "rtp-max-dropout");
168     p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
169     p_sys->autodetect   = true;
170
171     demux->pf_demux   = Demux;
172     demux->pf_control = Control;
173     demux->p_sys      = p_sys;
174
175     p_sys->session = rtp_session_create (demux);
176     if (p_sys->session == NULL)
177         goto error;
178
179     p_sys->fd = fd;
180     return VLC_SUCCESS;
181
182 error:
183     net_Close (fd);
184     free (p_sys);
185     return VLC_EGENERIC;
186 }
187
188
189 /**
190  * Releases resources
191  */
192 static void Close (vlc_object_t *obj)
193 {
194     demux_t *demux = (demux_t *)obj;
195     demux_sys_t *p_sys = demux->p_sys;
196
197     rtp_session_destroy (demux, p_sys->session);
198     net_Close (p_sys->fd);
199     free (p_sys);
200 }
201
202
203 /**
204  * Extracts port number from "[host]:port" or "host:port" strings,
205  * and remove brackets from the host name.
206  * @param phost pointer to the string upon entry,
207  * pointer to the hostname upon return.
208  * @return port number, 0 if missing.
209  */
210 static int extract_port (char **phost)
211 {
212     char *host = *phost, *port;
213
214     if (host[0] == '[')
215     {
216         host = *++phost; /* skip '[' */
217         port = strchr (host, ']');
218         if (port)
219             *port++ = '\0'; /* skip ']' */
220     }
221     else
222         port = strchr (host, ':');
223
224     if (port == NULL)
225         return 0;
226     *port++ = '\0'; /* skip ':' */
227     return atoi (port);
228 }
229
230
231 /**
232  * Control callback
233  */
234 static int Control (demux_t *demux, int i_query, va_list args)
235 {
236     demux_sys_t *p_sys = demux->p_sys;
237
238     switch (i_query)
239     {
240         case DEMUX_GET_POSITION:
241         {
242             float *v = va_arg (args, float *);
243             *v = 0.;
244             return 0;
245         }
246
247         case DEMUX_GET_LENGTH:
248         case DEMUX_GET_TIME:
249         {
250             int64_t *v = va_arg (args, int64_t *);
251             *v = 0;
252             return 0;
253         }
254
255         case DEMUX_GET_PTS_DELAY:
256         {
257             int64_t *v = va_arg (args, int64_t *);
258             *v = p_sys->caching;
259             return 0;
260         }
261     }
262
263     return VLC_EGENERIC;
264 }
265
266
267 /**
268  * Gets a datagram from the network
269  */
270 static block_t *rtp_dgram_recv (demux_t *demux, int fd)
271 {
272     block_t *block = block_Alloc (0xffff);
273
274     ssize_t len = net_Read (VLC_OBJECT (demux), fd, NULL,
275                             block->p_buffer, block->i_buffer, false);
276     if (len == -1)
277     {
278         block_Release (block);
279         return NULL;
280     }
281     return block_Realloc (block, 0, len);
282 }
283
284
285 /*
286  * Generic packet handlers
287  */
288
289 static void *codec_init (demux_t *demux, es_format_t *fmt)
290 {
291     return es_out_Add (demux->out, fmt);
292 }
293
294 static void codec_destroy (demux_t *demux, void *data)
295 {
296     if (data)
297         es_out_Del (demux->out, (es_out_id_t *)data);
298 }
299
300 /* Send a packet to decoder */
301 static void codec_decode (demux_t *demux, void *data, block_t *block)
302 {
303     if (data)
304     {
305         block->i_dts = 0; /* RTP does not specify this */
306         es_out_Control (demux->out, ES_OUT_SET_PCR,
307                         block->i_pts - demux->p_sys->caching * 1000);
308         es_out_Send (demux->out, (es_out_id_t *)data, block);
309     }
310     else
311         block_Release (block);
312 }
313
314
315 static void *stream_init (demux_t *demux, const char *name)
316 {
317     return stream_DemuxNew (demux, name, demux->out);
318 }
319
320 static void stream_destroy (demux_t *demux, void *data)
321 {
322     if (data)
323         stream_DemuxDelete ((stream_t *)data);
324     (void)demux;
325 }
326
327 /* Send a packet to a chained demuxer */
328 static void stream_decode (demux_t *demux, void *data, block_t *block)
329 {
330     if (data)
331         stream_DemuxSend ((stream_t *)data, block);
332     else
333         block_Release (block);
334     (void)demux;
335 }
336
337 /*
338  * Static payload types handler
339  */
340
341 /* PT=0
342  * PCMU:
343  */
344 static void *pcmu_init (demux_t *demux)
345 {
346     es_format_t fmt;
347
348     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('u', 'l', 'a', 'w'));
349     fmt.audio.i_rate = 8000;
350     fmt.audio.i_channels = 1;
351     return codec_init (demux, &fmt);
352 }
353
354 /* PT=8
355  * PCMA:
356  */
357 static void *pcma_init (demux_t *demux)
358 {
359     es_format_t fmt;
360
361     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('a', 'l', 'a', 'w'));
362     fmt.audio.i_rate = 8000;
363     fmt.audio.i_channels = 1;
364     return codec_init (demux, &fmt);
365 }
366
367 /* PT=14
368  * MPA: MPEG Audio (RFC2250, §3.4)
369  */
370 static void *mpa_init (demux_t *demux)
371 {
372     es_format_t fmt;
373
374     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('m', 'p', 'g', 'a'));
375     fmt.audio.i_channels = 2;
376     return codec_init (demux, &fmt);
377 }
378
379 static void mpa_decode (demux_t *demux, void *data, block_t *block)
380 {
381     if (block->i_buffer < 4)
382     {
383         block_Release (block);
384         return;
385     }
386
387     block->i_buffer -= 4; /* 32-bits RTP/MPA header */
388     block->p_buffer += 4;
389
390     codec_decode (demux, data, block);
391 }
392
393
394 /* PT=32
395  * MPV: MPEG Video (RFC2250, §3.5)
396  */
397 static void *mpv_init (demux_t *demux)
398 {
399     es_format_t fmt;
400
401     es_format_Init (&fmt, VIDEO_ES, VLC_FOURCC ('m', 'p', 'g', 'v'));
402     return codec_init (demux, &fmt);
403 }
404
405 static void mpv_decode (demux_t *demux, void *data, block_t *block)
406 {
407     if (block->i_buffer < 4)
408     {
409         block_Release (block);
410         return;
411     }
412
413     block->i_buffer -= 4; /* 32-bits RTP/MPV header */
414     block->p_buffer += 4;
415 #if 0
416     if (block->p_buffer[-3] & 0x4)
417     {
418         /* MPEG2 Video extension header */
419         /* TODO: shouldn't we skip this too ? */
420     }
421 #endif
422     codec_decode (demux, data, block);
423 }
424
425
426 /* PT=33
427  * MP2: MPEG TS (RFC2250, §2)
428  */
429 static void *ts_init (demux_t *demux)
430 {
431     return stream_init (demux, "ts");
432 }
433
434
435 /*
436  * Dynamic payload type handlers
437  * Hmm, none implemented yet.
438  */
439
440 /**
441  * Processing callback
442  */
443 static int Demux (demux_t *demux)
444 {
445     demux_sys_t *p_sys = demux->p_sys;
446     block_t     *block;
447
448     block = rtp_dgram_recv (demux, p_sys->fd);
449     if (block)
450     {
451         /* Not using SDP, we need to guess the payload format used */
452         if (p_sys->autodetect && block->i_buffer >= 2)
453         {
454             rtp_pt_t pt = {
455                 .init = NULL,
456                 .destroy = codec_destroy,
457                 .decode = codec_decode,
458                 .frequency = 0,
459                 .number = block->p_buffer[1] & 0x7f,
460             };
461
462             switch (pt.number)
463             {
464               case 0:
465                 msg_Dbg (demux, "detected G.711 mu-law");
466                 pt.init = pcmu_init;
467                 pt.frequency = 8000;
468                 break;
469
470               case 8:
471                 msg_Dbg (demux, "detected G.711 A-law");
472                 pt.init = pcma_init;
473                 pt.frequency = 8000;
474                 break;
475
476               case 14:
477                 msg_Dbg (demux, "detected MPEG Audio");
478                 pt.init = mpa_init;
479                 pt.decode = mpa_decode;
480                 pt.frequency = 44100;
481                 break;
482
483               case 32:
484                 msg_Dbg (demux, "detected MPEG Video");
485                 pt.init = mpv_init;
486                 pt.decode = mpv_decode;
487                 pt.frequency = 90000;
488                 break;
489
490               case 33:
491                 msg_Dbg (demux, "detected MPEG2 TS");
492                 pt.init = ts_init;
493                 pt.destroy = stream_destroy;
494                 pt.decode = stream_decode;
495                 pt.frequency = 90000;
496                 break;
497
498               case 72: /* muxed SR */
499               case 73: /* muxed RR */
500               case 74: /* muxed SDES */
501               case 75: /* muxed BYE */
502               case 76: /* muxed APP */
503               default:
504                 block_Release (block); /* ooh! ignoring RTCP is evil! */
505                 return 1;
506             }
507             rtp_add_type (demux, p_sys->session, &pt);
508             p_sys->autodetect = false;
509         }
510
511         rtp_receive (demux, p_sys->session, block);
512     }
513
514     return 1;
515 }