Mon Jun 27 16:51:20 2011

Asterisk developer's documentation


rtp_engine.h File Reference

Pluggable RTP Architecture. More...

#include "asterisk/astobj2.h"
#include "asterisk/frame.h"
#include "asterisk/netsock2.h"
#include "asterisk/sched.h"
#include "asterisk/res_srtp.h"

Go to the source code of this file.

Data Structures

struct  ast_rtp_codecs
struct  ast_rtp_engine
struct  ast_rtp_glue
struct  ast_rtp_instance_stats
struct  ast_rtp_payload_type

Defines

#define AST_RED_MAX_GENERATION   5
#define AST_RTP_CISCO_DTMF   (1 << 2)
#define AST_RTP_CN   (1 << 1)
#define AST_RTP_DTMF   (1 << 0)
#define ast_rtp_engine_register(engine)   ast_rtp_engine_register2(engine, ast_module_info->self)
#define ast_rtp_glue_register(glue)   ast_rtp_glue_register2(glue, ast_module_info->self)
#define AST_RTP_MAX   AST_RTP_CISCO_DTMF
#define AST_RTP_MAX_PT   256
#define AST_RTP_STAT_SET(current_stat, combined, placement, value)
#define AST_RTP_STAT_TERMINATOR(combined)

Enumerations

enum  ast_rtp_dtmf_mode { AST_RTP_DTMF_MODE_NONE = 0, AST_RTP_DTMF_MODE_RFC2833, AST_RTP_DTMF_MODE_INBAND }
enum  ast_rtp_glue_result { AST_RTP_GLUE_RESULT_FORBID = 0, AST_RTP_GLUE_RESULT_REMOTE, AST_RTP_GLUE_RESULT_LOCAL }
enum  ast_rtp_instance_stat {
  AST_RTP_INSTANCE_STAT_ALL = 0, AST_RTP_INSTANCE_STAT_TXCOUNT, AST_RTP_INSTANCE_STAT_RXCOUNT, AST_RTP_INSTANCE_STAT_COMBINED_LOSS,
  AST_RTP_INSTANCE_STAT_TXPLOSS, AST_RTP_INSTANCE_STAT_RXPLOSS, AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS,
  AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS,
  AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, AST_RTP_INSTANCE_STAT_TXJITTER,
  AST_RTP_INSTANCE_STAT_RXJITTER, AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER, AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER, AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER,
  AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER, AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER, AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER, AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER,
  AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_RTT, AST_RTP_INSTANCE_STAT_RTT, AST_RTP_INSTANCE_STAT_MAX_RTT,
  AST_RTP_INSTANCE_STAT_MIN_RTT, AST_RTP_INSTANCE_STAT_NORMDEVRTT, AST_RTP_INSTANCE_STAT_STDEVRTT, AST_RTP_INSTANCE_STAT_LOCAL_SSRC,
  AST_RTP_INSTANCE_STAT_REMOTE_SSRC
}
enum  ast_rtp_instance_stat_field { AST_RTP_INSTANCE_STAT_FIELD_QUALITY = 0, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT }
enum  ast_rtp_options { AST_RTP_OPT_G726_NONSTANDARD = (1 << 0) }
enum  ast_rtp_property {
  AST_RTP_PROPERTY_NAT = 0, AST_RTP_PROPERTY_DTMF, AST_RTP_PROPERTY_DTMF_COMPENSATE, AST_RTP_PROPERTY_STUN,
  AST_RTP_PROPERTY_RTCP, AST_RTP_PROPERTY_MAX
}

Functions

void ast_rtp_codecs_packetization_set (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, struct ast_codec_pref *prefs)
 Set codec packetization preferences.
int ast_rtp_codecs_payload_code (struct ast_rtp_codecs *codecs, const int asterisk_format, const format_t code)
 Retrieve a payload based on whether it is an Asterisk format and the code.
void ast_rtp_codecs_payload_formats (struct ast_rtp_codecs *codecs, format_t *astformats, int *nonastformats)
 Retrieve all formats that were found.
ast_rtp_payload_type ast_rtp_codecs_payload_lookup (struct ast_rtp_codecs *codecs, int payload)
 Retrieve payload information by payload.
