VLC  4.0.0-dev
sdp.h
Go to the documentation of this file.
1 /**
2  * @file sdp.h
3  * @brief Session Description Protocol (SDP)
4  * @ingroup sdp
5  */
6 /*****************************************************************************
7  * Copyright © 2020 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 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.
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 Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this library; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
22  ****************************************************************************/
23 
24 #ifndef VLC_SDP_H
25 #define VLC_SDP_H
26 
27 #include <stdbool.h>
28 
29 /**
30  * \defgroup sdp Session Description Protocol
31  * \ingroup net
32  * @{
33  */
34 
35 struct vlc_sdp;
36 struct vlc_sdp_media;
37 struct vlc_sdp_conn;
38 struct vlc_sdp_attr;
39 
40 /**
41  * Parses an SDP session descriptor.
42  *
43  * \param str start address of the descriptor
44  * \param length bytes length of the descriptor
45  * \return a parsed SDP or NULL on error (@c errno is set)
46  */
47 struct vlc_sdp *vlc_sdp_parse(const char *str, size_t length);
48 
49 /**
50  * Destroys a parsed SDP session descriptor.
51  */
52 void vlc_sdp_free(struct vlc_sdp *sdp);
53 
55  struct vlc_sdp_attr *const *ap, const char *name);
56 
57 /** SDP attribute */
59 {
60  struct vlc_sdp_attr *next; /*< Next attribute (or NULL) */
61  const char *value; /*< Attribute value, or NULL if none */
62  char name[]; /*< Attribute name */
63 };
64 
65 /** SDP connection address */
67 {
68  struct vlc_sdp_conn *next; /*< Next address (or NULL) */
69  int family; /*< Address family, or AF_UNSPEC if not recognized */
70  unsigned char ttl; /*< Multicast TTL */
71  unsigned short addr_count; /*< Multicast address count */
72  char addr[]; /*< Address name, usually an IP literal */
73 };
74 
75 /** SDP media */
77 {
78  struct vlc_sdp_media *next; /*< Next media in the session (or NULL) */
79  struct vlc_sdp *session; /*< Pointer to containing session */
80  char *type; /*< Media type, e.g. "audio" or "video" */
81  unsigned int port; /*< Media port number */
82  unsigned int port_count; /*< Number of ports (usually 1) */
83  char *proto; /*< Media protocol, e.g. "RTP/AVP" */
84  char *format; /*< Protocol-specific format parameters */
85  struct vlc_sdp_conn *conns; /*< List of media connection addresses */
86  struct vlc_sdp_attr *attrs; /*< List of media attributes */
87 };
88 
89 /**
90  * Gets a media attribute by name.
91  *
92  * \param media Session media descriptor.
93  * \param name Session attribute name.
94  *
95  * \note This function does <b>not</b> look for session attributes, as this is
96  * not always appropriate.
97  * To fallback to session attributes, call vlc_sdp_attr_get() explicitly.
98  *
99  * \return the first attribute with the specified name or NULL if not found.
100  */
101 static inline
103  const struct vlc_sdp_media *media, const char *name)
104 {
105  return vlc_sdp_attr_first_by_name(&media->attrs, name);
106 }
107 
108 /**
109  * Checks if a median attribute is present.
110  *
111  * \param media Media descriptor.
112  * \param name Attribute name.
113  *
114  * \retval true if present
115  * \retval false it absent
116  */
117 static inline
118 bool vlc_sdp_media_attr_present(const struct vlc_sdp_media *media,
119  const char *name)
120 {
121  return vlc_sdp_media_attr_get(media, name) != NULL;
122 }
123 
124 /**
125  * Returns a media attribute value.
126  *
127  * \param media Media descriptor.
128  * \param name Attribute name.
129  *
130  * \note This function cannot distinguish the cases of a missing attribute and
131  * of an attribute without a value.
132  * Use vlc_sdp_media_attr_present() to check for value-less attributes.
133  *
134  * \return Nul-terminated attribute value, or NULL if none.
135  */
136 static inline
137 const char *vlc_sdp_media_attr_value(const struct vlc_sdp_media *media,
138  const char *name)
139 {
140  const struct vlc_sdp_attr *a = vlc_sdp_media_attr_get(media, name);
141  return (a != NULL) ? a->value : NULL;
142 }
143 
144 /** SDP session descriptor */
145 struct vlc_sdp
146 {
147  char *name; /*< Session name */
148  char *info; /*< Session description, or NULL if none */
149  struct vlc_sdp_conn *conn; /*< Session connection address or NULL */
150  struct vlc_sdp_attr *attrs; /*< List of session attributes */
151  struct vlc_sdp_media *media; /*< List of session media */
152 };
153 
154 /**
155  * Returns the media connection address list.
156  */
157 static inline
159  const struct vlc_sdp_media *media)
160 {
161  return (media->conns != NULL) ? media->conns : media->session->conn;
162 }
163 
164 /**
165  * Gets a session attribute by name.
166  *
167  * \param sdp Session descriptor.
168  * \param name Attribute name.
169  *
170  * \return the first attribute with the specified name or NULL if not found.
171  */
172 static inline
173 const struct vlc_sdp_attr *vlc_sdp_attr_get(const struct vlc_sdp *sdp,
174  const char *name)
175 {
176  return vlc_sdp_attr_first_by_name(&sdp->attrs, name);
177 }
178 
179 /**
180  * Checks if a session attribute is present.
181  *
182  * \param sdp Session descriptor.
183  * \param name Attribute name.
184  *
185  * \retval true if present
186  * \retval false it absent
187  */
188 static inline
189 bool vlc_sdp_attr_present(const struct vlc_sdp *sdp, const char *name)
190 {
191  return vlc_sdp_attr_get(sdp, name) != NULL;
192 }
193 
194 /**
195  * Returns a session attribute value.
196  *
197  * \param sdp Session descriptor.
198  * \param name Attribute name.
199  *
200  * \note This function cannot distinguish the cases of a missing attribute and
201  * of an attribute without a value.
202  * Use vlc_sdp_attr_present() to check for value-less attributes.
203  *
204  * \return Nul-terminated attribute value, or NULL if none.
205  */
206 static inline
207 const char *vlc_sdp_attr_value(const struct vlc_sdp *sdp, const char *name)
208 {
209  const struct vlc_sdp_attr *a = vlc_sdp_attr_get(sdp, name);
210  return (a != NULL) ? a->value : NULL;
211 }
212 
213 /** @} */
214 
215 #endif
vlc_sdp_getline
static int vlc_sdp_getline(struct vlc_sdp_input *restrict in, const char **restrict pp, size_t *restrict lenp)
Definition: sdp.c:204
rtp_pt_t::header
void(* header)(demux_t *, void *, block_t *)
Definition: rtp.h:33
rtp_pt_t
Definition: rtp.h:29
stream_init
static void * stream_init(demux_t *demux, const char *name)
Definition: rtpfmt.c:66
vlc_sdp_attr::name
char name[]
Definition: sdp.h:62
VIDEO_ES
@ VIDEO_ES
Definition: vlc_es.h:603
rtp_pt_t::frequency
uint32_t frequency
Definition: rtp.h:35
vlc_demux.h
vlc_sdp_media_parse
static struct vlc_sdp_media * vlc_sdp_media_parse(struct vlc_sdp *sdp, const char *str, size_t len)
Definition: sdp.c:140
vlc_sdp_media::proto
char * proto
Definition: sdp.h:83
unlikely
#define unlikely(p)
Predicted false condition.
Definition: vlc_common.h:227
vlc_common.h
mpv_decode
static void mpv_decode(demux_t *demux, void *data, block_t *block)
Definition: rtpfmt.c:227
vlc_sdp::info
char * info
Definition: sdp.h:148
block_t::i_buffer
size_t i_buffer
Payload length.
Definition: vlc_block.h:122
msg_Info
#define msg_Info(p_this,...)
Definition: vlc_messages.h:100
AOUT_CHAN_CENTER
#define AOUT_CHAN_CENTER
Definition: vlc_es.h:117
theora_init
void * theora_init(demux_t *demux)
Definition: xiph.c:74
vlc_sdp::attrs
struct vlc_sdp_attr * attrs
Definition: sdp.h:150
vlc_sdp::media
struct vlc_sdp_media * media
Definition: sdp.h:151
ts_init
static void * ts_init(demux_t *demux)
Definition: rtpfmt.c:251
vlc_sdp
SDP session descriptor.
Definition: sdp.h:145
msg_Dbg
#define msg_Dbg(p_this,...)
Definition: vlc_messages.h:106
var_InheritString
static char * var_InheritString(vlc_object_t *obj, const char *name)
Definition: vlc_variables.h:705
vlc_sdp_attr_first_by_name
const struct vlc_sdp_attr * vlc_sdp_attr_first_by_name(struct vlc_sdp_attr *const *ap, const char *name)
Definition: sdp.c:242
vlc_sdp_media::port
unsigned int port
Definition: sdp.h:81
vlc_sdp_media
SDP media.
Definition: sdp.h:76
es_format_Init
void es_format_Init(es_format_t *fmt, int i_cat, vlc_fourcc_t i_codec)
This function will initialize a es_format_t structure.
Definition: es_format.c:409
vlc_dialog_display_error
#define vlc_dialog_display_error(a, b, c,...)
Definition: vlc_dialog.h:73
vlc_demux_chained_Send
void vlc_demux_chained_Send(vlc_demux_chained_t *dc, block_t *block)
Sends data to a chained demuxer.
Definition: demux_chained.c:133
audio_format_t::i_rate
unsigned int i_rate
audio sample-rate
Definition: vlc_es.h:84
VLC_CODEC_ALAW
#define VLC_CODEC_ALAW
Definition: vlc_fourcc.h:566
vlc_sdp_attr_value
static const char * vlc_sdp_attr_value(const struct vlc_sdp *sdp, const char *name)
Returns a session attribute value.
Definition: sdp.h:207
audio_format_t::i_physical_channels
uint16_t i_physical_channels
Definition: vlc_es.h:88
pcmu_init
static void * pcmu_init(demux_t *demux)
Definition: rtpfmt.c:115
vlc_sdp_media_free
static void vlc_sdp_media_free(struct vlc_sdp_media **media)
Definition: sdp.c:124
vlc_sdp_media::port_count
unsigned int port_count
Definition: sdp.h:82
vlc_sdp_conn
SDP connection address.
Definition: sdp.h:66
stream_destroy
static void stream_destroy(demux_t *demux, void *data)
Definition: rtpfmt.c:77
stream_t::out
es_out_t * out
Definition: vlc_stream.h:68
strndup
char * strndup(const char *, size_t)
demux_sys_t::chained_demux
struct vlc_demux_chained_t * chained_demux
Definition: rtp.h:66
vlc_sdp_free
void vlc_sdp_free(struct vlc_sdp *sdp)
Destroys a parsed SDP session descriptor.
Definition: sdp.c:252
VLC_CODEC_GSM
#define VLC_CODEC_GSM
Definition: vlc_fourcc.h:524
vlc_sdp_conn::addr
char addr[]
Definition: sdp.h:72
vlc_sdp_conn::ttl
unsigned char ttl
Definition: sdp.h:70
l16m_init
static void * l16m_init(demux_t *demux)
Definition: rtpfmt.c:164
vlc_sdp_conn_free
static void vlc_sdp_conn_free(struct vlc_sdp_conn **conn)
Definition: sdp.c:34
es_out_Add
static es_out_id_t * es_out_Add(es_out_t *out, const es_format_t *fmt)
Definition: vlc_es_out.h:149
xiph_decode
void xiph_decode(demux_t *demux, void *data, block_t *block)
Definition: xiph.c:146
stream_header
static void stream_header(demux_t *demux, void *data, block_t *block)
Definition: rtpfmt.c:88
vlc_sdp_media_attr_value
static const char * vlc_sdp_media_attr_value(const struct vlc_sdp_media *media, const char *name)
Returns a media attribute value.
Definition: sdp.h:137
stream_decode
static void stream_decode(demux_t *demux, void *data, block_t *block)
Definition: rtpfmt.c:99
es_format_t
Definition: vlc_es.h:617
vlc_sdp_attr_present
static bool vlc_sdp_attr_present(const struct vlc_sdp *sdp, const char *name)
Checks if a session attribute is present.
Definition: sdp.h:189
xiph_destroy
void xiph_destroy(demux_t *demux, void *data)
Definition: xiph.c:80
block_t::i_flags
uint32_t i_flags
Definition: vlc_block.h:126
vlc_sdp::conn
struct vlc_sdp_conn * conn
Definition: sdp.h:149
vlc_sdp_media::attrs
struct vlc_sdp_attr * attrs
Definition: sdp.h:86
es_format_t::i_cat
enum es_format_category_e i_cat
ES category.
Definition: vlc_es.h:619
vlc_sdp_attr_free
static void vlc_sdp_attr_free(struct vlc_sdp_attr **attr)
Definition: sdp.c:116
vlc_sdp_conn::addr_count
unsigned short addr_count
Definition: sdp.h:71
vlc_sdp_media::type
char * type
Definition: sdp.h:80
qcelp_init
static void * qcelp_init(demux_t *demux)
Definition: rtpfmt.c:177
VLC_TICK_INVALID
#define VLC_TICK_INVALID
Definition: vlc_config.h:44
mpv_init
static void * mpv_init(demux_t *demux)
Definition: rtpfmt.c:218
mpa_init
static void * mpa_init(demux_t *demux)
Definition: rtpfmt.c:190
rtp_session_t
State for a RTP session:
Definition: session.c:39
pcma_init
static void * pcma_init(demux_t *demux)
Definition: rtpfmt.c:141
vlc_sdp_attr::next
struct vlc_sdp_attr * next
Definition: sdp.h:60
rtp_pt_t::init
void *(* init)(demux_t *)
Definition: rtp.h:31
stream_t
stream_t definition
Definition: vlc_stream.h:46
block_t::i_pts
vlc_tick_t i_pts
Definition: vlc_block.h:129
es_format_t::audio
audio_format_t audio
description of audio format
Definition: vlc_es.h:643
vlc_sdp_conn::next
struct vlc_sdp_conn * next
Definition: sdp.h:68
es_out_id_t
Definition: es_out.c:105
vlc_sdp_input::end
const char * end
Definition: sdp.c:201
AUDIO_ES
@ AUDIO_ES
Definition: vlc_es.h:604
mpa_decode
static void mpa_decode(demux_t *demux, void *data, block_t *block)
Definition: rtpfmt.c:200
VLC_CODEC_QCELP
#define VLC_CODEC_QCELP
Definition: vlc_fourcc.h:533
vlc_sdp_media_conn
static const struct vlc_sdp_conn * vlc_sdp_media_conn(const struct vlc_sdp_media *media)
Returns the media connection address list.
Definition: sdp.h:158
vlc_sdp_media::next
struct vlc_sdp_media * next
Definition: sdp.h:78
codec_destroy
void codec_destroy(demux_t *demux, void *data)
Definition: rtpfmt.c:47
sdp.h
Session Description Protocol (SDP)
rtp.h
RTP demux module shared declarations.
rtp_pt_t::decode
void(* decode)(demux_t *, void *, block_t *)
Definition: rtp.h:34
es_out_Del
static void es_out_Del(es_out_t *out, es_out_id_t *id)
Definition: vlc_es_out.h:154
VLC_UNUSED
#define VLC_UNUSED(x)
Definition: vlc_common.h:1105
codec_decode
void codec_decode(demux_t *demux, void *data, block_t *block)
Definition: rtpfmt.c:54
name
const char name[16]
Definition: httpd.c:1268
vlc_sdp_media::format
char * format
Definition: sdp.h:84
demux_sys_t
Definition: rtp.h:63
rtp_add_type
int rtp_add_type(demux_t *demux, rtp_session_t *ses, const rtp_pt_t *pt)
Adds a payload type to an RTP session.
Definition: session.c:108
VLC_CODEC_S16B
#define VLC_CODEC_S16B
Definition: vlc_fourcc.h:547
aout_FormatPrepare
void aout_FormatPrepare(audio_sample_format_t *p_format)
Definition: common.c:87
vlc_sdp_media_attr_present
static bool vlc_sdp_media_attr_present(const struct vlc_sdp_media *media, const char *name)
Checks if a median attribute is present.
Definition: sdp.h:118
vlc_sdp_attr::value
const char * value
Definition: sdp.h:61
vlc_sdp_attr_get
static const struct vlc_sdp_attr * vlc_sdp_attr_get(const struct vlc_sdp *sdp, const char *name)
Gets a session attribute by name.
Definition: sdp.h:173
N_
#define N_(str)
Definition: vlc_fixups.h:375
VLC_CODEC_MULAW
#define VLC_CODEC_MULAW
Definition: vlc_fourcc.h:567
rtp_autodetect
void rtp_autodetect(demux_t *demux, rtp_session_t *session, const block_t *block)
Definition: rtpfmt.c:259
es_out_SetPCR
static int es_out_SetPCR(es_out_t *out, vlc_tick_t pcr)
Definition: vlc_es_out.h:186
vlc_sdp_conn_parse
static struct vlc_sdp_conn * vlc_sdp_conn_parse(const char *str, size_t len)
Definition: sdp.c:42
vlc_sdp::name
char * name
Definition: sdp.h:147
vlc_sdp_conn::family
int family
Definition: sdp.h:69
block_t::i_dts
vlc_tick_t i_dts
Definition: vlc_block.h:130
vlc_demux_chained_Delete
void vlc_demux_chained_Delete(vlc_demux_chained_t *dc)
Destroys a chained demuxer.
Definition: demux_chained.c:163
vlc_sdp_input::cursor
const char * cursor
Definition: sdp.c:200
gsm_init
static void * gsm_init(demux_t *demux)
Definition: rtpfmt.c:128
block_t::p_buffer
uint8_t * p_buffer
Payload start.
Definition: vlc_block.h:121
VLC_OBJECT
#define VLC_OBJECT(x)
Type-safe vlc_object_t cast.
Definition: vlc_objects.h:70
rtp_pt_t::destroy
void(* destroy)(demux_t *, void *)
Definition: rtp.h:32
vlc_aout.h
rtp_ptype
static uint8_t rtp_ptype(const block_t *block)
Definition: rtp.h:40
vlc_sdp_media::conns
struct vlc_sdp_conn * conns
Definition: sdp.h:85
BLOCK_FLAG_DISCONTINUITY
#define BLOCK_FLAG_DISCONTINUITY
The content doesn't follow the last block, possible some blocks in between have been lost.
Definition: vlc_block.h:67
VLC_CODEC_MPGV
#define VLC_CODEC_MPGV
Definition: vlc_fourcc.h:30
AOUT_CHANS_STEREO
#define AOUT_CHANS_STEREO
Definition: vlc_es.h:132
block_Release
void block_Release(block_t *block)
Releases a block.
Definition: block.c:135
vlc_sdp_media_attr_get
static const struct vlc_sdp_attr * vlc_sdp_media_attr_get(const struct vlc_sdp_media *media, const char *name)
Gets a media attribute by name.
Definition: sdp.h:102
vlc_sdp_attr
SDP attribute.
Definition: sdp.h:58
codec_init
void * codec_init(demux_t *demux, es_format_t *fmt)
Definition: rtpfmt.c:40
stream_t::p_sys
void * p_sys
Private data pointer.
Definition: vlc_stream.h:138
es_out_Send
static int es_out_Send(es_out_t *out, es_out_id_t *id, block_t *p_block)
Definition: vlc_es_out.h:159
block_t
Definition: vlc_block.h:117
vlc_dialog.h
vlc_sdp_attr_parse
static struct vlc_sdp_attr * vlc_sdp_attr_parse(const char *str, size_t len)
Definition: sdp.c:99
msg_Err
#define msg_Err(p_this,...)
Definition: vlc_messages.h:102
es_format_t::b_packetized
bool b_packetized
whether the data is packetized (ie.
Definition: vlc_es.h:654
VLC_CODEC_MPGA
#define VLC_CODEC_MPGA
Definition: vlc_fourcc.h:459
vlc_sdp_input
Definition: sdp.c:198
vlc_sdp_media::session
struct vlc_sdp * session
Definition: sdp.h:79
vlc_demux_chained_New
vlc_demux_chained_t * vlc_demux_chained_New(vlc_object_t *parent, const char *name, es_out_t *out)
Creates a chained demuxer.
Definition: demux_chained.c:100
l16s_init
static void * l16s_init(demux_t *demux)
Definition: rtpfmt.c:154
vlc_sdp_parse
struct vlc_sdp * vlc_sdp_parse(const char *str, size_t length)
Parses an SDP session descriptor.
Definition: sdp.c:268