Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (9)
# RTP plugin
access_LTLIBRARIES += librtp_plugin.la
librtp_plugin_la_SOURCES = \
access/rtp/input.c \
access/rtp/session.c \
access/rtp/input.c access/rtp/input.h \
access/rtp/sdp.c access/rtp/sdp.h \
access/rtp/rtpfmt.c \
access/rtp/datagram.c access/rtp/vlc_dtls.h \
access/rtp/rtp.c access/rtp/rtp.h
librtp_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/access/rtp
librtp_plugin_la_CFLAGS = $(AM_CFLAGS)
librtp_plugin_la_LIBADD = $(SOCKET_LIBS)
librtp_plugin_la_LIBADD = libvlc_rtp.la $(SOCKET_LIBS)
# RTP library
libvlc_rtp_la_SOURCES = access/rtp/rtpfmt.c access/rtp/rtp.h \
access/rtp/session.c
libvlc_rtp_la_CPPFLAGS = -I$(srcdir)/access/rtp
libvlc_rtp_la_LDFLAGS = -no-undefined
noinst_LTLIBRARIES += libvlc_rtp.la
# Secure RTP library
libvlc_srtp_la_SOURCES = access/rtp/srtp.c access/rtp/srtp.h
......@@ -18,14 +23,13 @@ libvlc_srtp_la_CFLAGS = $(GCRYPT_CFLAGS)
libvlc_srtp_la_LDFLAGS = -static
libvlc_srtp_la_LIBADD = $(GCRYPT_LIBS)
librtp_plugin_la_DEPENDENCIES =
if HAVE_GCRYPT
noinst_LTLIBRARIES += libvlc_srtp.la
librtp_plugin_la_CPPFLAGS += -DHAVE_SRTP
librtp_plugin_la_CFLAGS += $(GCRYPT_CFLAGS)
librtp_plugin_la_LIBADD += libvlc_srtp.la $(GCRYPT_LIBS)
librtp_plugin_la_DEPENDENCIES += libvlc_srtp.la
librtp_plugin_la_DEPENDENCIES = libvlc_srtp.la
endif
noinst_HEADERS += access/rtp/fmtp.h
......
......@@ -46,13 +46,15 @@
#ifdef HAVE_SRTP
# include "srtp.h"
#endif
#include "input.h"
#define DEFAULT_MRU (1500u - (20 + 8))
/**
* Processes a packet received from the RTP socket.
*/
static void rtp_process (rtp_sys_t *sys, block_t *block)
static void rtp_process (struct vlc_logger *logger, rtp_input_sys_t *sys,
rtp_session_t *session, block_t *block)
{
if (block->i_buffer < 2)
goto drop;
......@@ -66,14 +68,14 @@ static void rtp_process (rtp_sys_t *sys, block_t *block)
size_t len = block->i_buffer;
if (srtp_recv (sys->srtp, block->p_buffer, &len))
{
vlc_debug (sys->logger, "SRTP authentication/decryption failed");
vlc_debug (logger, "SRTP authentication/decryption failed");
goto drop;
}
block->i_buffer = len;
}
#endif
rtp_queue (sys, sys->session, block);
rtp_queue (logger, session, block);
return;
drop:
block_Release (block);
......@@ -101,7 +103,7 @@ void *rtp_dgram_thread (void *opaque)
{
rtp_sys_t *sys = opaque;
vlc_tick_t deadline = VLC_TICK_INVALID;
struct vlc_dtls *rtp_sock = sys->rtp_sock;
struct vlc_dtls *rtp_sock = sys->input_sys.rtp_sock;
vlc_thread_set_name("vlc-rtp");
......@@ -138,7 +140,7 @@ void *rtp_dgram_thread (void *opaque)
else
block->i_buffer = len;
rtp_process (sys, block);
rtp_process (sys->logger, &sys->input_sys, sys->session, block);
}
else
{
......@@ -153,7 +155,7 @@ void *rtp_dgram_thread (void *opaque)
}
dequeue:
if (!rtp_dequeue (sys, sys->session, &deadline))
if (!rtp_dequeue (sys->logger, sys->session, vlc_tick_now(), &deadline))
deadline = VLC_TICK_INVALID;
vlc_restorecancel (canc);
}
......
/**
* @file input.h
* @brief RTP demux input shared declarations
*/
/*****************************************************************************
* Copyright © 2008 Rémi Denis-Courmont
* 2023 VideoLabs, VideoLAN and VLC Authors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
****************************************************************************/
typedef struct
{
#ifdef HAVE_SRTP
struct srtp_session_t *srtp;
#endif
struct vlc_dtls *rtp_sock;
struct vlc_dtls *rtcp_sock;
} rtp_input_sys_t;
/* Global data */
typedef struct
{
struct vlc_logger *logger;
rtp_session_t *session;
vlc_thread_t thread;
rtp_input_sys_t input_sys;
} rtp_sys_t;
......@@ -41,6 +41,7 @@
# include <vlc_gcrypt.h>
#endif
#include "sdp.h"
#include "input.h"
/*
* TODO: so much stuff
......@@ -218,8 +219,6 @@ static int extract_port (char **phost)
*/
static int Control (demux_t *demux, int query, va_list args)
{
rtp_sys_t *sys = demux->p_sys;
switch (query)
{
case DEMUX_GET_PTS_DELAY:
......@@ -239,9 +238,6 @@ static int Control (demux_t *demux, int query, va_list args)
}
}
if (sys->chained_demux != NULL)
return vlc_demux_chained_ControlVa (sys->chained_demux, query, args);
switch (query)
{
case DEMUX_GET_POSITION:
......@@ -273,13 +269,13 @@ static void Close (vlc_object_t *obj)
vlc_cancel(p_sys->thread);
vlc_join(p_sys->thread, NULL);
#ifdef HAVE_SRTP
if (p_sys->srtp)
srtp_destroy (p_sys->srtp);
if (p_sys->input_sys.srtp)
srtp_destroy (p_sys->input_sys.srtp);
#endif
rtp_session_destroy (obj->logger, p_sys->session);
if (p_sys->rtcp_sock != NULL)
vlc_dtls_Close(p_sys->rtcp_sock);
vlc_dtls_Close(p_sys->rtp_sock);
if (p_sys->input_sys.rtcp_sock != NULL)
vlc_dtls_Close(p_sys->input_sys.rtcp_sock);
vlc_dtls_Close(p_sys->input_sys.rtp_sock);
}
static int OpenSDP(vlc_object_t *obj)
......@@ -309,11 +305,11 @@ static int OpenSDP(vlc_object_t *obj)
if (unlikely(sys == NULL))
return VLC_ENOMEM;
sys->rtp_sock = NULL;
sys->rtcp_sock = NULL;
sys->input_sys.rtp_sock = NULL;
sys->input_sys.rtcp_sock = NULL;
sys->session = NULL;
#ifdef HAVE_SRTP
sys->srtp = NULL;
sys->input_sys.srtp = NULL;
#endif
struct vlc_sdp *sdp = vlc_sdp_parse((const char *)peek, sdplen);
......@@ -398,8 +394,8 @@ static int OpenSDP(vlc_object_t *obj)
if (fd == -1)
goto error;
sys->rtp_sock = vlc_datagram_CreateFD(fd);
if (unlikely(sys->rtp_sock == NULL)) {
sys->input_sys.rtp_sock = vlc_datagram_CreateFD(fd);
if (unlikely(sys->input_sys.rtp_sock == NULL)) {
net_Close(fd);
goto error;
}
......@@ -409,25 +405,23 @@ static int OpenSDP(vlc_object_t *obj)
if (fd == -1)
goto error;
sys->rtcp_sock = vlc_datagram_CreateFD(fd);
if (unlikely(sys->rtcp_sock == NULL)) {
sys->input_sys.rtcp_sock = vlc_datagram_CreateFD(fd);
if (unlikely(sys->input_sys.rtcp_sock == NULL)) {
net_Close(fd);
goto error;
}
}
sys->logger = obj->logger;
sys->chained_demux = NULL;
sys->max_src = var_InheritInteger(obj, "rtp-max-src");
sys->timeout = vlc_tick_from_sec(var_InheritInteger(obj, "rtp-timeout"));
sys->max_dropout = var_InheritInteger(obj, "rtp-max-dropout");
sys->max_misorder = -var_InheritInteger(obj, "rtp-max-misorder");
demux->pf_demux = NULL;
demux->pf_control = Control;
demux->p_sys = sys;
sys->session = rtp_session_create();
sys->session = rtp_session_create_custom(var_InheritInteger(obj, "rtp-max-dropout"),
var_InheritInteger(obj, "rtp-max-misorder"),
var_InheritInteger(obj, "rtp-max-src"),
vlc_tick_from_sec(var_InheritInteger(obj, "rtp-timeout")));
if (sys->session == NULL)
goto error;
......@@ -450,10 +444,10 @@ static int OpenSDP(vlc_object_t *obj)
return VLC_SUCCESS;
error:
if (sys->rtcp_sock != NULL)
vlc_dtls_Close(sys->rtcp_sock);
if (sys->rtp_sock != NULL)
vlc_dtls_Close(sys->rtp_sock);
if (sys->input_sys.rtcp_sock != NULL)
vlc_dtls_Close(sys->input_sys.rtcp_sock);
if (sys->input_sys.rtp_sock != NULL)
vlc_dtls_Close(sys->input_sys.rtp_sock);
vlc_sdp_free(sdp);
return VLC_EGENERIC;
}
......@@ -549,8 +543,8 @@ static int OpenURL(vlc_object_t *obj)
if(fd == -1)
return VLC_EGENERIC;
p_sys->rtp_sock = (co ? vlc_dccp_CreateFD : vlc_datagram_CreateFD)(fd);
if (p_sys->rtp_sock == NULL) {
p_sys->input_sys.rtp_sock = (co ? vlc_dccp_CreateFD : vlc_datagram_CreateFD)(fd);
if (p_sys->input_sys.rtp_sock == NULL) {
if (rtcp_fd != -1)
net_Close(rtcp_fd);
return VLC_EGENERIC;
......@@ -558,28 +552,26 @@ static int OpenURL(vlc_object_t *obj)
net_SetCSCov (fd, -1, 12);
if (rtcp_fd != -1) {
p_sys->rtcp_sock = vlc_datagram_CreateFD(rtcp_fd);
if (p_sys->rtcp_sock == NULL)
p_sys->input_sys.rtcp_sock = vlc_datagram_CreateFD(rtcp_fd);
if (p_sys->input_sys.rtcp_sock == NULL)
net_Close (rtcp_fd);
} else
p_sys->rtcp_sock = NULL;
p_sys->input_sys.rtcp_sock = NULL;
/* Initializes demux */
p_sys->chained_demux = NULL;
#ifdef HAVE_SRTP
p_sys->srtp = NULL;
p_sys->input_sys.srtp = NULL;
#endif
p_sys->logger = obj->logger;
p_sys->max_src = var_CreateGetInteger (obj, "rtp-max-src");
p_sys->timeout = vlc_tick_from_sec( var_CreateGetInteger (obj, "rtp-timeout") );
p_sys->max_dropout = var_CreateGetInteger (obj, "rtp-max-dropout");
p_sys->max_misorder = -var_CreateGetInteger (obj, "rtp-max-misorder");
demux->pf_demux = NULL;
demux->pf_control = Control;
demux->p_sys = p_sys;
p_sys->session = rtp_session_create();
p_sys->session = rtp_session_create_custom(
var_InheritInteger(obj, "rtp-max-dropout"),
var_InheritInteger(obj, "rtp-max-misorder"),
var_InheritInteger(obj, "rtp-max-src"),
vlc_tick_from_sec(var_InheritInteger(obj, "rtp-timeout")) );
if (p_sys->session == NULL)
goto error;
......@@ -591,16 +583,16 @@ static int OpenURL(vlc_object_t *obj)
if (key)
{
vlc_gcrypt_init ();
p_sys->srtp = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 10,
p_sys->input_sys.srtp = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 10,
SRTP_PRF_AES_CM, SRTP_RCC_MODE1);
if (p_sys->srtp == NULL)
if (p_sys->input_sys.srtp == NULL)
{
free (key);
goto error;
}
char *salt = var_CreateGetNonEmptyString (demux, "srtp-salt");
int val = srtp_setkeystring (p_sys->srtp, key, salt ? salt : "");
int val = srtp_setkeystring (p_sys->input_sys.srtp, key, salt ? salt : "");
free (salt);
free (key);
if (val)
......@@ -618,14 +610,14 @@ static int OpenURL(vlc_object_t *obj)
error:
#ifdef HAVE_SRTP
if (p_sys->srtp != NULL)
srtp_destroy(p_sys->srtp);
if (p_sys->input_sys.srtp != NULL)
srtp_destroy(p_sys->input_sys.srtp);
#endif
if (p_sys->session != NULL)
rtp_session_destroy(obj->logger, p_sys->session);
if (p_sys->rtcp_sock != NULL)
vlc_dtls_Close(p_sys->rtcp_sock);
vlc_dtls_Close(p_sys->rtp_sock);
if (p_sys->input_sys.rtcp_sock != NULL)
vlc_dtls_Close(p_sys->input_sys.rtcp_sock);
vlc_dtls_Close(p_sys->input_sys.rtp_sock);
return VLC_EGENERIC;
}
......@@ -689,15 +681,15 @@ vlc_module_begin()
SRTP_SALT_TEXT, SRTP_SALT_LONGTEXT)
change_safe()
#endif
add_integer("rtp-max-src", 1, RTP_MAX_SRC_TEXT,
add_integer("rtp-max-src", RTP_MAX_SRC_DEFAULT, RTP_MAX_SRC_TEXT,
RTP_MAX_SRC_LONGTEXT)
change_integer_range (1, 255)
add_integer("rtp-timeout", 5, RTP_TIMEOUT_TEXT,
add_integer("rtp-timeout", RTP_MAX_TIMEOUT_DEFAULT, RTP_TIMEOUT_TEXT,
RTP_TIMEOUT_LONGTEXT)
add_integer("rtp-max-dropout", 3000, RTP_MAX_DROPOUT_TEXT,
add_integer("rtp-max-dropout", RTP_MAX_DROPOUT_DEFAULT, RTP_MAX_DROPOUT_TEXT,
RTP_MAX_DROPOUT_LONGTEXT)
change_integer_range (0, 32767)
add_integer("rtp-max-misorder", 100, RTP_MAX_MISORDER_TEXT,
add_integer("rtp-max-misorder", RTP_MAX_MISORDER_DEFAULT, RTP_MAX_MISORDER_TEXT,
RTP_MAX_MISORDER_LONGTEXT)
change_integer_range (0, 32767)
add_obsolete_string("rtp-dynamic-pt") /* since 4.0.0 */
......
......@@ -355,34 +355,21 @@ static inline uint8_t rtp_ptype (const block_t *block)
/** @} */
/* Global data */
typedef struct
{
struct vlc_logger *logger;
rtp_session_t *session;
struct vlc_demux_chained_t *chained_demux;
#ifdef HAVE_SRTP
struct srtp_session_t *srtp;
#endif
struct vlc_dtls *rtp_sock;
struct vlc_dtls *rtcp_sock;
vlc_thread_t thread;
vlc_tick_t timeout;
uint16_t max_dropout; /**< Max packet forward misordering */
uint16_t max_misorder; /**< Max packet backward misordering */
uint8_t max_src; /**< Max simultaneous RTP sources */
} rtp_sys_t;
/**
* \defgroup rtp_session RTP session
* @{
*/
#define RTP_MAX_SRC_DEFAULT 1
#define RTP_MAX_DROPOUT_DEFAULT 3000
#define RTP_MAX_TIMEOUT_DEFAULT 5
#define RTP_MAX_MISORDER_DEFAULT 100
rtp_session_t *rtp_session_create (void);
rtp_session_t *rtp_session_create_custom (uint16_t max_dropout, uint16_t max_misorder,
uint8_t max_src, vlc_tick_t timeout);
void rtp_session_destroy (struct vlc_logger *, rtp_session_t *);
void rtp_queue (rtp_sys_t *, rtp_session_t *, block_t *);
bool rtp_dequeue (rtp_sys_t *, const rtp_session_t *, vlc_tick_t *);
void rtp_queue (struct vlc_logger *, rtp_session_t *, block_t *);
bool rtp_dequeue (struct vlc_logger *, const rtp_session_t *, vlc_tick_t, vlc_tick_t *);
int rtp_add_type(rtp_session_t *ses, rtp_pt_t *pt);
int vlc_rtp_add_media_types(vlc_object_t *obj, rtp_session_t *ses,
const struct vlc_sdp_media *media,
......
......@@ -42,6 +42,11 @@ struct rtp_session_t
unsigned srcc;
uint8_t ptc;
rtp_pt_t **ptv;
/* params */
vlc_tick_t timeout;
uint16_t max_dropout; /**< Max packet forward misordering */
uint16_t max_misorder; /**< Max packet backward misordering */
uint8_t max_src; /**< Max simultaneous RTP sources */
};
static rtp_source_t *
......@@ -50,16 +55,26 @@ static void rtp_source_destroy(struct vlc_logger *, rtp_source_t *);
static void rtp_decode (struct vlc_logger *, const rtp_session_t *, rtp_source_t *);
/** @} */
/**
* Creates a new RTP session.
*/
rtp_session_t *
rtp_session_create (void)
rtp_session_create_custom (uint16_t max_dropout, uint16_t max_misorder,
uint8_t max_src, vlc_tick_t timeout)
{
rtp_session_t *session = malloc (sizeof (*session));
if (session == NULL)
return NULL;
/* fixed parameters */
session->max_dropout = max_dropout;
session->max_misorder = -1 * max_misorder;
session->max_src = max_src;
session->timeout = timeout;
/* state variables */
session->srcv = NULL;
session->srcc = 0;
session->ptc = 0;
......@@ -68,6 +83,14 @@ rtp_session_create (void)
return session;
}
rtp_session_t *
rtp_session_create (void)
{
return rtp_session_create_custom(RTP_MAX_DROPOUT_DEFAULT,
RTP_MAX_MISORDER_DEFAULT,
RTP_MAX_SRC_DEFAULT,
RTP_MAX_TIMEOUT_DEFAULT);
}
/**
* Destroys an RTP session.
......@@ -194,12 +217,12 @@ static struct vlc_rtp_pt *rtp_find_ptype(const rtp_session_t *session,
/**
* Receives an RTP packet and queues it. Not a cancellation point.
*
* @param demux VLC demux object
* @param logger VLC logger handle
* @param session RTP session receiving the packet
* @param block RTP packet including the RTP header
*/
void
rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
rtp_queue (struct vlc_logger *logger, rtp_session_t *session, block_t *block)
{
/* RTP header sanity checks (see RFC 3550) */
if (block->i_buffer < 12)
......@@ -233,9 +256,9 @@ rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
}
/* RTP source garbage collection */
if ((tmp->last_rx + p_sys->timeout) < now)
if ((tmp->last_rx + session->timeout) < now)
{
rtp_source_destroy(p_sys->logger, tmp);
rtp_source_destroy(logger, tmp);
if (--session->srcc > 0)
session->srcv[i] = session->srcv[session->srcc - 1];
}
......@@ -244,9 +267,9 @@ rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
if (src == NULL)
{
/* New source */
if (session->srcc >= p_sys->max_src)
if (session->srcc >= session->max_src)
{
vlc_warning (p_sys->logger, "too many RTP sessions");
vlc_warning (logger, "too many RTP sessions");
goto drop;
}
......@@ -256,7 +279,7 @@ rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
goto drop;
session->srcv = tab;
src = rtp_source_create (p_sys->logger, session, ssrc, seq);
src = rtp_source_create (logger, session, ssrc, seq);
if (src == NULL)
goto drop;
......@@ -292,16 +315,16 @@ rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
int16_t s;
} delta_seq = { .u = seq - src->max_seq };
if ((delta_seq.s >= 0) ? (delta_seq.u > p_sys->max_dropout)
: (delta_seq.u < p_sys->max_misorder))
if ((delta_seq.s >= 0) ? (delta_seq.u > session->max_dropout)
: (delta_seq.u < session->max_misorder))
{
vlc_debug (p_sys->logger, "sequence discontinuity"
vlc_debug (logger, "sequence discontinuity"
" (got: %"PRIu16", expected: %"PRIu16")", seq, src->max_seq);
if (seq == src->bad_seq)
{
src->max_seq = src->bad_seq = seq + 1;
src->last_seq = seq - 0x7fffe; /* hack for rtp_decode() */
vlc_warning (p_sys->logger, "sequence resynchronized");
vlc_warning (logger, "sequence resynchronized");
block_ChainRelease (src->blocks);
src->blocks = NULL;
}
......@@ -325,7 +348,7 @@ rtp_queue (rtp_sys_t *p_sys, rtp_session_t *session, block_t *block)
break;
if (delta_seq.s == 0)
{
vlc_debug (p_sys->logger, "duplicate packet (sequence: %"PRIu16")", seq);
vlc_debug (logger, "duplicate packet (sequence: %"PRIu16")", seq);
goto drop; /* duplicate */
}
pp = &prev->p_next;
......@@ -347,16 +370,16 @@ drop:
* given up waiting on the missing packets (time out) from the last one
* already decoded.
*
* @param demux VLC demux object
* @param logger pointer to VLC logger
* @param session RTP session receiving the packet
* @param now monotonic clock reference for packets timing (ex: vlc_tick_now())
* @param deadlinep pointer to deadline to call rtp_dequeue() again
* @return true if the buffer is not empty, false otherwise.
* In the later case, *deadlinep is undefined.
*/
bool rtp_dequeue (rtp_sys_t *sys, const rtp_session_t *session,
vlc_tick_t *restrict deadlinep)
bool rtp_dequeue (struct vlc_logger *logger, const rtp_session_t *session,
vlc_tick_t now, vlc_tick_t *restrict deadlinep)
{
vlc_tick_t now = vlc_tick_now ();
bool pending = false;
*deadlinep = VLC_TICK_MAX;
......@@ -386,7 +409,7 @@ bool rtp_dequeue (rtp_sys_t *sys, const rtp_session_t *session,
{
if ((int16_t)(rtp_seq (block) - (src->last_seq + 1)) <= 0)
{ /* Next (or earlier) block ready, no need to wait */
rtp_decode (sys->logger, session, src);
rtp_decode (logger, session, src);
continue;
}
......@@ -412,7 +435,7 @@ bool rtp_dequeue (rtp_sys_t *sys, const rtp_session_t *session,
deadline += block->i_pts;
if (now >= deadline)
{
rtp_decode (sys->logger, session, src);
rtp_decode (logger, session, src);
continue;
}
if (*deadlinep > deadline)
......