void ast_rtp_codecs_payloads_clear (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
 Clear payload information from an RTP instance.
void ast_rtp_codecs_payloads_copy (struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
 Copy payload information from one RTP instance to another.
void ast_rtp_codecs_payloads_default (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
 Set payload information on an RTP instance to the default.
void ast_rtp_codecs_payloads_set_m_type (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 Record payload information that was seen in an m= SDP line.
int ast_rtp_codecs_payloads_set_rtpmap_type (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload, char *mimetype, char *mimesubtype, enum ast_rtp_options options)
 Record payload information that was seen in an a=rtpmap: SDP line.
int ast_rtp_codecs_payloads_set_rtpmap_type_rate (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int pt, char *mimetype, char *mimesubtype, enum ast_rtp_options options, unsigned int sample_rate)
 Set payload type to a known MIME media type for a codec with a specific sample rate.
void ast_rtp_codecs_payloads_unset (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 Remove payload information.
int ast_rtp_engine_register2 (struct ast_rtp_engine *engine, struct ast_module *module)
 Register an RTP engine.
int ast_rtp_engine_register_srtp (struct ast_srtp_res *srtp_res, struct ast_srtp_policy_res *policy_res)
int ast_rtp_engine_srtp_is_registered (void)
int ast_rtp_engine_unregister (struct ast_rtp_engine *engine)
 Unregister an RTP engine.
void ast_rtp_engine_unregister_srtp (void)
int ast_rtp_glue_register2 (struct ast_rtp_glue *glue, struct ast_module *module)
 Register RTP glue.
int ast_rtp_glue_unregister (struct ast_rtp_glue *glue)
 Unregister RTP glue.
int ast_rtp_instance_activate (struct ast_rtp_instance *instance)
 Indicate to the RTP engine that packets are now expected to be sent/received on the RTP instance.
int ast_rtp_instance_add_srtp_policy (struct ast_rtp_instance *instance, struct ast_srtp_policy *policy)
format_t ast_rtp_instance_available_formats (struct ast_rtp_instance *instance, format_t to_endpoint, format_t to_asterisk)
 Request the formats that can be transcoded.
enum ast_bridge_result ast_rtp_instance_bridge (struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
 Bridge two channels that use RTP instances.
void ast_rtp_instance_change_source (struct ast_rtp_instance *instance)
 Indicate a new source of audio has dropped in and the ssrc should change.
int ast_rtp_instance_destroy (struct ast_rtp_instance *instance)
 Destroy an RTP instance.
int ast_rtp_instance_dtmf_begin (struct ast_rtp_instance *instance, char digit)
 Begin sending a DTMF digit.
int ast_rtp_instance_dtmf_end (struct ast_rtp_instance *instance, char digit)
 Stop sending a DTMF digit.
int ast_rtp_instance_dtmf_end_with_duration (struct ast_rtp_instance *instance, char digit, unsigned int duration)
enum ast_rtp_dtmf_mode ast_rtp_instance_dtmf_mode_get (struct ast_rtp_instance *instance)
 Get the DTMF mode of an RTP instance.
int ast_rtp_instance_dtmf_mode_set (struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
 Set the DTMF mode that should be used.
int ast_rtp_instance_early_bridge (struct ast_channel *c0, struct ast_channel *c1)
 Early bridge two channels that use RTP instances.
void ast_rtp_instance_early_bridge_make_compatible (struct ast_channel *c0, struct ast_channel *c1)
 Make two channels compatible for early bridging.
int ast_rtp_instance_fd (struct ast_rtp_instance *instance, int rtcp)
 Get the file descriptor for an RTP session (or RTCP).
ast_rtp_glueast_rtp_instance_get_active_glue (struct ast_rtp_instance *instance)
 Get the RTP glue in use on an RTP instance.
int ast_rtp_instance_get_and_cmp_local_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the address of the local endpoint that we are sending RTP to, comparing its address to another.
int ast_rtp_instance_get_and_cmp_remote_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the address of the remote endpoint that we are sending RTP to, comparing its address to another.
ast_rtp_instanceast_rtp_instance_get_bridged (struct ast_rtp_instance *instance)
 Get the other RTP instance that an instance is bridged to.
ast_channelast_rtp_instance_get_chan (struct ast_rtp_instance *instance)
 Get the channel that is associated with an RTP instance while in a bridge.
ast_rtp_codecsast_rtp_instance_get_codecs (struct ast_rtp_instance *instance)
 Get the codecs structure of an RTP instance.
void * ast_rtp_instance_get_data (struct ast_rtp_instance *instance)
 Get the data portion of an RTP instance.
ast_rtp_engineast_rtp_instance_get_engine (struct ast_rtp_instance *instance)
 Get the RTP engine in use on an RTP instance.
void * ast_rtp_instance_get_extended_prop (struct ast_rtp_instance *instance, int property)
 Get the value of an RTP instance extended property.
ast_rtp_glueast_rtp_instance_get_glue (const char *type)
 Get the RTP glue that binds a channel to the RTP engine.
int ast_rtp_instance_get_hold_timeout (struct ast_rtp_instance *instance)
 Get the RTP timeout value for when an RTP instance is on hold.
void ast_rtp_instance_get_local_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the local address that we are expecting RTP on.
int ast_rtp_instance_get_prop (struct ast_rtp_instance *instance, enum ast_rtp_property property)
 Get the value of an RTP instance property.
char * ast_rtp_instance_get_quality (struct ast_rtp_instance *instance, enum ast_rtp_instance_stat_field field, char *buf, size_t size)
 Retrieve quality statistics about an RTP instance.
void ast_rtp_instance_get_remote_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the address of the remote endpoint that we are sending RTP to.
ast_srtpast_rtp_instance_get_srtp (struct ast_rtp_instance *instance)
int ast_rtp_instance_get_stats (struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
 Retrieve statistics about an RTP instance.
int ast_rtp_instance_get_timeout (struct ast_rtp_instance *instance)
 Get the RTP timeout value.
int ast_rtp_instance_make_compatible (struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_channel *peer)
 Request that the underlying RTP engine make two RTP instances compatible with eachother.
ast_rtp_instanceast_rtp_instance_new (const char *engine_name, struct sched_context *sched, const struct ast_sockaddr *sa, void *data)
 Create a new RTP instance.
ast_frameast_rtp_instance_read (struct ast_rtp_instance *instance, int rtcp)
 Receive a frame over RTP.
int ast_rtp_instance_set_alt_remote_address (struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
 Set the address of an an alternate RTP address to receive from.
void ast_rtp_instance_set_data (struct ast_rtp_instance *instance, void *data)
 Set the data portion of an RTP instance.
void ast_rtp_instance_set_extended_prop (struct ast_rtp_instance *instance, int property, void *value)
 Set the value of an RTP instance extended property.
void ast_rtp_instance_set_hold_timeout (struct ast_rtp_instance *instance, int timeout)
 Set the RTP timeout value for when the instance is on hold.
int ast_rtp_instance_set_local_address (struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
 Set the address that we are expecting to receive RTP on.
void ast_rtp_instance_set_prop (struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
 Set the value of an RTP instance property.
int ast_rtp_instance_set_qos (struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
 Set QoS parameters on an RTP session.
int ast_rtp_instance_set_read_format (struct ast_rtp_instance *instance, format_t format)
 Request that the underlying RTP engine provide audio frames in a specific format.
int ast_rtp_instance_set_remote_address (struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
 Set the address of the remote endpoint that we are sending RTP to.
void ast_rtp_instance_set_stats_vars (struct ast_channel *chan, struct ast_rtp_instance *instance)
 Set standard statistics from an RTP instance on a channel.
void ast_rtp_instance_set_timeout (struct ast_rtp_instance *instance, int timeout)
 Set the RTP timeout value.
int ast_rtp_instance_set_write_format (struct ast_rtp_instance *instance, format_t format)
 Tell underlying RTP engine that audio frames will be provided in a specific format.
void ast_rtp_instance_stop (struct ast_rtp_instance *instance)
 Stop an RTP instance.
void ast_rtp_instance_stun_request (struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username)
 Request that the underlying RTP engine send a STUN BIND request.
void ast_rtp_instance_update_source (struct ast_rtp_instance *instance)
 Indicate that the RTP marker bit should be set on an RTP stream.
int ast_rtp_instance_write (struct ast_rtp_instance *instance, struct ast_frame *frame)
 Send a frame out over RTP.
char * ast_rtp_lookup_mime_multiple2 (struct ast_str *buf, const format_t capability, const int asterisk_format, enum ast_rtp_options options)
 Convert formats into a string and put them into a buffer.
const char * ast_rtp_lookup_mime_subtype2 (const int asterisk_format, const format_t code, enum ast_rtp_options options)
 Retrieve mime subtype information on a payload.
unsigned int ast_rtp_lookup_sample_rate2 (int asterisk_format, format_t code)
 Get the sample rate associated with known RTP payload types.
int ast_rtp_red_buffer (struct ast_rtp_instance *instance, struct ast_frame *frame)
 Buffer a frame in an RTP instance for RED.
int ast_rtp_red_init (struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
 Initialize RED support on an RTP instance.


Detailed Description

Pluggable RTP Architecture.

Author:
Joshua Colp <jcolp@digium.com> Asterisk RTP Engine API

Definition in file rtp_engine.h.


Define Documentation

#define AST_RED_MAX_GENERATION   5

Definition at line 82 of file rtp_engine.h.

Referenced by process_sdp_a_text().

#define AST_RTP_CISCO_DTMF   (1 << 2)

DTMF (Cisco Proprietary)

Definition at line 222 of file rtp_engine.h.

Referenced by ast_rtp_read().

#define AST_RTP_CN   (1 << 1)

'Comfort Noise' (RFC3389)

Definition at line 220 of file rtp_engine.h.

Referenced by ast_rtp_read().

#define AST_RTP_DTMF   (1 << 0)

DTMF (RFC2833)

Definition at line 218 of file rtp_engine.h.

Referenced by add_noncodec_to_sdp(), ast_rtp_dtmf_begin(), ast_rtp_read(), check_peer_ok(), create_addr(), create_addr_from_peer(), oh323_alloc(), oh323_request(), process_sdp(), sip_alloc(), and sip_dtmfmode().

#define ast_rtp_engine_register ( engine   )     ast_rtp_engine_register2(engine, ast_module_info->self)

Definition at line 417 of file rtp_engine.h.

Referenced by load_module().

#define ast_rtp_glue_register ( glue   )     ast_rtp_glue_register2(glue, ast_module_info->self)

Definition at line 470 of file rtp_engine.h.

Referenced by load_module().

#define AST_RTP_MAX   AST_RTP_CISCO_DTMF

Maximum RTP-specific code

Definition at line 224 of file rtp_engine.h.

Referenced by add_sdp(), and ast_rtp_lookup_mime_multiple2().

#define AST_RTP_MAX_PT   256

Definition at line 79 of file rtp_engine.h.

Referenced by ast_rtp_codecs_payload_code(), ast_rtp_codecs_payload_formats(), ast_rtp_codecs_payload_lookup(), ast_rtp_codecs_payloads_clear(), ast_rtp_codecs_payloads_copy(), ast_rtp_codecs_payloads_default(), ast_rtp_codecs_payloads_set_m_type(), ast_rtp_codecs_payloads_set_rtpmap_type_rate(), ast_rtp_codecs_payloads_unset(), and process_sdp_a_audio().

#define AST_RTP_STAT_SET ( current_stat,
combined,
placement,
value   ) 

Definition at line 296 of file rtp_engine.h.

Referenced by ast_rtp_get_stat().

#define AST_RTP_STAT_TERMINATOR ( combined   ) 

Value:

if (stat == combined) { \
return 0; \
}

Definition at line 304 of file rtp_engine.h.

Referenced by ast_rtp_get_stat().


Enumeration Type Documentation

enum ast_rtp_dtmf_mode

RTP DTMF Modes

Enumerator:
AST_RTP_DTMF_MODE_NONE  No DTMF is being carried over the RTP stream
AST_RTP_DTMF_MODE_RFC2833  DTMF is being carried out of band using RFC2833
AST_RTP_DTMF_MODE_INBAND  DTMF is being carried inband over the RTP stream

Definition at line 115 of file rtp_engine.h.

00115                        {
00116    /*! No DTMF is being carried over the RTP stream */
00117    AST_RTP_DTMF_MODE_NONE = 0,
00118    /*! DTMF is being carried out of band using RFC2833 */
00119    AST_RTP_DTMF_MODE_RFC2833,
00120    /*! DTMF is being carried inband over the RTP stream */
00121    AST_RTP_DTMF_MODE_INBAND,
00122 };

enum ast_rtp_glue_result

Result codes when RTP glue is queried for information

Enumerator:
AST_RTP_GLUE_RESULT_FORBID  No remote or local bridging is permitted
AST_RTP_GLUE_RESULT_REMOTE  Move RTP stream to be remote between devices directly
AST_RTP_GLUE_RESULT_LOCAL  Perform RTP engine level bridging if possible

Definition at line 125 of file rtp_engine.h.

00125                          {
00126    /*! No remote or local bridging is permitted */
00127    AST_RTP_GLUE_RESULT_FORBID = 0,
00128    /*! Move RTP stream to be remote between devices directly */
00129    AST_RTP_GLUE_RESULT_REMOTE,
00130    /*! Perform RTP engine level bridging if possible */
00131    AST_RTP_GLUE_RESULT_LOCAL,
00132 };

enum ast_rtp_instance_stat

Statistics that can be retrieved from an RTP instance

Enumerator:
AST_RTP_INSTANCE_STAT_ALL  Retrieve all statistics
AST_RTP_INSTANCE_STAT_TXCOUNT  Retrieve number of packets transmitted
AST_RTP_INSTANCE_STAT_RXCOUNT  Retrieve number of packets received
AST_RTP_INSTANCE_STAT_COMBINED_LOSS  Retrieve ALL statistics relating to packet loss
AST_RTP_INSTANCE_STAT_TXPLOSS  Retrieve number of packets lost for transmitting
AST_RTP_INSTANCE_STAT_RXPLOSS  Retrieve number of packets lost for receiving
AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS  Retrieve maximum number of packets lost on remote side
AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS  Retrieve minimum number of packets lost on remote side
AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS  Retrieve average number of packets lost on remote side
AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS  Retrieve standard deviation of packets lost on remote side
AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS  Retrieve maximum number of packets lost on local side
AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS  Retrieve minimum number of packets lost on local side
AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS  Retrieve average number of packets lost on local side
AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS  Retrieve standard deviation of packets lost on local side
AST_RTP_INSTANCE_STAT_COMBINED_JITTER  Retrieve ALL statistics relating to jitter
AST_RTP_INSTANCE_STAT_TXJITTER  Retrieve jitter on transmitted packets
AST_RTP_INSTANCE_STAT_RXJITTER  Retrieve jitter on received packets
AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER  Retrieve maximum jitter on remote side
AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER  Retrieve minimum jitter on remote side
AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER  Retrieve average jitter on remote side
AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER  Retrieve standard deviation jitter on remote side
AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER  Retrieve maximum jitter on local side
AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER  Retrieve minimum jitter on local side
AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER  Retrieve average jitter on local side
AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER  Retrieve standard deviation jitter on local side
AST_RTP_INSTANCE_STAT_COMBINED_RTT  Retrieve ALL statistics relating to round trip time
AST_RTP_INSTANCE_STAT_RTT  Retrieve round trip time
AST_RTP_INSTANCE_STAT_MAX_RTT  Retrieve maximum round trip time
AST_RTP_INSTANCE_STAT_MIN_RTT  Retrieve minimum round trip time
AST_RTP_INSTANCE_STAT_NORMDEVRTT  Retrieve average round trip time
AST_RTP_INSTANCE_STAT_STDEVRTT  Retrieve standard deviation round trip time
AST_RTP_INSTANCE_STAT_LOCAL_SSRC  Retrieve local SSRC
AST_RTP_INSTANCE_STAT_REMOTE_SSRC  Retrieve remote SSRC

Definition at line 147 of file rtp_engine.h.

00147                            {
00148    /*! Retrieve all statistics */
00149    AST_RTP_INSTANCE_STAT_ALL = 0,
00150    /*! Retrieve number of packets transmitted */
00151    AST_RTP_INSTANCE_STAT_TXCOUNT,
00152    /*! Retrieve number of packets received */
00153    AST_RTP_INSTANCE_STAT_RXCOUNT,
00154    /*! Retrieve ALL statistics relating to packet loss */
00155    AST_RTP_INSTANCE_STAT_COMBINED_LOSS,
00156    /*! Retrieve number of packets lost for transmitting */
00157    AST_RTP_INSTANCE_STAT_TXPLOSS,
00158    /*! Retrieve number of packets lost for receiving */
00159    AST_RTP_INSTANCE_STAT_RXPLOSS,
00160    /*! Retrieve maximum number of packets lost on remote side */
00161    AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS,
00162    /*! Retrieve minimum number of packets lost on remote side */
00163    AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS,
00164    /*! Retrieve average number of packets lost on remote side */
00165    AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS,
00166    /*! Retrieve standard deviation of packets lost on remote side */
00167    AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS,
00168    /*! Retrieve maximum number of packets lost on local side */
00169    AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS,
00170    /*! Retrieve minimum number of packets lost on local side */
00171    AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS,
00172    /*! Retrieve average number of packets lost on local side */
00173    AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS,
00174    /*! Retrieve standard deviation of packets lost on local side */
00175    AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS,
00176    /*! Retrieve ALL statistics relating to jitter */
00177    AST_RTP_INSTANCE_STAT_COMBINED_JITTER,
00178    /*! Retrieve jitter on transmitted packets */
00179    AST_RTP_INSTANCE_STAT_TXJITTER,
00180    /*! Retrieve jitter on received packets */
00181    AST_RTP_INSTANCE_STAT_RXJITTER,
00182    /*! Retrieve maximum jitter on remote side */
00183    AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER,
00184    /*! Retrieve minimum jitter on remote side */
00185    AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER,
00186    /*! Retrieve average jitter on remote side */
00187    AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER,
00188    /*! Retrieve standard deviation jitter on remote side */
00189    AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER,
00190    /*! Retrieve maximum jitter on local side */
00191    AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER,
00192    /*! Retrieve minimum jitter on local side */
00193    AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER,
00194    /*! Retrieve average jitter on local side */
00195    AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER,
00196    /*! Retrieve standard deviation jitter on local side */
00197    AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER,
00198    /*! Retrieve ALL statistics relating to round trip time */
00199    AST_RTP_INSTANCE_STAT_COMBINED_RTT,
00200    /*! Retrieve round trip time */
00201    AST_RTP_INSTANCE_STAT_RTT,
00202    /*! Retrieve maximum round trip time */
00203    AST_RTP_INSTANCE_STAT_MAX_RTT,
00204    /*! Retrieve minimum round trip time */
00205    AST_RTP_INSTANCE_STAT_MIN_RTT,
00206    /*! Retrieve average round trip time */
00207    AST_RTP_INSTANCE_STAT_NORMDEVRTT,
00208    /*! Retrieve standard deviation round trip time */
00209    AST_RTP_INSTANCE_STAT_STDEVRTT,
00210    /*! Retrieve local SSRC */
00211    AST_RTP_INSTANCE_STAT_LOCAL_SSRC,
00212    /*! Retrieve remote SSRC */
00213    AST_RTP_INSTANCE_STAT_REMOTE_SSRC,
00214 };

enum ast_rtp_instance_stat_field

Field statistics that can be retrieved from an RTP instance

Enumerator:
AST_RTP_INSTANCE_STAT_FIELD_QUALITY  Retrieve quality information
AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER  Retrieve quality information about jitter
AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS  Retrieve quality information about packet loss
AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT  Retrieve quality information about round trip time

Definition at line 135 of file rtp_engine.h.

00135                                  {
00136    /*! Retrieve quality information */
00137    AST_RTP_INSTANCE_STAT_FIELD_QUALITY = 0,
00138    /*! Retrieve quality information about jitter */
00139    AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER,
00140    /*! Retrieve quality information about packet loss */
00141    AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS,
00142    /*! Retrieve quality information about round trip time */
00143    AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT,
00144 };

enum ast_rtp_options

Additional RTP options

Enumerator:
AST_RTP_OPT_G726_NONSTANDARD  Remote side is using non-standard G.726

Definition at line 109 of file rtp_engine.h.

00109                      {
00110    /*! Remote side is using non-standard G.726 */
00111    AST_RTP_OPT_G726_NONSTANDARD = (1 << 0),
00112 };

enum ast_rtp_property

RTP Properties that can be set on an RTP instance

Enumerator:
AST_RTP_PROPERTY_NAT  Enable symmetric RTP support
AST_RTP_PROPERTY_DTMF  RTP instance will be carrying DTMF (using RFC2833)
AST_RTP_PROPERTY_DTMF_COMPENSATE  Expect unreliable DTMF from remote party
AST_RTP_PROPERTY_STUN  Enable STUN support
AST_RTP_PROPERTY_RTCP  Enable RTCP support
AST_RTP_PROPERTY_MAX  Maximum number of RTP properties supported.

Note:
THIS MUST BE THE LAST ENTRY IN THIS ENUM.

Definition at line 88 of file rtp_engine.h.

00088                       {
00089    /*! Enable symmetric RTP support */
00090    AST_RTP_PROPERTY_NAT = 0,
00091    /*! RTP instance will be carrying DTMF (using RFC2833) */
00092    AST_RTP_PROPERTY_DTMF,
00093    /*! Expect unreliable DTMF from remote party */
00094    AST_RTP_PROPERTY_DTMF_COMPENSATE,
00095    /*! Enable STUN support */
00096    AST_RTP_PROPERTY_STUN,
00097    /*! Enable RTCP support */
00098    AST_RTP_PROPERTY_RTCP,
00099 
00100    /*!
00101     * \brief Maximum number of RTP properties supported
00102     *
00103     * \note THIS MUST BE THE LAST ENTRY IN THIS ENUM.
00104     */
00105    AST_RTP_PROPERTY_MAX,
00106 };


Function Documentation

void ast_rtp_codecs_packetization_set ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance,
struct ast_codec_pref prefs 
)

Set codec packetization preferences.

Parameters:
codecs Codecs structure to muck with
instance Optionally the instance that the codecs structure belongs to
prefs Codec packetization preferences
Example usage:

This sets the packetization preferences pointed to by prefs on the codecs structure pointed to by codecs.

Since:
1.8

Definition at line 721 of file rtp_engine.c.

References ast_rtp_instance::codecs, ast_rtp_instance::engine, ast_rtp_engine::packetization_set, ast_rtp_codecs::pref, and prefs.

Referenced by __oh323_rtp_create(), check_peer_ok(), create_addr_from_peer(), gtalk_new(), jingle_new(), process_sdp_a_audio(), set_peer_capabilities(), start_rtp(), and transmit_response_with_sdp().

00722 {
00723    codecs->pref = *prefs;
00724 
00725    if (instance && instance->engine->packetization_set) {
00726       instance->engine->packetization_set(instance, &instance->codecs.pref);
00727    }
00728 }

int ast_rtp_codecs_payload_code ( struct ast_rtp_codecs codecs,
const int  asterisk_format,
const format_t  code 
)

Retrieve a payload based on whether it is an Asterisk format and the code.

Parameters:
codecs Codecs structure to look in
asterisk_format Non-zero if the given code is an Asterisk format value
code The format to look for
Return values:
Numerical payload
Example usage:

 int payload = ast_rtp_codecs_payload_code(&codecs, 1, AST_FORMAT_ULAW);

This looks for the numerical payload for ULAW in the codecs structure.

Since:
1.8

Definition at line 648 of file rtp_engine.c.

References AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, and ast_rtp_codecs::payloads.

Referenced by add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), ast_rtp_dtmf_begin(), ast_rtp_write(), bridge_p2p_rtp_write(), multicast_rtp_write(), and start_rtp().

00649 {
00650    int i;
00651 
00652    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00653       if (codecs->payloads[i].asterisk_format == asterisk_format && codecs->payloads[i].code == code) {
00654          return i;
00655       }
00656    }
00657 
00658    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00659       if (static_RTP_PT[i].asterisk_format == asterisk_format && static_RTP_PT[i].code == code) {
00660          return i;
00661       }
00662    }
00663 
00664    return -1;
00665 }

void ast_rtp_codecs_payload_formats ( struct ast_rtp_codecs codecs,
format_t astformats,
int *  nonastformats 
)

Retrieve all formats that were found.

Parameters:
codecs Codecs structure to look in
astformats An integer to put the Asterisk formats in
nonastformats An integer to put the non-Asterisk formats in
Example usage:

 int astformats, nonastformats;
 ast_rtp_codecs_payload_Formats(&codecs, &astformats, &nonastformats);

This retrieves all the formats known about in the codecs structure and puts the Asterisk ones in the integer pointed to by astformats and the non-Asterisk ones in the integer pointed to by nonastformats.

Since:
1.8

Definition at line 630 of file rtp_engine.c.

References ast_debug, AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, and ast_rtp_codecs::payloads.

Referenced by gtalk_is_answered(), gtalk_newcall(), and process_sdp().

00631 {
00632    int i;
00633 
00634    *astformats = *nonastformats = 0;
00635 
00636    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00637       if (codecs->payloads[i].code) {
00638          ast_debug(1, "Incorporating payload %d on %p\n", i, codecs);
00639       }
00640       if (codecs->payloads[i].asterisk_format) {
00641          *astformats |= codecs->payloads[i].code;
00642       } else {
00643          *nonastformats |= codecs->payloads[i].code;
00644       }
00645    }
00646 }

struct ast_rtp_payload_type ast_rtp_codecs_payload_lookup ( struct ast_rtp_codecs codecs,
int  payload 
)

Retrieve payload information by payload.

Parameters:
codecs Codecs structure to look in
payload Numerical payload to look up
Return values:
Payload information
Example usage:

 struct ast_rtp_payload_type payload_type;
 payload_type = ast_rtp_codecs_payload_lookup(&codecs, 0);

This looks up the information for payload '0' from the codecs structure.

Since:
1.8

Definition at line 612 of file rtp_engine.c.

References AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, and static_RTP_PT.

Referenced by ast_rtp_read(), bridge_p2p_rtp_write(), process_sdp_a_audio(), and setup_rtp_connection().

00613 {
00614    struct ast_rtp_payload_type result = { .asterisk_format = 0, };
00615 
00616    if (payload < 0 || payload >= AST_RTP_MAX_PT) {
00617       return result;
00618    }
00619 
00620    result.asterisk_format = codecs->payloads[payload].asterisk_format;
00621    result.code = codecs->payloads[payload].code;
00622 
00623    if (!result.code) {
00624       result = static_RTP_PT[payload];
00625    }
00626 
00627    return result;
00628 }

void ast_rtp_codecs_payloads_clear ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance 
)

Clear payload information from an RTP instance.

Parameters:
codecs The codecs structure that payloads will be cleared from
instance Optionally the instance that the codecs structure belongs to
Example usage:

 struct ast_rtp_codecs codecs;
 ast_rtp_codecs_payloads_clear(&codecs, NULL);

This clears the codecs structure and puts it into a pristine state.

Since:
1.8

Definition at line 482 of file rtp_engine.c.

References AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, and ast_rtp_codecs::payloads.

Referenced by gtalk_alloc(), and process_sdp().

00483 {
00484    int i;
00485 
00486    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00487       codecs->payloads[i].asterisk_format = 0;
00488       codecs->payloads[i].code = 0;
00489       if (instance && instance->engine && instance->engine->payload_set) {
00490          instance->engine->payload_set(instance, i, 0, 0);
00491       }
00492    }
00493 }

void ast_rtp_codecs_payloads_copy ( struct ast_rtp_codecs src,
struct ast_rtp_codecs dest,
struct ast_rtp_instance instance 
)

Copy payload information from one RTP instance to another.

Parameters:
src The source codecs structure
dest The destination codecs structure that the values from src will be copied to
instance Optionally the instance that the dst codecs structure belongs to
Example usage:

 ast_rtp_codecs_payloads_copy(&codecs0, &codecs1, NULL);

This copies the payloads from the codecs0 structure to the codecs1 structure, overwriting any current values.

Since:
1.8

Definition at line 510 of file rtp_engine.c.

References ast_debug, AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, and ast_rtp_codecs::payloads.

Referenced by ast_rtp_instance_early_bridge_make_compatible(), and process_sdp().

00511 {
00512    int i;
00513 
00514    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00515       if (src->payloads[i].code) {
00516          ast_debug(2, "Copying payload %d from %p to %p\n", i, src, dest);
00517          dest->payloads[i].asterisk_format = src->payloads[i].asterisk_format;
00518          dest->payloads[i].code = src->payloads[i].code;
00519          if (instance && instance->engine && instance->engine->payload_set) {
00520             instance->engine->payload_set(instance, i, dest->payloads[i].asterisk_format, dest->payloads[i].code);
00521          }
00522       }
00523    }
00524 }

void ast_rtp_codecs_payloads_default ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance 
)

Set payload information on an RTP instance to the default.

Parameters:
codecs The codecs structure to set defaults on
instance Optionally the instance that the codecs structure belongs to
Example usage:

 struct ast_rtp_codecs codecs;
 ast_rtp_codecs_payloads_default(&codecs, NULL);

This sets the default payloads on the codecs structure.

Since:
1.8

Definition at line 495 of file rtp_engine.c.

References AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, ast_rtp_codecs::payloads, and static_RTP_PT.

00496 {
00497    int i;
00498 
00499    for (i = 0; i < AST_RTP_MAX_PT; i++) {
00500       if (static_RTP_PT[i].code) {
00501          codecs->payloads[i].asterisk_format = static_RTP_PT[i].asterisk_format;
00502          codecs->payloads[i].code = static_RTP_PT[i].code;
00503          if (instance && instance->engine && instance->engine->payload_set) {
00504             instance->engine->payload_set(instance, i, codecs->payloads[i].asterisk_format, codecs->payloads[i].code);
00505          }
00506       }
00507    }
00508 }

void ast_rtp_codecs_payloads_set_m_type ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance,
int  payload 
)

Record payload information that was seen in an m= SDP line.

Parameters:
codecs The codecs structure to muck with
instance Optionally the instance that the codecs structure belongs to
payload Numerical payload that was seen in the m= SDP line
Example usage:

This records that the numerical payload '0' was seen in the codecs structure.

Since:
1.8

Definition at line 526 of file rtp_engine.c.

References ast_debug, AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, ast_rtp_codecs::payloads, and static_RTP_PT.

Referenced by gtalk_is_answered(), gtalk_newcall(), jingle_newcall(), and process_sdp().

00527 {
00528    if (payload < 0 || payload >= AST_RTP_MAX_PT || !static_RTP_PT[payload].code) {
00529       return;
00530    }
00531 
00532    codecs->payloads[payload].asterisk_format = static_RTP_PT[payload].asterisk_format;
00533    codecs->payloads[payload].code = static_RTP_PT[payload].code;
00534 
00535    ast_debug(1, "Setting payload %d based on m type on %p\n", payload, codecs);
00536 
00537    if (instance && instance->engine && instance->engine->payload_set) {
00538       instance->engine->payload_set(instance, payload, codecs->payloads[payload].asterisk_format, codecs->payloads[payload].code);
00539    }
00540 }

int ast_rtp_codecs_payloads_set_rtpmap_type ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance,
int  payload,
char *  mimetype,
char *  mimesubtype,
enum ast_rtp_options  options 
)

Record payload information that was seen in an a=rtpmap: SDP line.

Parameters:
codecs The codecs structure to muck with
instance Optionally the instance that the codecs structure belongs to
payload Numerical payload that was seen in the a=rtpmap: SDP line
mimetype The string mime type that was seen
mimesubtype The strin mime sub type that was seen
options Optional options that may change the behavior of this specific payload
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_codecs_payloads_set_rtpmap_type(&codecs, NULL, 0, "audio", "PCMU", 0);

This records that the numerical payload '0' was seen with mime type 'audio' and sub mime type 'PCMU' in the codecs structure.

Since:
1.8

Definition at line 591 of file rtp_engine.c.

References ast_rtp_codecs_payloads_set_rtpmap_type_rate().

Referenced by __oh323_rtp_create(), gtalk_is_answered(), gtalk_newcall(), jingle_newcall(), process_sdp(), set_dtmf_payload(), and setup_rtp_connection().

00592 {
00593    return ast_rtp_codecs_payloads_set_rtpmap_type_rate(codecs, instance, payload, mimetype, mimesubtype, options, 0);
00594 }

int ast_rtp_codecs_payloads_set_rtpmap_type_rate ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance,
int  pt,
char *  mimetype,
char *  mimesubtype,
enum ast_rtp_options  options,
unsigned int  sample_rate 
)

Set payload type to a known MIME media type for a codec with a specific sample rate.

Parameters:
codecs RTP structure to modify
instance Optionally the instance that the codecs structure belongs to
pt Payload type entry to modify
mimetype top-level MIME type of media stream (typically "audio", "video", "text", etc.)
mimesubtype MIME subtype of media stream (typically a codec name)
options Zero or more flags from the ast_rtp_options enum
sample_rate The sample rate of the media stream
This function 'fills in' an entry in the list of possible formats for a media stream associated with an RTP structure.

Return values:
0 on success
-1 if the payload type is out of range
-2 if the mimeType/mimeSubtype combination was not found
Since:
1.8

Definition at line 542 of file rtp_engine.c.

References ARRAY_LEN, AST_FORMAT_G726, AST_FORMAT_G726_AAL2, AST_RTP_MAX_PT, ast_rtp_mime_types, AST_RTP_OPT_G726_NONSTANDARD, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, and ast_rtp_codecs::payloads.

Referenced by ast_rtp_codecs_payloads_set_rtpmap_type(), process_sdp_a_audio(), process_sdp_a_text(), and process_sdp_a_video().

00546 {
00547    unsigned int i;
00548    int found = 0;
00549 
00550    if (pt < 0 || pt >= AST_RTP_MAX_PT)
00551       return -1; /* bogus payload type */
00552 
00553    for (i = 0; i < ARRAY_LEN(ast_rtp_mime_types); ++i) {
00554       const struct ast_rtp_mime_type *t = &ast_rtp_mime_types[i];
00555 
00556       if (strcasecmp(mimesubtype, t->subtype)) {
00557          continue;
00558       }
00559 
00560       if (strcasecmp(mimetype, t->type)) {
00561          continue;
00562       }
00563 
00564       /* if both sample rates have been supplied, and they don't match,
00565                             then this not a match; if one has not been supplied, then the
00566                   rates are not compared */
00567       if (sample_rate && t->sample_rate &&
00568           (sample_rate != t->sample_rate)) {
00569          continue;
00570       }
00571 
00572       found = 1;
00573       codecs->payloads[pt] = t->payload_type;
00574 
00575       if ((t->payload_type.code == AST_FORMAT_G726) &&
00576                               t->payload_type.asterisk_format &&
00577           (options & AST_RTP_OPT_G726_NONSTANDARD)) {
00578          codecs->payloads[pt].code = AST_FORMAT_G726_AAL2;
00579       }
00580 
00581       if (instance && instance->engine && instance->engine->payload_set) {
00582          instance->engine->payload_set(instance, pt, codecs->payloads[i].asterisk_format, codecs->payloads[i].code);
00583       }
00584 
00585       break;
00586    }
00587 
00588    return (found ? 0 : -2);
00589 }

void ast_rtp_codecs_payloads_unset ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance,
int  payload 
)

