Project 'savoirfairelinux/ring-client-windows' was moved to 'savoirfairelinux/jami-client-windows'. Please update any links and bookmarks that may still have the old path.
Select Git revision
pivotviewwidget.ui
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
sdp.h 11.47 KiB
/*
* Copyright (C) 2009 Savoir-Faire Linux inc.
*
* Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _SDP_H
#define _SDP_H
#include <pjmedia/sdp.h>
#include <pjmedia/sdp_neg.h>
#include <pjsip/sip_transport.h>
#include <pjlib.h>
#include <pjsip_ua.h>
#include <pjmedia/errno.h>
#include <pj/pool.h>
#include <pj/assert.h>
#include "audio/codecs/codecDescriptor.h"
#include "sdpmedia.h"
#include <exception>
class sdpException: public std::exception
{
virtual const char* what() const throw()
{
return "An sdpException Occured";
}
};
class Sdp {
public:
/*
* Class Constructor.
*
* @param ip_addr
*/
Sdp(pj_pool_t *pool);
/* Class destructor */
~Sdp();
/*
* Read accessor. Get the list of the local media capabilities.
*
* @return std::vector<sdpMedia*> the vector containing the different media
*/
std::vector<sdpMedia*> get_local_media_cap( void ) { return _local_media_cap; }
/*
* Read accessor. Get the sdp session information
*
* @return pjmedia_sdp_session The structure that describes a SDP session
*/
pjmedia_sdp_session* get_local_sdp_session( void ) { return _local_offer; }
/*
* Write accessor. Set the local IP address that will be used in the sdp session
*/
void set_ip_address( std::string ip_addr ) { _ip_addr = ip_addr; }
/*
* Read accessor. Get the local IP address
*/
std::string get_ip_address( void ) { return _ip_addr; }
/*
* Build the local SDP offer
*/
int create_local_offer( );
/*
* Build the sdp media section
* Add rtpmap field if necessary
*
* @param media The media to add to SDP
* @param med The structure to receive the media section
*/
void set_media_descriptor_line( sdpMedia* media, pjmedia_sdp_media** p_med );
/* Set the zrtp hash that was previously calculated from the hello message in the zrtp layer.
* This hash value is unique at the media level. Therefore, if video support is added, one would
* have to set the correct zrtp-hash value in the corresponding media section.
* @param hash The hello hash of a rtp session. (Only audio at the moment)
*/
inline void set_zrtp_hash(const std::string& hash) { _zrtp_hello_hash = hash; _debug("Zrtp hash set with %s\n", hash.c_str()); }
/* Set the srtp _master_key
* @param mk The Master Key of a srtp session.
*/
inline void set_srtp_crypto(const std::string& mk) { _srtp_crypto = mk; }
/*
* On building an invite outside a dialog, build the local offer and create the
* SDP negociator instance with it.
*/
int create_initial_offer( );
/*
* On receiving an invite outside a dialog, build the local offer and create the
* SDP negociator instance with the remote offer.
*
* @param remote The remote offer
*/
int receiving_initial_offer( pjmedia_sdp_session* remote );
/*
* On receiving a message, check if it contains SDP and negotiate. Should be used for
* SDP answer and offer but currently is only used for answer.
* SDP negociator instance with the remote offer.
*
* @param inv The the invitation
* @param rdata The remote data
*/
pj_status_t check_sdp_answer(pjsip_inv_session *inv, pjsip_rx_data *rdata);
/*
* Remove all media in the session media vector.
*/
void clean_session_media();
/*
* Return a string description of the media added to the session,
* ie the local media capabilities
*/
std::string media_to_string( void );
/*
* Return the codec of the first media after negociation
*/
AudioCodec* get_session_media( void );
/*
* read accessor. Return the negociated offer
*
* @return pjmedia_sdp_session The negociated offer
*/
pjmedia_sdp_session* get_negociated_offer( void ){
return _negociated_offer;
}
/*
* Start the sdp negociation.
*
* @return pj_status_t 0 on success
* 1 otherwise
*/
pj_status_t start_negociation( void ){
return pjmedia_sdp_neg_negotiate(
_pool, _negociator, 0);
}
/*
* Retrieve the negociated sdp offer from the sip payload.
*
* @param sdp the negociated offer
*/
void set_negotiated_sdp ( const pjmedia_sdp_session *sdp );
/*
* Attribute the specified port to every medias provided
* This is valid only because we are using one media
* We should change this to support multiple medias
*
* @param port The media port
*/
void attribute_port_to_all_media (int port);
void set_local_extern_audio_port(int port){ _local_extern_audio_port = port; }
int get_local_extern_audio_port (void){ return _local_extern_audio_port; }
void toString (void);
/**
* Set remote's IP addr. [not protected]
* @param ip The remote IP address
*/
void set_remote_ip(const std::string& ip) { _remote_ip_addr = ip; }
/**
* Return IP of destination [mutex protected]
* @return const std:string The remote IP address
*/
const std::string& get_remote_ip() { return _remote_ip_addr; }
/**
* Set remote's audio port. [not protected]
* @param port The remote audio port
*/
void set_remote_audio_port(unsigned int port) { _remote_audio_port = port; }
/**
* Return audio port at destination [mutex protected]
* @return unsigned int The remote audio port
*/
unsigned int get_remote_audio_port() { return _remote_audio_port; }
void set_media_transport_info_from_remote_sdp (const pjmedia_sdp_session *remote_sdp);
std::vector<sdpMedia*> get_session_media_list (void) { return _session_media; }
void get_remote_sdp_crypto_from_offer (const pjmedia_sdp_session* remote_sdp, pjmedia_sdp_attr** r_crypto);
private:
/** Codec Map */
std::vector<sdpMedia*> _local_media_cap;
/* The media that will be used by the session (after the SDP negociation) */
std::vector<sdpMedia*> _session_media;
/** negociator */
pjmedia_sdp_neg *_negociator;
/** IP address */
std::string _ip_addr;
/** Remote's IP address */
std::string _remote_ip_addr;
/** Local SDP */
pjmedia_sdp_session *_local_offer;
/* The negociated SDP offer */
// Explanation: each endpoint's offer is negociated, and a new sdp offer results from this
// negociation, with the compatible media from each part
pjmedia_sdp_session *_negociated_offer;
// The pool to allocate memory
pj_pool_t *_pool;
/** Local audio port */
int _local_extern_audio_port;
/** Remote's audio port */
unsigned int _remote_audio_port;
std::string _zrtp_hello_hash;
/** "a=crypto" sdes attribute obtained from AudioSrtpSession */
std::string _srtp_crypto;
Sdp(const Sdp&); //No Copy Constructor
Sdp& operator=(const Sdp&); //No Assignment Operator
void set_local_media_capabilities ();
/*
* Mandatory field: Origin ("o=")
* Gives the originator of the session.
* Serves as a globally unique identifier for this version of this session description.
*/
void sdp_add_origin( void );
/*
* Mandatory field: Protocol version ("v=")
* Add the protocol version in the SDP session description
*/
void sdp_add_protocol( void );
/*
* Optional field: Connection data ("c=")
* Contains connection data.
*/
void sdp_add_connection_info( void );
/*
* Mandatory field: Session name ("s=")
* Add a textual session name.
*/
void sdp_add_session_name( void );
/*
* Optional field: Session information ("s=")
* Provides textual information about the session.
*/
void sdp_add_session_info( void ){}
/*
* Optional field: Uri ("u=")
* Add a pointer to additional information about the session.
*/
void sdp_add_uri( void ) {}
/*
* Optional fields: Email address and phone number ("e=" and "p=")
* Add contact information for the person responsible for the conference.
*/
void sdp_add_email( void ) {}
/*
* Optional field: Bandwidth ("b=")
* Denotes the proposed bandwidth to be used by the session or the media .
*/
void sdp_add_bandwidth( void ) {}
/*
* Mandatory field: Timing ("t=")
* Specify the start and the stop time for a session.
*/
void sdp_add_timing( void );
/*
* Optional field: Time zones ("z=")
*/
void sdp_add_time_zone( void ) {}
/*
* Optional field: Encryption keys ("k=")
*/
void sdp_add_encryption_key( void ) {}
/*
* Optional field: Attributes ("a=")
*/
void sdp_add_attributes( );
/*
* Mandatory field: Media descriptions ("m=")
*/
void sdp_add_media_description();
std::string convert_int_to_string (int value);
void set_remote_ip_from_sdp (const pjmedia_sdp_session *r_sdp);
void set_remote_audio_port_from_sdp (pjmedia_sdp_media *r_media);
void get_remote_sdp_media_from_offer (const pjmedia_sdp_session* r_sdp, pjmedia_sdp_media** r_media);
/*
* Adds a sdes attribute to the given media section.
*
* @param media The media to add the srtp attribute to
*/
void sdp_add_sdes_attribute(std::string crypto);
/*
* Adds a zrtp-hash attribute to
* the given media section. The hello hash is
* available only after is has been computed
* in the AudioZrtpSession constructor.
*
* @param media The media to add the zrtp-hash attribute to
* @param hash The hash to which the attribute should be set to
*/
void sdp_add_zrtp_attribute(pjmedia_sdp_media* media, std::string hash);
};
#endif