rtp.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:17k
源码类别:

midi

开发平台:

Unix_Linux

  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-2009 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. #ifdef HAVE_CONFIG_H
  24. # include <config.h>
  25. #endif
  26. #include <stdarg.h>
  27. #include <assert.h>
  28. #include <vlc_common.h>
  29. #include <vlc_demux.h>
  30. #include <vlc_aout.h>
  31. #include <vlc_network.h>
  32. #include <vlc_plugin.h>
  33. #include <vlc_codecs.h>
  34. #include "rtp.h"
  35. #include <srtp.h>
  36. #define RTP_CACHING_TEXT N_("RTP de-jitter buffer length (msec)")
  37. #define RTP_CACHING_LONGTEXT N_( 
  38.     "How long to wait for late RTP packets (and delay the performance)." )
  39. #define RTCP_PORT_TEXT N_("RTCP (local) port")
  40. #define RTCP_PORT_LONGTEXT N_( 
  41.     "RTCP packets will be received on this transport protocol port. " 
  42.     "If zero, multiplexed RTP/RTCP is used.")
  43. #define SRTP_KEY_TEXT N_("SRTP key (hexadecimal)")
  44. #define SRTP_KEY_LONGTEXT N_( 
  45.     "RTP packets will be authenticated and deciphered "
  46.     "with this Secure RTP master shared secret key.")
  47. #define SRTP_SALT_TEXT N_("SRTP salt (hexadecimal)")
  48. #define SRTP_SALT_LONGTEXT N_( 
  49.     "Secure RTP requires a (non-secret) master salt value.")
  50. #define RTP_MAX_SRC_TEXT N_("Maximum RTP sources")
  51. #define RTP_MAX_SRC_LONGTEXT N_( 
  52.     "How many distinct active RTP sources are allowed at a time." )
  53. #define RTP_TIMEOUT_TEXT N_("RTP source timeout (sec)")
  54. #define RTP_TIMEOUT_LONGTEXT N_( 
  55.     "How long to wait for any packet before a source is expired.")
  56. #define RTP_MAX_DROPOUT_TEXT N_("Maximum RTP sequence number dropout")
  57. #define RTP_MAX_DROPOUT_LONGTEXT N_( 
  58.     "RTP packets will be discarded if they are too much ahead (i.e. in the " 
  59.     "future) by this many packets from the last received packet." )
  60. #define RTP_MAX_MISORDER_TEXT N_("Maximum RTP sequence number misordering")
  61. #define RTP_MAX_MISORDER_LONGTEXT N_( 
  62.     "RTP packets will be discarded if they are too far behind (i.e. in the " 
  63.     "past) by this many packets from the last received packet." )
  64. static int  Open (vlc_object_t *);
  65. static void Close (vlc_object_t *);
  66. /*
  67.  * Module descriptor
  68.  */
  69. vlc_module_begin ()
  70.     set_shortname (N_("RTP"))
  71.     set_description (N_("Real-Time Protocol (RTP) input"))
  72.     set_category (CAT_INPUT)
  73.     set_subcategory (SUBCAT_INPUT_DEMUX)
  74.     set_capability ("access_demux", 0)
  75.     set_callbacks (Open, Close)
  76.     add_integer ("rtp-caching", 1000, NULL, RTP_CACHING_TEXT,
  77.                  RTP_CACHING_LONGTEXT, true)
  78.         change_integer_range (0, 65535)
  79.         change_safe ()
  80.     add_integer ("rtcp-port", 0, NULL, RTCP_PORT_TEXT,
  81.                  RTCP_PORT_LONGTEXT, false)
  82.         change_integer_range (0, 65535)
  83.         change_safe ()
  84.     add_string ("srtp-key", "", NULL,
  85.                 SRTP_KEY_TEXT, SRTP_KEY_LONGTEXT, false)
  86.     add_string ("srtp-salt", "", NULL,
  87.                 SRTP_SALT_TEXT, SRTP_SALT_LONGTEXT, false)
  88.     add_integer ("rtp-max-src", 1, NULL, RTP_MAX_SRC_TEXT,
  89.                  RTP_MAX_SRC_LONGTEXT, true)
  90.         change_integer_range (1, 255)
  91.     add_integer ("rtp-timeout", 5, NULL, RTP_TIMEOUT_TEXT,
  92.                  RTP_TIMEOUT_LONGTEXT, true)
  93.     add_integer ("rtp-max-dropout", 3000, NULL, RTP_MAX_DROPOUT_TEXT,
  94.                  RTP_MAX_DROPOUT_LONGTEXT, true)
  95.         change_integer_range (0, 32767)
  96.     add_integer ("rtp-max-misorder", 100, NULL, RTP_MAX_MISORDER_TEXT,
  97.                  RTP_MAX_MISORDER_LONGTEXT, true)
  98.         change_integer_range (0, 32767)
  99.     add_shortcut ("dccp")
  100.     /*add_shortcut ("sctp")*/
  101.     add_shortcut ("rtptcp") /* "tcp" is already taken :( */
  102.     add_shortcut ("rtp")
  103.     add_shortcut ("udplite")
  104. vlc_module_end ()
  105. /*
  106.  * TODO: so much stuff
  107.  * - send RTCP-RR and RTCP-BYE
  108.  * - dynamic payload types (need SDP parser)
  109.  * - multiple medias (need SDP parser, and RTCP-SR parser for lip-sync)
  110.  * - support for stream_filter in case of stream_Demux (MPEG-TS)
  111.  */
  112. #ifndef IPPROTO_DCCP
  113. # define IPPROTO_DCCP 33 /* IANA */
  114. #endif
  115. #ifndef IPPROTO_UDPLITE
  116. # define IPPROTO_UDPLITE 136 /* from IANA */
  117. #endif
  118. /*
  119.  * Local prototypes
  120.  */
  121. static int Demux (demux_t *);
  122. static int Control (demux_t *, int i_query, va_list args);
  123. static int extract_port (char **phost);
  124. /**
  125.  * Probes and initializes.
  126.  */
  127. static int Open (vlc_object_t *obj)
  128. {
  129.     demux_t *demux = (demux_t *)obj;
  130.     int tp; /* transport protocol */
  131.     if (!strcmp (demux->psz_access, "dccp"))
  132.         tp = IPPROTO_DCCP;
  133.     else
  134.     if (!strcmp (demux->psz_access, "rtptcp"))
  135.         tp = IPPROTO_TCP;
  136.     else
  137.     if (!strcmp (demux->psz_access, "rtp"))
  138.         tp = IPPROTO_UDP;
  139.     else
  140.     if (!strcmp (demux->psz_access, "udplite"))
  141.         tp = IPPROTO_UDPLITE;
  142.     else
  143.         return VLC_EGENERIC;
  144.     char *tmp = strdup (demux->psz_path);
  145.     char *shost = tmp;
  146.     if (shost == NULL)
  147.         return VLC_ENOMEM;
  148.     char *dhost = strchr (shost, '@');
  149.     if (dhost)
  150.         *dhost++ = '';
  151.     /* Parses the port numbers */
  152.     int sport = 0, dport = 0;
  153.     sport = extract_port (&shost);
  154.     if (dhost != NULL)
  155.         dport = extract_port (&dhost);
  156.     if (dport == 0)
  157.         dport = 5004; /* avt-profile-1 port */
  158.     int rtcp_dport = var_CreateGetInteger (obj, "rtcp-port");
  159.     /* Try to connect */
  160.     int fd = -1, rtcp_fd = -1;
  161.     switch (tp)
  162.     {
  163.         case IPPROTO_UDP:
  164.         case IPPROTO_UDPLITE:
  165.             fd = net_OpenDgram (obj, dhost, dport,
  166.                                 shost, sport, AF_UNSPEC, tp);
  167.             if (fd == -1)
  168.                 break;
  169.             if (rtcp_dport > 0) /* XXX: source port is unknown */
  170.                 rtcp_fd = net_OpenDgram (obj, dhost, rtcp_dport, shost, 0,
  171.                                          AF_UNSPEC, tp);
  172.             break;
  173.          case IPPROTO_DCCP:
  174. #ifndef SOCK_DCCP /* provisional API (FIXME) */
  175. # ifdef __linux__
  176. #  define SOCK_DCCP 6
  177. # endif
  178. #endif
  179. #ifdef SOCK_DCCP
  180.             var_Create (obj, "dccp-service", VLC_VAR_STRING);
  181.             var_SetString (obj, "dccp-service", "RTPV"); /* FIXME: RTPA? */
  182.             fd = net_Connect (obj, shost, sport, SOCK_DCCP, tp);
  183. #else
  184.             msg_Err (obj, "DCCP support not included");
  185. #endif
  186.             break;
  187.         case IPPROTO_TCP:
  188.             fd = net_Connect (obj, shost, sport, SOCK_STREAM, tp);
  189.             break;
  190.     }
  191.     free (tmp);
  192.     if (fd == -1)
  193.         return VLC_EGENERIC;
  194.     net_SetCSCov (fd, -1, 12);
  195.     /* Initializes demux */
  196.     demux_sys_t *p_sys = malloc (sizeof (*p_sys));
  197.     if (p_sys == NULL)
  198.     {
  199.         net_Close (fd);
  200.         if (rtcp_fd != -1)
  201.             net_Close (rtcp_fd);
  202.         return VLC_EGENERIC;
  203.     }
  204.     vlc_mutex_init (&p_sys->lock);
  205.     vlc_cond_init (&p_sys->wait);
  206.     p_sys->srtp         = NULL;
  207.     p_sys->fd           = fd;
  208.     p_sys->rtcp_fd      = rtcp_fd;
  209.     p_sys->caching      = var_CreateGetInteger (obj, "rtp-caching");
  210.     p_sys->max_src      = var_CreateGetInteger (obj, "rtp-max-src");
  211.     p_sys->timeout      = var_CreateGetInteger (obj, "rtp-timeout");
  212.     p_sys->max_dropout  = var_CreateGetInteger (obj, "rtp-max-dropout");
  213.     p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
  214.     p_sys->framed_rtp   = (tp == IPPROTO_TCP);
  215.     p_sys->dead         = false;
  216.     demux->pf_demux   = Demux;
  217.     demux->pf_control = Control;
  218.     demux->p_sys      = p_sys;
  219.     p_sys->session = rtp_session_create (demux);
  220.     if (p_sys->session == NULL)
  221.         goto error;
  222.     char *key = var_CreateGetNonEmptyString (demux, "srtp-key");
  223.     if (key)
  224.     {
  225.         p_sys->srtp = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 10,
  226.                                    SRTP_PRF_AES_CM, SRTP_RCC_MODE1);
  227.         if (p_sys->srtp == NULL)
  228.         {
  229.             free (key);
  230.             goto error;
  231.         }
  232.         char *salt = var_CreateGetNonEmptyString (demux, "srtp-salt");
  233.         errno = srtp_setkeystring (p_sys->srtp, key, salt ? salt : "");
  234.         free (salt);
  235.         free (key);
  236.         if (errno)
  237.         {
  238.             msg_Err (obj, "bad SRTP key/salt combination (%m)");
  239.             goto error;
  240.         }
  241.     }
  242.     if (vlc_clone (&p_sys->thread, rtp_thread, demux,
  243.                    VLC_THREAD_PRIORITY_INPUT))
  244.         goto error;
  245.     p_sys->thread_ready = true;
  246.     return VLC_SUCCESS;
  247. error:
  248.     Close (obj);
  249.     return VLC_EGENERIC;
  250. }
  251. /**
  252.  * Releases resources
  253.  */
  254. static void Close (vlc_object_t *obj)
  255. {
  256.     demux_t *demux = (demux_t *)obj;
  257.     demux_sys_t *p_sys = demux->p_sys;
  258.     if (p_sys->thread_ready)
  259.     {
  260.         vlc_cancel (p_sys->thread);
  261.         vlc_join (p_sys->thread, NULL);
  262.     }
  263.     vlc_cond_destroy (&p_sys->wait);
  264.     vlc_mutex_destroy (&p_sys->lock);
  265.     if (p_sys->srtp)
  266.         srtp_destroy (p_sys->srtp);
  267.     if (p_sys->session)
  268.         rtp_session_destroy (demux, p_sys->session);
  269.     if (p_sys->rtcp_fd != -1)
  270.         net_Close (p_sys->rtcp_fd);
  271.     net_Close (p_sys->fd);
  272.     free (p_sys);
  273. }
  274. /**
  275.  * Extracts port number from "[host]:port" or "host:port" strings,
  276.  * and remove brackets from the host name.
  277.  * @param phost pointer to the string upon entry,
  278.  * pointer to the hostname upon return.
  279.  * @return port number, 0 if missing.
  280.  */
  281. static int extract_port (char **phost)
  282. {
  283.     char *host = *phost, *port;
  284.     if (host[0] == '[')
  285.     {
  286.         host = ++*phost; /* skip '[' */
  287.         port = strchr (host, ']');
  288.         if (port)
  289.             *port++ = ''; /* skip ']' */
  290.     }
  291.     else
  292.         port = strchr (host, ':');
  293.     if (port == NULL)
  294.         return 0;
  295.     *port++ = ''; /* skip ':' */
  296.     return atoi (port);
  297. }
  298. /**
  299.  * Control callback
  300.  */
  301. static int Control (demux_t *demux, int i_query, va_list args)
  302. {
  303.     demux_sys_t *p_sys = demux->p_sys;
  304.     switch (i_query)
  305.     {
  306.         case DEMUX_GET_POSITION:
  307.         {
  308.             float *v = va_arg (args, float *);
  309.             *v = 0.;
  310.             return VLC_SUCCESS;
  311.         }
  312.         case DEMUX_GET_LENGTH:
  313.         case DEMUX_GET_TIME:
  314.         {
  315.             int64_t *v = va_arg (args, int64_t *);
  316.             *v = 0;
  317.             return VLC_SUCCESS;
  318.         }
  319.         case DEMUX_GET_PTS_DELAY:
  320.         {
  321.             int64_t *v = va_arg (args, int64_t *);
  322.             *v = p_sys->caching * 1000;
  323.             return VLC_SUCCESS;
  324.         }
  325.         case DEMUX_CAN_PAUSE:
  326.         case DEMUX_CAN_SEEK:
  327.         case DEMUX_CAN_CONTROL_PACE:
  328.         {
  329.             bool *v = (bool*)va_arg( args, bool * );
  330.             *v = false;
  331.             return VLC_SUCCESS;
  332.         }
  333.     }
  334.     return VLC_EGENERIC;
  335. }
  336. /*
  337.  * Generic packet handlers
  338.  */
  339. static void *codec_init (demux_t *demux, es_format_t *fmt)
  340. {
  341.     return es_out_Add (demux->out, fmt);
  342. }
  343. static void codec_destroy (demux_t *demux, void *data)
  344. {
  345.     if (data)
  346.         es_out_Del (demux->out, (es_out_id_t *)data);
  347. }
  348. /* Send a packet to decoder */
  349. static void codec_decode (demux_t *demux, void *data, block_t *block)
  350. {
  351.     if (data)
  352.     {
  353.         block->i_dts = 0; /* RTP does not specify this */
  354.         es_out_Control (demux->out, ES_OUT_SET_PCR, block->i_pts );
  355.         es_out_Send (demux->out, (es_out_id_t *)data, block);
  356.     }
  357.     else
  358.         block_Release (block);
  359. }
  360. static void *stream_init (demux_t *demux, const char *name)
  361. {
  362.     return stream_DemuxNew (demux, name, demux->out);
  363. }
  364. static void stream_destroy (demux_t *demux, void *data)
  365. {
  366.     if (data)
  367.         stream_Delete ((stream_t *)data);
  368.     (void)demux;
  369. }
  370. /* Send a packet to a chained demuxer */
  371. static void stream_decode (demux_t *demux, void *data, block_t *block)
  372. {
  373.     if (data)
  374.         stream_DemuxSend ((stream_t *)data, block);
  375.     else
  376.         block_Release (block);
  377.     (void)demux;
  378. }
  379. /*
  380.  * Static payload types handler
  381.  */
  382. /* PT=0
  383.  * PCMU: G.711 µ-law (RFC3551)
  384.  */
  385. static void *pcmu_init (demux_t *demux)
  386. {
  387.     es_format_t fmt;
  388.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('u', 'l', 'a', 'w'));
  389.     fmt.audio.i_rate = 8000;
  390.     fmt.audio.i_channels = 1;
  391.     return codec_init (demux, &fmt);
  392. }
  393. /* PT=3
  394.  * GSM
  395.  */
  396. static void *gsm_init (demux_t *demux)
  397. {
  398.     es_format_t fmt;
  399.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('g', 's', 'm', ' '));
  400.     fmt.audio.i_rate = 8000;
  401.     fmt.audio.i_channels = 1;
  402.     return codec_init (demux, &fmt);
  403. }
  404. /* PT=8
  405.  * PCMA: G.711 A-law (RFC3551)
  406.  */
  407. static void *pcma_init (demux_t *demux)
  408. {
  409.     es_format_t fmt;
  410.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('a', 'l', 'a', 'w'));
  411.     fmt.audio.i_rate = 8000;
  412.     fmt.audio.i_channels = 1;
  413.     return codec_init (demux, &fmt);
  414. }
  415. /* PT=10,11
  416.  * L16: 16-bits (network byte order) PCM
  417.  */
  418. static void *l16s_init (demux_t *demux)
  419. {
  420.     es_format_t fmt;
  421.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('s', '1', '6', 'b'));
  422.     fmt.audio.i_rate = 44100;
  423.     fmt.audio.i_channels = 2;
  424.     return codec_init (demux, &fmt);
  425. }
  426. static void *l16m_init (demux_t *demux)
  427. {
  428.     es_format_t fmt;
  429.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('s', '1', '6', 'b'));
  430.     fmt.audio.i_rate = 44100;
  431.     fmt.audio.i_channels = 1;
  432.     return codec_init (demux, &fmt);
  433. }
  434. /* PT=12
  435.  * QCELP
  436.  */
  437. static void *qcelp_init (demux_t *demux)
  438. {
  439.     es_format_t fmt;
  440.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('Q', 'c', 'l', 'p'));
  441.     fmt.audio.i_rate = 8000;
  442.     fmt.audio.i_channels = 1;
  443.     return codec_init (demux, &fmt);
  444. }
  445. /* PT=14
  446.  * MPA: MPEG Audio (RFC2250, §3.4)
  447.  */
  448. static void *mpa_init (demux_t *demux)
  449. {
  450.     es_format_t fmt;
  451.     es_format_Init (&fmt, AUDIO_ES, VLC_FOURCC ('m', 'p', 'g', 'a'));
  452.     fmt.audio.i_channels = 2;
  453.     fmt.b_packetized = false;
  454.     return codec_init (demux, &fmt);
  455. }
  456. static void mpa_decode (demux_t *demux, void *data, block_t *block)
  457. {
  458.     if (block->i_buffer < 4)
  459.     {
  460.         block_Release (block);
  461.         return;
  462.     }
  463.     block->i_buffer -= 4; /* 32-bits RTP/MPA header */
  464.     block->p_buffer += 4;
  465.     codec_decode (demux, data, block);
  466. }
  467. /* PT=32
  468.  * MPV: MPEG Video (RFC2250, §3.5)
  469.  */
  470. static void *mpv_init (demux_t *demux)
  471. {
  472.     es_format_t fmt;
  473.     es_format_Init (&fmt, VIDEO_ES, VLC_FOURCC ('m', 'p', 'g', 'v'));
  474.     fmt.b_packetized = false;
  475.     return codec_init (demux, &fmt);
  476. }
  477. static void mpv_decode (demux_t *demux, void *data, block_t *block)
  478. {
  479.     if (block->i_buffer < 4)
  480.     {
  481.         block_Release (block);
  482.         return;
  483.     }
  484.     block->i_buffer -= 4; /* 32-bits RTP/MPV header */
  485.     block->p_buffer += 4;
  486. #if 0
  487.     if (block->p_buffer[-3] & 0x4)
  488.     {
  489.         /* MPEG2 Video extension header */
  490.         /* TODO: shouldn't we skip this too ? */
  491.     }
  492. #endif
  493.     codec_decode (demux, data, block);
  494. }
  495. /* PT=33
  496.  * MP2: MPEG TS (RFC2250, §2)
  497.  */
  498. static void *ts_init (demux_t *demux)
  499. {
  500.     return stream_init (demux, *demux->psz_demux ? demux->psz_demux : "ts");
  501. }
  502. /* Not using SDP, we need to guess the payload format used */
  503. /* see http://www.iana.org/assignments/rtp-parameters */
  504. int rtp_autodetect (demux_t *demux, rtp_session_t *session,
  505.                     const block_t *block)
  506. {
  507.     uint8_t ptype = rtp_ptype (block);
  508.     rtp_pt_t pt = {
  509.         .init = NULL,
  510.         .destroy = codec_destroy,
  511.         .decode = codec_decode,
  512.         .frequency = 0,
  513.         .number = ptype,
  514.     };
  515.     /* Remember to keep this in sync with modules/services_discovery/sap.c */
  516.     switch (ptype)
  517.     {
  518.       case 0:
  519.         msg_Dbg (demux, "detected G.711 mu-law");
  520.         pt.init = pcmu_init;
  521.         pt.frequency = 8000;
  522.         break;
  523.       case 3:
  524.         msg_Dbg (demux, "detected GSM");
  525.         pt.init = gsm_init;
  526.         pt.frequency = 8000;
  527.         break;
  528.       case 8:
  529.         msg_Dbg (demux, "detected G.711 A-law");
  530.         pt.init = pcma_init;
  531.         pt.frequency = 8000;
  532.         break;
  533.       case 10:
  534.         msg_Dbg (demux, "detected stereo PCM");
  535.         pt.init = l16s_init;
  536.         pt.frequency = 44100;
  537.         break;
  538.       case 11:
  539.         msg_Dbg (demux, "detected mono PCM");
  540.         pt.init = l16m_init;
  541.         pt.frequency = 44100;
  542.         break;
  543.       case 12:
  544.         msg_Dbg (demux, "detected QCELP");
  545.         pt.init = qcelp_init;
  546.         pt.frequency = 8000;
  547.         break;
  548.       case 14:
  549.         msg_Dbg (demux, "detected MPEG Audio");
  550.         pt.init = mpa_init;
  551.         pt.decode = mpa_decode;
  552.         pt.frequency = 90000;
  553.         break;
  554.       case 32:
  555.         msg_Dbg (demux, "detected MPEG Video");
  556.         pt.init = mpv_init;
  557.         pt.decode = mpv_decode;
  558.         pt.frequency = 90000;
  559.         break;
  560.       case 33:
  561.         msg_Dbg (demux, "detected MPEG2 TS");
  562.         pt.init = ts_init;
  563.         pt.destroy = stream_destroy;
  564.         pt.decode = stream_decode;
  565.         pt.frequency = 90000;
  566.         break;
  567.       default:
  568.         return -1;
  569.     }
  570.     rtp_add_type (demux, session, &pt);
  571.     return 0;
  572. }
  573. /*
  574.  * Dynamic payload type handlers
  575.  * Hmm, none implemented yet.
  576.  */
  577. /**
  578.  * Processing callback
  579.  */
  580. static int Demux (demux_t *demux)
  581. {
  582.     return rtp_process (demux) ? 0 : 1;
  583. }