Yate
yatesdp.h
1
21
22#ifndef __YATESDP_H
23#define __YATESDP_H
24
25#ifndef __cplusplus
26#error C++ is required
27#endif
28
29#include <yatemime.h>
30#include <yatephone.h>
31
32#ifdef _WINDOWS
33
34#ifdef LIBYSDP_EXPORTS
35#define YSDP_API __declspec(dllexport)
36#else
37#ifndef LIBYSDP_STATIC
38#define YSDP_API __declspec(dllimport)
39#endif
40#endif
41
42#endif /* _WINDOWS */
43
44#ifndef YSDP_API
45#define YSDP_API
46#endif
47
51namespace TelEngine {
52
53class SDPMedia;
54class SDPSession;
55class SDPParser;
56
61class YSDP_API SDPMedia : public NamedList
62{
63public:
72 SDPMedia(const char* media, const char* transport, const char* formats,
73 int rport = -1, int lport = -1);
74
78 virtual ~SDPMedia();
79
84 inline bool isAudio() const
85 { return m_audio; }
86
91 inline bool isVideo() const
92 { return m_video; }
93
98 inline bool isModified() const
99 { return m_modified; }
100
105 inline void setModified(bool modified = true)
106 { m_modified = modified; }
107
112 inline const String& suffix() const
113 { return m_suffix; }
114
119 inline bool isStarted() const
120 { return m_id && m_transport && m_format && m_lPort; }
121
126 inline const String& transport() const
127 { return m_transport; }
128
133 inline const String& id() const
134 { return m_id; }
135
140 inline const String& format() const
141 { return m_format; }
142
147 inline const String& formats() const
148 { return m_formats; }
149
154 inline const String& remotePort() const
155 { return m_rPort; }
156
161 inline const String& localPort() const
162 { return m_lPort; }
163
168 inline const String& mappings() const
169 { return m_mappings; }
170
175 inline void mappings(const char* newMap)
176 { if (newMap) m_mappings = newMap; }
177
182 inline const String& rfc2833() const
183 { return m_rfc2833; }
184
190 inline void rfc2833(int payload)
191 {
192 if (payload >= 0)
193 m_rfc2833 = payload;
194 else
195 m_rfc2833 = String::boolText(false);
196 }
197
202 inline const String& remoteCrypto() const
203 { return m_rCrypto; }
204
209 inline const String& localCrypto() const
210 { return m_lCrypto; }
211
216 inline bool securable() const
217 { return m_securable; }
218
226 bool sameAs(const SDPMedia* other, bool ignorePort = false, bool checkStarted = false) const;
227
232 inline bool localChanged() const
233 { return m_localChanged; }
234
239 inline void setLocalChanged(bool chg = false)
240 { m_localChanged = chg; }
241
247 const char* fmtList() const;
248
257 bool update(const char* formats, int rport = -1, int lport = -1, bool force = false);
258
264 void update(const NamedList& msg, bool pickFormat);
265
272 void parameter(const char* name, const char* value, bool append);
273
279 void parameter(NamedString* param, bool append);
280
287 void crypto(const char* desc, bool remote);
288
294 void putMedia(NamedList& msg, bool putPort = true);
295
300 void keepRtp(const SDPMedia& other);
301
308 static int payloadMapping(const String& mappings, const String& fmt);
309
310private:
311 bool m_audio;
312 bool m_video;
313 bool m_modified;
314 bool m_securable;
315 // local rtp data changed flag
316 bool m_localChanged;
317 // suffix used for this type
318 String m_suffix;
319 // transport protocol
320 String m_transport;
321 // list of supported format names
322 String m_formats;
323 // format used for sending data
324 String m_format;
325 // id of the local media channel
326 String m_id;
327 // remote media port
328 String m_rPort;
329 // mappings of RTP payloads
330 String m_mappings;
331 // local media port
332 String m_lPort;
333 // payload for telephone/event
334 String m_rfc2833;
335 // remote security descriptor
336 String m_rCrypto;
337 // local security descriptor
338 String m_lCrypto;
339};
340
341
347class YSDP_API SDPSession
348{
349public:
353 enum {
354 MediaMissing,
355 MediaStarted,
356 MediaMuted
357 };
358
364
370 SDPSession(SDPParser* parser, NamedList& params);
371
375 virtual ~SDPSession();
376
381 inline const String& getHost() const
382 { return m_host; }
383
388 inline const String& getRtpAddr() const
389 { return m_externalAddr ? m_externalAddr : m_rtpLocalAddr; }
390
397 bool setMedia(ObjList* media, bool preserveExisting = false);
398
405 static void putMedia(NamedList& msg, ObjList* media, bool putPort = true);
406
412 inline void putMedia(NamedList& msg, bool putPort = true)
413 { putMedia(msg,m_rtpMedia,putPort); }
414
420 SDPMedia* getMedia(const String& name) const
421 { return m_rtpMedia ? static_cast<SDPMedia*>((*m_rtpMedia)[name]) : 0; }
422
427 void setRfc2833(const String& value);
428
433 inline void setRfc2833(const String* value)
434 { if (value) setRfc2833(*value); }
435
445 bool dispatchRtp(SDPMedia* media, const char* addr, bool start, bool pick, RefObject* context = 0);
446
455 bool dispatchRtp(const char* addr, bool start, RefObject* context = 0);
456
462 bool startRtp(RefObject* context = 0);
463
470 bool updateSDP(const NamedList& params, bool defaults = true);
471
477 bool updateRtpSDP(const NamedList& params);
478
485 MimeSdpBody* createSDP(const char* addr, ObjList* mediaList = 0);
486
491 MimeSdpBody* createSDP();
492
501 MimeSdpBody* createPasstroughSDP(NamedList& msg, bool update = true,
502 bool allowEmptyAddr = false);
503
511 inline MimeSdpBody* createRtpSDP(const char* addr, const NamedList& msg)
512 { updateSDP(msg); return createRtpSDP(addr,false); }
513
520 inline MimeSdpBody* createRtpSDP(const char* addr, bool start)
521 { return dispatchRtp(addr,start) ? createSDP(getRtpAddr()) : 0; }
522
529 inline MimeSdpBody* createRtpSDP(bool start)
530 {
531 if (m_rtpAddr.null()) {
532 m_mediaStatus = MediaMuted;
533 return createSDP(0);
534 }
535 return createRtpSDP(m_rtpAddr,start);
536 }
537
543 void updateFormats(const NamedList& msg, bool changeMedia = false);
544
551 bool addSdpParams(NamedList& msg, const MimeBody* body);
552
559 bool addSdpParams(NamedList& msg, const String& rawSdp);
560
571 bool addRtpParams(NamedList& msg, const String& natAddr = String::empty(),
572 const MimeBody* body = 0, bool force = false, bool allowEmptyAddr = false);
573
578 virtual void resetSdp(bool all = true);
579
588 virtual Message* buildChanRtp(SDPMedia* media, const char* addr, bool start, RefObject* context);
589
595 virtual Message* buildChanRtp(RefObject* context) = 0;
596
601 bool localRtpChanged() const;
602
607 void setLocalRtpChanged(bool chg = false);
608
618 static ObjList* updateRtpSDP(const NamedList& params, String& rtpAddr,
619 ObjList* oldList = 0, bool allowEmptyAddr = false);
620
621protected:
627 virtual void mediaChanged(const SDPMedia& media);
628
636 virtual void dispatchingRtp(Message*& msg, SDPMedia* media);
637
644 void setSdpDebug(DebugEnabler* enabler = 0, void* ptr = 0, const String& traceId = String::empty());
645
650 void printRtpMedia(const char* reason);
651
657 void setFormatsExtra(const NamedList& list, bool out);
658
659 SDPParser* m_parser;
660 int m_mediaStatus;
661 bool m_rtpForward; // Forward RTP flag
662 bool m_sdpForward; // Forward SDP (only if RTP is forwarded)
663 String m_originAddr; // Our SDP origin address
664 String m_externalAddr; // Our external IP address, possibly outside of a NAT
665 String m_rtpAddr; // Remote RTP address
666 String m_rtpLocalAddr; // Local RTP address
667 String m_rtpNatAddr; // Advertised local IP in sdp (override any local IP)
668 ObjList* m_rtpMedia; // List of media descriptors
669 int m_sdpSession; // Unique SDP session number
670 int m_sdpVersion; // SDP version number, incremented each time we generate a new SDP
671 unsigned int m_sdpHash; // SDP content hash
672 String m_host;
673 bool m_secure;
674 int m_rfc2833; // Payload of RFC 2833 for remote party
675 bool m_ipv6; // IPv6 support
676 NamedList m_amrExtra; // Extra AMR codec parameters
677
678private:
679 // Add extra AMR params to fmtp line
680 void addFmtpAmrExtra(String& buf, const String* fmtp);
681
682 DebugEnabler* m_enabler; // Debug enabler used for output
683 void* m_ptr; // Pointer to show in debug messages
684 String m_traceId;
685};
686
691class YSDP_API SDPParser : public DebugEnabler, public Mutex
692{
693 friend class SDPSession;
694
695public:
702 inline SDPParser(const char* dbgName, const char* sessName, const char* fmts = "alaw,mulaw")
703 : Mutex(true,"SDPParser"),
704 m_rfc2833(101),
705 m_sdpForward(false), m_secure(false), m_ignorePort(false),
706 m_sessionName(sessName), m_audioFormats(fmts),
707 m_codecs(""), m_hacks("")
708 { debugName(dbgName); }
709
715 inline void getAudioFormats(String& buf)
716 { Lock lock(this); buf = m_audioFormats; }
717
722 inline int rfc2833() const
723 { return m_rfc2833; }
724
729 inline bool secure() const
730 { return m_secure; }
731
736 inline bool sdpForward() const
737 { return m_sdpForward; }
738
743 inline bool ignorePort() const
744 { return m_ignorePort; }
745
758 ObjList* parse(const MimeSdpBody& sdp, String& addr, ObjList* oldMedia = 0,
759 const String& media = String::empty(), bool force = false);
760
773 inline ObjList* parse(const MimeSdpBody* sdp, String& addr, ObjList* oldMedia = 0,
774 const String& media = String::empty(), bool force = false)
775 { return sdp ? parse(*sdp,addr,oldMedia,media,force) : 0; }
776
783 void initialize(const NamedList* codecs, const NamedList* hacks, const NamedList* general = 0);
784
788 static const TokenDict s_payloads[];
789
793 static const TokenDict s_rtpmap[];
794
795private:
796 int m_rfc2833; // RFC 2833 payload offered to remote
797 bool m_sdpForward; // Include raw SDP for forwarding
798 bool m_secure; // Offer SRTP
799 bool m_ignorePort; // Ignore port only changes in SDP
800 String m_sessionName;
801 String m_audioFormats; // Default audio formats to be advertised to remote party
802 NamedList m_codecs; // Codecs configuration list
803 NamedList m_hacks; // Various potentially standard breaking settings
804};
805
806}; // namespace TelEngine
807
808#endif /* __YATESDP_H */
809
810/* vi: set ts=8 sw=4 sts=4 noet: */
A holder for a debug level.
Definition yateclass.h:312
DebugEnabler(int level=TelEngine::debugLevel(), bool enabled=true)
Definition yateclass.h:319
const char * debugName() const
Definition yateclass.h:358
Ephemeral mutex or semaphore locking object.
Definition yateclass.h:5833
Mutex(bool recursive=false, const char *name=0)
virtual bool lock(long maxwait=-1)
A named string container class.
Definition yateclass.h:5016
NamedList(const char *name)
A named string class.
Definition yateclass.h:3481
An object list class.
Definition yateclass.h:1454
Definition yateclass.h:1174
SDP media description.
Definition yatesdp.h:62
const String & suffix() const
Definition yatesdp.h:112
const String & localCrypto() const
Definition yatesdp.h:209
const String & mappings() const
Definition yatesdp.h:168
virtual ~SDPMedia()
void rfc2833(int payload)
Definition yatesdp.h:190
const String & remoteCrypto() const
Definition yatesdp.h:202
bool update(const char *formats, int rport=-1, int lport=-1, bool force=false)
void update(const NamedList &msg, bool pickFormat)
bool securable() const
Definition yatesdp.h:216
const String & id() const
Definition yatesdp.h:133
void setLocalChanged(bool chg=false)
Definition yatesdp.h:239
const char * fmtList() const
bool isModified() const
Definition yatesdp.h:98
void putMedia(NamedList &msg, bool putPort=true)
const String & localPort() const
Definition yatesdp.h:161
bool isAudio() const
Definition yatesdp.h:84
const String & remotePort() const
Definition yatesdp.h:154
void parameter(const char *name, const char *value, bool append)
void parameter(NamedString *param, bool append)
bool isVideo() const
Definition yatesdp.h:91
void mappings(const char *newMap)
Definition yatesdp.h:175
static int payloadMapping(const String &mappings, const String &fmt)
void keepRtp(const SDPMedia &other)
const String & rfc2833() const
Definition yatesdp.h:182
void crypto(const char *desc, bool remote)
SDPMedia(const char *media, const char *transport, const char *formats, int rport=-1, int lport=-1)
void setModified(bool modified=true)
Definition yatesdp.h:105
const String & formats() const
Definition yatesdp.h:147
bool isStarted() const
Definition yatesdp.h:119
const String & format() const
Definition yatesdp.h:140
bool sameAs(const SDPMedia *other, bool ignorePort=false, bool checkStarted=false) const
const String & transport() const
Definition yatesdp.h:126
bool localChanged() const
Definition yatesdp.h:232
A SDP parser.
Definition yatesdp.h:692
static const TokenDict s_payloads[]
Definition yatesdp.h:788
ObjList * parse(const MimeSdpBody &sdp, String &addr, ObjList *oldMedia=0, const String &media=String::empty(), bool force=false)
int rfc2833() const
Definition yatesdp.h:722
ObjList * parse(const MimeSdpBody *sdp, String &addr, ObjList *oldMedia=0, const String &media=String::empty(), bool force=false)
Definition yatesdp.h:773
bool sdpForward() const
Definition yatesdp.h:736
void getAudioFormats(String &buf)
Definition yatesdp.h:715
static const TokenDict s_rtpmap[]
Definition yatesdp.h:793
bool secure() const
Definition yatesdp.h:729
bool ignorePort() const
Definition yatesdp.h:743
SDPParser(const char *dbgName, const char *sessName, const char *fmts="alaw,mulaw")
Definition yatesdp.h:702
void initialize(const NamedList *codecs, const NamedList *hacks, const NamedList *general=0)
void setFormatsExtra(const NamedList &list, bool out)
bool dispatchRtp(const char *addr, bool start, RefObject *context=0)
bool addRtpParams(NamedList &msg, const String &natAddr=String::empty(), const MimeBody *body=0, bool force=false, bool allowEmptyAddr=false)
const String & getRtpAddr() const
Definition yatesdp.h:388
bool updateSDP(const NamedList &params, bool defaults=true)
void printRtpMedia(const char *reason)
bool dispatchRtp(SDPMedia *media, const char *addr, bool start, bool pick, RefObject *context=0)
bool startRtp(RefObject *context=0)
SDPSession(SDPParser *parser, NamedList &params)
virtual ~SDPSession()
void setSdpDebug(DebugEnabler *enabler=0, void *ptr=0, const String &traceId=String::empty())
void setLocalRtpChanged(bool chg=false)
MimeSdpBody * createPasstroughSDP(NamedList &msg, bool update=true, bool allowEmptyAddr=false)
bool addSdpParams(NamedList &msg, const String &rawSdp)
virtual Message * buildChanRtp(SDPMedia *media, const char *addr, bool start, RefObject *context)
bool addSdpParams(NamedList &msg, const MimeBody *body)
static ObjList * updateRtpSDP(const NamedList &params, String &rtpAddr, ObjList *oldList=0, bool allowEmptyAddr=false)
void putMedia(NamedList &msg, bool putPort=true)
Definition yatesdp.h:412
void setRfc2833(const String *value)
Definition yatesdp.h:433
MimeSdpBody * createRtpSDP(const char *addr, const NamedList &msg)
Definition yatesdp.h:511
virtual Message * buildChanRtp(RefObject *context)=0
bool localRtpChanged() const
virtual void mediaChanged(const SDPMedia &media)
static void putMedia(NamedList &msg, ObjList *media, bool putPort=true)
MimeSdpBody * createSDP()
SDPMedia * getMedia(const String &name) const
Definition yatesdp.h:420
virtual void resetSdp(bool all=true)
bool updateRtpSDP(const NamedList &params)
const String & getHost() const
Definition yatesdp.h:381
MimeSdpBody * createRtpSDP(const char *addr, bool start)
Definition yatesdp.h:520
void updateFormats(const NamedList &msg, bool changeMedia=false)
bool setMedia(ObjList *media, bool preserveExisting=false)
MimeSdpBody * createSDP(const char *addr, ObjList *mediaList=0)
SDPSession(SDPParser *parser)
virtual void dispatchingRtp(Message *&msg, SDPMedia *media)
void setRfc2833(const String &value)
MimeSdpBody * createRtpSDP(bool start)
Definition yatesdp.h:529
A C-style string handling class.
Definition yateclass.h:2131
String & append(const char *value, int len)
static const char * boolText(bool value)
Definition yateclass.h:2229
static const String & empty()
Definition yatemime.h:34
Definition yateclass.h:848