Remove payload information.

Parameters:
codecs The codecs structure to muck with
instance Optionally the instance that the codecs structure belongs to
payload Numerical payload to unset
Example usage:

 ast_rtp_codecs_payloads_unset(&codecs, NULL, 0);

This clears the payload '0' from the codecs structure. It will be as if it was never set.

Since:
1.8

Definition at line 596 of file rtp_engine.c.

References ast_debug, AST_RTP_MAX_PT, ast_rtp_payload_type::asterisk_format, ast_rtp_payload_type::code, ast_rtp_instance::engine, ast_rtp_engine::payload_set, and ast_rtp_codecs::payloads.

Referenced by process_sdp_a_audio(), and process_sdp_a_video().

00597 {
00598    if (payload < 0 || payload >= AST_RTP_MAX_PT) {
00599       return;
00600    }
00601 
00602    ast_debug(2, "Unsetting payload %d on %p\n", payload, codecs);
00603 
00604    codecs->payloads[payload].asterisk_format = 0;
00605    codecs->payloads[payload].code = 0;
00606 
00607    if (instance && instance->engine && instance->engine->payload_set) {
00608       instance->engine->payload_set(instance, payload, 0, 0);
00609    }
00610 }

int ast_rtp_engine_register2 ( struct ast_rtp_engine engine,
struct ast_module module 
)

Register an RTP engine.

Parameters:
engine Structure of the RTP engine to register
module Module that the RTP engine is part of
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_engine_register2(&example_rtp_engine, NULL);

This registers the RTP engine declared as example_rtp_engine with the RTP engine core, but does not associate a module with it.

Note:
It is recommended that you use the ast_rtp_engine_register macro so that the module is associated with the RTP engine and use counting is performed.
Since:
1.8

Definition at line 182 of file rtp_engine.c.

References ast_log(), AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero(), ast_verb, ast_rtp_engine::destroy, ast_rtp_engine::entry, LOG_WARNING, ast_rtp_engine::mod, ast_rtp_engine::name, ast_rtp_engine::new, ast_rtp_engine::read, and ast_rtp_engine::write.

00183 {
00184    struct ast_rtp_engine *current_engine;
00185 
00186    /* Perform a sanity check on the engine structure to make sure it has the basics */
00187    if (ast_strlen_zero(engine->name) || !engine->new || !engine->destroy || !engine->write || !engine->read) {
00188       ast_log(LOG_WARNING, "RTP Engine '%s' failed sanity check so it was not registered.\n", !ast_strlen_zero(engine->name) ? engine->name : "Unknown");
00189       return -1;
00190    }
00191 
00192    /* Link owner module to the RTP engine for reference counting purposes */
00193    engine->mod = module;
00194 
00195    AST_RWLIST_WRLOCK(&engines);
00196 
00197    /* Ensure that no two modules with the same name are registered at the same time */
00198    AST_RWLIST_TRAVERSE(&engines, current_engine, entry) {
00199       if (!strcmp(current_engine->name, engine->name)) {
00200          ast_log(LOG_WARNING, "An RTP engine with the name '%s' has already been registered.\n", engine->name);
00201          AST_RWLIST_UNLOCK(&engines);
00202          return -1;
00203       }
00204    }
00205 
00206    /* The engine survived our critique. Off to the list it goes to be used */
00207    AST_RWLIST_INSERT_TAIL(&engines, engine, entry);
00208 
00209    AST_RWLIST_UNLOCK(&engines);
00210 
00211    ast_verb(2, "Registered RTP engine '%s'\n", engine->name);
00212 
00213    return 0;
00214 }

int ast_rtp_engine_register_srtp ( struct ast_srtp_res srtp_res,
struct ast_srtp_policy_res policy_res 
)

Definition at line 1732 of file rtp_engine.c.

References policy_res, res_srtp, res_srtp_policy, and srtp_res.

Referenced by res_srtp_init().

01733 {
01734    if (res_srtp || res_srtp_policy) {
01735       return -1;
01736    }
01737    if (!srtp_res || !policy_res) {
01738       return -1;
01739    }
01740 
01741    res_srtp = srtp_res;
01742    res_srtp_policy = policy_res;
01743 
01744    return 0;
01745 }

int ast_rtp_engine_srtp_is_registered ( void   ) 

Definition at line 1753 of file rtp_engine.c.

References res_srtp, and res_srtp_policy.

Referenced by setup_srtp().

01754 {
01755    return res_srtp && res_srtp_policy;
01756 }

int ast_rtp_engine_unregister ( struct ast_rtp_engine engine  ) 

Unregister an RTP engine.

Parameters:
engine Structure of the RTP engine to unregister
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_engine_unregister(&example_rtp_engine);

This unregisters the RTP engine declared as example_rtp_engine from the RTP engine core. If a module reference was provided when it was registered then this will only be called once the RTP engine is no longer in use.

Since:
1.8

Definition at line 216 of file rtp_engine.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, ast_rtp_engine::entry, and ast_rtp_engine::name.

Referenced by load_module(), and unload_module().

00217 {
00218    struct ast_rtp_engine *current_engine = NULL;
00219 
00220    AST_RWLIST_WRLOCK(&engines);
00221 
00222    if ((current_engine = AST_RWLIST_REMOVE(&engines, engine, entry))) {
00223       ast_verb(2, "Unregistered RTP engine '%s'\n", engine->name);
00224    }
00225 
00226    AST_RWLIST_UNLOCK(&engines);
00227 
00228    return current_engine ? 0 : -1;
00229 }

void ast_rtp_engine_unregister_srtp ( void   ) 

Definition at line 1747 of file rtp_engine.c.

References res_srtp, and res_srtp_policy.

Referenced by unload_module().

01748 {
01749    res_srtp = NULL;
01750    res_srtp_policy = NULL;
01751 }

int ast_rtp_glue_register2 ( struct ast_rtp_glue glue,
struct ast_module module 
)

Register RTP glue.

Parameters:
glue The glue to register
module Module that the RTP glue is part of
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_glue_register2(&example_rtp_glue, NULL);

This registers the RTP glue declared as example_rtp_glue with the RTP engine core, but does not associate a module with it.

Note:
It is recommended that you use the ast_rtp_glue_register macro so that the module is associated with the RTP glue and use counting is performed.
Since:
1.8

Definition at line 231 of file rtp_engine.c.

References ast_log(), AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero(), ast_verb, ast_rtp_glue::entry, LOG_WARNING, ast_rtp_glue::mod, and ast_rtp_glue::type.

00232 {
00233    struct ast_rtp_glue *current_glue = NULL;
00234 
00235    if (ast_strlen_zero(glue->type)) {
00236       return -1;
00237    }
00238 
00239    glue->mod = module;
00240 
00241    AST_RWLIST_WRLOCK(&glues);
00242 
00243    AST_RWLIST_TRAVERSE(&glues, current_glue, entry) {
00244       if (!strcasecmp(current_glue->type, glue->type)) {
00245          ast_log(LOG_WARNING, "RTP glue with the name '%s' has already been registered.\n", glue->type);
00246          AST_RWLIST_UNLOCK(&glues);
00247          return -1;
00248       }
00249    }
00250 
00251    AST_RWLIST_INSERT_TAIL(&glues, glue, entry);
00252 
00253    AST_RWLIST_UNLOCK(&glues);
00254 
00255    ast_verb(2, "Registered RTP glue '%s'\n", glue->type);
00256 
00257    return 0;
00258 }

int ast_rtp_glue_unregister ( struct ast_rtp_glue glue  ) 

Unregister RTP glue.

Parameters:
glue The glue to unregister
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_glue_unregister(&example_rtp_glue);

This unregisters the RTP glue declared as example_rtp_gkue from the RTP engine core. If a module reference was provided when it was registered then this will only be called once the RTP engine is no longer in use.

Since:
1.8

Definition at line 260 of file rtp_engine.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, ast_rtp_glue::entry, and ast_rtp_glue::type.

Referenced by load_module(), and unload_module().

00261 {
00262    struct ast_rtp_glue *current_glue = NULL;
00263 
00264    AST_RWLIST_WRLOCK(&glues);
00265 
00266    if ((current_glue = AST_RWLIST_REMOVE(&glues, glue, entry))) {
00267       ast_verb(2, "Unregistered RTP glue '%s'\n", glue->type);
00268    }
00269 
00270    AST_RWLIST_UNLOCK(&glues);
00271 
00272    return current_glue ? 0 : -1;
00273 }

int ast_rtp_instance_activate ( struct ast_rtp_instance instance  ) 

Indicate to the RTP engine that packets are now expected to be sent/received on the RTP instance.

Parameters:
instance The RTP instance
Return values:
0 success
-1 failure
Example usage:

This tells the underlying RTP engine of instance that packets will now flow.

Since:
1.8

Definition at line 1683 of file rtp_engine.c.

References ast_rtp_engine::activate, and ast_rtp_instance::engine.

Referenced by handle_response_invite(), multicast_rtp_call(), and transmit_response_with_sdp().

01684 {
01685    return instance->engine->activate ? instance->engine->activate(instance) : 0;
01686 }

int ast_rtp_instance_add_srtp_policy ( struct ast_rtp_instance instance,
struct ast_srtp_policy policy 
)

Definition at line 1758 of file rtp_engine.c.

References ast_srtp_res::add_stream, ast_srtp_res::create, res_srtp, and ast_rtp_instance::srtp.

01759 {
01760    if (!res_srtp) {
01761       return -1;
01762    }
01763 
01764    if (!instance->srtp) {
01765       return res_srtp->create(&instance->srtp, instance, policy);
01766    } else {
01767       return res_srtp->add_stream(instance->srtp, policy);
01768    }
01769 }

format_t ast_rtp_instance_available_formats ( struct ast_rtp_instance instance,
format_t  to_endpoint,
format_t  to_asterisk 
)

Request the formats that can be transcoded.

Parameters:
instance The RTP instance
to_endpoint Formats being sent/received towards the endpoint
to_asterisk Formats being sent/received towards Asterisk
Return values:
supported formats
Example usage:

This sees if it is possible to have ulaw communicated to the endpoint but signed linear received into Asterisk.

Since:
1.8

Definition at line 1672 of file rtp_engine.c.

References ast_translate_available_formats(), ast_rtp_engine::available_formats, and ast_rtp_instance::engine.

Referenced by sip_call().

01673 {
01674    format_t formats;
01675 
01676    if (instance->engine->available_formats && (formats = instance->engine->available_formats(instance, to_endpoint, to_asterisk))) {
01677       return formats;
01678    }
01679 
01680    return ast_translate_available_formats(to_endpoint, to_asterisk);
01681 }

enum ast_bridge_result ast_rtp_instance_bridge ( struct ast_channel c0,
struct ast_channel c1,
int  flags,
struct ast_frame **  fo,
struct ast_channel **  rc,
int  timeoutms 
)

Bridge two channels that use RTP instances.

Parameters:
c0 First channel part of the bridge
c1 Second channel part of the bridge
flags Bridging flags
fo If a frame needs to be passed up it is stored here
rc Channel that passed the above frame up
timeoutms How long the channels should be bridged for
Return values:
Bridge result
Note:
This should only be used by channel drivers in their technology declaration.
Since:
1.8

Definition at line 1231 of file rtp_engine.c.

References AST_BRIDGE_FAILED, AST_BRIDGE_FAILED_NOWARN, ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_check_hangup(), ast_debug, ast_getformatname(), ast_log(), AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_LOCAL, AST_RTP_GLUE_RESULT_REMOTE, ast_rtp_instance_get_glue(), ast_rtp_instance_get_remote_address(), AST_RTP_PROPERTY_DTMF, ast_sockaddr_is_ipv4_mapped(), ast_verbose, ast_rtp_instance::chan, ast_rtp_engine::dtmf_compatible, ast_rtp_instance::engine, ast_rtp_glue::get_codec, ast_rtp_glue::get_rtp_info, ast_rtp_glue::get_trtp_info, ast_rtp_glue::get_vrtp_info, ast_rtp_instance::glue, ast_rtp_engine::local_bridge, local_bridge_loop(), LOG_WARNING, ast_channel::name, ast_rtp_instance::properties, remote_bridge_loop(), ast_sockaddr::ss, ast_channel::tech, ast_channel::tech_pvt, ast_channel_tech::type, unref_instance_cond(), and VERBOSE_PREFIX_3.

01232 {
01233    struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL,
01234          *vinstance0 = NULL, *vinstance1 = NULL,
01235          *tinstance0 = NULL, *tinstance1 = NULL;
01236    struct ast_rtp_glue *glue0, *glue1;
01237    struct ast_sockaddr addr1, addr2;
01238    enum ast_rtp_glue_result audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID, video_glue0_res = AST_RTP_GLUE_RESULT_FORBID, text_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01239    enum ast_rtp_glue_result audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID, video_glue1_res = AST_RTP_GLUE_RESULT_FORBID, text_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01240    enum ast_bridge_result res = AST_BRIDGE_FAILED;
01241    format_t codec0 = 0, codec1 = 0;
01242    int unlock_chans = 1;
01243 
01244    /* Lock both channels so we can look for the glue that binds them together */
01245    ast_channel_lock(c0);
01246    while (ast_channel_trylock(c1)) {
01247       ast_channel_unlock(c0);
01248       usleep(1);
01249       ast_channel_lock(c0);
01250    }
01251 
01252    /* Ensure neither channel got hungup during lock avoidance */
01253    if (ast_check_hangup(c0) || ast_check_hangup(c1)) {
01254       ast_log(LOG_WARNING, "Got hangup while attempting to bridge '%s' and '%s'\n", c0->name, c1->name);
01255       goto done;
01256    }
01257 
01258    /* Grab glue that binds each channel to something using the RTP engine */
01259    if (!(glue0 = ast_rtp_instance_get_glue(c0->tech->type)) || !(glue1 = ast_rtp_instance_get_glue(c1->tech->type))) {
01260       ast_debug(1, "Can't find native functions for channel '%s'\n", glue0 ? c1->name : c0->name);
01261       goto done;
01262    }
01263 
01264    audio_glue0_res = glue0->get_rtp_info(c0, &instance0);
01265    video_glue0_res = glue0->get_vrtp_info ? glue0->get_vrtp_info(c0, &vinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01266    text_glue0_res = glue0->get_trtp_info ? glue0->get_trtp_info(c0, &tinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01267 
01268    audio_glue1_res = glue1->get_rtp_info(c1, &instance1);
01269    video_glue1_res = glue1->get_vrtp_info ? glue1->get_vrtp_info(c1, &vinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01270    text_glue1_res = glue1->get_trtp_info ? glue1->get_trtp_info(c1, &tinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01271 
01272    /* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
01273    if (video_glue0_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue0_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01274       audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01275    }
01276    if (video_glue1_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue1_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01277       audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01278    }
01279 
01280    /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
01281    if (audio_glue0_res == AST_RTP_GLUE_RESULT_FORBID || audio_glue1_res == AST_RTP_GLUE_RESULT_FORBID) {
01282       res = AST_BRIDGE_FAILED_NOWARN;
01283       goto done;
01284    }
01285 
01286 
01287    /* If address families differ, force a local bridge */
01288    ast_rtp_instance_get_remote_address(instance0, &addr1);
01289    ast_rtp_instance_get_remote_address(instance1, &addr2);
01290 
01291    if (addr1.ss.ss_family != addr2.ss.ss_family ||
01292       (ast_sockaddr_is_ipv4_mapped(&addr1) != ast_sockaddr_is_ipv4_mapped(&addr2))) {
01293       audio_glue0_res = AST_RTP_GLUE_RESULT_LOCAL;
01294       audio_glue1_res = AST_RTP_GLUE_RESULT_LOCAL;
01295    }
01296 
01297    /* If we need to get DTMF see if we can do it outside of the RTP stream itself */
01298    if ((flags & AST_BRIDGE_DTMF_CHANNEL_0) && instance0->properties[AST_RTP_PROPERTY_DTMF]) {
01299       res = AST_BRIDGE_FAILED_NOWARN;
01300       goto done;
01301    }
01302    if ((flags & AST_BRIDGE_DTMF_CHANNEL_1) && instance1->properties[AST_RTP_PROPERTY_DTMF]) {
01303       res = AST_BRIDGE_FAILED_NOWARN;
01304       goto done;
01305    }
01306 
01307    /* If we have gotten to a local bridge make sure that both sides have the same local bridge callback and that they are DTMF compatible */
01308    if ((audio_glue0_res == AST_RTP_GLUE_RESULT_LOCAL || audio_glue1_res == AST_RTP_GLUE_RESULT_LOCAL) && ((instance0->engine->local_bridge != instance1->engine->local_bridge) || (instance0->engine->dtmf_compatible && !instance0->engine->dtmf_compatible(c0, instance0, c1, instance1)))) {
01309       res = AST_BRIDGE_FAILED_NOWARN;
01310       goto done;
01311    }
01312 
01313    /* Make sure that codecs match */
01314    codec0 = glue0->get_codec ? glue0->get_codec(c0) : 0;
01315    codec1 = glue1->get_codec ? glue1->get_codec(c1) : 0;
01316    if (codec0 && codec1 && !(codec0 & codec1)) {
01317       ast_debug(1, "Channel codec0 = %s is not codec1 = %s, cannot native bridge in RTP.\n", ast_getformatname(codec0), ast_getformatname(codec1));
01318       res = AST_BRIDGE_FAILED_NOWARN;
01319       goto done;
01320    }
01321 
01322    instance0->glue = glue0;
01323    instance1->glue = glue1;
01324    instance0->chan = c0;
01325    instance1->chan = c1;
01326 
01327    /* Depending on the end result for bridging either do a local bridge or remote bridge */
01328    if (audio_glue0_res == AST_RTP_GLUE_RESULT_LOCAL || audio_glue1_res == AST_RTP_GLUE_RESULT_LOCAL) {
01329       ast_verbose(VERBOSE_PREFIX_3 "Locally bridging %s and %s\n", c0->name, c1->name);
01330       res = local_bridge_loop(c0, c1, instance0, instance1, timeoutms, flags, fo, rc, c0->tech_pvt, c1->tech_pvt);
01331    } else {
01332       ast_verbose(VERBOSE_PREFIX_3 "Remotely bridging %s and %s\n", c0->name, c1->name);
01333       res = remote_bridge_loop(c0, c1, instance0, instance1, vinstance0, vinstance1,
01334             tinstance0, tinstance1, glue0, glue1, codec0, codec1, timeoutms, flags,
01335             fo, rc, c0->tech_pvt, c1->tech_pvt);
01336    }
01337 
01338    instance0->glue = NULL;
01339    instance1->glue = NULL;
01340    instance0->chan = NULL;
01341    instance1->chan = NULL;
01342 
01343    unlock_chans = 0;
01344 
01345 done:
01346    if (unlock_chans) {
01347       ast_channel_unlock(c0);
01348       ast_channel_unlock(c1);
01349    }
01350 
01351    unref_instance_cond(&instance0);
01352    unref_instance_cond(&instance1);
01353    unref_instance_cond(&vinstance0);
01354    unref_instance_cond(&vinstance1);
01355    unref_instance_cond(&tinstance0);
01356    unref_instance_cond(&tinstance1);
01357 
01358    return res;
01359 }

void ast_rtp_instance_change_source ( struct ast_rtp_instance instance  ) 

Indicate a new source of audio has dropped in and the ssrc should change.

Parameters:
instance Instance that the new media source is feeding into
Example usage:

This indicates that the source of media that is feeding the instance pointed to by instance has changed and that the marker bit should be set and the SSRC updated.

Since:
1.8

Definition at line 767 of file rtp_engine.c.

References ast_rtp_engine::change_source, and ast_rtp_instance::engine.

Referenced by mgcp_indicate(), oh323_indicate(), sip_indicate(), and skinny_indicate().

00768 {
00769    if (instance->engine->change_source) {
00770       instance->engine->change_source(instance);
00771    }
00772 }

int ast_rtp_instance_destroy ( struct ast_rtp_instance instance  ) 

Destroy an RTP instance.

Parameters:
instance The RTP instance to destroy
Return values:
0 success
-1 failure
Example usage:

This destroys the RTP instance pointed to by instance. Once this function returns instance no longer points to valid memory and may not be used again.

Since:
1.8

Definition at line 295 of file rtp_engine.c.

References ao2_ref.

Referenced by __oh323_destroy(), __sip_destroy(), cleanup_connection(), destroy_endpoint(), gtalk_free_pvt(), jingle_free_pvt(), mgcp_hangup(), multicast_rtp_hangup(), multicast_rtp_request(), oh323_alloc(), skinny_hangup(), start_rtp(), unalloc_sub(), and unistim_hangup().

00296 {
00297    ao2_ref(instance, -1);
00298 
00299    return 0;
00300 }

int ast_rtp_instance_dtmf_begin ( struct ast_rtp_instance instance,
char  digit 
)

Begin sending a DTMF digit.

Parameters:
instance The RTP instance to send the DTMF on
digit What DTMF digit to send
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_instance_dtmf_begin(instance, '1');

This starts sending the DTMF '1' on the RTP instance pointed to by instance. It will continue being sent until it is ended.

Since:
1.8

Definition at line 730 of file rtp_engine.c.

References ast_rtp_engine::dtmf_begin, and ast_rtp_instance::engine.

Referenced by gtalk_digit_begin(), mgcp_senddigit_begin(), oh323_digit_begin(), and sip_senddigit_begin().

00731 {
00732    return instance->engine->dtmf_begin ? instance->engine->dtmf_begin(instance, digit) : -1;
00733 }

int ast_rtp_instance_dtmf_end ( struct ast_rtp_instance instance,
char  digit 
)

Stop sending a DTMF digit.

Parameters:
instance The RTP instance to stop the DTMF on
digit What DTMF digit to stop
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_instance_dtmf_end(instance, '1');

This stops sending the DTMF '1' on the RTP instance pointed to by instance.

Since:
1.8

Definition at line 735 of file rtp_engine.c.

References ast_rtp_engine::dtmf_end, and ast_rtp_instance::engine.

Referenced by mgcp_senddigit_end(), oh323_digit_end(), and sip_senddigit_end().

00736 {
00737    return instance->engine->dtmf_end ? instance->engine->dtmf_end(instance, digit) : -1;
00738 }

int ast_rtp_instance_dtmf_end_with_duration ( struct ast_rtp_instance instance,
char  digit,
unsigned int  duration 
)

Definition at line 739 of file rtp_engine.c.

References ast_rtp_engine::dtmf_end_with_duration, and ast_rtp_instance::engine.

Referenced by gtalk_digit_end(), and sip_senddigit_end().

00740 {
00741    return instance->engine->dtmf_end_with_duration ? instance->engine->dtmf_end_with_duration(instance, digit, duration) : -1;
00742 }

enum ast_rtp_dtmf_mode ast_rtp_instance_dtmf_mode_get ( struct ast_rtp_instance instance  ) 

Get the DTMF mode of an RTP instance.

Parameters:
instance The RTP instance to get the DTMF mode of
Return values:
DTMF mode
Example usage:

This gets the DTMF mode set on the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 755 of file rtp_engine.c.

References ast_rtp_instance::dtmf_mode.

Referenced by sip_senddigit_begin(), and sip_senddigit_end().

00756 {
00757    return instance->dtmf_mode;
00758 }

int ast_rtp_instance_dtmf_mode_set ( struct ast_rtp_instance instance,
enum ast_rtp_dtmf_mode  dtmf_mode 
)

Set the DTMF mode that should be used.

Parameters:
instance the RTP instance to set DTMF mode on
dtmf_mode The DTMF mode that is in use
Return values:
0 success
-1 failure
Example usage:

This sets the RTP instance to use RFC2833 for DTMF transmission and receiving.

Since:
1.8

Definition at line 744 of file rtp_engine.c.

References ast_rtp_instance::dtmf_mode, ast_rtp_engine::dtmf_mode_set, and ast_rtp_instance::engine.

Referenced by enable_dsp_detect(), gtalk_alloc(), and sip_new().

00745 {
00746    if (!instance->engine->dtmf_mode_set || instance->engine->dtmf_mode_set(instance, dtmf_mode)) {
00747       return -1;
00748    }
00749 
00750    instance->dtmf_mode = dtmf_mode;
00751 
00752    return 0;
00753 }

int ast_rtp_instance_early_bridge ( struct ast_channel c0,
struct ast_channel c1 
)

Early bridge two channels that use RTP instances.

Parameters:
c0 First channel part of the bridge
c1 Second channel part of the bridge
Return values:
0 success
-1 failure
Note:
This should only be used by channel drivers in their technology declaration.
Since:
1.8

Definition at line 1450 of file rtp_engine.c.

References ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_debug, ast_log(), AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_REMOTE, ast_rtp_instance_get_glue(), ast_rtp_glue::get_codec, ast_rtp_glue::get_rtp_info, ast_rtp_glue::get_trtp_info, ast_rtp_glue::get_vrtp_info, LOG_WARNING, ast_channel::name, ast_channel::tech, ast_channel_tech::type, unref_instance_cond(), and ast_rtp_glue::update_peer.

01451 {
01452    struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL,
01453          *vinstance0 = NULL, *vinstance1 = NULL,
01454          *tinstance0 = NULL, *tinstance1 = NULL;
01455    struct ast_rtp_glue *glue0, *glue1;
01456    enum ast_rtp_glue_result audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID, video_glue0_res = AST_RTP_GLUE_RESULT_FORBID, text_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01457    enum ast_rtp_glue_result audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID, video_glue1_res = AST_RTP_GLUE_RESULT_FORBID, text_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01458    format_t codec0 = 0, codec1 = 0;
01459    int res = 0;
01460 
01461    /* If there is no second channel just immediately bail out, we are of no use in that scenario */
01462    if (!c1) {
01463       return -1;
01464    }
01465 
01466    /* Lock both channels so we can look for the glue that binds them together */
01467    ast_channel_lock(c0);
01468    while (ast_channel_trylock(c1)) {
01469       ast_channel_unlock(c0);
01470       usleep(1);
01471       ast_channel_lock(c0);
01472    }
01473 
01474    /* Grab glue that binds each channel to something using the RTP engine */
01475    if (!(glue0 = ast_rtp_instance_get_glue(c0->tech->type)) || !(glue1 = ast_rtp_instance_get_glue(c1->tech->type))) {
01476       ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", glue0 ? c1->name : c0->name);
01477       goto done;
01478    }
01479 
01480    audio_glue0_res = glue0->get_rtp_info(c0, &instance0);
01481    video_glue0_res = glue0->get_vrtp_info ? glue0->get_vrtp_info(c0, &vinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01482    text_glue0_res = glue0->get_trtp_info ? glue0->get_trtp_info(c0, &tinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01483 
01484    audio_glue1_res = glue1->get_rtp_info(c1, &instance1);
01485    video_glue1_res = glue1->get_vrtp_info ? glue1->get_vrtp_info(c1, &vinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01486    text_glue1_res = glue1->get_trtp_info ? glue1->get_trtp_info(c1, &tinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01487 
01488    /* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
01489    if (video_glue0_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue0_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01490       audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01491    }
01492    if (video_glue1_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue1_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01493       audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01494    }
01495    if (audio_glue0_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue0_res == AST_RTP_GLUE_RESULT_FORBID || video_glue0_res == AST_RTP_GLUE_RESULT_REMOTE) && glue0->get_codec(c0)) {
01496       codec0 = glue0->get_codec(c0);
01497    }
01498    if (audio_glue1_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue1_res == AST_RTP_GLUE_RESULT_FORBID || video_glue1_res == AST_RTP_GLUE_RESULT_REMOTE) && glue1->get_codec(c1)) {
01499       codec1 = glue1->get_codec(c1);
01500    }
01501 
01502    /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
01503    if (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE) {
01504       goto done;
01505    }
01506 
01507    /* Make sure we have matching codecs */
01508    if (!(codec0 & codec1)) {
01509       goto done;
01510    }
01511 
01512    /* Bridge media early */
01513    if (glue0->update_peer(c0, instance1, vinstance1, tinstance1, codec1, 0)) {
01514       ast_log(LOG_WARNING, "Channel '%s' failed to setup early bridge to '%s'\n", c0->name, c1 ? c1->name : "<unspecified>");
01515    }
01516 
01517    res = 0;
01518 
01519 done:
01520    ast_channel_unlock(c0);
01521    ast_channel_unlock(c1);
01522 
01523    unref_instance_cond(&instance0);
01524    unref_instance_cond(&instance1);
01525    unref_instance_cond(&vinstance0);
01526    unref_instance_cond(&vinstance1);
01527    unref_instance_cond(&tinstance0);
01528    unref_instance_cond(&tinstance1);
01529 
01530    if (!res) {
01531       ast_debug(1, "Setting early bridge SDP of '%s' with that of '%s'\n", c0->name, c1 ? c1->name : "<unspecified>");
01532    }
01533 
01534    return res;
01535 }

void ast_rtp_instance_early_bridge_make_compatible ( struct ast_channel c0,
struct ast_channel c1 
)

Make two channels compatible for early bridging.

Parameters:
c0 First channel part of the bridge
c1 Second channel part of the bridge
Since:
1.8

Definition at line 1366 of file rtp_engine.c.

References ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_debug, ast_rtp_codecs_payloads_copy(), AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_REMOTE, ast_rtp_instance_get_glue(), ast_rtp_instance::codecs, ast_rtp_glue::get_codec, ast_rtp_glue::get_rtp_info, ast_rtp_glue::get_trtp_info, ast_rtp_glue::get_vrtp_info, ast_channel::name, ast_channel::tech, ast_channel_tech::type, and unref_instance_cond().

Referenced by dial_exec_full(), and do_forward().

01367 {
01368    struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL,
01369       *vinstance0 = NULL, *vinstance1 = NULL,
01370       *tinstance0 = NULL, *tinstance1 = NULL;
01371    struct ast_rtp_glue *glue0, *glue1;
01372    enum ast_rtp_glue_result audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID, video_glue0_res = AST_RTP_GLUE_RESULT_FORBID, text_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01373    enum ast_rtp_glue_result audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID, video_glue1_res = AST_RTP_GLUE_RESULT_FORBID, text_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01374    format_t codec0 = 0, codec1 = 0;
01375    int res = 0;
01376 
01377    /* Lock both channels so we can look for the glue that binds them together */
01378    ast_channel_lock(c0);
01379    while (ast_channel_trylock(c1)) {
01380       ast_channel_unlock(c0);
01381       usleep(1);
01382       ast_channel_lock(c0);
01383    }
01384 
01385    /* Grab glue that binds each channel to something using the RTP engine */
01386    if (!(glue0 = ast_rtp_instance_get_glue(c0->tech->type)) || !(glue1 = ast_rtp_instance_get_glue(c1->tech->type))) {
01387       ast_debug(1, "Can't find native functions for channel '%s'\n", glue0 ? c1->name : c0->name);
01388       goto done;
01389    }
01390 
01391    audio_glue0_res = glue0->get_rtp_info(c0, &instance0);
01392    video_glue0_res = glue0->get_vrtp_info ? glue0->get_vrtp_info(c0, &vinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01393    text_glue0_res = glue0->get_trtp_info ? glue0->get_trtp_info(c0, &tinstance0) : AST_RTP_GLUE_RESULT_FORBID;
01394 
01395    audio_glue1_res = glue1->get_rtp_info(c1, &instance1);
01396    video_glue1_res = glue1->get_vrtp_info ? glue1->get_vrtp_info(c1, &vinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01397    text_glue1_res = glue1->get_trtp_info ? glue1->get_trtp_info(c1, &tinstance1) : AST_RTP_GLUE_RESULT_FORBID;
01398 
01399    /* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
01400    if (video_glue0_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue0_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01401       audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
01402    }
01403    if (video_glue1_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue1_res != AST_RTP_GLUE_RESULT_REMOTE)) {
01404       audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
01405    }
01406    if (audio_glue0_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue0_res == AST_RTP_GLUE_RESULT_FORBID || video_glue0_res == AST_RTP_GLUE_RESULT_REMOTE) && glue0->get_codec) {
01407       codec0 = glue0->get_codec(c0);
01408    }
01409    if (audio_glue1_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue1_res == AST_RTP_GLUE_RESULT_FORBID || video_glue1_res == AST_RTP_GLUE_RESULT_REMOTE) && glue1->get_codec) {
01410       codec1 = glue1->get_codec(c1);
01411    }
01412 
01413    /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
01414    if (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE) {
01415       goto done;
01416    }
01417 
01418    /* Make sure we have matching codecs */
01419    if (!(codec0 & codec1)) {
01420       goto done;
01421    }
01422 
01423    ast_rtp_codecs_payloads_copy(&instance0->codecs, &instance1->codecs, instance1);
01424 
01425    if (vinstance0 && vinstance1) {
01426       ast_rtp_codecs_payloads_copy(&vinstance0->codecs, &vinstance1->codecs, vinstance1);
01427    }
01428    if (tinstance0 && tinstance1) {
01429       ast_rtp_codecs_payloads_copy(&tinstance0->codecs, &tinstance1->codecs, tinstance1);
01430    }
01431 
01432    res = 0;
01433 
01434 done:
01435    ast_channel_unlock(c0);
01436    ast_channel_unlock(c1);
01437 
01438    unref_instance_cond(&instance0);
01439    unref_instance_cond(&instance1);
01440    unref_instance_cond(&vinstance0);
01441    unref_instance_cond(&vinstance1);
01442    unref_instance_cond(&tinstance0);
01443    unref_instance_cond(&tinstance1);
01444 
01445    if (!res) {
01446       ast_debug(1, "Seeded SDP of '%s' with that of '%s'\n", c0->name, c1 ? c1->name : "<unspecified>");
01447    }
01448 }

int ast_rtp_instance_fd ( struct ast_rtp_instance instance,
int  rtcp 
)

Get the file descriptor for an RTP session (or RTCP).

Parameters:
instance Instance to get the file descriptor for
rtcp Whether to retrieve the file descriptor for RTCP or not
Return values:
fd success
-1 failure
Example usage:

 int rtp_fd = ast_rtp_instance_fd(instance, 0);

This retrieves the file descriptor for the socket carrying media on the instance pointed to by instance.

Since:
1.8

Definition at line 786 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::fd.

Referenced by __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), gtalk_new(), jingle_new(), mgcp_new(), sip_new(), skinny_new(), start_rtp(), and unistim_new().

00787 {
00788    return instance->engine->fd ? instance->engine->fd(instance, rtcp) : -1;
00789 }

struct ast_rtp_glue* ast_rtp_instance_get_active_glue ( struct ast_rtp_instance instance  ) 

Get the RTP glue in use on an RTP instance.

Parameters:
instance The RTP instance
Return values:
pointer to the glue
Example:

This gets the RTP glue currently in use on the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 1722 of file rtp_engine.c.

References ast_rtp_instance::glue.

01723 {
01724    return instance->glue;
01725 }

int ast_rtp_instance_get_and_cmp_local_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the address of the local endpoint that we are sending RTP to, comparing its address to another.

Parameters:
instance The instance that we want to get the local address for
address An initialized address that may be overwritten if the local address is different
Return values:
0 address was not changed
1 address was changed Example usage:
 struct ast_sockaddr address;
 int ret;
 ret = ast_rtp_instance_get_and_cmp_local_address(instance, &address);

This retrieves the current local address set on the instance pointed to by instance and puts the value into the address structure.

Since:
1.8

Definition at line 413 of file rtp_engine.c.

References ast_sockaddr_cmp(), ast_sockaddr_copy(), and ast_rtp_instance::local_address.

00415 {
00416    if (ast_sockaddr_cmp(address, &instance->local_address) != 0) {
00417       ast_sockaddr_copy(address, &instance->local_address);
00418       return 1;
00419    }
00420 
00421    return 0;
00422 }

int ast_rtp_instance_get_and_cmp_remote_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the address of the remote endpoint that we are sending RTP to, comparing its address to another.

Parameters:
instance The instance that we want to get the remote address for
address An initialized address that may be overwritten if the remote address is different
Return values:
0 address was not changed
1 address was changed Example usage:
 struct ast_sockaddr address;
 int ret;
 ret = ast_rtp_instance_get_and_cmp_remote_address(instance, &address);

This retrieves the current remote address set on the instance pointed to by instance and puts the value into the address structure.

Since:
1.8

Definition at line 430 of file rtp_engine.c.

References ast_sockaddr_cmp(), ast_sockaddr_copy(), and ast_rtp_instance::remote_address.

Referenced by sip_set_rtp_peer().

00432 {
00433    if (ast_sockaddr_cmp(address, &instance->remote_address) != 0) {
00434       ast_sockaddr_copy(address, &instance->remote_address);
00435       return 1;
00436    }
00437 
00438    return 0;
00439 }

struct ast_rtp_instance* ast_rtp_instance_get_bridged ( struct ast_rtp_instance instance  ) 

Get the other RTP instance that an instance is bridged to.

Parameters:
instance The RTP instance that we want
Return values:
non-NULL success
NULL failure
Example usage:

This gets the RTP instance that instance0 is bridged to.

Since:
1.8

Definition at line 1361 of file rtp_engine.c.

References ast_rtp_instance::bridged.

Referenced by ast_rtp_read(), bridge_p2p_rtp_write(), and dialog_needdestroy().

01362 {
01363    return instance->bridged;
01364 }

struct ast_channel* ast_rtp_instance_get_chan ( struct ast_rtp_instance instance  ) 

Get the channel that is associated with an RTP instance while in a bridge.

Parameters:
instance The RTP instance
Return values:
pointer to the channel
Example:

 struct ast_channel *chan = ast_rtp_instance_get_chan(instance);

This gets the channel associated with the RTP instance pointed to by 'instance'.

Note:
This will only return a channel while in a local or remote bridge.
Since:
1.8

Definition at line 1727 of file rtp_engine.c.

References ast_rtp_instance::chan.

01728 {
01729    return instance->chan;
01730 }

struct ast_rtp_codecs* ast_rtp_instance_get_codecs ( struct ast_rtp_instance instance  ) 

Get the codecs structure of an RTP instance.

Parameters:
instance The RTP instance to get the codecs structure from
Example usage:

 struct ast_rtp_codecs *codecs = ast_rtp_instance_get_codecs(instance);

This gets the codecs structure on the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 477 of file rtp_engine.c.

References ast_rtp_instance::codecs.

Referenced by __oh323_rtp_create(), add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), ast_rtp_dtmf_begin(), ast_rtp_read(), ast_rtp_write(), bridge_p2p_rtp_write(), check_peer_ok(), create_addr_from_peer(), gtalk_alloc(), gtalk_is_answered(), gtalk_new(), gtalk_newcall(), jingle_new(), jingle_newcall(), multicast_rtp_write(), process_sdp(), process_sdp_a_audio(), set_dtmf_payload(), set_peer_capabilities(), setup_rtp_connection(), start_rtp(), and transmit_response_with_sdp().

00478 {
00479    return &instance->codecs;
00480 }

void* ast_rtp_instance_get_data ( struct ast_rtp_instance instance  ) 

Get the data portion of an RTP instance.

Parameters:
instance The RTP instance we want the data portion from
Example usage:

 struct *blob = ast_rtp_instance_get_data(instance);
 ( 

This gets the data pointer on the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 363 of file rtp_engine.c.

References ast_rtp_instance::data.

Referenced by __rtp_recvfrom(), __rtp_sendto(), ast_rtcp_read(), ast_rtcp_write(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_alt_remote_address_set(), ast_rtp_change_source(), ast_rtp_destroy(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_fd(), ast_rtp_get_stat(), ast_rtp_local_bridge(), ast_rtp_prop_set(), ast_rtp_qos_set(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_rtp_stop(), ast_rtp_stun_request(), ast_rtp_update_source(), ast_rtp_write(), bridge_p2p_rtp_write(), create_dtmf_frame(), multicast_rtp_activate(), multicast_rtp_destroy(), multicast_rtp_write(), process_cn_rfc3389(), process_dtmf_cisco(), process_dtmf_rfc2833(), red_write(), rtp_red_buffer(), and rtp_red_init().

00364 {
00365    return instance->data;
00366 }

struct ast_rtp_engine* ast_rtp_instance_get_engine ( struct ast_rtp_instance instance  ) 

Get the RTP engine in use on an RTP instance.

Parameters:
instance The RTP instance
Return values:
pointer to the engine
Example usage:

 struct ast_rtp_engine *engine = ast_rtp_instance_get_engine(instance);

This gets the RTP engine currently in use on the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 1717 of file rtp_engine.c.

References ast_rtp_instance::engine.

01718 {
01719    return instance->engine;
01720 }

void* ast_rtp_instance_get_extended_prop ( struct ast_rtp_instance instance,
int  property 
)

Get the value of an RTP instance extended property.

Parameters:
instance The RTP instance to get the extended property on
property The extended property to get
Since:
1.8

Definition at line 454 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::extended_prop_get.

00455 {
00456    if (instance->engine->extended_prop_get) {
00457       return instance->engine->extended_prop_get(instance, property);
00458    }
00459 
00460    return NULL;
00461 }

struct ast_rtp_glue* ast_rtp_instance_get_glue ( const char *  type  ) 

Get the RTP glue that binds a channel to the RTP engine.

Parameters:
type Name of the glue we want
Return values:
non-NULL success
NULL failure
Example usage:

 struct ast_rtp_glue *glue = ast_rtp_instance_get_glue("Example");

This retrieves the RTP glue that has the name 'Example'.

Since:
1.8

Definition at line 791 of file rtp_engine.c.

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_rtp_glue::entry, and ast_rtp_glue::type.

Referenced by ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), and ast_rtp_instance_make_compatible().

00792 {
00793    struct ast_rtp_glue *glue = NULL;
00794 
00795    AST_RWLIST_RDLOCK(&glues);
00796 
00797    AST_RWLIST_TRAVERSE(&glues, glue, entry) {
00798       if (!strcasecmp(glue->type, type)) {
00799          break;
00800       }
00801    }
00802 
00803    AST_RWLIST_UNLOCK(&glues);
00804 
00805    return glue;
00806 }

int ast_rtp_instance_get_hold_timeout ( struct ast_rtp_instance instance  ) 

Get the RTP timeout value for when an RTP instance is on hold.

Parameters:
instance The RTP instance
Return values:
timeout value
Example usage:

 int timeout = ast_rtp_instance_get_hold_timeout(instance);

This gets the RTP hold timeout value for the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 1712 of file rtp_engine.c.

References ast_rtp_instance::holdtimeout.

Referenced by check_rtp_timeout().

01713 {
01714    return instance->holdtimeout;
01715 }

void ast_rtp_instance_get_local_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the local address that we are expecting RTP on.

Parameters:
instance The RTP instance to get the address from
address The variable to store the address in
Example usage:

 struct ast_sockaddr address;
 ast_rtp_instance_get_local_address(instance, &address);

This gets the local address that we are expecting RTP on and stores it in the 'address' structure.

Since:
1.8

Definition at line 424 of file rtp_engine.c.

References ast_sockaddr_copy(), and ast_rtp_instance::local_address.

Referenced by add_sdp(), apply_directmedia_ha(), ast_rtp_prop_set(), external_rtp_create(), get_our_media_address(), gtalk_create_candidates(), handle_open_receive_channel_ack_message(), jingle_create_candidates(), multicast_send_control_packet(), oh323_set_rtp_peer(), skinny_set_rtp_peer(), and start_rtp().

00426 {
00427    ast_sockaddr_copy(address, &instance->local_address);
00428 }

int ast_rtp_instance_get_prop ( struct ast_rtp_instance instance,
enum ast_rtp_property  property 
)

Get the value of an RTP instance property.

Parameters:
instance The RTP instance to get the property from
property The property to get
Return values:
Current value of the property
Example usage:

This returns the current value of the NAT property on the instance pointed to by instance.

Since:
1.8

Definition at line 472 of file rtp_engine.c.

References ast_rtp_instance::properties.

Referenced by ast_rtcp_read(), ast_rtp_dtmf_compatible(), ast_rtp_raw_write(), ast_rtp_read(), bridge_p2p_rtp_write(), process_dtmf_cisco(), and process_dtmf_rfc2833().

00473 {
00474    return instance->properties[property];
00475 }

char* ast_rtp_instance_get_quality ( struct ast_rtp_instance instance,
enum ast_rtp_instance_stat_field  field,
char *  buf,
size_t  size 
)

Retrieve quality statistics about an RTP instance.

Parameters:
instance Instance to get statistics on
field What quality statistic to retrieve
buf What buffer to put the result into
size Size of the above buffer
Return values:
non-NULL success
NULL failure
Example usage:

This retrieves general quality statistics and places a text representation into the buf pointed to by buf.

Since:
1.8

Definition at line 1552 of file rtp_engine.c.

References ast_rtp_instance_get_stats(), AST_RTP_INSTANCE_STAT_ALL, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, AST_RTP_INSTANCE_STAT_COMBINED_RTT, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, ast_rtp_instance_stats::local_maxjitter, ast_rtp_instance_stats::local_maxrxploss, ast_rtp_instance_stats::local_minjitter, ast_rtp_instance_stats::local_minrxploss, ast_rtp_instance_stats::local_normdevjitter, ast_rtp_instance_stats::local_normdevrxploss, ast_rtp_instance_stats::local_ssrc, ast_rtp_instance_stats::local_stdevjitter, ast_rtp_instance_stats::local_stdevrxploss, ast_rtp_instance_stats::maxrtt, ast_rtp_instance_stats::minrtt, ast_rtp_instance_stats::normdevrtt, ast_rtp_instance_stats::remote_maxjitter, ast_rtp_instance_stats::remote_maxrxploss, ast_rtp_instance_stats::remote_minjitter, ast_rtp_instance_stats::remote_minrxploss, ast_rtp_instance_stats::remote_normdevjitter, ast_rtp_instance_stats::remote_normdevrxploss, ast_rtp_instance_stats::remote_ssrc, ast_rtp_instance_stats::remote_stdevjitter, ast_rtp_instance_stats::remote_stdevrxploss, ast_rtp_instance_stats::rtt, ast_rtp_instance_stats::rxcount, ast_rtp_instance_stats::rxjitter, ast_rtp_instance_stats::rxploss, ast_rtp_instance_stats::stdevrtt, ast_rtp_instance_stats::txcount, ast_rtp_instance_stats::txjitter, and ast_rtp_instance_stats::txploss.

Referenced by ast_rtp_instance_set_stats_vars(), handle_request_bye(), and sip_hangup().

01553 {
01554    struct ast_rtp_instance_stats stats = { 0, };
01555    enum ast_rtp_instance_stat stat;
01556 
01557    /* Determine what statistics we will need to retrieve based on field passed in */
01558    if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY) {
01559       stat = AST_RTP_INSTANCE_STAT_ALL;
01560    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER) {
01561       stat = AST_RTP_INSTANCE_STAT_COMBINED_JITTER;
01562    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS) {
01563       stat = AST_RTP_INSTANCE_STAT_COMBINED_LOSS;
01564    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT) {
01565       stat = AST_RTP_INSTANCE_STAT_COMBINED_RTT;
01566    } else {
01567       return NULL;
01568    }
01569 
01570    /* Attempt to actually retrieve the statistics we need to generate the quality string */
01571    if (ast_rtp_instance_get_stats(instance, &stats, stat)) {
01572       return NULL;
01573    }
01574 
01575    /* Now actually fill the buffer with the good information */
01576    if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY) {
01577       snprintf(buf, size, "ssrc=%i;themssrc=%u;lp=%u;rxjitter=%f;rxcount=%u;txjitter=%f;txcount=%u;rlp=%u;rtt=%f",
01578           stats.local_ssrc, stats.remote_ssrc, stats.rxploss, stats.txjitter, stats.rxcount, stats.rxjitter, stats.txcount, stats.txploss, stats.rtt);
01579    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER) {
01580       snprintf(buf, size, "minrxjitter=%f;maxrxjitter=%f;avgrxjitter=%f;stdevrxjitter=%f;reported_minjitter=%f;reported_maxjitter=%f;reported_avgjitter=%f;reported_stdevjitter=%f;",
01581           stats.local_minjitter, stats.local_maxjitter, stats.local_normdevjitter, sqrt(stats.local_stdevjitter), stats.remote_minjitter, stats.remote_maxjitter, stats.remote_normdevjitter, sqrt(stats.remote_stdevjitter));
01582    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS) {
01583       snprintf(buf, size, "minrxlost=%f;maxrxlost=%f;avgrxlost=%f;stdevrxlost=%f;reported_minlost=%f;reported_maxlost=%f;reported_avglost=%f;reported_stdevlost=%f;",
01584           stats.local_minrxploss, stats.local_maxrxploss, stats.local_normdevrxploss, sqrt(stats.local_stdevrxploss), stats.remote_minrxploss, stats.remote_maxrxploss, stats.remote_normdevrxploss, sqrt(stats.remote_stdevrxploss));
01585    } else if (field == AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT) {
01586       snprintf(buf, size, "minrtt=%f;maxrtt=%f;avgrtt=%f;stdevrtt=%f;", stats.minrtt, stats.maxrtt, stats.normdevrtt, stats.stdevrtt);
01587    }
01588 
01589    return buf;
01590 }

void ast_rtp_instance_get_remote_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the address of the remote endpoint that we are sending RTP to.

Parameters:
instance The instance that we want to get the remote address for
address A structure to put the address into
Example usage:

 struct ast_sockaddr address;
 ast_rtp_instance_get_remote_address(instance, &address);

This retrieves the current remote address set on the instance pointed to by instance and puts the value into the address structure.

Since:
1.8

Definition at line 441 of file rtp_engine.c.

References ast_sockaddr_copy(), and ast_rtp_instance::remote_address.

Referenced by add_sdp(), apply_directmedia_ha(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_instance_bridge(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_write(), bridge_p2p_rtp_write(), create_dtmf_frame(), gtalk_update_stun(), multicast_rtp_write(), multicast_send_control_packet(), oh323_set_rtp_peer(), process_cn_rfc3389(), process_dtmf_rfc2833(), process_sdp(), remote_bridge_loop(), skinny_set_rtp_peer(), and transmit_modify_with_sdp().

00443 {
00444    ast_sockaddr_copy(address, &instance->remote_address);
00445 }

struct ast_srtp* ast_rtp_instance_get_srtp ( struct ast_rtp_instance instance  ) 

Definition at line 1771 of file rtp_engine.c.

References ast_rtp_instance::srtp.

Referenced by __rtp_recvfrom(), __rtp_sendto(), and ast_rtp_change_source().

01772 {
01773    return instance->srtp;
01774 }

int ast_rtp_instance_get_stats ( struct ast_rtp_instance instance,
struct ast_rtp_instance_stats stats,
enum ast_rtp_instance_stat  stat 
)

Retrieve statistics about an RTP instance.

Parameters:
instance Instance to get statistics on
stats Structure to put results into
stat What statistic(s) to retrieve
Return values:
0 success
-1 failure
Example usage:

This retrieves all statistics the underlying RTP engine supports and puts the values into the stats structure.

Since:
1.8

Definition at line 1547 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::get_stat.

Referenced by ast_rtp_instance_get_quality(), ast_srtp_unprotect(), and show_chanstats_cb().

01548 {
01549    return instance->engine->get_stat ? instance->engine->get_stat(instance, stats, stat) : -1;
01550 }

int ast_rtp_instance_get_timeout ( struct ast_rtp_instance instance  ) 

Get the RTP timeout value.

Parameters:
instance The RTP instance
Return values:
timeout value
Example usage:

 int timeout = ast_rtp_instance_get_timeout(instance);

This gets the RTP timeout value for the RTP instance pointed to by 'instance'.

Since:
1.8

Definition at line 1707 of file rtp_engine.c.

References ast_rtp_instance::timeout.

Referenced by check_rtp_timeout().

01708 {
01709    return instance->timeout;
01710 }

int ast_rtp_instance_make_compatible ( struct ast_channel chan,
struct ast_rtp_instance instance,
struct ast_channel peer 
)

Request that the underlying RTP engine make two RTP instances compatible with eachother.

Parameters:
chan Our own Asterisk channel
instance The first RTP instance
peer The peer Asterisk channel
Return values:
0 success
-1 failure
Example usage:

This makes the RTP instance for 'peer' compatible with 'instance' and vice versa.

Since:
1.8

Definition at line 1636 of file rtp_engine.c.

References ao2_ref, ast_channel_lock, ast_channel_unlock, ast_rtp_instance_get_glue(), ast_rtp_instance::chan, ast_rtp_instance::engine, ast_rtp_glue::get_rtp_info, ast_rtp_instance::glue, ast_rtp_engine::make_compatible, ast_channel::tech, and ast_channel_tech::type.

Referenced by sip_setoption().

01637 {
01638    struct ast_rtp_glue *glue;
01639    struct ast_rtp_instance *peer_instance = NULL;
01640    int res = -1;
01641 
01642    if (!instance->engine->make_compatible) {
01643       return -1;
01644    }
01645 
01646    ast_channel_lock(peer);
01647 
01648    if (!(glue = ast_rtp_instance_get_glue(peer->tech->type))) {
01649       ast_channel_unlock(peer);
01650       return -1;
01651    }
01652 
01653    glue->get_rtp_info(peer, &peer_instance);
01654 
01655    if (!peer_instance || peer_instance->engine != instance->engine) {
01656       ast_channel_unlock(peer);
01657       ao2_ref(peer_instance, -1);
01658       peer_instance = NULL;
01659       return -1;
01660    }
01661 
01662    res = instance->engine->make_compatible(chan, instance, peer, peer_instance);
01663 
01664    ast_channel_unlock(peer);
01665 
01666    ao2_ref(peer_instance, -1);
01667    peer_instance = NULL;
01668 
01669    return res;
01670 }

struct ast_rtp_instance* ast_rtp_instance_new ( const char *  engine_name,
struct sched_context sched,
const struct ast_sockaddr sa,
void *  data 
)

Create a new RTP instance.

Parameters:
engine_name Name of the engine to use for the RTP instance
sched Scheduler context that the RTP engine may want to use
sa Address we want to bind to
data Unique data for the engine
Return values:
non-NULL success
NULL failure
Example usage:

 struct ast_rtp_instance *instance = NULL;
 instance = ast_rtp_instance_new(NULL, sched, &sin, NULL);

This creates a new RTP instance using the default engine and asks the RTP engine to bind to the address given in the address structure.

Note:
The RTP engine does not have to use the address provided when creating an RTP instance. It may choose to use another depending on it's own configuration.
Since:
1.8

Definition at line 302 of file rtp_engine.c.

References ao2_alloc, ao2_ref, ast_debug, ast_log(), ast_module_ref(), ast_module_unref(), AST_RWLIST_FIRST, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_sockaddr_copy(), ast_strlen_zero(), ast_rtp_engine::entry, instance_destructor(), LOG_ERROR, ast_rtp_engine::mod, ast_rtp_engine::name, and sched.

Referenced by __oh323_rtp_create(), dialog_initialize_rtp(), gtalk_alloc(), jingle_alloc(), multicast_rtp_request(), and start_rtp().

00305 {
00306    struct ast_sockaddr address = {{0,}};
00307    struct ast_rtp_instance *instance = NULL;
00308    struct ast_rtp_engine *engine = NULL;
00309 
00310    AST_RWLIST_RDLOCK(&engines);
00311 
00312    /* If an engine name was specified try to use it or otherwise use the first one registered */
00313    if (!ast_strlen_zero(engine_name)) {
00314       AST_RWLIST_TRAVERSE(&engines, engine, entry) {
00315          if (!strcmp(engine->name, engine_name)) {
00316             break;
00317          }
00318       }
00319    } else {
00320       engine = AST_RWLIST_FIRST(&engines);
00321    }
00322 
00323    /* If no engine was actually found bail out now */
00324    if (!engine) {
00325       ast_log(LOG_ERROR, "No RTP engine was found. Do you have one loaded?\n");
00326       AST_RWLIST_UNLOCK(&engines);
00327       return NULL;
00328    }
00329 
00330    /* Bump up the reference count before we return so the module can not be unloaded */
00331    ast_module_ref(engine->mod);
00332 
00333    AST_RWLIST_UNLOCK(&engines);
00334 
00335    /* Allocate a new RTP instance */
00336    if (!(instance = ao2_alloc(sizeof(*instance), instance_destructor))) {
00337       ast_module_unref(engine->mod);
00338       return NULL;
00339    }
00340    instance->engine = engine;
00341    ast_sockaddr_copy(&instance->local_address, sa);
00342    ast_sockaddr_copy(&address, sa);
00343 
00344    ast_debug(1, "Using engine '%s' for RTP instance '%p'\n", engine->name, instance);
00345 
00346    /* And pass it off to the engine to setup */
00347    if (instance->engine->new(instance, sched, &address, data)) {
00348       ast_debug(1, "Engine '%s' failed to setup RTP instance '%p'\n", engine->name, instance);
00349       ao2_ref(instance, -1);
00350       return NULL;
00351    }
00352 
00353    ast_debug(1, "RTP instance '%p' is setup and ready to go\n", instance);
00354 
00355    return instance;
00356 }

struct ast_frame* ast_rtp_instance_read ( struct ast_rtp_instance instance,
int  rtcp 
)

Receive a frame over RTP.

Parameters:
instance The RTP instance to receive frame on
rtcp Whether to read in RTCP or not
Return values:
non-NULL success
NULL failure
Example usage:

 struct ast_frame *frame;
 frame = ast_rtp_instance_read(instance, 0);

This asks the RTP engine to read in RTP from the instance and return it as an Asterisk frame.

Since:
1.8

Definition at line 373 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::read.

Referenced by gtalk_rtp_read(), jingle_rtp_read(), mgcp_rtp_read(), oh323_read(), oh323_rtp_read(), sip_rtp_read(), skinny_rtp_read(), and unistim_rtp_read().

00374 {
00375    return instance->engine->read(instance, rtcp);
00376 }

int ast_rtp_instance_set_alt_remote_address ( struct ast_rtp_instance instance,
const struct ast_sockaddr address 
)

Set the address of an an alternate RTP address to receive from.

Parameters:
instance The RTP instance to change the address on
address Address to set it to
Return values:
0 success
-1 failure
Example usage:

This changes the alternate remote address that RTP will be sent to on instance to the address given in the sin structure.

Since:
1.8

Definition at line 399 of file rtp_engine.c.

References ast_rtp_instance::alt_remote_address, ast_rtp_engine::alt_remote_address_set, ast_sockaddr_copy(), and ast_rtp_instance::engine.

Referenced by handle_request_invite().

00401 {
00402    ast_sockaddr_copy(&instance->alt_remote_address, address);
00403 
00404    /* oink */
00405 
00406    if (instance->engine->alt_remote_address_set) {
00407       instance->engine->alt_remote_address_set(instance, &instance->alt_remote_address);
00408    }
00409 
00410    return 0;
00411 }

void ast_rtp_instance_set_data ( struct ast_rtp_instance instance,
void *  data 
)

Set the data portion of an RTP instance.

Parameters:
instance The RTP instance to manipulate
data Pointer to data
Example usage:

 ast_rtp_instance_set_data(instance, blob);

This sets the data pointer on the RTP instance pointed to by 'instance' to blob.

Since:
1.8

Definition at line 358 of file rtp_engine.c.

References ast_rtp_instance::data.

Referenced by multicast_rtp_new().

00359 {
00360    instance->data = data;
00361 }

void ast_rtp_instance_set_extended_prop ( struct ast_rtp_instance instance,
int  property,
void *  value 
)

Set the value of an RTP instance extended property.

Parameters:
instance The RTP instance to set the extended property on
property The extended property to set
value The value to set the extended property to
Since:
1.8

Definition at line 447 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::extended_prop_set.

00448 {
00449    if (instance->engine->extended_prop_set) {
00450       instance->engine->extended_prop_set(instance, property, value);
00451    }
00452 }

void ast_rtp_instance_set_hold_timeout ( struct ast_rtp_instance instance,
int  timeout 
)

Set the RTP timeout value for when the instance is on hold.

Parameters:
instance The RTP instance
timeout Value to set the timeout to
Example usage:

This sets the RTP hold timeout value on 'instance' to be 5000.

Since:
1.8

Definition at line 1702 of file rtp_engine.c.

References ast_rtp_instance::holdtimeout.

Referenced by check_rtp_timeout(), create_addr_from_peer(), and dialog_initialize_rtp().

01703 {
01704    instance->holdtimeout = timeout;
01705 }

int ast_rtp_instance_set_local_address ( struct ast_rtp_instance instance,
const struct ast_sockaddr address 
)

Set the address that we are expecting to receive RTP on.

Parameters:
instance The RTP instance to change the address on
address Address to set it to
Return values:
0 success
-1 failure
Example usage:

This changes the local address that RTP is expected on to the address given in the sin structure.

Since:
1.8

Definition at line 378 of file rtp_engine.c.

References ast_sockaddr_copy(), and ast_rtp_instance::local_address.

Referenced by ast_rtp_new().

00380 {
00381    ast_sockaddr_copy(&instance->local_address, address);
00382    return 0;
00383 }

void ast_rtp_instance_set_prop ( struct ast_rtp_instance instance,
enum ast_rtp_property  property,
int  value 
)

Set the value of an RTP instance property.

Parameters:
instance The RTP instance to set the property on
property The property to modify
value The value to set the property to
Example usage:

This enables the AST_RTP_PROPERTY_NAT property on the instance pointed to by instance.

Since:
1.8

Definition at line 463 of file rtp_engine.c.

References ast_rtp_instance::engine, ast_rtp_engine::prop_set, and ast_rtp_instance::properties.

Referenced by __oh323_rtp_create(), create_addr_from_peer(), dialog_initialize_rtp(), do_setnat(), gtalk_alloc(), handle_request_invite(), oh323_rtp_read(), process_sdp(), sip_dtmfmode(), and start_rtp().

00464 {
00465    instance->properties[property] = value;
00466 
00467    if (instance->engine->prop_set) {
00468       instance->engine->prop_set(instance, property, value);
00469    }
00470 }

int ast_rtp_instance_set_qos ( struct ast_rtp_instance instance,
int  tos,
int  cos,
const char *  desc 
)

Set QoS parameters on an RTP session.

Parameters:
instance Instance to set the QoS parameters on
tos Terms of service value
cos Class of service value
desc What is setting the QoS values
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_instance_set_qos(instance, 0, 0, "Example");

This sets the TOS and COS values to 0 on the instance pointed to by instance.

Since:
1.8

Definition at line 774 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::qos.

Referenced by __oh323_rtp_create(), dialog_initialize_rtp(), and start_rtp().

00775 {
00776    return instance->engine->qos ? instance->engine->qos(instance, tos, cos, desc) : -1;
00777 }

int ast_rtp_instance_set_read_format ( struct ast_rtp_instance instance,
format_t  format 
)

Request that the underlying RTP engine provide audio frames in a specific format.

Parameters:
instance The RTP instance to change read format on
format Format that frames are wanted in
Return values:
0 success
-1 failure
Example usage:

This requests that the RTP engine provide audio frames in the ULAW format.

Since:
1.8

Definition at line 1626 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::set_read_format.

Referenced by sip_new(), and sip_setoption().

01627 {
01628    return instance->engine->set_read_format ? instance->engine->set_read_format(instance, format) : -1;
01629 }

int ast_rtp_instance_set_remote_address ( struct ast_rtp_instance instance,
const struct ast_sockaddr address 
)

Set the address of the remote endpoint that we are sending RTP to.

Parameters:
instance The RTP instance to change the address on
address Address to set it to
Return values:
0 success
-1 failure
Example usage:

This changes the remote address that RTP will be sent to on instance to the address given in the sin structure.

Since:
1.8

Definition at line 385 of file rtp_engine.c.

References ast_sockaddr_copy(), ast_rtp_instance::engine, ast_rtp_instance::remote_address, and ast_rtp_engine::remote_address_set.

Referenced by ast_rtp_read(), ast_rtp_stop(), handle_open_receive_channel_ack_message(), multicast_rtp_request(), process_sdp(), setup_rtp_connection(), and start_rtp().

00387 {
00388    ast_sockaddr_copy(&instance->remote_address, address);
00389 
00390    /* moo */
00391 
00392    if (instance->engine->remote_address_set) {
00393       instance->engine->remote_address_set(instance, &instance->remote_address);
00394    }
00395 
00396    return 0;
00397 }

void ast_rtp_instance_set_stats_vars ( struct ast_channel chan,
struct ast_rtp_instance instance 
)

Set standard statistics from an RTP instance on a channel.

Parameters:
chan Channel to set the statistics on
instance The RTP instance that statistics will be retrieved from
Example usage:

This retrieves standard statistics from the RTP instance rtp and sets it on the channel pointed to by chan.

Since:
1.8

Definition at line 1592 of file rtp_engine.c.

References ast_bridged_channel(), AST_MAX_USER_FIELD, ast_rtp_instance_get_quality(), AST_RTP_INSTANCE_STAT_FIELD_QUALITY, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, ast_channel::bridge, pbx_builtin_setvar_helper(), and quality.

Referenced by handle_request_bye(), and sip_hangup().

01593 {
01594    char quality_buf[AST_MAX_USER_FIELD], *quality;
01595    struct ast_channel *bridge = ast_bridged_channel(chan);
01596 
01597    if ((quality = ast_rtp_instance_get_quality(instance, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
01598       pbx_builtin_setvar_helper(chan, "RTPAUDIOQOS", quality);
01599       if (bridge) {
01600          pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSBRIDGED", quality);
01601       }
01602    }
01603 
01604    if ((quality = ast_rtp_instance_get_quality(instance, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, quality_buf, sizeof(quality_buf)))) {
01605       pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSJITTER", quality);
01606       if (bridge) {
01607          pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSJITTERBRIDGED", quality);
01608       }
01609    }
01610 
01611    if ((quality = ast_rtp_instance_get_quality(instance, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, quality_buf, sizeof(quality_buf)))) {
01612       pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSLOSS", quality);
01613       if (bridge) {
01614          pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSLOSSBRIDGED", quality);
01615       }
01616    }
01617 
01618    if ((quality = ast_rtp_instance_get_quality(instance, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, quality_buf, sizeof(quality_buf)))) {
01619       pbx_builtin_setvar_helper(chan, "RTPAUDIOQOSRTT", quality);
01620       if (bridge) {
01621          pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSRTTBRIDGED", quality);
01622       }
01623    }
01624 }

void ast_rtp_instance_set_timeout ( struct ast_rtp_instance instance,
int  timeout 
)

Set the RTP timeout value.

Parameters:
instance The RTP instance
timeout Value to set the timeout to
Example usage:

 ast_rtp_instance_set_timeout(instance, 5000);

This sets the RTP timeout value on 'instance' to be 5000.

Since:
1.8

Definition at line 1697 of file rtp_engine.c.

References ast_rtp_instance::timeout.

Referenced by check_rtp_timeout(), create_addr_from_peer(), and dialog_initialize_rtp().

01698 {
01699    instance->timeout = timeout;
01700 }

int ast_rtp_instance_set_write_format ( struct ast_rtp_instance instance,
format_t  format 
)

Tell underlying RTP engine that audio frames will be provided in a specific format.

Parameters:
instance The RTP instance to change write format on
format Format that frames will be provided in
Return values:
0 success
-1 failure
Example usage:

This tells the underlying RTP engine that audio frames will be provided to it in ULAW format.

Since:
1.8

Definition at line 1631 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::set_write_format.

Referenced by sip_new(), and sip_setoption().

01632 {
01633    return instance->engine->set_write_format ? instance->engine->set_write_format(instance, format) : -1;
01634 }

void ast_rtp_instance_stop ( struct ast_rtp_instance instance  ) 

Stop an RTP instance.

Parameters:
instance Instance that media is no longer going to at this time
Example usage:

This tells the RTP engine being used for the instance pointed to by instance that media is no longer going to it at this time, but may in the future.

Since:
1.8

Definition at line 779 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::stop.

Referenced by process_sdp(), setup_rtp_connection(), and stop_media_flows().

00780 {
00781    if (instance->engine->stop) {
00782       instance->engine->stop(instance);
00783    }
00784 }

void ast_rtp_instance_stun_request ( struct ast_rtp_instance instance,
struct ast_sockaddr suggestion,
const char *  username 
)

Request that the underlying RTP engine send a STUN BIND request.

Parameters:
instance The RTP instance
suggestion The suggested destination
username Optionally a username for the request
Example usage:

 ast_rtp_instance_stun_request(instance, NULL, NULL);

This requests that the RTP engine send a STUN BIND request on the session pointed to by 'instance'.

Since:
1.8

Definition at line 1688 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::stun_request.

Referenced by gtalk_update_stun(), and jingle_update_stun().

01691 {
01692    if (instance->engine->stun_request) {
01693       instance->engine->stun_request(instance, suggestion, username);
01694    }
01695 }

void ast_rtp_instance_update_source ( struct ast_rtp_instance instance  ) 

Indicate that the RTP marker bit should be set on an RTP stream.

Parameters:
instance Instance that the new media source is feeding into
Example usage:

This indicates that the source of media that is feeding the instance pointed to by instance has been updated and that the marker bit should be set.

Since:
1.8

Definition at line 760 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::update_source.

Referenced by mgcp_indicate(), oh323_indicate(), sip_answer(), sip_indicate(), sip_write(), and skinny_indicate().

00761 {
00762    if (instance->engine->update_source) {
00763       instance->engine->update_source(instance);
00764    }
00765 }

int ast_rtp_instance_write ( struct ast_rtp_instance instance,
struct ast_frame frame 
)

Send a frame out over RTP.

Parameters:
instance The RTP instance to send frame out on
frame the frame to send out
Return values:
0 success
-1 failure
Example usage:

 ast_rtp_instance_write(instance, frame);

This gives the frame pointed to by frame to the RTP engine being used for the instance and asks that it be transmitted to the current remote address set on the RTP instance.

Since:
1.8

Definition at line 368 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::write.

Referenced by gtalk_write(), jingle_write(), mgcp_write(), multicast_rtp_write(), oh323_write(), sip_write(), skinny_write(), and unistim_write().

00369 {
00370    return instance->engine->write(instance, frame);
00371 }

char* ast_rtp_lookup_mime_multiple2 ( struct ast_str buf,
const format_t  capability,
const int  asterisk_format,
enum ast_rtp_options  options 
)

Convert formats into a string and put them into a buffer.

Parameters:
buf Buffer to put the mime output into
capability Formats that we are looking up
asterisk_format Non-zero if the given capability are Asterisk format capabilities
options Additional options that may change the result
Return values:
non-NULL success
NULL failure
Example usage:

 char buf[256] = "";
 char *mime = ast_rtp_lookup_mime_multiple2(&buf, sizeof(buf), AST_FORMAT_ULAW | AST_FORMAT_ALAW, 1, 0);

This returns the mime values for ULAW and ALAW in the buffer pointed to by buf.

Since:
1.8

Definition at line 697 of file rtp_engine.c.

References ast_rtp_lookup_mime_subtype2(), AST_RTP_MAX, ast_str_append(), ast_str_buffer(), format, and name.

Referenced by process_sdp().

00698 {
00699    format_t format;
00700    int found = 0;
00701 
00702    if (!buf) {
00703       return NULL;
00704    }
00705 
00706    ast_str_append(&buf, 0, "0x%llx (", (unsigned long long) capability);
00707 
00708    for (format = 1; format < AST_RTP_MAX; format <<= 1) {
00709       if (capability & format) {
00710          const char *name = ast_rtp_lookup_mime_subtype2(asterisk_format, format, options);
00711          ast_str_append(&buf, 0, "%s|", name);
00712          found = 1;
00713       }
00714    }
00715 
00716    ast_str_append(&buf, 0, "%s", found ? ")" : "nothing)");
00717 
00718    return ast_str_buffer(buf);
00719 }

const char* ast_rtp_lookup_mime_subtype2 ( const int  asterisk_format,
const format_t  code,
enum ast_rtp_options  options 
)

Retrieve mime subtype information on a payload.

Parameters:
asterisk_format Non-zero if the given code is an Asterisk format value
code Format to look up
options Additional options that may change the result
Return values:
Mime subtype success
NULL failure
Example usage:

 const char *subtype = ast_rtp_lookup_mime_subtype2(1, AST_FORMAT_ULAW, 0);

This looks up the mime subtype for the ULAW format.

Since:
1.8

Definition at line 667 of file rtp_engine.c.

References ARRAY_LEN, AST_FORMAT_G726_AAL2, ast_rtp_mime_types, AST_RTP_OPT_G726_NONSTANDARD, ast_rtp_payload_type::asterisk_format, ast_rtp_mime_type::payload_type, and ast_rtp_mime_type::subtype.

Referenced by add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), ast_rtp_lookup_mime_multiple2(), transmit_connect(), transmit_connect_with_sdp(), transmit_modify_request(), and transmit_modify_with_sdp().

00668 {
00669    int i;
00670 
00671    for (i = 0; i < ARRAY_LEN(ast_rtp_mime_types); i++) {
00672       if (ast_rtp_mime_types[i].payload_type.code == code && ast_rtp_mime_types[i].payload_type.asterisk_format == asterisk_format) {
00673          if (asterisk_format && (code == AST_FORMAT_G726_AAL2) && (options & AST_RTP_OPT_G726_NONSTANDARD)) {
00674             return "G726-32";
00675          } else {
00676             return ast_rtp_mime_types[i].subtype;
00677          }
00678       }
00679    }
00680 
00681    return "";
00682 }

unsigned int ast_rtp_lookup_sample_rate2 ( int  asterisk_format,
format_t  code 
)

Get the sample rate associated with known RTP payload types.

Parameters:
asterisk_format True if the value in the 'code' parameter is an AST_FORMAT value
code Format code, either from AST_FORMAT list or from AST_RTP list
Returns:
the sample rate if the format was found, zero if it was not found
Since:
1.8

Definition at line 684 of file rtp_engine.c.

References ARRAY_LEN, ast_rtp_mime_types, ast_rtp_payload_type::asterisk_format, ast_rtp_mime_type::payload_type, and ast_rtp_mime_type::sample_rate.

Referenced by add_codec_to_sdp(), add_noncodec_to_sdp(), add_tcodec_to_sdp(), and add_vcodec_to_sdp().

00685 {
00686    unsigned int i;
00687 
00688    for (i = 0; i < ARRAY_LEN(ast_rtp_mime_types); ++i) {
00689       if ((ast_rtp_mime_types[i].payload_type.code == code) && (ast_rtp_mime_types[i].payload_type.asterisk_format == asterisk_format)) {
00690          return ast_rtp_mime_types[i].sample_rate;
00691       }
00692    }
00693 
00694    return 0;
00695 }

int ast_rtp_red_buffer ( struct ast_rtp_instance instance,
struct ast_frame frame 
)

Buffer a frame in an RTP instance for RED.

Parameters:
instance The instance to buffer the frame on
frame Frame that we want to buffer
Return values:
0 success
-1 failure
Since:
1.8

Definition at line 1542 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::red_buffer.

Referenced by sip_write().

01543 {
01544    return instance->engine->red_buffer ? instance->engine->red_buffer(instance, frame) : -1;
01545 }

int ast_rtp_red_init ( struct ast_rtp_instance instance,
int  buffer_time,
int *  payloads,
int  generations 
)

Initialize RED support on an RTP instance.

Parameters:
instance The instance to initialize RED support on
buffer_time How long to buffer before sending
payloads Payload values
generations Number of generations
Return values:
0 success
-1 failure
Since:
1.8

Definition at line 1537 of file rtp_engine.c.

References ast_rtp_instance::engine, and ast_rtp_engine::red_init.

Referenced by process_sdp().

01538 {
01539    return instance->engine->red_init ? instance->engine->red_init(instance, buffer_time, payloads, generations) : -1;
01540 }


Generated on Mon Jun 27 16:51:20 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7