Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Enumerations | Functions
rtp_engine.h File Reference

Pluggable RTP Architecture. More...

#include "asterisk/astobj2.h"
#include "asterisk/frame.h"
#include "asterisk/format_cap.h"
#include "asterisk/netsock2.h"
#include "asterisk/sched.h"
#include "asterisk/res_srtp.h"
#include "asterisk/stasis.h"
#include "asterisk/vector.h"
#include "asterisk/logger_category.h"
Include dependency graph for rtp_engine.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_rtp_codecs
 
struct  ast_rtp_dtls_cfg
 DTLS configuration structure. More...
 
struct  ast_rtp_engine
 
struct  ast_rtp_engine_dtls
 Structure that represents the optional DTLS SRTP support within an RTP engine. More...
 
struct  ast_rtp_engine_ice
 Structure that represents the optional ICE support within an RTP engine. More...
 
struct  ast_rtp_engine_ice_candidate
 Structure for an ICE candidate. More...
 
struct  ast_rtp_glue
 
struct  ast_rtp_instance_stats
 
struct  ast_rtp_payload_type
 
struct  ast_rtp_rtcp_feedback
 An object that represents data received in a feedback report. More...
 
struct  ast_rtp_rtcp_feedback_remb
 A REMB feedback message (see draft-alvestrand-rmcat-remb-03 for details) More...
 
struct  ast_rtp_rtcp_report
 An object that represents data sent during a SR/RR RTCP report. More...
 
struct  ast_rtp_rtcp_report_block
 A report block within a SR/RR report. More...
 

Macros

#define AST_DEBUG_CATEGORY_DTLS   ast_debug_category_dtls_id() /* DTLS debug logging category id */
 
#define AST_DEBUG_CATEGORY_DTLS_PACKET   ast_debug_category_dtls_packet_id() /* DTLS packet debug logging category id */
 
#define AST_DEBUG_CATEGORY_ICE   ast_debug_category_ice_id() /* ICE debug logging category id */
 
#define AST_DEBUG_CATEGORY_RTCP   ast_debug_category_rtcp_id() /* RTCP debug logging category id */
 
#define AST_DEBUG_CATEGORY_RTCP_PACKET   ast_debug_category_rtcp_packet_id() /* RTCP packet debug logging category id */
 
#define AST_DEBUG_CATEGORY_RTP   ast_debug_category_rtp_id() /* RTP debug logging category id */
 
#define AST_DEBUG_CATEGORY_RTP_PACKET   ast_debug_category_rtp_packet_id() /* RTP packet debug logging category id */
 
#define ast_debug_dtls(sublevel, ...)    ast_debug_category(sublevel, AST_DEBUG_CATEGORY_DTLS, __VA_ARGS__)
 Log debug level DTLS information. More...
 
#define ast_debug_dtls_packet_is_allowed    ast_debug_category_is_allowed(AST_LOG_CATEGORY_ENABLED, AST_DEBUG_CATEGORY_DTLS_PACKET)
 
#define ast_debug_ice(sublevel, ...)    ast_debug_category(sublevel, AST_DEBUG_CATEGORY_ICE, __VA_ARGS__)
 Log debug level ICE information. More...
 
#define ast_debug_rtcp(sublevel, ...)    ast_debug_category(sublevel, AST_DEBUG_CATEGORY_RTCP, __VA_ARGS__)
 Log debug level RTCP information. More...
 
#define ast_debug_rtcp_packet_is_allowed    ast_debug_category_is_allowed(AST_LOG_CATEGORY_ENABLED, AST_DEBUG_CATEGORY_RTCP_PACKET)
 
#define ast_debug_rtp(sublevel, ...)    ast_debug_category(sublevel, AST_DEBUG_CATEGORY_RTP, __VA_ARGS__)
 Log debug level RTP information. More...
 
#define ast_debug_rtp_packet_is_allowed    ast_debug_category_is_allowed(AST_LOG_CATEGORY_ENABLED, AST_DEBUG_CATEGORY_RTP_PACKET)
 
#define AST_LOG_CATEGORY_DTLS   "dtls"
 
#define AST_LOG_CATEGORY_DTLS_PACKET   "dtls_packet"
 
#define AST_LOG_CATEGORY_ICE   "ice"
 
#define AST_LOG_CATEGORY_RTCP   "rtcp"
 
#define AST_LOG_CATEGORY_RTCP_PACKET   "rtcp_packet"
 
#define AST_LOG_CATEGORY_RTP   "rtp"
 
#define AST_LOG_CATEGORY_RTP_PACKET   "rtp_packet"
 
#define AST_RED_MAX_GENERATION   5
 
#define AST_RTP_CISCO_DTMF   (1 << 2)
 
#define AST_RTP_CN   (1 << 1)
 
#define AST_RTP_CODECS_NULL_INIT    { .codecs_lock = AST_RWLOCK_INIT_VALUE, .payload_mapping_rx = { 0, }, .payload_mapping_tx = { 0, }, .framing = 0, }
 
#define AST_RTP_DTMF   (1 << 0)
 
#define ast_rtp_engine_register(engine)   ast_rtp_engine_register2(engine, AST_MODULE_SELF)
 
#define ast_rtp_glue_register(glue)   ast_rtp_glue_register2(glue, AST_MODULE_SELF)
 
#define ast_rtp_instance_get_and_cmp_remote_address(instance, address)    ast_rtp_instance_get_and_cmp_requested_target_address((instance), (address))
 Get the address of the remote endpoint that we are sending RTP to, comparing its address to another. More...
 
#define ast_rtp_instance_get_remote_address(instance, address)    ast_rtp_instance_get_incoming_source_address((instance), (address))
 Get the address of the remote endpoint that we are sending RTP to. More...
 
#define ast_rtp_instance_set_remote_address(instance, address)    ast_rtp_instance_set_requested_target_address((instance), (address))
 Set the address of the remote endpoint that we are sending RTP to. More...
 
#define AST_RTP_MAX   AST_RTP_CISCO_DTMF
 
#define AST_RTP_MAX_PT   128
 
#define AST_RTP_PT_FIRST_DYNAMIC   96
 
#define AST_RTP_PT_LAST_REASSIGN   63
 
#define AST_RTP_PT_LAST_STATIC   34
 
#define AST_RTP_RTCP_FMT_FIR   4
 
#define AST_RTP_RTCP_FMT_NACK   1
 
#define AST_RTP_RTCP_FMT_PLI   1
 
#define AST_RTP_RTCP_FMT_REMB   15
 
#define AST_RTP_RTCP_FMT_TRANSPORT_WIDE_CC   15
 
#define AST_RTP_RTCP_PSFB   206
 
#define AST_RTP_RTCP_RR   201
 
#define AST_RTP_RTCP_RTPFB   205
 
#define AST_RTP_RTCP_SR   200
 
#define AST_RTP_STAT_SET(current_stat, combined, placement, value)
 
#define AST_RTP_STAT_STRCPY(current_stat, combined, placement, value)
 
#define AST_RTP_STAT_TERMINATOR(combined)
 
#define MAX_CHANNEL_ID   152
 

Enumerations

enum  ast_rtp_dtls_connection { AST_RTP_DTLS_CONNECTION_NEW , AST_RTP_DTLS_CONNECTION_EXISTING }
 DTLS connection states. More...
 
enum  ast_rtp_dtls_hash { AST_RTP_DTLS_HASH_SHA256 , AST_RTP_DTLS_HASH_SHA1 }
 DTLS fingerprint hashes. More...
 
enum  ast_rtp_dtls_setup { AST_RTP_DTLS_SETUP_ACTIVE , AST_RTP_DTLS_SETUP_PASSIVE , AST_RTP_DTLS_SETUP_ACTPASS , AST_RTP_DTLS_SETUP_HOLDCONN }
 DTLS setup types. More...
 
enum  ast_rtp_dtls_verify { AST_RTP_DTLS_VERIFY_NONE = 0 , AST_RTP_DTLS_VERIFY_FINGERPRINT = (1 << 0) , AST_RTP_DTLS_VERIFY_CERTIFICATE = (1 << 1) }
 DTLS verification settings. More...
 
enum  ast_rtp_dtmf_mode { AST_RTP_DTMF_MODE_NONE = 0 , AST_RTP_DTMF_MODE_RFC2833 , AST_RTP_DTMF_MODE_INBAND }
 
enum  ast_rtp_extension { AST_RTP_EXTENSION_UNSUPPORTED = 0 , AST_RTP_EXTENSION_ABS_SEND_TIME , AST_RTP_EXTENSION_TRANSPORT_WIDE_CC , AST_RTP_EXTENSION_MAX }
 Known RTP extensions. More...
 
enum  ast_rtp_extension_direction {
  AST_RTP_EXTENSION_DIRECTION_NONE , AST_RTP_EXTENSION_DIRECTION_SENDRECV , AST_RTP_EXTENSION_DIRECTION_SENDONLY , AST_RTP_EXTENSION_DIRECTION_RECVONLY ,
  AST_RTP_EXTENSION_DIRECTION_INACTIVE
}
 Directions for RTP extensions. More...
 
enum  ast_rtp_glue_result { AST_RTP_GLUE_RESULT_FORBID = 0 , AST_RTP_GLUE_RESULT_REMOTE , AST_RTP_GLUE_RESULT_LOCAL }
 
enum  ast_rtp_ice_candidate_type { AST_RTP_ICE_CANDIDATE_TYPE_HOST , AST_RTP_ICE_CANDIDATE_TYPE_SRFLX , AST_RTP_ICE_CANDIDATE_TYPE_RELAYED }
 ICE candidate types. More...
 
enum  ast_rtp_ice_component_type { AST_RTP_ICE_COMPONENT_RTP = 1 , AST_RTP_ICE_COMPONENT_RTCP = 2 }
 ICE component types. More...
 
enum  ast_rtp_ice_role { AST_RTP_ICE_ROLE_CONTROLLED , AST_RTP_ICE_ROLE_CONTROLLING }
 ICE role during negotiation. More...
 
enum  ast_rtp_instance_rtcp { AST_RTP_INSTANCE_RTCP_DISABLED = 0 , AST_RTP_INSTANCE_RTCP_STANDARD , AST_RTP_INSTANCE_RTCP_MUX }
 
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 , AST_RTP_INSTANCE_STAT_CHANNEL_UNIQUEID , AST_RTP_INSTANCE_STAT_TXOCTETCOUNT , AST_RTP_INSTANCE_STAT_RXOCTETCOUNT
}
 
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_ASYMMETRIC_CODEC , AST_RTP_PROPERTY_RETRANS_RECV , AST_RTP_PROPERTY_RETRANS_SEND ,
  AST_RTP_PROPERTY_REMB , AST_RTP_PROPERTY_MAX
}
 

Functions

uintmax_t ast_debug_category_dtls_id (void)
 
uintmax_t ast_debug_category_dtls_packet_id (void)
 
uintmax_t ast_debug_category_ice_id (void)
 
uintmax_t ast_debug_category_rtcp_id (void)
 
uintmax_t ast_debug_category_rtcp_packet_id (void)
 
uintmax_t ast_debug_category_rtp_id (void)
 
uintmax_t ast_debug_category_rtp_packet_id (void)
 
int ast_rtp_codecs_find_payload_code (struct ast_rtp_codecs *codecs, int payload)
 Search for the tx payload type in the ast_rtp_codecs structure. More...
 
unsigned int ast_rtp_codecs_get_framing (struct ast_rtp_codecs *codecs)
 Get the framing used for a set of codecs. More...
 
struct ast_rtp_payload_typeast_rtp_codecs_get_payload (struct ast_rtp_codecs *codecs, int payload)
 Retrieve rx payload mapped information by payload type. More...
 
struct ast_formatast_rtp_codecs_get_payload_format (struct ast_rtp_codecs *codecs, int payload)
 Retrieve the actual ast_format stored on the codecs structure for a specific tx payload type. More...
 
enum ast_media_type ast_rtp_codecs_get_stream_type (struct ast_rtp_codecs *codecs)
 Determine the type of RTP stream media from the codecs mapped. More...
 
int ast_rtp_codecs_payload_code (struct ast_rtp_codecs *codecs, int asterisk_format, struct ast_format *format, int code)
 Retrieve a rx mapped payload type based on whether it is an Asterisk format and the code. More...
 
int ast_rtp_codecs_payload_code_tx (struct ast_rtp_codecs *codecs, int asterisk_format, const struct ast_format *format, int code)
 Retrieve a tx mapped payload type based on whether it is an Asterisk format and the code. More...
 
void ast_rtp_codecs_payload_formats (struct ast_rtp_codecs *codecs, struct ast_format_cap *astformats, int *nonastformats)
 Retrieve all formats that were found. More...
 
int ast_rtp_codecs_payload_replace_format (struct ast_rtp_codecs *codecs, int payload, struct ast_format *format)
 Update the format associated with a tx payload type in a codecs structure. More...
 
int ast_rtp_codecs_payload_set_rx (struct ast_rtp_codecs *codecs, int code, struct ast_format *format)
 Set a payload code for use with a specific Asterisk format. More...
 
void ast_rtp_codecs_payloads_clear (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
 Clear rx and tx payload mapping information from an RTP instance. More...
 
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. More...
 
void ast_rtp_codecs_payloads_destroy (struct ast_rtp_codecs *codecs)
 Destroy the contents of an RTP codecs structure (but not the structure itself) More...
 
int ast_rtp_codecs_payloads_initialize (struct ast_rtp_codecs *codecs)
 Initialize an RTP codecs structure. More...
 
void ast_rtp_codecs_payloads_set_m_type (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 Record tx payload type information that was seen in an m= SDP line. More...
 
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 tx payload type information that was seen in an a=rtpmap: SDP line. More...
 
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 tx payload type to a known MIME media type for a codec with a specific sample rate. More...
 
void ast_rtp_codecs_payloads_unset (struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
 Remove tx payload type mapped information. More...
 
void ast_rtp_codecs_payloads_xover (struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
 Crossover copy the tx payload mapping of src to the rx payload mapping of dest. More...
 
void ast_rtp_codecs_set_framing (struct ast_rtp_codecs *codecs, unsigned int framing)
 Set the framing used for a set of codecs. More...
 
struct ast_jsonast_rtp_convert_stats_json (const struct ast_rtp_instance_stats *stats)
 Convert given stat instance into json format. More...
 
void ast_rtp_dtls_cfg_copy (const struct ast_rtp_dtls_cfg *src_cfg, struct ast_rtp_dtls_cfg *dst_cfg)
 Copy contents of a DTLS configuration structure. More...
 
void ast_rtp_dtls_cfg_free (struct ast_rtp_dtls_cfg *dtls_cfg)
 Free contents of a DTLS configuration structure. More...
 
int ast_rtp_dtls_cfg_parse (struct ast_rtp_dtls_cfg *dtls_cfg, const char *name, const char *value)
 Parse DTLS related configuration options. More...
 
int ast_rtp_dtls_cfg_validate (struct ast_rtp_dtls_cfg *dtls_cfg)
 Validates DTLS related configuration options. More...
 
struct ast_rtp_payload_typeast_rtp_engine_alloc_payload_type (void)
 Allocation routine for ast_rtp_payload_type. More...
 
int ast_rtp_engine_load_format (struct ast_format *format)
 Custom formats declared in codecs.conf at startup must be communicated to the rtp_engine so their mime type can payload number can be initialized. More...
 
int ast_rtp_engine_register2 (struct ast_rtp_engine *engine, struct ast_module *module)
 Register an RTP engine. More...
 
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_unload_format (struct ast_format *format)
 Formats requiring the use of a format attribute interface must have that interface registered in order for the rtp engine to handle it correctly. If an attribute interface is unloaded, this function must be called to notify the rtp_engine. More...
 
int ast_rtp_engine_unregister (struct ast_rtp_engine *engine)
 Unregister an RTP engine. More...
 
void ast_rtp_engine_unregister_srtp (void)
 
int ast_rtp_get_rate (const struct ast_format *format)
 Retrieve the sample rate of a format according to RTP specifications. More...
 
int ast_rtp_glue_register2 (struct ast_rtp_glue *glue, struct ast_module *module)
 Register RTP glue. More...
 
int ast_rtp_glue_unregister (struct ast_rtp_glue *glue)
 Unregister RTP glue. More...
 
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. More...
 
int ast_rtp_instance_add_srtp_policy (struct ast_rtp_instance *instance, struct ast_srtp_policy *remote_policy, struct ast_srtp_policy *local_policy, int rtcp)
 Add or replace the SRTP policies for the given RTP instance. More...
 
void ast_rtp_instance_available_formats (struct ast_rtp_instance *instance, struct ast_format_cap *to_endpoint, struct ast_format_cap *to_asterisk, struct ast_format_cap *result)
 Request the formats that can be transcoded. More...
 
int ast_rtp_instance_bundle (struct ast_rtp_instance *child, struct ast_rtp_instance *parent)
 Request that an RTP instance be bundled with another. More...
 
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. More...
 
int ast_rtp_instance_destroy (struct ast_rtp_instance *instance)
 Destroy an RTP instance. More...
 
int ast_rtp_instance_dtmf_begin (struct ast_rtp_instance *instance, char digit)
 Begin sending a DTMF digit. More...
 
int ast_rtp_instance_dtmf_end (struct ast_rtp_instance *instance, char digit)
 Stop sending a DTMF digit. More...
 
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. More...
 
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. More...
 
int ast_rtp_instance_early_bridge (struct ast_channel *c0, struct ast_channel *c1)
 Early bridge two channels that use RTP instances. More...
 
void ast_rtp_instance_early_bridge_make_compatible (struct ast_channel *c_dst, struct ast_channel *c_src)
 Make two channels compatible for early bridging. More...
 
void ast_rtp_instance_extmap_clear (struct ast_rtp_instance *instance)
 Clear negotiated RTP extension information. More...
 
size_t ast_rtp_instance_extmap_count (struct ast_rtp_instance *instance)
 Get the number of known unique identifiers. More...
 
int ast_rtp_instance_extmap_enable (struct ast_rtp_instance *instance, int id, enum ast_rtp_extension extension, enum ast_rtp_extension_direction direction)
 Enable support for an RTP extension on an instance. More...
 
enum ast_rtp_extension_direction ast_rtp_instance_extmap_get_direction (struct ast_rtp_instance *instance, int id)
 Retrieve the negotiated direction for an RTP extension id. More...
 
enum ast_rtp_extension ast_rtp_instance_extmap_get_extension (struct ast_rtp_instance *instance, int id)
 Retrieve the extension for an RTP extension id. More...
 
int ast_rtp_instance_extmap_get_id (struct ast_rtp_instance *instance, enum ast_rtp_extension extension)
 Retrieve the id for an RTP extension. More...
 
const char * ast_rtp_instance_extmap_get_uri (struct ast_rtp_instance *instance, int id)
 Retrieve the URI for an RTP extension id. More...
 
int ast_rtp_instance_extmap_negotiate (struct ast_rtp_instance *instance, int id, enum ast_rtp_extension_direction direction, const char *uri, const char *attributes)
 Negotiate received RTP extension information. More...
 
int ast_rtp_instance_fd (struct ast_rtp_instance *instance, int rtcp)
 Get the file descriptor for an RTP session (or RTCP) More...
 
struct ast_rtp_glueast_rtp_instance_get_active_glue (struct ast_rtp_instance *instance)
 Get the RTP glue in use on an RTP instance. More...
 
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. More...
 
int ast_rtp_instance_get_and_cmp_requested_target_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the requested target address of the remote endpoint and compare it to the given address. More...
 
struct ast_rtp_instanceast_rtp_instance_get_bridged (struct ast_rtp_instance *instance)
 Get the other RTP instance that an instance is bridged to. More...
 
const char * ast_rtp_instance_get_channel_id (struct ast_rtp_instance *instance)
 Get the unique ID of the channel that owns this RTP instance. More...
 
const char * ast_rtp_instance_get_cname (struct ast_rtp_instance *rtp)
 Retrieve the CNAME used in RTCP SDES items. More...
 
struct ast_rtp_codecsast_rtp_instance_get_codecs (struct ast_rtp_instance *instance)
 Get the codecs structure of an RTP instance. More...
 
void * ast_rtp_instance_get_data (struct ast_rtp_instance *instance)
 Get the data portion of an RTP instance. More...
 
struct ast_rtp_engine_dtlsast_rtp_instance_get_dtls (struct ast_rtp_instance *instance)
 Obtain a pointer to the DTLS support present on an RTP instance. More...
 
struct ast_rtp_engineast_rtp_instance_get_engine (struct ast_rtp_instance *instance)
 Get the RTP engine in use on an RTP instance. More...
 
void * ast_rtp_instance_get_extended_prop (struct ast_rtp_instance *instance, int property)
 Get the value of an RTP instance extended property. More...
 
struct ast_rtp_glueast_rtp_instance_get_glue (const char *type)
 Get the RTP glue that binds a channel to the RTP engine. More...
 
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. More...
 
struct ast_rtp_engine_iceast_rtp_instance_get_ice (struct ast_rtp_instance *instance)
 Obtain a pointer to the ICE support present on an RTP instance. More...
 
void ast_rtp_instance_get_incoming_source_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the incoming source address of the remote endpoint. More...
 
int ast_rtp_instance_get_keepalive (struct ast_rtp_instance *instance)
 Get the RTP keepalive interval. More...
 
time_t ast_rtp_instance_get_last_rx (const struct ast_rtp_instance *rtp)
 Get the last RTP reception time. More...
 
time_t ast_rtp_instance_get_last_tx (const struct ast_rtp_instance *rtp)
 Get the last RTP transmission time. More...
 
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. More...
 
int ast_rtp_instance_get_prop (struct ast_rtp_instance *instance, enum ast_rtp_property property)
 Get the value of an RTP instance property. More...
 
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. More...
 
void ast_rtp_instance_get_requested_target_address (struct ast_rtp_instance *instance, struct ast_sockaddr *address)
 Get the requested target address of the remote endpoint. More...
 
struct ast_srtpast_rtp_instance_get_srtp (struct ast_rtp_instance *instance, int rtcp)
 Obtain the SRTP instance associated with an RTP instance. More...
 
unsigned int ast_rtp_instance_get_ssrc (struct ast_rtp_instance *rtp)
 Retrieve the local SSRC value that we will be using. More...
 
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. More...
 
struct ast_jsonast_rtp_instance_get_stats_all_json (struct ast_rtp_instance *instance)
 Retrieve statistics about an RTP instance in json format. More...
 
int ast_rtp_instance_get_timeout (struct ast_rtp_instance *instance)
 Get the RTP timeout value. More...
 
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. More...
 
struct ast_rtp_instanceast_rtp_instance_new (const char *engine_name, struct ast_sched_context *sched, const struct ast_sockaddr *sa, void *data)
 Create a new RTP instance. More...
 
struct ast_frameast_rtp_instance_read (struct ast_rtp_instance *instance, int rtcp)
 Receive a frame over RTP. More...
 
int ast_rtp_instance_sendcng (struct ast_rtp_instance *instance, int level)
 Send a comfort noise packet to the RTP instance. More...
 
void ast_rtp_instance_set_bridged (struct ast_rtp_instance *instance, struct ast_rtp_instance *bridged)
 Set the other RTP instance that an instance is bridged to. More...
 
void ast_rtp_instance_set_channel_id (struct ast_rtp_instance *instance, const char *uniqueid)
 Set the channel that owns this RTP instance. More...
 
void ast_rtp_instance_set_data (struct ast_rtp_instance *instance, void *data)
 Set the data portion of an RTP instance. More...
 
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. More...
 
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. More...
 
int ast_rtp_instance_set_incoming_source_address (struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
 Set the incoming source address of the remote endpoint that we are sending RTP to. More...
 
void ast_rtp_instance_set_keepalive (struct ast_rtp_instance *instance, int timeout)
 Set the RTP keepalive interval. More...
 
void ast_rtp_instance_set_last_rx (struct ast_rtp_instance *rtp, time_t time)
 Set the last RTP reception time. More...
 
void ast_rtp_instance_set_last_tx (struct ast_rtp_instance *rtp, time_t time)
 Set the last RTP transmission time. More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_rtp_instance_set_read_format (struct ast_rtp_instance *instance, struct ast_format *format)
 Request that the underlying RTP engine provide audio frames in a specific format. More...
 
void ast_rtp_instance_set_remote_ssrc (struct ast_rtp_instance *rtp, unsigned int ssrc)
 Set the remote SSRC for an RTP instance. More...
 
int ast_rtp_instance_set_requested_target_address (struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
 Set the requested target address of the remote endpoint. More...
 
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. More...
 
void ast_rtp_instance_set_stream_num (struct ast_rtp_instance *instance, int stream_num)
 Set the stream number for an RTP instance. More...
 
void ast_rtp_instance_set_timeout (struct ast_rtp_instance *instance, int timeout)
 Set the RTP timeout value. More...
 
int ast_rtp_instance_set_write_format (struct ast_rtp_instance *instance, struct ast_format *format)
 Tell underlying RTP engine that audio frames will be provided in a specific format. More...
 
void ast_rtp_instance_stop (struct ast_rtp_instance *instance)
 Stop an RTP instance. More...
 
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. More...
 
void ast_rtp_instance_update_source (struct ast_rtp_instance *instance)
 Indicate that the RTP marker bit should be set on an RTP stream. More...
 
int ast_rtp_instance_write (struct ast_rtp_instance *instance, struct ast_frame *frame)
 Send a frame out over RTP. More...
 
char * ast_rtp_lookup_mime_multiple2 (struct ast_str *buf, struct ast_format_cap *ast_format_capability, int rtp_capability, const int asterisk_format, enum ast_rtp_options options)
 Convert formats into a string and put them into a buffer. More...
 
const char * ast_rtp_lookup_mime_subtype2 (const int asterisk_format, const struct ast_format *format, int code, enum ast_rtp_options options)
 Retrieve mime subtype information on a payload. More...
 
unsigned int ast_rtp_lookup_sample_rate2 (int asterisk_format, const struct ast_format *format, int code)
 Get the sample rate associated with known RTP payload types. More...
 
void ast_rtp_publish_rtcp_message (struct ast_rtp_instance *rtp, struct stasis_message_type *message_type, struct ast_rtp_rtcp_report *report, struct ast_json *blob)
 Publish an RTCP message to Stasis Message Bus API. More...
 
int ast_rtp_red_buffer (struct ast_rtp_instance *instance, struct ast_frame *frame)
 Buffer a frame in an RTP instance for RED. More...
 
int ast_rtp_red_init (struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
 Initialize RED support on an RTP instance. More...
 
struct stasis_message_typeast_rtp_rtcp_received_type (void)
 Message type for an RTCP message received from some external source. More...
 
struct ast_rtp_rtcp_reportast_rtp_rtcp_report_alloc (unsigned int report_blocks)
 Allocate an ao2 ref counted instance of ast_rtp_rtcp_report. More...
 
struct stasis_message_typeast_rtp_rtcp_sent_type (void)
 Message type for an RTCP message sent from this Asterisk instance. More...
 
struct stasis_topicast_rtp_topic (void)
 Stasis Message Bus API topic for RTP and RTCP related messages More...
 

Detailed Description

Pluggable RTP Architecture.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om Asterisk RTP Engine API

Definition in file rtp_engine.h.

Macro Definition Documentation

◆ AST_DEBUG_CATEGORY_DTLS

#define AST_DEBUG_CATEGORY_DTLS   ast_debug_category_dtls_id() /* DTLS debug logging category id */

Definition at line 2850 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_DTLS_PACKET

#define AST_DEBUG_CATEGORY_DTLS_PACKET   ast_debug_category_dtls_packet_id() /* DTLS packet debug logging category id */

Definition at line 2851 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_ICE

#define AST_DEBUG_CATEGORY_ICE   ast_debug_category_ice_id() /* ICE debug logging category id */

Definition at line 2852 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_RTCP

#define AST_DEBUG_CATEGORY_RTCP   ast_debug_category_rtcp_id() /* RTCP debug logging category id */

Definition at line 2848 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_RTCP_PACKET

#define AST_DEBUG_CATEGORY_RTCP_PACKET   ast_debug_category_rtcp_packet_id() /* RTCP packet debug logging category id */

Definition at line 2849 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_RTP

#define AST_DEBUG_CATEGORY_RTP   ast_debug_category_rtp_id() /* RTP debug logging category id */

Definition at line 2846 of file rtp_engine.h.

◆ AST_DEBUG_CATEGORY_RTP_PACKET

#define AST_DEBUG_CATEGORY_RTP_PACKET   ast_debug_category_rtp_packet_id() /* RTP packet debug logging category id */

Definition at line 2847 of file rtp_engine.h.

◆ ast_debug_dtls

#define ast_debug_dtls (   sublevel,
  ... 
)     ast_debug_category(sublevel, AST_DEBUG_CATEGORY_DTLS, __VA_ARGS__)

Log debug level DTLS information.

Parameters
sublevelDebug output sublevel (>= 0)
...String format and any associated arguments

Definition at line 2886 of file rtp_engine.h.

◆ ast_debug_dtls_packet_is_allowed

Definition at line 2890 of file rtp_engine.h.

◆ ast_debug_ice

#define ast_debug_ice (   sublevel,
  ... 
)     ast_debug_category(sublevel, AST_DEBUG_CATEGORY_ICE, __VA_ARGS__)

Log debug level ICE information.

Parameters
sublevelDebug output sublevel (>= 0)
...String format and any associated arguments

Definition at line 2898 of file rtp_engine.h.

◆ ast_debug_rtcp

#define ast_debug_rtcp (   sublevel,
  ... 
)     ast_debug_category(sublevel, AST_DEBUG_CATEGORY_RTCP, __VA_ARGS__)

Log debug level RTCP information.

Parameters
sublevelDebug output sublevel (>= 0)
...String format and any associated arguments

Definition at line 2873 of file rtp_engine.h.

◆ ast_debug_rtcp_packet_is_allowed

Definition at line 2877 of file rtp_engine.h.

◆ ast_debug_rtp

#define ast_debug_rtp (   sublevel,
  ... 
)     ast_debug_category(sublevel, AST_DEBUG_CATEGORY_RTP, __VA_ARGS__)

Log debug level RTP information.

Parameters
sublevelDebug output sublevel (>= 0)
...String format and any associated arguments

Definition at line 2860 of file rtp_engine.h.

◆ ast_debug_rtp_packet_is_allowed

Definition at line 2864 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_DTLS

#define AST_LOG_CATEGORY_DTLS   "dtls"

Definition at line 2832 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_DTLS_PACKET

#define AST_LOG_CATEGORY_DTLS_PACKET   "dtls_packet"

Definition at line 2834 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_ICE

#define AST_LOG_CATEGORY_ICE   "ice"

Definition at line 2836 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_RTCP

#define AST_LOG_CATEGORY_RTCP   "rtcp"

Definition at line 2828 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_RTCP_PACKET

#define AST_LOG_CATEGORY_RTCP_PACKET   "rtcp_packet"

Definition at line 2830 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_RTP

#define AST_LOG_CATEGORY_RTP   "rtp"

Definition at line 2824 of file rtp_engine.h.

◆ AST_LOG_CATEGORY_RTP_PACKET

#define AST_LOG_CATEGORY_RTP_PACKET   "rtp_packet"

Definition at line 2826 of file rtp_engine.h.

◆ AST_RED_MAX_GENERATION

#define AST_RED_MAX_GENERATION   5

Maximum number of generations

Definition at line 98 of file rtp_engine.h.

◆ AST_RTP_CISCO_DTMF

#define AST_RTP_CISCO_DTMF   (1 << 2)

DTMF (Cisco Proprietary)

Definition at line 270 of file rtp_engine.h.

◆ AST_RTP_CN

#define AST_RTP_CN   (1 << 1)

'Comfort Noise' (RFC3389)

Definition at line 268 of file rtp_engine.h.

◆ AST_RTP_CODECS_NULL_INIT

#define AST_RTP_CODECS_NULL_INIT    { .codecs_lock = AST_RWLOCK_INIT_VALUE, .payload_mapping_rx = { 0, }, .payload_mapping_tx = { 0, }, .framing = 0, }

Definition at line 716 of file rtp_engine.h.

◆ AST_RTP_DTMF

#define AST_RTP_DTMF   (1 << 0)

DTMF (RFC2833)

Definition at line 266 of file rtp_engine.h.

◆ ast_rtp_engine_register

#define ast_rtp_engine_register (   engine)    ast_rtp_engine_register2(engine, AST_MODULE_SELF)

Definition at line 794 of file rtp_engine.h.

◆ ast_rtp_glue_register

#define ast_rtp_glue_register (   glue)    ast_rtp_glue_register2(glue, AST_MODULE_SELF)

Definition at line 847 of file rtp_engine.h.

◆ ast_rtp_instance_get_and_cmp_remote_address

#define ast_rtp_instance_get_and_cmp_remote_address (   instance,
  address 
)     ast_rtp_instance_get_and_cmp_requested_target_address((instance), (address))

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

Parameters
instanceThe instance that we want to get the remote address for
addressAn initialized address that may be overwritten if the remote address is different
Return values
0address was not changed
1address was changed Example usage:
int ret;
char * address
Definition: f2c.h:59
#define ast_rtp_instance_get_and_cmp_remote_address(instance, address)
Get the address of the remote endpoint that we are sending RTP to, comparing its address to another.
Definition: rtp_engine.h:1228
Socket address structure.
Definition: netsock2.h:97

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 1228 of file rtp_engine.h.

◆ ast_rtp_instance_get_remote_address

#define ast_rtp_instance_get_remote_address (   instance,
  address 
)     ast_rtp_instance_get_incoming_source_address((instance), (address))

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

Parameters
instanceThe instance that we want to get the remote address for
addressA structure to put the address into

Example usage:

#define ast_rtp_instance_get_remote_address(instance, address)
Get the address of the remote endpoint that we are sending RTP to.
Definition: rtp_engine.h:1192

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 1192 of file rtp_engine.h.

◆ ast_rtp_instance_set_remote_address

#define ast_rtp_instance_set_remote_address (   instance,
  address 
)     ast_rtp_instance_set_requested_target_address((instance), (address))

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

Parameters
instanceThe RTP instance to change the address on
addressAddress to set it to
Return values
0success
-1failure

Example usage:

#define ast_rtp_instance_set_remote_address(instance, address)
Set the address of the remote endpoint that we are sending RTP to.
Definition: rtp_engine.h:1080

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 1080 of file rtp_engine.h.

◆ AST_RTP_MAX

#define AST_RTP_MAX   AST_RTP_CISCO_DTMF

Maximum RTP-specific code

Definition at line 272 of file rtp_engine.h.

◆ AST_RTP_MAX_PT

#define AST_RTP_MAX_PT   128

Maximum number of payload types RTP can support.

Definition at line 83 of file rtp_engine.h.

◆ AST_RTP_PT_FIRST_DYNAMIC

#define AST_RTP_PT_FIRST_DYNAMIC   96

First dynamic RTP payload type

Definition at line 92 of file rtp_engine.h.

◆ AST_RTP_PT_LAST_REASSIGN

#define AST_RTP_PT_LAST_REASSIGN   63

Last reassignable RTP payload type

Definition at line 95 of file rtp_engine.h.

◆ AST_RTP_PT_LAST_STATIC

#define AST_RTP_PT_LAST_STATIC   34

Last RTP payload type statically assigned, see http://www.iana.org/assignments/rtp-parameters

Definition at line 89 of file rtp_engine.h.

◆ AST_RTP_RTCP_FMT_FIR

#define AST_RTP_RTCP_FMT_FIR   4

Full INTRA-frame Request (From RFC5104)

Definition at line 307 of file rtp_engine.h.

◆ AST_RTP_RTCP_FMT_NACK

#define AST_RTP_RTCP_FMT_NACK   1

Generic NACK (From RFC4585 also RFC5104)

Definition at line 303 of file rtp_engine.h.

◆ AST_RTP_RTCP_FMT_PLI

#define AST_RTP_RTCP_FMT_PLI   1

Picture loss indication (From RFC4585)

Definition at line 305 of file rtp_engine.h.

◆ AST_RTP_RTCP_FMT_REMB

#define AST_RTP_RTCP_FMT_REMB   15

REMB Information (From draft-alvestrand-rmcat-remb-03)

Definition at line 309 of file rtp_engine.h.

◆ AST_RTP_RTCP_FMT_TRANSPORT_WIDE_CC

#define AST_RTP_RTCP_FMT_TRANSPORT_WIDE_CC   15

Transport-wide congestion control feedback (From draft-holmer-rmcat-transport-wide-cc-extensions-01)

Definition at line 311 of file rtp_engine.h.

◆ AST_RTP_RTCP_PSFB

#define AST_RTP_RTCP_PSFB   206

Payload Specific Feed Back (From RFC4585 also RFC5104)

Definition at line 299 of file rtp_engine.h.

◆ AST_RTP_RTCP_RR

#define AST_RTP_RTCP_RR   201

Receiver Report

Definition at line 295 of file rtp_engine.h.

◆ AST_RTP_RTCP_RTPFB

#define AST_RTP_RTCP_RTPFB   205

Transport Layer Feed Back (From RFC4585 also RFC5104)

Definition at line 297 of file rtp_engine.h.

◆ AST_RTP_RTCP_SR

#define AST_RTP_RTCP_SR   200

Sender Report

Definition at line 293 of file rtp_engine.h.

◆ AST_RTP_STAT_SET

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

Definition at line 433 of file rtp_engine.h.

◆ AST_RTP_STAT_STRCPY

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

Definition at line 441 of file rtp_engine.h.

◆ AST_RTP_STAT_TERMINATOR

#define AST_RTP_STAT_TERMINATOR (   combined)
Value:
if (stat == combined) { \
return 0; \
}

Definition at line 449 of file rtp_engine.h.

◆ MAX_CHANNEL_ID

#define MAX_CHANNEL_ID   152

Maximum size of an internal Asterisk channel unique ID.

Note
Must match the AST_MAX_UNIQUEID(AST_MAX_PUBLIC_UNIQUEID) value. We don't use that defined value directly here to avoid a hard dependency on channel.h.

Definition at line 107 of file rtp_engine.h.

Enumeration Type Documentation

◆ ast_rtp_dtls_connection

DTLS connection states.

Enumerator
AST_RTP_DTLS_CONNECTION_NEW 

Endpoint wants to use a new connection

AST_RTP_DTLS_CONNECTION_EXISTING 

Endpoint wishes to use existing connection

Definition at line 521 of file rtp_engine.h.

521  {
522  AST_RTP_DTLS_CONNECTION_NEW, /*!< Endpoint wants to use a new connection */
523  AST_RTP_DTLS_CONNECTION_EXISTING, /*!< Endpoint wishes to use existing connection */
524 };
@ AST_RTP_DTLS_CONNECTION_NEW
Definition: rtp_engine.h:522
@ AST_RTP_DTLS_CONNECTION_EXISTING
Definition: rtp_engine.h:523

◆ ast_rtp_dtls_hash

DTLS fingerprint hashes.

Enumerator
AST_RTP_DTLS_HASH_SHA256 

SHA-256 fingerprint hash

AST_RTP_DTLS_HASH_SHA1 

SHA-1 fingerprint hash

Definition at line 527 of file rtp_engine.h.

527  {
528  AST_RTP_DTLS_HASH_SHA256, /*!< SHA-256 fingerprint hash */
529  AST_RTP_DTLS_HASH_SHA1, /*!< SHA-1 fingerprint hash */
530 };
@ AST_RTP_DTLS_HASH_SHA1
Definition: rtp_engine.h:529
@ AST_RTP_DTLS_HASH_SHA256
Definition: rtp_engine.h:528

◆ ast_rtp_dtls_setup

DTLS setup types.

Enumerator
AST_RTP_DTLS_SETUP_ACTIVE 

Endpoint is willing to inititate connections

AST_RTP_DTLS_SETUP_PASSIVE 

Endpoint is willing to accept connections

AST_RTP_DTLS_SETUP_ACTPASS 

Endpoint is willing to both accept and initiate connections

AST_RTP_DTLS_SETUP_HOLDCONN 

Endpoint does not want the connection to be established right now

Definition at line 513 of file rtp_engine.h.

513  {
514  AST_RTP_DTLS_SETUP_ACTIVE, /*!< Endpoint is willing to inititate connections */
515  AST_RTP_DTLS_SETUP_PASSIVE, /*!< Endpoint is willing to accept connections */
516  AST_RTP_DTLS_SETUP_ACTPASS, /*!< Endpoint is willing to both accept and initiate connections */
517  AST_RTP_DTLS_SETUP_HOLDCONN, /*!< Endpoint does not want the connection to be established right now */
518 };
@ AST_RTP_DTLS_SETUP_PASSIVE
Definition: rtp_engine.h:515
@ AST_RTP_DTLS_SETUP_HOLDCONN
Definition: rtp_engine.h:517
@ AST_RTP_DTLS_SETUP_ACTPASS
Definition: rtp_engine.h:516
@ AST_RTP_DTLS_SETUP_ACTIVE
Definition: rtp_engine.h:514

◆ ast_rtp_dtls_verify

DTLS verification settings.

Enumerator
AST_RTP_DTLS_VERIFY_NONE 

Don't verify anything

AST_RTP_DTLS_VERIFY_FINGERPRINT 

Verify the fingerprint

AST_RTP_DTLS_VERIFY_CERTIFICATE 

Verify the certificate

Definition at line 533 of file rtp_engine.h.

533  {
534  AST_RTP_DTLS_VERIFY_NONE = 0, /*!< Don't verify anything */
535  AST_RTP_DTLS_VERIFY_FINGERPRINT = (1 << 0), /*!< Verify the fingerprint */
536  AST_RTP_DTLS_VERIFY_CERTIFICATE = (1 << 1), /*!< Verify the certificate */
537 };
@ AST_RTP_DTLS_VERIFY_NONE
Definition: rtp_engine.h:534
@ AST_RTP_DTLS_VERIFY_FINGERPRINT
Definition: rtp_engine.h:535
@ AST_RTP_DTLS_VERIFY_CERTIFICATE
Definition: rtp_engine.h:536

◆ 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 148 of file rtp_engine.h.

148  {
149  /*! No DTMF is being carried over the RTP stream */
151  /*! DTMF is being carried out of band using RFC2833 */
153  /*! DTMF is being carried inband over the RTP stream */
155 };
@ AST_RTP_DTMF_MODE_RFC2833
Definition: rtp_engine.h:152
@ AST_RTP_DTMF_MODE_INBAND
Definition: rtp_engine.h:154
@ AST_RTP_DTMF_MODE_NONE
Definition: rtp_engine.h:150

◆ ast_rtp_extension

Known RTP extensions.

Enumerator
AST_RTP_EXTENSION_UNSUPPORTED 

Per the RFC 0 should not be used, so we treat it as an unsupported extension placeholder

AST_RTP_EXTENSION_ABS_SEND_TIME 

abs-send-time from https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03

AST_RTP_EXTENSION_TRANSPORT_WIDE_CC 

transport-cc from https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01

AST_RTP_EXTENSION_MAX 

The maximum number of known RTP extensions

Definition at line 542 of file rtp_engine.h.

542  {
543  /*! Per the RFC 0 should not be used, so we treat it as an unsupported extension placeholder */
545  /*! abs-send-time from https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03 */
547  /*! transport-cc from https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 */
549  /*! The maximum number of known RTP extensions */
551 };
@ AST_RTP_EXTENSION_MAX
Definition: rtp_engine.h:550
@ AST_RTP_EXTENSION_TRANSPORT_WIDE_CC
Definition: rtp_engine.h:548
@ AST_RTP_EXTENSION_ABS_SEND_TIME
Definition: rtp_engine.h:546
@ AST_RTP_EXTENSION_UNSUPPORTED
Definition: rtp_engine.h:544

◆ ast_rtp_extension_direction

Directions for RTP extensions.

Enumerator
AST_RTP_EXTENSION_DIRECTION_NONE 

The extension is not negotiated and is not flowing

AST_RTP_EXTENSION_DIRECTION_SENDRECV 

Send and receive

AST_RTP_EXTENSION_DIRECTION_SENDONLY 

Send only

AST_RTP_EXTENSION_DIRECTION_RECVONLY 

Receive only

AST_RTP_EXTENSION_DIRECTION_INACTIVE 

Negotiated but not sending or receiving

Definition at line 769 of file rtp_engine.h.

769  {
770  /*! The extension is not negotiated and is not flowing */
772  /*! Send and receive */
774  /*! Send only */
776  /*! Receive only */
778  /*! Negotiated but not sending or receiving */
780 };
@ AST_RTP_EXTENSION_DIRECTION_SENDRECV
Definition: rtp_engine.h:773
@ AST_RTP_EXTENSION_DIRECTION_NONE
Definition: rtp_engine.h:771
@ AST_RTP_EXTENSION_DIRECTION_INACTIVE
Definition: rtp_engine.h:779
@ AST_RTP_EXTENSION_DIRECTION_RECVONLY
Definition: rtp_engine.h:777
@ AST_RTP_EXTENSION_DIRECTION_SENDONLY
Definition: rtp_engine.h:775

◆ 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 158 of file rtp_engine.h.

158  {
159  /*! No remote or local bridging is permitted */
161  /*! Move RTP stream to be remote between devices directly */
163  /*! Perform RTP engine level bridging if possible */
165 };
@ AST_RTP_GLUE_RESULT_LOCAL
Definition: rtp_engine.h:164
@ AST_RTP_GLUE_RESULT_REMOTE
Definition: rtp_engine.h:162
@ AST_RTP_GLUE_RESULT_FORBID
Definition: rtp_engine.h:160

◆ ast_rtp_ice_candidate_type

ICE candidate types.

Enumerator
AST_RTP_ICE_CANDIDATE_TYPE_HOST 

ICE host candidate. A host candidate represents the actual local transport address in the host.

AST_RTP_ICE_CANDIDATE_TYPE_SRFLX 

ICE server reflexive candidate, which represents the public mapped address of the local address.

AST_RTP_ICE_CANDIDATE_TYPE_RELAYED 

ICE relayed candidate, which represents the address allocated in TURN server.

Definition at line 455 of file rtp_engine.h.

455  {
456  AST_RTP_ICE_CANDIDATE_TYPE_HOST, /*!< ICE host candidate. A host candidate represents the actual local transport address in the host. */
457  AST_RTP_ICE_CANDIDATE_TYPE_SRFLX, /*!< ICE server reflexive candidate, which represents the public mapped address of the local address. */
458  AST_RTP_ICE_CANDIDATE_TYPE_RELAYED, /*!< ICE relayed candidate, which represents the address allocated in TURN server. */
459 };
@ AST_RTP_ICE_CANDIDATE_TYPE_RELAYED
Definition: rtp_engine.h:458
@ AST_RTP_ICE_CANDIDATE_TYPE_SRFLX
Definition: rtp_engine.h:457
@ AST_RTP_ICE_CANDIDATE_TYPE_HOST
Definition: rtp_engine.h:456

◆ ast_rtp_ice_component_type

ICE component types.

Enumerator
AST_RTP_ICE_COMPONENT_RTP 
AST_RTP_ICE_COMPONENT_RTCP 

Definition at line 462 of file rtp_engine.h.

462  {
465 };
@ AST_RTP_ICE_COMPONENT_RTCP
Definition: rtp_engine.h:464
@ AST_RTP_ICE_COMPONENT_RTP
Definition: rtp_engine.h:463

◆ ast_rtp_ice_role

ICE role during negotiation.

Enumerator
AST_RTP_ICE_ROLE_CONTROLLED 
AST_RTP_ICE_ROLE_CONTROLLING 

Definition at line 468 of file rtp_engine.h.

468  {
471 };
@ AST_RTP_ICE_ROLE_CONTROLLING
Definition: rtp_engine.h:470
@ AST_RTP_ICE_ROLE_CONTROLLED
Definition: rtp_engine.h:469

◆ ast_rtp_instance_rtcp

Enumerator
AST_RTP_INSTANCE_RTCP_DISABLED 

RTCP should not be sent/received

AST_RTP_INSTANCE_RTCP_STANDARD 

RTCP should be sent/received based on standard port rules

AST_RTP_INSTANCE_RTCP_MUX 

RTCP should be sent/received on the same port as RTP

Definition at line 255 of file rtp_engine.h.

255  {
256  /*! RTCP should not be sent/received */
258  /*! RTCP should be sent/received based on standard port rules */
260  /*! RTCP should be sent/received on the same port as RTP */
262 };
@ AST_RTP_INSTANCE_RTCP_MUX
Definition: rtp_engine.h:261
@ AST_RTP_INSTANCE_RTCP_STANDARD
Definition: rtp_engine.h:259
@ AST_RTP_INSTANCE_RTCP_DISABLED
Definition: rtp_engine.h:257

◆ 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

AST_RTP_INSTANCE_STAT_CHANNEL_UNIQUEID 

Retrieve channel unique ID

AST_RTP_INSTANCE_STAT_TXOCTETCOUNT 

Retrieve number of octets transmitted

AST_RTP_INSTANCE_STAT_RXOCTETCOUNT 

Retrieve number of octets received

Definition at line 180 of file rtp_engine.h.

180  {
181  /*! Retrieve all statistics */
183  /*! Retrieve number of packets transmitted */
185  /*! Retrieve number of packets received */
187  /*! Retrieve ALL statistics relating to packet loss */
189  /*! Retrieve number of packets lost for transmitting */
191  /*! Retrieve number of packets lost for receiving */
193  /*! Retrieve maximum number of packets lost on remote side */
195  /*! Retrieve minimum number of packets lost on remote side */
197  /*! Retrieve average number of packets lost on remote side */
199  /*! Retrieve standard deviation of packets lost on remote side */
201  /*! Retrieve maximum number of packets lost on local side */
203  /*! Retrieve minimum number of packets lost on local side */
205  /*! Retrieve average number of packets lost on local side */
207  /*! Retrieve standard deviation of packets lost on local side */
209  /*! Retrieve ALL statistics relating to jitter */
211  /*! Retrieve jitter on transmitted packets */
213  /*! Retrieve jitter on received packets */
215  /*! Retrieve maximum jitter on remote side */
217  /*! Retrieve minimum jitter on remote side */
219  /*! Retrieve average jitter on remote side */
221  /*! Retrieve standard deviation jitter on remote side */
223  /*! Retrieve maximum jitter on local side */
225  /*! Retrieve minimum jitter on local side */
227  /*! Retrieve average jitter on local side */
229  /*! Retrieve standard deviation jitter on local side */
231  /*! Retrieve ALL statistics relating to round trip time */
233  /*! Retrieve round trip time */
235  /*! Retrieve maximum round trip time */
237  /*! Retrieve minimum round trip time */
239  /*! Retrieve average round trip time */
241  /*! Retrieve standard deviation round trip time */
243  /*! Retrieve local SSRC */
245  /*! Retrieve remote SSRC */
247  /*! Retrieve channel unique ID */
249  /*! Retrieve number of octets transmitted */
251  /*! Retrieve number of octets received */
253 };
@ AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS
Definition: rtp_engine.h:202
@ AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS
Definition: rtp_engine.h:198
@ AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS
Definition: rtp_engine.h:194
@ AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER
Definition: rtp_engine.h:218
@ AST_RTP_INSTANCE_STAT_MIN_RTT
Definition: rtp_engine.h:238
@ AST_RTP_INSTANCE_STAT_CHANNEL_UNIQUEID
Definition: rtp_engine.h:248
@ AST_RTP_INSTANCE_STAT_TXPLOSS
Definition: rtp_engine.h:190
@ AST_RTP_INSTANCE_STAT_MAX_RTT
Definition: rtp_engine.h:236
@ AST_RTP_INSTANCE_STAT_RXPLOSS
Definition: rtp_engine.h:192
@ AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER
Definition: rtp_engine.h:216
@ AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER
Definition: rtp_engine.h:224
@ AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER
Definition: rtp_engine.h:222
@ AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS
Definition: rtp_engine.h:196
@ AST_RTP_INSTANCE_STAT_TXOCTETCOUNT
Definition: rtp_engine.h:250
@ AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS
Definition: rtp_engine.h:206
@ AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS
Definition: rtp_engine.h:200
@ AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS
Definition: rtp_engine.h:208
@ AST_RTP_INSTANCE_STAT_TXCOUNT
Definition: rtp_engine.h:184
@ AST_RTP_INSTANCE_STAT_STDEVRTT
Definition: rtp_engine.h:242
@ AST_RTP_INSTANCE_STAT_RXJITTER
Definition: rtp_engine.h:214
@ AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS
Definition: rtp_engine.h:204
@ AST_RTP_INSTANCE_STAT_LOCAL_SSRC
Definition: rtp_engine.h:244
@ AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER
Definition: rtp_engine.h:220
@ AST_RTP_INSTANCE_STAT_COMBINED_JITTER
Definition: rtp_engine.h:210
@ AST_RTP_INSTANCE_STAT_TXJITTER
Definition: rtp_engine.h:212
@ AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER
Definition: rtp_engine.h:226
@ AST_RTP_INSTANCE_STAT_COMBINED_LOSS
Definition: rtp_engine.h:188
@ AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER
Definition: rtp_engine.h:230
@ AST_RTP_INSTANCE_STAT_COMBINED_RTT
Definition: rtp_engine.h:232
@ AST_RTP_INSTANCE_STAT_NORMDEVRTT
Definition: rtp_engine.h:240
@ AST_RTP_INSTANCE_STAT_RTT
Definition: rtp_engine.h:234
@ AST_RTP_INSTANCE_STAT_RXOCTETCOUNT
Definition: rtp_engine.h:252
@ AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER
Definition: rtp_engine.h:228
@ AST_RTP_INSTANCE_STAT_ALL
Definition: rtp_engine.h:182
@ AST_RTP_INSTANCE_STAT_RXCOUNT
Definition: rtp_engine.h:186
@ AST_RTP_INSTANCE_STAT_REMOTE_SSRC
Definition: rtp_engine.h:246

◆ 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 168 of file rtp_engine.h.

168  {
169  /*! Retrieve quality information */
171  /*! Retrieve quality information about jitter */
173  /*! Retrieve quality information about packet loss */
175  /*! Retrieve quality information about round trip time */
177 };
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS
Definition: rtp_engine.h:174
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT
Definition: rtp_engine.h:176
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY
Definition: rtp_engine.h:170
@ AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER
Definition: rtp_engine.h:172

◆ ast_rtp_options

Additional RTP options

Enumerator
AST_RTP_OPT_G726_NONSTANDARD 

Remote side is using non-standard G.726

Definition at line 142 of file rtp_engine.h.

142  {
143  /*! Remote side is using non-standard G.726 */
144  AST_RTP_OPT_G726_NONSTANDARD = (1 << 0),
145 };
@ AST_RTP_OPT_G726_NONSTANDARD
Definition: rtp_engine.h:144

◆ 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_ASYMMETRIC_CODEC 

Enable Asymmetric RTP Codecs

AST_RTP_PROPERTY_RETRANS_RECV 

Enable packet retransmission for received packets

AST_RTP_PROPERTY_RETRANS_SEND 

Enable packet retransmission for sent packets

AST_RTP_PROPERTY_REMB 

Enable REMB sending and receiving passthrough support

AST_RTP_PROPERTY_MAX 

Maximum number of RTP properties supported.

Note
THIS MUST BE THE LAST ENTRY IN THIS ENUM.

Definition at line 113 of file rtp_engine.h.

113  {
114  /*! Enable symmetric RTP support */
116  /*! RTP instance will be carrying DTMF (using RFC2833) */
118  /*! Expect unreliable DTMF from remote party */
120  /*! Enable STUN support */
122  /*! Enable RTCP support */
124  /*! Enable Asymmetric RTP Codecs */
126  /*! Enable packet retransmission for received packets */
128  /*! Enable packet retransmission for sent packets */
130  /*! Enable REMB sending and receiving passthrough support */
132 
133  /*!
134  * \brief Maximum number of RTP properties supported
135  *
136  * \note THIS MUST BE THE LAST ENTRY IN THIS ENUM.
137  */
139 };
@ AST_RTP_PROPERTY_NAT
Definition: rtp_engine.h:115
@ AST_RTP_PROPERTY_MAX
Maximum number of RTP properties supported.
Definition: rtp_engine.h:138
@ AST_RTP_PROPERTY_RETRANS_RECV
Definition: rtp_engine.h:127
@ AST_RTP_PROPERTY_RETRANS_SEND
Definition: rtp_engine.h:129
@ AST_RTP_PROPERTY_RTCP
Definition: rtp_engine.h:123
@ AST_RTP_PROPERTY_ASYMMETRIC_CODEC
Definition: rtp_engine.h:125
@ AST_RTP_PROPERTY_STUN
Definition: rtp_engine.h:121
@ AST_RTP_PROPERTY_DTMF
Definition: rtp_engine.h:117
@ AST_RTP_PROPERTY_DTMF_COMPENSATE
Definition: rtp_engine.h:119
@ AST_RTP_PROPERTY_REMB
Definition: rtp_engine.h:131

Function Documentation

◆ ast_debug_category_dtls_id()

uintmax_t ast_debug_category_dtls_id ( void  )

Definition at line 3559 of file rtp_engine.c.

3560 {
3561  return debug_category_dtls_id;
3562 }
static uintmax_t debug_category_dtls_id
Definition: rtp_engine.c:3557

References debug_category_dtls_id.

◆ ast_debug_category_dtls_packet_id()

uintmax_t ast_debug_category_dtls_packet_id ( void  )

Definition at line 3566 of file rtp_engine.c.

3567 {
3569 }
static uintmax_t debug_category_dtls_packet_id
Definition: rtp_engine.c:3564

References debug_category_dtls_packet_id.

◆ ast_debug_category_ice_id()

uintmax_t ast_debug_category_ice_id ( void  )

Definition at line 3573 of file rtp_engine.c.

3574 {
3575  return debug_category_ice_id;
3576 }
static uintmax_t debug_category_ice_id
Definition: rtp_engine.c:3571

References debug_category_ice_id.

◆ ast_debug_category_rtcp_id()

uintmax_t ast_debug_category_rtcp_id ( void  )

Definition at line 3545 of file rtp_engine.c.

3546 {
3547  return debug_category_rtcp_id;
3548 }
static uintmax_t debug_category_rtcp_id
Definition: rtp_engine.c:3543

References debug_category_rtcp_id.

◆ ast_debug_category_rtcp_packet_id()

uintmax_t ast_debug_category_rtcp_packet_id ( void  )

Definition at line 3552 of file rtp_engine.c.

3553 {
3555 }
static uintmax_t debug_category_rtcp_packet_id
Definition: rtp_engine.c:3550

References debug_category_rtcp_packet_id.

◆ ast_debug_category_rtp_id()

uintmax_t ast_debug_category_rtp_id ( void  )

Definition at line 3531 of file rtp_engine.c.

3532 {
3533  return debug_category_rtp_id;
3534 }
static uintmax_t debug_category_rtp_id
Definition: rtp_engine.c:3529

References debug_category_rtp_id.

◆ ast_debug_category_rtp_packet_id()

uintmax_t ast_debug_category_rtp_packet_id ( void  )

Definition at line 3538 of file rtp_engine.c.

3539 {
3541 }
static uintmax_t debug_category_rtp_packet_id
Definition: rtp_engine.c:3536

References debug_category_rtp_packet_id.

◆ ast_rtp_codecs_find_payload_code()

int ast_rtp_codecs_find_payload_code ( struct ast_rtp_codecs codecs,
int  payload 
)

Search for the tx payload type in the ast_rtp_codecs structure.

Parameters
codecsCodecs structure to look in
payloadThe payload type format to look for
Returns
Numerical payload type or -1 if unable to find payload in codecs

Example usage:

static struct ao2_container * codecs
Registered codecs.
Definition: codec.c:48
int ast_rtp_codecs_find_payload_code(struct ast_rtp_codecs *codecs, int payload)
Search for the tx payload type in the ast_rtp_codecs structure.
Definition: rtp_engine.c:1967

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

Definition at line 1967 of file rtp_engine.c.

1968 {
1969  struct ast_rtp_payload_type *type;
1970  int res = -1;
1971 
1972  ast_rwlock_rdlock(&codecs->codecs_lock);
1973  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1974  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, payload);
1975  if (type) {
1976  res = payload;
1977  }
1978  }
1979  ast_rwlock_unlock(&codecs->codecs_lock);
1980 
1981  return res;
1982 }
static const char type[]
Definition: chan_ooh323.c:109
#define ast_rwlock_rdlock(a)
Definition: lock.h:233
#define ast_rwlock_unlock(a)
Definition: lock.h:232
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

References ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, codecs, ast_rtp_payload_type::payload, and type.

Referenced by bridge_p2p_rtp_write().

◆ ast_rtp_codecs_get_framing()

unsigned int ast_rtp_codecs_get_framing ( struct ast_rtp_codecs codecs)

Get the framing used for a set of codecs.

Parameters
codecsCodecs structure to get the framing from
Returns
The framing to be used for the media stream associated with these codecs
Since
13.0.0

Definition at line 1561 of file rtp_engine.c.

1562 {
1563  unsigned int framing;
1564 
1565  ast_rwlock_rdlock(&codecs->codecs_lock);
1566  framing = codecs->framing;
1567  ast_rwlock_unlock(&codecs->codecs_lock);
1568 
1569  return framing;
1570 }

References ast_rwlock_rdlock, ast_rwlock_unlock, and codecs.

Referenced by ast_rtp_write(), create_outgoing_sdp_stream(), multicast_rtp_write(), native_rtp_bridge_compatible_check(), and process_sdp().

◆ ast_rtp_codecs_get_payload()

struct ast_rtp_payload_type* ast_rtp_codecs_get_payload ( struct ast_rtp_codecs codecs,
int  payload 
)

Retrieve rx payload mapped information by payload type.

Parameters
codecsCodecs structure to look in
payloadNumerical payload to look up
Returns
Payload information.
Return values
NULLif payload does not exist.
Note
The payload returned by this function has its reference count increased. Callers are responsible for decrementing the reference count.

Example usage:

struct ast_rtp_payload_type *payload_type;
payload_type = ast_rtp_codecs_get_payload(&codecs, 0);
struct ast_rtp_payload_type * ast_rtp_codecs_get_payload(struct ast_rtp_codecs *codecs, int payload)
Retrieve rx payload mapped information by payload type.
Definition: rtp_engine.c:1471

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

Definition at line 1471 of file rtp_engine.c.

1472 {
1473  struct ast_rtp_payload_type *type = NULL;
1474 
1475  if (payload < 0 || payload >= AST_RTP_MAX_PT) {
1476  return NULL;
1477  }
1478 
1479  ast_rwlock_rdlock(&codecs->codecs_lock);
1480  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_rx)) {
1481  type = AST_VECTOR_GET(&codecs->payload_mapping_rx, payload);
1482  ao2_bump(type);
1483  }
1484  ast_rwlock_unlock(&codecs->codecs_lock);
1485 
1486  if (!type && payload <= AST_RTP_PT_LAST_STATIC) {
1490  }
1491 
1492  return type;
1493 }
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
#define NULL
Definition: resample.c:96
static struct ast_rtp_payload_type * static_RTP_PT[AST_RTP_MAX_PT]
Mapping between Asterisk codecs and rtp payload types.
Definition: rtp_engine.c:274
static ast_rwlock_t static_RTP_PT_lock
Definition: rtp_engine.c:275
#define AST_RTP_MAX_PT
Definition: rtp_engine.h:83
#define AST_RTP_PT_LAST_STATIC
Definition: rtp_engine.h:89

References ao2_bump, AST_RTP_MAX_PT, AST_RTP_PT_LAST_STATIC, ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, codecs, NULL, ast_rtp_payload_type::payload, static_RTP_PT, static_RTP_PT_lock, and type.

Referenced by ast_rtp_interpret(), and bridge_p2p_rtp_write().

◆ ast_rtp_codecs_get_payload_format()

struct ast_format* ast_rtp_codecs_get_payload_format ( struct ast_rtp_codecs codecs,
int  payload 
)

Retrieve the actual ast_format stored on the codecs structure for a specific tx payload type.

Parameters
codecsCodecs structure to look in
payloadNumerical payload type to look up
Returns
pointer to format structure on success
Return values
NULLon failure
Note
The format returned by this function has its reference count increased. Callers are responsible for decrementing the reference count.
Since
10.0

Definition at line 1529 of file rtp_engine.c.

1530 {
1531  struct ast_rtp_payload_type *type;
1532  struct ast_format *format = NULL;
1533 
1534  if (payload < 0 || payload >= AST_RTP_MAX_PT) {
1535  return NULL;
1536  }
1537 
1538  ast_rwlock_rdlock(&codecs->codecs_lock);
1539  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1540  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, payload);
1541  if (type && type->asterisk_format) {
1542  format = ao2_bump(type->format);
1543  }
1544  }
1545  ast_rwlock_unlock(&codecs->codecs_lock);
1546 
1547  return format;
1548 }
static snd_pcm_format_t format
Definition: chan_alsa.c:106
Definition of a media format.
Definition: format.c:43

References ao2_bump, AST_RTP_MAX_PT, ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, codecs, format, NULL, and type.

Referenced by get_codecs(), process_sdp_a_audio(), and process_sdp_a_video().

◆ ast_rtp_codecs_get_stream_type()

enum ast_media_type ast_rtp_codecs_get_stream_type ( struct ast_rtp_codecs codecs)

Determine the type of RTP stream media from the codecs mapped.

Since
13.19.0
Parameters
codecsCodecs structure to look in
Returns
Media type or AST_MEDIA_TYPE_UNKNOWN if no codecs mapped.

Definition at line 1425 of file rtp_engine.c.

1453 {
1454  enum ast_media_type stream_type = AST_MEDIA_TYPE_UNKNOWN;
1455  int payload;
1456  struct ast_rtp_payload_type *type;
1457 
1458  ast_rwlock_rdlock(&codecs->codecs_lock);
1459  for (payload = 0; payload < AST_VECTOR_SIZE(&codecs->payload_mapping_rx); ++payload) {
1460  type = AST_VECTOR_GET(&codecs->payload_mapping_rx, payload);
1461  if (type && type->asterisk_format) {
1462  stream_type = ast_format_get_type(type->format);
1463  break;
1464  }
1465  }
1466  ast_rwlock_unlock(&codecs->codecs_lock);
1467 
1468  return stream_type;
1469 }
ast_media_type
Types of media.
Definition: codec.h:30
@ AST_MEDIA_TYPE_UNKNOWN
Definition: codec.h:31
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition: format.c:354

References ao2_cleanup, ao2_lock, ao2_unlock, ast_debug, AST_RTP_MAX_PT, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, codecs, ast_rtp_instance::engine, NULL, ast_rtp_payload_type::payload, ast_rtp_engine::payload_set, and type.

Referenced by ast_rtp_read().

◆ ast_rtp_codecs_payload_code()

int ast_rtp_codecs_payload_code ( struct ast_rtp_codecs codecs,
int  asterisk_format,
struct ast_format format,
int  code 
)

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

Parameters
codecsCodecs structure to look in
asterisk_formatNon-zero if the given Asterisk format is present
formatAsterisk format to look for
codeThe format to look for

Find the currently assigned rx mapped payload type based on whether it is an Asterisk format or non-format code. If one is currently not assigned then create a rx payload type mapping.

Returns
Numerical payload type
Return values
-1if could not assign.

Example usage:

int payload = ast_rtp_codecs_payload_code(&codecs, 1, ast_format_set(&tmp_fmt, AST_FORMAT_ULAW, 0), 0);
int ast_rtp_codecs_payload_code(struct ast_rtp_codecs *codecs, int asterisk_format, struct ast_format *format, int code)
Retrieve a rx mapped payload type based on whether it is an Asterisk format and the code.
Definition: rtp_engine.c:1865

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

Since
1.8

Definition at line 1865 of file rtp_engine.c.

1866 {
1867  struct ast_rtp_payload_type *type;
1868  int idx;
1869  int payload = -1;
1870 
1872  if (!asterisk_format) {
1873  ast_rwlock_rdlock(&codecs->codecs_lock);
1874  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_rx); ++idx) {
1875  type = AST_VECTOR_GET(&codecs->payload_mapping_rx, idx);
1876  if (!type) {
1877  continue;
1878  }
1879 
1880  if (!type->asterisk_format
1881  && type->primary_mapping
1882  && type->rtp_code == code) {
1883  payload = idx;
1884  break;
1885  }
1886  }
1887  ast_rwlock_unlock(&codecs->codecs_lock);
1888  } else if (format) {
1889  ast_rwlock_rdlock(&codecs->codecs_lock);
1890  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_rx); ++idx) {
1891  type = AST_VECTOR_GET(&codecs->payload_mapping_rx, idx);
1892  if (!type) {
1893  continue;
1894  }
1895 
1896  if (type->asterisk_format
1897  && type->primary_mapping
1898  && ast_format_cmp(format, type->format) == AST_FORMAT_CMP_EQUAL) {
1899  payload = idx;
1900  break;
1901  }
1902  }
1903  ast_rwlock_unlock(&codecs->codecs_lock);
1904  }
1905 
1906  if (payload < 0) {
1908  code, 0);
1909  }
1911 
1912  return payload;
1913 }
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition: format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition: format.h:36
static int rtp_codecs_assign_payload_code_rx(struct ast_rtp_codecs *codecs, int asterisk_format, struct ast_format *format, int code, int explicit)
Definition: rtp_engine.c:1807

References ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_rtp_payload_type::asterisk_format, codecs, format, ast_rtp_payload_type::payload, rtp_codecs_assign_payload_code_rx(), static_RTP_PT_lock, and type.

Referenced by add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), apply_cap_to_bundled(), create_outgoing_sdp_stream(), and jingle_add_payloads_to_description().

◆ ast_rtp_codecs_payload_code_tx()

int ast_rtp_codecs_payload_code_tx ( struct ast_rtp_codecs codecs,
int  asterisk_format,
const struct ast_format format,
int  code 
)

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

Since
14.0.0
Parameters
codecsCodecs structure to look in
asterisk_formatNon-zero if the given Asterisk format is present
formatAsterisk format to look for
codeThe format to look for
Returns
Numerical payload type
Return values
-1if not found.

Definition at line 1920 of file rtp_engine.c.

1921 {
1922  struct ast_rtp_payload_type *type;
1923  int idx;
1924  int payload = -1;
1925 
1926  if (!asterisk_format) {
1927  ast_rwlock_rdlock(&codecs->codecs_lock);
1928  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_tx); ++idx) {
1929  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, idx);
1930  if (!type) {
1931  continue;
1932  }
1933 
1934  if (!type->asterisk_format
1935  && type->rtp_code == code) {
1936  payload = idx;
1937  break;
1938  }
1939  }
1940  ast_rwlock_unlock(&codecs->codecs_lock);
1941  } else if (format) {
1942  ast_rwlock_rdlock(&codecs->codecs_lock);
1943  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_tx); ++idx) {
1944  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, idx);
1945  if (!type) {
1946  continue;
1947  }
1948 
1949  if (type->asterisk_format
1950  && ast_format_cmp(format, type->format) == AST_FORMAT_CMP_EQUAL) {
1951  payload = idx;
1952  break;
1953  }
1954  }
1955  ast_rwlock_unlock(&codecs->codecs_lock);
1956  }
1957 
1958  if (payload < 0) {
1962  }
1963 
1964  return payload;
1965 }
static int find_static_payload_type(int asterisk_format, const struct ast_format *format, int code)
Definition: rtp_engine.c:1616

References ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_rtp_payload_type::asterisk_format, codecs, find_static_payload_type(), format, ast_rtp_payload_type::payload, static_RTP_PT_lock, and type.

Referenced by ast_rtp_dtmf_begin(), ast_rtp_sendcng(), ast_rtp_write(), bridge_p2p_rtp_write(), multicast_rtp_write(), and send_start_rtp().

◆ ast_rtp_codecs_payload_formats()

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

Retrieve all formats that were found.

Parameters
codecsCodecs structure to look in
astformatsA capabilities structure to put the Asterisk formats in.
nonastformatsAn integer to put the non-Asterisk formats in

Example usage:

struct ast_format_cap *astformats = ast_format_cap_alloc_nolock()
int nonastformats;
ast_rtp_codecs_payload_formats(&codecs, astformats, &nonastformats);
void ast_rtp_codecs_payload_formats(struct ast_rtp_codecs *codecs, struct ast_format_cap *astformats, int *nonastformats)
Retrieve all formats that were found.
Definition: rtp_engine.c:1572
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54

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 1572 of file rtp_engine.c.

1573 {
1574  int idx;
1575 
1577  *nonastformats = 0;
1578 
1579  ast_rwlock_rdlock(&codecs->codecs_lock);
1580 
1581  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_tx); ++idx) {
1582  struct ast_rtp_payload_type *type;
1583 
1584  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, idx);
1585  if (!type) {
1586  continue;
1587  }
1588 
1589  if (type->asterisk_format) {
1590  ast_format_cap_append(astformats, type->format, 0);
1591  } else {
1592  *nonastformats |= type->rtp_code;
1593  }
1594  }
1595  if (codecs->framing) {
1596  ast_format_cap_set_framing(astformats, codecs->framing);
1597  }
1598 
1599  ast_rwlock_unlock(&codecs->codecs_lock);
1600 }
void ast_format_cap_remove_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Remove all formats matching a specific format type.
Definition: format_cap.c:523
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition: format_cap.h:99
void ast_format_cap_set_framing(struct ast_format_cap *cap, unsigned int framing)
Set the global framing.
Definition: format_cap.c:136

References ast_format_cap_append, ast_format_cap_remove_by_type(), ast_format_cap_set_framing(), AST_MEDIA_TYPE_UNKNOWN, ast_rwlock_rdlock, ast_rwlock_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, codecs, and type.

Referenced by jingle_interpret_description(), and process_sdp().

◆ ast_rtp_codecs_payload_replace_format()

int ast_rtp_codecs_payload_replace_format ( struct ast_rtp_codecs codecs,
int  payload,
struct ast_format format 
)

Update the format associated with a tx payload type in a codecs structure.

Parameters
codecsCodecs structure to operate on
payloadNumerical payload type to look up
formatThe format to replace the existing one
Return values
0success
-1failure
Since
13

Definition at line 1495 of file rtp_engine.c.

1496 {
1497  struct ast_rtp_payload_type *type;
1498 
1499  if (payload < 0 || payload >= AST_RTP_MAX_PT || !format) {
1500  return -1;
1501  }
1502 
1504  if (!type) {
1505  return -1;
1506  }
1507  ao2_ref(format, +1);
1508  type->format = format;
1509  type->asterisk_format = 1;
1510  type->payload = payload;
1511  type->primary_mapping = 1;
1512 
1513  ast_rwlock_wrlock(&codecs->codecs_lock);
1515  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1516  ao2_cleanup(AST_VECTOR_GET(&codecs->payload_mapping_tx, payload));
1517  }
1518  if (AST_VECTOR_REPLACE(&codecs->payload_mapping_tx, payload, type)) {
1519  ao2_ref(type, -1);
1520  }
1521  } else {
1522  ao2_ref(type, -1);
1523  }
1524  ast_rwlock_unlock(&codecs->codecs_lock);
1525 
1526  return 0;
1527 }
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
#define ast_rwlock_wrlock(a)
Definition: lock.h:234
struct ast_rtp_payload_type * ast_rtp_engine_alloc_payload_type(void)
Allocation routine for ast_rtp_payload_type.
Definition: rtp_engine.c:325
static int payload_mapping_tx_is_present(const struct ast_rtp_codecs *codecs, const struct ast_rtp_payload_type *to_match)
Definition: rtp_engine.c:1138
#define AST_VECTOR_REPLACE(vec, idx, elem)
Replace an element at a specific position in a vector, growing the vector if needed.
Definition: vector.h:284

References ao2_cleanup, ao2_ref, ast_rtp_engine_alloc_payload_type(), AST_RTP_MAX_PT, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, codecs, format, ast_rtp_payload_type::payload, payload_mapping_tx_is_present(), and type.

Referenced by get_codecs(), process_sdp_a_audio(), and process_sdp_a_video().

◆ ast_rtp_codecs_payload_set_rx()

int ast_rtp_codecs_payload_set_rx ( struct ast_rtp_codecs codecs,
int  code,
struct ast_format format 
)

Set a payload code for use with a specific Asterisk format.

Parameters
codecsCodecs structure to manipulate
codeThe payload code
formatAsterisk format
Return values
0Payload was set to the given format
-1Payload was in use or could not be set
Since
15.0.0

Definition at line 1915 of file rtp_engine.c.

1916 {
1917  return rtp_codecs_assign_payload_code_rx(codecs, 1, format, code, 1);
1918 }

References codecs, format, and rtp_codecs_assign_payload_code_rx().

Referenced by apply_cap_to_bundled(), and create_outgoing_sdp_stream().

◆ ast_rtp_codecs_payloads_clear()

void ast_rtp_codecs_payloads_clear ( struct ast_rtp_codecs codecs,
struct ast_rtp_instance instance 
)

Clear rx and tx payload mapping information from an RTP instance.

Parameters
codecsThe codecs structure that payloads will be cleared from
instanceOptionally the instance that the codecs structure belongs to

Example usage:

void ast_rtp_codecs_payloads_clear(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance)
Clear rx and tx payload mapping information from an RTP instance.
Definition: rtp_engine.c:994

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

Since
1.8

Definition at line 994 of file rtp_engine.c.

995 {
998 
999  if (instance && instance->engine && instance->engine->payload_set) {
1000  int i;
1001 
1002  ao2_lock(instance);
1003  for (i = 0; i < AST_RTP_MAX_PT; i++) {
1004  instance->engine->payload_set(instance, i, 0, NULL, 0);
1005  }
1006  ao2_unlock(instance);
1007  }
1008 }
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs)
Destroy the contents of an RTP codecs structure (but not the structure itself)
Definition: rtp_engine.c:974
int ast_rtp_codecs_payloads_initialize(struct ast_rtp_codecs *codecs)
Initialize an RTP codecs structure.
Definition: rtp_engine.c:958
void(* payload_set)(struct ast_rtp_instance *instance, int payload, int asterisk_format, struct ast_format *format, int code)
Definition: rtp_engine.h:643
struct ast_rtp_engine * engine
Definition: rtp_engine.c:191

References ao2_lock, ao2_unlock, ast_rtp_codecs_payloads_destroy(), ast_rtp_codecs_payloads_initialize(), AST_RTP_MAX_PT, codecs, ast_rtp_instance::engine, NULL, and ast_rtp_engine::payload_set.

◆ ast_rtp_codecs_payloads_copy()

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
srcThe source codecs structure
destThe destination codecs structure that the values from src will be copied to
instanceOptionally the instance that the dst codecs structure belongs to

Example usage:

ast_rtp_codecs_payloads_copy(&codecs0, &codecs1, NULL);
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.
Definition: rtp_engine.c:1216

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

Since
1.8

Definition at line 1216 of file rtp_engine.c.

1217 {
1218  int idx;
1219  struct ast_rtp_payload_type *type;
1220 
1222 
1223  /* Deadlock avoidance because of held write lock. */
1224  while (ast_rwlock_tryrdlock(&src->codecs_lock)) {
1226  sched_yield();
1228  }
1229 
1230  /*
1231  * This represents a completely new mapping of what the remote party is
1232  * expecting for payloads, so we clear out the entire tx payload mapping
1233  * vector and replace it.
1234  */
1235  for (idx = 0; idx < AST_VECTOR_SIZE(&dest->payload_mapping_tx); ++idx) {
1236  type = AST_VECTOR_GET(&dest->payload_mapping_tx, idx);
1237  ao2_t_cleanup(type, "destroying ast_rtp_codec tx mapping");
1239  }
1240 
1241  rtp_codecs_payloads_copy_rx(src, dest, instance);
1242  rtp_codecs_payloads_copy_tx(src, dest, instance);
1243  dest->framing = src->framing;
1244 
1247 }
#define ao2_t_cleanup(obj, tag)
Definition: astobj2.h:1935
#define ast_rwlock_tryrdlock(a)
Definition: lock.h:235
static void rtp_codecs_payloads_copy_tx(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
Definition: rtp_engine.c:1185
static void rtp_codecs_payloads_copy_rx(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
Definition: rtp_engine.c:1102
ast_rwlock_t codecs_lock
Definition: rtp_engine.h:707
struct ast_rtp_codecs::@307 payload_mapping_tx
unsigned int framing
Definition: rtp_engine.h:713

References ao2_t_cleanup, ast_rwlock_tryrdlock, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, ast_rtp_codecs::codecs_lock, ast_rtp_codecs::framing, NULL, ast_rtp_codecs::payload_mapping_tx, rtp_codecs_payloads_copy_rx(), rtp_codecs_payloads_copy_tx(), and type.

Referenced by jingle_interpret_description(), process_sdp(), set_caps(), and set_incoming_call_offer_cap().

◆ ast_rtp_codecs_payloads_destroy()

void ast_rtp_codecs_payloads_destroy ( struct ast_rtp_codecs codecs)

Destroy the contents of an RTP codecs structure (but not the structure itself)

Parameters
codecsThe codecs structure to destroy the contents of

Example usage:

void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs)
Destroy the contents of an RTP codecs structure (but not the structure itself)
Definition: rtp_engine.c:974
Since
11

Definition at line 974 of file rtp_engine.c.

975 {
976  int idx;
977  struct ast_rtp_payload_type *type;
978 
979  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_rx); ++idx) {
980  type = AST_VECTOR_GET(&codecs->payload_mapping_rx, idx);
981  ao2_t_cleanup(type, "destroying ast_rtp_codec rx mapping");
982  }
983  AST_VECTOR_FREE(&codecs->payload_mapping_rx);
984 
985  for (idx = 0; idx < AST_VECTOR_SIZE(&codecs->payload_mapping_tx); ++idx) {
986  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, idx);
987  ao2_t_cleanup(type, "destroying ast_rtp_codec tx mapping");
988  }
989  AST_VECTOR_FREE(&codecs->payload_mapping_tx);
990 
991  ast_rwlock_destroy(&codecs->codecs_lock);
992 }
#define ast_rwlock_destroy(rwlock)
Definition: lock.h:231
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174

References ao2_t_cleanup, ast_rwlock_destroy, AST_VECTOR_FREE, AST_VECTOR_GET, AST_VECTOR_SIZE, codecs, and type.

Referenced by ast_rtp_codecs_payloads_clear(), ast_stream_free(), ast_stream_set_rtp_codecs(), instance_destructor(), jingle_interpret_description(), process_sdp(), set_caps(), and set_incoming_call_offer_cap().

◆ ast_rtp_codecs_payloads_initialize()

int ast_rtp_codecs_payloads_initialize ( struct ast_rtp_codecs codecs)

Initialize an RTP codecs structure.

Parameters
codecsThe codecs structure to initialize
Return values
0success
-1failure

Example usage:

int ast_rtp_codecs_payloads_initialize(struct ast_rtp_codecs *codecs)
Initialize an RTP codecs structure.
Definition: rtp_engine.c:958
Since
11

Definition at line 958 of file rtp_engine.c.

959 {
960  int res;
961 
962  codecs->framing = 0;
963  ast_rwlock_init(&codecs->codecs_lock);
964  res = AST_VECTOR_INIT(&codecs->payload_mapping_rx, AST_RTP_MAX_PT);
965  res |= AST_VECTOR_INIT(&codecs->payload_mapping_tx, AST_RTP_MAX_PT);
966  if (res) {
967  AST_VECTOR_FREE(&codecs->payload_mapping_rx);
968  AST_VECTOR_FREE(&codecs->payload_mapping_tx);
969  }
970 
971  return res;
972 }
#define ast_rwlock_init(rwlock)
wrapper for rwlock with tracking enabled
Definition: lock.h:222
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113

References AST_RTP_MAX_PT, ast_rwlock_init, AST_VECTOR_FREE, AST_VECTOR_INIT, and codecs.

Referenced by ast_rtp_codecs_payloads_clear(), ast_rtp_instance_new(), get_codecs(), jingle_interpret_description(), and process_sdp().

◆ ast_rtp_codecs_payloads_set_m_type()

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

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

Parameters
codecsThe codecs structure to muck with
instanceOptionally the instance that the codecs structure belongs to
payloadNumerical payload that was seen in the m= SDP line

Example usage:

void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
Record tx payload type information that was seen in an m= SDP line.
Definition: rtp_engine.c:1293

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

Since
1.8

Definition at line 1293 of file rtp_engine.c.

1294 {
1296 
1297  if (payload < 0 || payload >= AST_RTP_MAX_PT || payload > AST_RTP_PT_LAST_STATIC) {
1298  return;
1299  }
1300 
1304  if (!new_type) {
1305  ast_debug(1, "Don't have a default tx payload type %d format for m type on %p\n",
1306  payload, codecs);
1307  return;
1308  }
1309 
1310  ast_debug(1, "Setting tx payload type %d based on m type on %p\n",
1311  payload, codecs);
1312 
1313  ast_rwlock_wrlock(&codecs->codecs_lock);
1314 
1316  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1317  ao2_t_cleanup(AST_VECTOR_GET(&codecs->payload_mapping_tx, payload),
1318  "cleaning up replaced tx payload type");
1319  }
1320 
1321  if (AST_VECTOR_REPLACE(&codecs->payload_mapping_tx, payload, new_type)) {
1322  ao2_ref(new_type, -1);
1323  } else if (instance && instance->engine && instance->engine->payload_set) {
1324  ao2_lock(instance);
1325  instance->engine->payload_set(instance, payload, new_type->asterisk_format, new_type->format, new_type->rtp_code);
1326  ao2_unlock(instance);
1327  }
1328  } else {
1329  ao2_ref(new_type, -1);
1330  }
1331 
1332  ast_rwlock_unlock(&codecs->codecs_lock);
1333 }
#define ast_debug(level,...)
Log a DEBUG message.

References ao2_bump, ao2_lock, ao2_ref, ao2_t_cleanup, ao2_unlock, ast_debug, AST_RTP_MAX_PT, AST_RTP_PT_LAST_STATIC, ast_rwlock_rdlock, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, codecs, ast_rtp_instance::engine, 10aedae86a32_add_outgoing_enum_va::new_type, ast_rtp_payload_type::payload, payload_mapping_tx_is_present(), ast_rtp_engine::payload_set, static_RTP_PT, and static_RTP_PT_lock.

Referenced by get_codecs(), and process_sdp().

◆ ast_rtp_codecs_payloads_set_rtpmap_type()

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 tx payload type information that was seen in an a=rtpmap: SDP line.

Parameters
codecsThe codecs structure to muck with
instanceOptionally the instance that the codecs structure belongs to
payloadNumerical payload that was seen in the a=rtpmap: SDP line
mimetypeThe string mime type that was seen
mimesubtypeThe string mime sub type that was seen
optionsOptional options that may change the behavior of this specific payload
Return values
0success
-1failure, invalid payload numbe
-2failure, unknown mimetype

Example usage:

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 tx payload type information that was seen in an a=rtpmap: SDP line.
Definition: rtp_engine.c:1420

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 1420 of file rtp_engine.c.

1421 {
1422  return ast_rtp_codecs_payloads_set_rtpmap_type_rate(codecs, instance, payload, mimetype, mimesubtype, options, 0);
1423 }
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 tx payload type to a known MIME media type for a codec with a specific sample rate.
Definition: rtp_engine.c:1335
static struct test_options options

References ast_rtp_codecs_payloads_set_rtpmap_type_rate(), codecs, options, and ast_rtp_payload_type::payload.

Referenced by configure_local_rtp(), jingle_interpret_description(), ooh323_set_write_format(), process_sdp(), and setup_rtp_connection().

◆ ast_rtp_codecs_payloads_set_rtpmap_type_rate()

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 tx payload type to a known MIME media type for a codec with a specific sample rate.

Parameters
codecsRTP structure to modify
instanceOptionally the instance that the codecs structure belongs to
ptPayload type entry to modify
mimetypetop-level MIME type of media stream (typically "audio", "video", "text", etc.)
mimesubtypeMIME subtype of media stream (typically a codec name)
optionsZero or more flags from the ast_rtp_options enum
sample_rateThe 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
0on success
-1if the payload type is out of range
-2if the mimeType/mimeSubtype combination was not found
Since
1.8

Definition at line 1335 of file rtp_engine.c.

1339 {
1340  unsigned int idx;
1341  int found = 0;
1342 
1343  if (pt < 0 || pt >= AST_RTP_MAX_PT) {
1344  return -1; /* bogus payload type */
1345  }
1346 
1348  ast_rwlock_wrlock(&codecs->codecs_lock);
1349 
1350  for (idx = 0; idx < mime_types_len; ++idx) {
1351  const struct ast_rtp_mime_type *t = &ast_rtp_mime_types[idx];
1353 
1354  if (strcasecmp(mimesubtype, t->subtype)) {
1355  continue;
1356  }
1357 
1358  if (strcasecmp(mimetype, t->type)) {
1359  continue;
1360  }
1361 
1362  /* if both sample rates have been supplied, and they don't match,
1363  * then this not a match; if one has not been supplied, then the
1364  * rates are not compared */
1365  if (sample_rate && t->sample_rate &&
1366  (sample_rate != t->sample_rate)) {
1367  continue;
1368  }
1369 
1370  found = 1;
1371 
1373  if (!new_type) {
1374  continue;
1375  }
1376 
1377  new_type->asterisk_format = t->payload_type.asterisk_format;
1378  new_type->rtp_code = t->payload_type.rtp_code;
1379  new_type->payload = pt;
1380  new_type->primary_mapping = 1;
1384  new_type->format = ast_format_g726_aal2;
1385  } else {
1386  new_type->format = t->payload_type.format;
1387  }
1388 
1389  if (new_type->format) {
1390  /* SDP parsing automatically increases the reference count */
1391  new_type->format = ast_format_parse_sdp_fmtp(new_type->format, "");
1392  }
1393 
1395  if (pt < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1396  ao2_t_cleanup(AST_VECTOR_GET(&codecs->payload_mapping_tx, pt),
1397  "cleaning up replaced tx payload type");
1398  }
1399 
1400  if (AST_VECTOR_REPLACE(&codecs->payload_mapping_tx, pt, new_type)) {
1401  ao2_ref(new_type, -1);
1402  } else if (instance && instance->engine && instance->engine->payload_set) {
1403  ao2_lock(instance);
1404  instance->engine->payload_set(instance, pt, new_type->asterisk_format, new_type->format, new_type->rtp_code);
1405  ao2_unlock(instance);
1406  }
1407  } else {
1408  ao2_ref(new_type, -1);
1409  }
1410 
1411  break;
1412  }
1413 
1414  ast_rwlock_unlock(&codecs->codecs_lock);
1416 
1417  return (found ? 0 : -2);
1418 }
struct ast_format * ast_format_parse_sdp_fmtp(const struct ast_format *format, const char *attributes)
This function is used to have a media format aware module parse and interpret SDP attribute informati...
Definition: format.c:286
struct ast_format * ast_format_g726
Built-in cached g726 format.
Definition: format_cache.c:111
struct ast_format * ast_format_g726_aal2
Built-in cached g726 aal2 format.
Definition: format_cache.c:116
static struct ast_rtp_mime_type ast_rtp_mime_types[128]
static int mime_types_len
Definition: rtp_engine.c:262
static ast_rwlock_t mime_types_lock
Definition: rtp_engine.c:261
unsigned int sample_rate
Expected sample rate of the /c subtype.
Definition: rtp_engine.c:259
char subtype[64]
The format type.
Definition: rtp_engine.c:257
char type[16]
The media type.
Definition: rtp_engine.c:255
struct ast_rtp_payload_type payload_type
A mapping object between the Asterisk codec and this RTP payload.
Definition: rtp_engine.c:253
struct ast_format * format
Definition: rtp_engine.h:278

References ao2_lock, ao2_ref, ao2_t_cleanup, ao2_unlock, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, ast_format_g726, ast_format_g726_aal2, ast_format_parse_sdp_fmtp(), ast_rtp_engine_alloc_payload_type(), AST_RTP_MAX_PT, ast_rtp_mime_types, AST_RTP_OPT_G726_NONSTANDARD, ast_rwlock_rdlock, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, ast_rtp_payload_type::asterisk_format, codecs, ast_rtp_instance::engine, ast_rtp_payload_type::format, mime_types_len, mime_types_lock, 10aedae86a32_add_outgoing_enum_va::new_type, options, payload_mapping_tx_is_present(), ast_rtp_engine::payload_set, ast_rtp_mime_type::payload_type, ast_rtp_payload_type::rtp_code, ast_rtp_mime_type::sample_rate, ast_rtp_mime_type::subtype, and ast_rtp_mime_type::type.

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

◆ ast_rtp_codecs_payloads_unset()

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

Remove tx payload type mapped information.

Parameters
codecsThe codecs structure to muck with
instanceOptionally the instance that the codecs structure belongs to
payloadNumerical payload to unset

Example usage:

void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload)
Remove tx payload type mapped information.
Definition: rtp_engine.c:1425

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

Since
1.8

Definition at line 1425 of file rtp_engine.c.

1426 {
1427  struct ast_rtp_payload_type *type;
1428 
1429  if (payload < 0 || payload >= AST_RTP_MAX_PT) {
1430  return;
1431  }
1432 
1433  ast_debug(2, "Unsetting payload %d on %p\n", payload, codecs);
1434 
1435  ast_rwlock_wrlock(&codecs->codecs_lock);
1436 
1437  if (payload < AST_VECTOR_SIZE(&codecs->payload_mapping_tx)) {
1438  type = AST_VECTOR_GET(&codecs->payload_mapping_tx, payload);
1439  ao2_cleanup(type);
1440  AST_VECTOR_REPLACE(&codecs->payload_mapping_tx, payload, NULL);
1441  }
1442 
1443  if (instance && instance->engine && instance->engine->payload_set) {
1444  ao2_lock(instance);
1445  instance->engine->payload_set(instance, payload, 0, NULL, 0);
1446  ao2_unlock(instance);
1447  }
1448 
1449  ast_rwlock_unlock(&codecs->codecs_lock);
1450 }

Referenced by process_sdp_a_audio(), and process_sdp_a_video().

◆ ast_rtp_codecs_payloads_xover()

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

Crossover copy the tx payload mapping of src to the rx payload mapping of dest.

Since
14.0.0
Parameters
srcThe source codecs structure
destThe destination codecs structure that the values from src will be copied to
instanceOptionally the instance that the dst codecs structure belongs to

Definition at line 1249 of file rtp_engine.c.

1250 {
1251  int idx;
1252  struct ast_rtp_payload_type *type;
1253 
1255  if (src != dest) {
1256  /* Deadlock avoidance because of held write lock. */
1257  while (ast_rwlock_tryrdlock(&src->codecs_lock)) {
1259  sched_yield();
1261  }
1262  }
1263 
1264  /* Crossover copy payload type tx mapping to rx mapping. */
1265  for (idx = 0; idx < AST_VECTOR_SIZE(&src->payload_mapping_tx); ++idx) {
1266  type = AST_VECTOR_GET(&src->payload_mapping_tx, idx);
1267  if (!type) {
1268  continue;
1269  }
1270 
1271  /* All tx mapping elements should have the primary flag set. */
1272  ast_assert(type->primary_mapping);
1273 
1274  ast_debug(2, "Crossover copying tx to rx payload mapping %d (%p) from %p to %p\n",
1275  idx, type, src, dest);
1276  rtp_codecs_payload_replace_rx(dest, idx, type);
1277 
1278  if (instance && instance->engine && instance->engine->payload_set) {
1279  ao2_lock(instance);
1280  instance->engine->payload_set(instance, idx, type->asterisk_format, type->format, type->rtp_code);
1281  ao2_unlock(instance);
1282  }
1283  }
1284 
1285  dest->framing = src->framing;
1286 
1287  if (src != dest) {
1289  }
1291 }
static void rtp_codecs_payload_replace_rx(struct ast_rtp_codecs *codecs, int payload, struct ast_rtp_payload_type *new_type)
Definition: rtp_engine.c:1075
#define ast_assert(a)
Definition: utils.h:734

References ao2_lock, ao2_unlock, ast_assert, ast_debug, ast_rwlock_tryrdlock, ast_rwlock_unlock, ast_rwlock_wrlock, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_rtp_codecs::codecs_lock, ast_rtp_instance::engine, ast_rtp_codecs::framing, ast_rtp_codecs::payload_mapping_tx, ast_rtp_engine::payload_set, rtp_codecs_payload_replace_rx(), and type.

Referenced by ast_rtp_instance_early_bridge_make_compatible(), process_sdp(), set_caps(), and set_incoming_call_offer_cap().

◆ ast_rtp_codecs_set_framing()

void ast_rtp_codecs_set_framing ( struct ast_rtp_codecs codecs,
unsigned int  framing 
)

Set the framing used for a set of codecs.

Parameters
codecsCodecs structure to set framing on
framingThe framing value to set on the codecs
Since
13.0.0

Definition at line 1550 of file rtp_engine.c.

1551 {
1552  if (!framing) {
1553  return;
1554  }
1555 
1556  ast_rwlock_wrlock(&codecs->codecs_lock);
1557  codecs->framing = framing;
1558  ast_rwlock_unlock(&codecs->codecs_lock);
1559 }

References ast_rwlock_unlock, ast_rwlock_wrlock, and codecs.

Referenced by configure_local_rtp(), create_addr_from_peer(), get_codecs(), jingle_enable_video(), jingle_new(), process_sdp(), process_sdp_a_audio(), and start_rtp().

◆ ast_rtp_convert_stats_json()

struct ast_json* ast_rtp_convert_stats_json ( const struct ast_rtp_instance_stats stats)

Convert given stat instance into json format.

Parameters
stats
Returns
A json format stat

Definition at line 3949 of file rtp_engine.c.

3950 {
3951  struct ast_json *j_res;
3952  int ret;
3953 
3954  j_res = ast_json_object_create();
3955  if (!j_res) {
3956  return NULL;
3957  }
3958 
3959  /* set mandatory items */
3960  ret = ast_json_object_set(j_res, "txcount", ast_json_integer_create(stats->txcount));
3961  ret |= ast_json_object_set(j_res, "rxcount", ast_json_integer_create(stats->rxcount));
3962 
3963  ret |= ast_json_object_set(j_res, "txploss", ast_json_integer_create(stats->txploss));
3964  ret |= ast_json_object_set(j_res, "rxploss", ast_json_integer_create(stats->rxploss));
3965 
3966  ret |= ast_json_object_set(j_res, "local_ssrc", ast_json_integer_create(stats->local_ssrc));
3967  ret |= ast_json_object_set(j_res, "remote_ssrc", ast_json_integer_create(stats->remote_ssrc));
3968 
3969  ret |= ast_json_object_set(j_res, "txoctetcount", ast_json_integer_create(stats->txoctetcount));
3970  ret |= ast_json_object_set(j_res, "rxoctetcount", ast_json_integer_create(stats->rxoctetcount));
3971 
3972  ret |= ast_json_object_set(j_res, "channel_uniqueid", ast_json_string_create(stats->channel_uniqueid));
3973  if (ret) {
3974  ast_log(LOG_WARNING, "Could not create rtp statistics info. channel: %s\n", stats->channel_uniqueid);
3975  ast_json_unref(j_res);
3976  return NULL;
3977  }
3978 
3979  /* set other items */
3980  SET_AST_JSON_OBJ(j_res, "txjitter", ast_json_real_create(stats->txjitter));
3981  SET_AST_JSON_OBJ(j_res, "rxjitter", ast_json_real_create(stats->rxjitter));
3982 
3983  SET_AST_JSON_OBJ(j_res, "remote_maxjitter", ast_json_real_create(stats->remote_maxjitter));
3984  SET_AST_JSON_OBJ(j_res, "remote_minjitter", ast_json_real_create(stats->remote_minjitter));
3985  SET_AST_JSON_OBJ(j_res, "remote_normdevjitter", ast_json_real_create(stats->remote_normdevjitter));
3986  SET_AST_JSON_OBJ(j_res, "remote_stdevjitter", ast_json_real_create(stats->remote_stdevjitter));
3987 
3988  SET_AST_JSON_OBJ(j_res, "local_maxjitter", ast_json_real_create(stats->local_maxjitter));
3989  SET_AST_JSON_OBJ(j_res, "local_minjitter", ast_json_real_create(stats->local_minjitter));
3990  SET_AST_JSON_OBJ(j_res, "local_normdevjitter", ast_json_real_create(stats->local_normdevjitter));
3991  SET_AST_JSON_OBJ(j_res, "local_stdevjitter", ast_json_real_create(stats->local_stdevjitter));
3992 
3993  SET_AST_JSON_OBJ(j_res, "remote_maxrxploss", ast_json_real_create(stats->remote_maxrxploss));
3994  SET_AST_JSON_OBJ(j_res, "remote_minrxploss", ast_json_real_create(stats->remote_minrxploss));
3995  SET_AST_JSON_OBJ(j_res, "remote_normdevrxploss", ast_json_real_create(stats->remote_normdevrxploss));
3996  SET_AST_JSON_OBJ(j_res, "remote_stdevrxploss", ast_json_real_create(stats->remote_stdevrxploss));
3997 
3998  SET_AST_JSON_OBJ(j_res, "local_maxrxploss", ast_json_real_create(stats->local_maxrxploss));
3999  SET_AST_JSON_OBJ(j_res, "local_minrxploss", ast_json_real_create(stats->local_minrxploss));
4000  SET_AST_JSON_OBJ(j_res, "local_normdevrxploss", ast_json_real_create(stats->local_normdevrxploss));
4001  SET_AST_JSON_OBJ(j_res, "local_stdevrxploss", ast_json_real_create(stats->local_stdevrxploss));
4002 
4003  SET_AST_JSON_OBJ(j_res, "rtt", ast_json_real_create(stats->rtt));
4004  SET_AST_JSON_OBJ(j_res, "maxrtt", ast_json_real_create(stats->maxrtt));
4005  SET_AST_JSON_OBJ(j_res, "minrtt", ast_json_real_create(stats->minrtt));
4006  SET_AST_JSON_OBJ(j_res, "normdevrtt", ast_json_real_create(stats->normdevrtt));
4007  SET_AST_JSON_OBJ(j_res, "stdevrtt", ast_json_real_create(stats->stdevrtt));
4008 
4009  return j_res;
4010 }
#define ast_log
Definition: astobj2.c:42
#define LOG_WARNING
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json * ast_json_real_create(double value)
Create a JSON real number.
Definition: json.c:332
struct ast_json * ast_json_object_create(void)
Create a new JSON object.
Definition: json.c:389
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
Definition: json.c:404
struct ast_json * ast_json_integer_create(intmax_t value)
Create a JSON integer.
Definition: json.c:317
struct ast_json * ast_json_string_create(const char *value)
Construct a JSON string from value.
Definition: json.c:268
#define SET_AST_JSON_OBJ(target, name, obj)
Set given json object into target with name.
Definition: rtp_engine.c:288
Abstract JSON element (object, array, string, int, ...).
unsigned int remote_ssrc
Definition: rtp_engine.h:424
unsigned int rxcount
Definition: rtp_engine.h:370
unsigned int local_ssrc
Definition: rtp_engine.h:422
unsigned int rxoctetcount
Definition: rtp_engine.h:430
unsigned int rxploss
Definition: rtp_engine.h:394
unsigned int txcount
Definition: rtp_engine.h:368
unsigned int txploss
Definition: rtp_engine.h:392
unsigned int txoctetcount
Definition: rtp_engine.h:428
char channel_uniqueid[MAX_CHANNEL_ID]
Definition: rtp_engine.h:426

References ast_json_integer_create(), ast_json_object_create(), ast_json_object_set(), ast_json_real_create(), ast_json_string_create(), ast_json_unref(), ast_log, ast_rtp_instance_stats::channel_uniqueid, 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, LOG_WARNING, ast_rtp_instance_stats::maxrtt, ast_rtp_instance_stats::minrtt, ast_rtp_instance_stats::normdevrtt, NULL, 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::rxoctetcount, ast_rtp_instance_stats::rxploss, SET_AST_JSON_OBJ, ast_rtp_instance_stats::stdevrtt, ast_rtp_instance_stats::txcount, ast_rtp_instance_stats::txjitter, ast_rtp_instance_stats::txoctetcount, and ast_rtp_instance_stats::txploss.

Referenced by ast_rtp_instance_get_stats_all_json().

◆ ast_rtp_dtls_cfg_copy()

void ast_rtp_dtls_cfg_copy ( const struct ast_rtp_dtls_cfg src_cfg,
struct ast_rtp_dtls_cfg dst_cfg 
)

Copy contents of a DTLS configuration structure.

Parameters
src_cfgsource DTLS configuration structure
dst_cfgdestination DTLS configuration structure

Definition at line 3105 of file rtp_engine.c.

3106 {
3107  ast_rtp_dtls_cfg_free(dst_cfg); /* Prevent a double-call leaking memory via ast_strdup */
3108 
3109  dst_cfg->enabled = src_cfg->enabled;
3110  dst_cfg->verify = src_cfg->verify;
3111  dst_cfg->rekey = src_cfg->rekey;
3112  dst_cfg->suite = src_cfg->suite;
3113  dst_cfg->hash = src_cfg->hash;
3114  dst_cfg->ephemeral_cert = src_cfg->ephemeral_cert;
3115  dst_cfg->certfile = ast_strdup(src_cfg->certfile);
3116  dst_cfg->pvtfile = ast_strdup(src_cfg->pvtfile);
3117  dst_cfg->cipher = ast_strdup(src_cfg->cipher);
3118  dst_cfg->cafile = ast_strdup(src_cfg->cafile);
3119  dst_cfg->capath = ast_strdup(src_cfg->capath);
3120  dst_cfg->default_setup = src_cfg->default_setup;
3121 }
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
void ast_rtp_dtls_cfg_free(struct ast_rtp_dtls_cfg *dtls_cfg)
Free contents of a DTLS configuration structure.
Definition: rtp_engine.c:3123
enum ast_rtp_dtls_setup default_setup
Definition: rtp_engine.h:557
enum ast_rtp_dtls_verify verify
Definition: rtp_engine.h:560
unsigned int rekey
Definition: rtp_engine.h:556
enum ast_rtp_dtls_hash hash
Definition: rtp_engine.h:559
unsigned int enabled
Definition: rtp_engine.h:555
unsigned int ephemeral_cert
Definition: rtp_engine.h:566
enum ast_srtp_suite suite
Definition: rtp_engine.h:558

References ast_rtp_dtls_cfg_free(), ast_strdup, ast_rtp_dtls_cfg::cafile, ast_rtp_dtls_cfg::capath, ast_rtp_dtls_cfg::certfile, ast_rtp_dtls_cfg::cipher, ast_rtp_dtls_cfg::default_setup, ast_rtp_dtls_cfg::enabled, ast_rtp_dtls_cfg::ephemeral_cert, ast_rtp_dtls_cfg::hash, ast_rtp_dtls_cfg::pvtfile, ast_rtp_dtls_cfg::rekey, ast_rtp_dtls_cfg::suite, and ast_rtp_dtls_cfg::verify.

Referenced by build_peer(), and create_addr_from_peer().

◆ ast_rtp_dtls_cfg_free()

void ast_rtp_dtls_cfg_free ( struct ast_rtp_dtls_cfg dtls_cfg)

Free contents of a DTLS configuration structure.

Parameters
dtls_cfga DTLS configuration structure

Definition at line 3123 of file rtp_engine.c.

3124 {
3125  ast_free(dtls_cfg->certfile);
3126  dtls_cfg->certfile = NULL;
3127  ast_free(dtls_cfg->pvtfile);
3128  dtls_cfg->pvtfile = NULL;
3129  ast_free(dtls_cfg->cipher);
3130  dtls_cfg->cipher = NULL;
3131  ast_free(dtls_cfg->cafile);
3132  dtls_cfg->cafile = NULL;
3133  ast_free(dtls_cfg->capath);
3134  dtls_cfg->capath = NULL;
3135 }
#define ast_free(a)
Definition: astmm.h:180

References ast_free, ast_rtp_dtls_cfg::cafile, ast_rtp_dtls_cfg::capath, ast_rtp_dtls_cfg::certfile, ast_rtp_dtls_cfg::cipher, NULL, and ast_rtp_dtls_cfg::pvtfile.

Referenced by ast_rtp_dtls_cfg_copy(), build_peer(), media_configuration_destroy(), reload_config(), sip_destroy_peer(), and sip_pvt_dtor().

◆ ast_rtp_dtls_cfg_parse()

int ast_rtp_dtls_cfg_parse ( struct ast_rtp_dtls_cfg dtls_cfg,
const char *  name,
const char *  value 
)

Parse DTLS related configuration options.

Parameters
dtls_cfga DTLS configuration structure
namename of the configuration option
valuevalue of the configuration option
Return values
0if handled
-1if not handled

Definition at line 3012 of file rtp_engine.c.

3013 {
3014  if (!strcasecmp(name, "dtlsenable")) {
3015  dtls_cfg->enabled = ast_true(value) ? 1 : 0;
3016  } else if (!strcasecmp(name, "dtlsverify")) {
3017  if (!strcasecmp(value, "yes")) {
3019  } else if (!strcasecmp(value, "fingerprint")) {
3021  } else if (!strcasecmp(value, "certificate")) {
3023  } else if (!strcasecmp(value, "no")) {
3024  dtls_cfg->verify = AST_RTP_DTLS_VERIFY_NONE;
3025  } else {
3026  return -1;
3027  }
3028  } else if (!strcasecmp(name, "dtlsrekey")) {
3029  if (sscanf(value, "%30u", &dtls_cfg->rekey) != 1) {
3030  return -1;
3031  }
3032  } else if (!strcasecmp(name, "dtlsautogeneratecert")) {
3033  dtls_cfg->ephemeral_cert = ast_true(value) ? 1 : 0;
3034  } else if (!strcasecmp(name, "dtlscertfile")) {
3036  ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
3037  return -1;
3038  }
3039  ast_free(dtls_cfg->certfile);
3040  dtls_cfg->certfile = ast_strdup(value);
3041  } else if (!strcasecmp(name, "dtlsprivatekey")) {
3043  ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
3044  return -1;
3045  }
3046  ast_free(dtls_cfg->pvtfile);
3047  dtls_cfg->pvtfile = ast_strdup(value);
3048  } else if (!strcasecmp(name, "dtlscipher")) {
3049  ast_free(dtls_cfg->cipher);
3050  dtls_cfg->cipher = ast_strdup(value);
3051  } else if (!strcasecmp(name, "dtlscafile")) {
3053  ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
3054  return -1;
3055  }
3056  ast_free(dtls_cfg->cafile);
3057  dtls_cfg->cafile = ast_strdup(value);
3058  } else if (!strcasecmp(name, "dtlscapath") || !strcasecmp(name, "dtlscadir")) {
3060  ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
3061  return -1;
3062  }
3063  ast_free(dtls_cfg->capath);
3064  dtls_cfg->capath = ast_strdup(value);
3065  } else if (!strcasecmp(name, "dtlssetup")) {
3066  if (!strcasecmp(value, "active")) {
3068  } else if (!strcasecmp(value, "passive")) {
3070  } else if (!strcasecmp(value, "actpass")) {
3072  }
3073  } else if (!strcasecmp(name, "dtlsfingerprint")) {
3074  if (!strcasecmp(value, "sha-256")) {
3075  dtls_cfg->hash = AST_RTP_DTLS_HASH_SHA256;
3076  } else if (!strcasecmp(value, "sha-1")) {
3077  dtls_cfg->hash = AST_RTP_DTLS_HASH_SHA1;
3078  }
3079  } else {
3080  return -1;
3081  }
3082 
3083  return 0;
3084 }
static const char name[]
Definition: format_mp3.c:68
#define LOG_ERROR
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: main/utils.c:2097
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
int value
Definition: syslog.c:37
int ast_file_is_readable(const char *filename)
Test that a file exists and is readable by the effective user.
Definition: main/utils.c:3003

References ast_file_is_readable(), ast_free, ast_log, AST_RTP_DTLS_HASH_SHA1, AST_RTP_DTLS_HASH_SHA256, AST_RTP_DTLS_SETUP_ACTIVE, AST_RTP_DTLS_SETUP_ACTPASS, AST_RTP_DTLS_SETUP_PASSIVE, AST_RTP_DTLS_VERIFY_CERTIFICATE, AST_RTP_DTLS_VERIFY_FINGERPRINT, AST_RTP_DTLS_VERIFY_NONE, ast_strdup, ast_strlen_zero(), ast_true(), ast_rtp_dtls_cfg::cafile, ast_rtp_dtls_cfg::capath, ast_rtp_dtls_cfg::certfile, ast_rtp_dtls_cfg::cipher, ast_rtp_dtls_cfg::default_setup, ast_rtp_dtls_cfg::enabled, ast_rtp_dtls_cfg::ephemeral_cert, ast_rtp_dtls_cfg::hash, LOG_ERROR, name, ast_rtp_dtls_cfg::pvtfile, ast_rtp_dtls_cfg::rekey, value, and ast_rtp_dtls_cfg::verify.

Referenced by build_peer(), dtls_handler(), media_encryption_handler(), and reload_config().

◆ ast_rtp_dtls_cfg_validate()

int ast_rtp_dtls_cfg_validate ( struct ast_rtp_dtls_cfg dtls_cfg)

Validates DTLS related configuration options.

Parameters
dtls_cfga DTLS configuration structure
Return values
0if valid
-1if invalid

Definition at line 3086 of file rtp_engine.c.

3087 {
3088  if (dtls_cfg->ephemeral_cert) {
3089  if (!ast_strlen_zero(dtls_cfg->certfile)) {
3090  ast_log(LOG_ERROR, "You cannot request automatically generated certificates"
3091  " (dtls_auto_generate_cert) and also specify a certificate file"
3092  " (dtls_cert_file) at the same time\n");
3093  return -1;
3094  } else if (!ast_strlen_zero(dtls_cfg->pvtfile)
3095  || !ast_strlen_zero(dtls_cfg->cafile)
3096  || !ast_strlen_zero(dtls_cfg->capath)) {
3097  ast_log(LOG_NOTICE, "dtls_pvt_file, dtls_cafile, and dtls_ca_path are"
3098  " ignored when dtls_auto_generate_cert is enabled\n");
3099  }
3100  }
3101 
3102  return 0;
3103 }
#define LOG_NOTICE

References ast_log, ast_strlen_zero(), ast_rtp_dtls_cfg::cafile, ast_rtp_dtls_cfg::capath, ast_rtp_dtls_cfg::certfile, ast_rtp_dtls_cfg::ephemeral_cert, LOG_ERROR, LOG_NOTICE, and ast_rtp_dtls_cfg::pvtfile.

Referenced by build_peer(), reload_config(), and sip_endpoint_apply_handler().

◆ ast_rtp_engine_alloc_payload_type()

struct ast_rtp_payload_type* ast_rtp_engine_alloc_payload_type ( void  )

Allocation routine for ast_rtp_payload_type.

Return values
NULLon error
Returns
An ao2 ref counted ast_rtp_payload_type on success.
Note
The ast_rtp_payload_type returned by this function is an ao2 ref counted object.

Definition at line 325 of file rtp_engine.c.

326 {
327  return rtp_payload_type_alloc(NULL, 0, 0, 0);
328 }
static struct ast_rtp_payload_type * rtp_payload_type_alloc(struct ast_format *format, int payload, int rtp_code, int primary_mapping)
Definition: rtp_engine.c:306

References NULL, and rtp_payload_type_alloc().

Referenced by ast_rtp_codecs_payload_replace_format(), ast_rtp_codecs_payloads_set_rtpmap_type_rate(), and payload_mapping_rx_clear_primary().

◆ ast_rtp_engine_load_format()

int ast_rtp_engine_load_format ( struct ast_format format)

Custom formats declared in codecs.conf at startup must be communicated to the rtp_engine so their mime type can payload number can be initialized.

Definition at line 3221 of file rtp_engine.c.

3222 {
3223  char *codec_name = ast_strdupa(ast_format_get_codec_name(format));
3224 
3225  codec_name = ast_str_to_upper(codec_name);
3226 
3228  0,
3230  codec_name,
3232  add_static_payload(-1, format, 0);
3233 
3234  return 0;
3235 }
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
const char * ast_codec_media_type2str(enum ast_media_type type)
Conversion function to take a media type and turn it into a string.
Definition: codec.c:347
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition: format.c:379
const char * ast_format_get_codec_name(const struct ast_format *format)
Get the codec name associated with a format.
Definition: format.c:339
static void add_static_payload(int payload, struct ast_format *format, int rtp_code)
Definition: rtp_engine.c:3175
static void set_next_mime_type(struct ast_format *format, int rtp_code, const char *type, const char *subtype, unsigned int sample_rate)
Definition: rtp_engine.c:3147
static force_inline char * ast_str_to_upper(char *str)
Convert a string to all upper-case.
Definition: strings.h:1320

References add_static_payload(), ast_codec_media_type2str(), ast_format_get_codec_name(), ast_format_get_sample_rate(), ast_format_get_type(), ast_str_to_upper(), ast_strdupa, format, and set_next_mime_type().

◆ ast_rtp_engine_register2()

int ast_rtp_engine_register2 ( struct ast_rtp_engine engine,
struct ast_module module 
)

Register an RTP engine.

Parameters
engineStructure of the RTP engine to register
moduleModule that the RTP engine is part of
Return values
0success
-1failure

Example usage:

ast_rtp_engine_register2(&example_rtp_engine, NULL);
int ast_rtp_engine_register2(struct ast_rtp_engine *engine, struct ast_module *module)
Register an RTP engine.
Definition: rtp_engine.c:330

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 330 of file rtp_engine.c.

331 {
332  struct ast_rtp_engine *current_engine;
333 
334  /* Perform a sanity check on the engine structure to make sure it has the basics */
335  if (ast_strlen_zero(engine->name) || !engine->new || !engine->destroy || !engine->write || !engine->read) {
336  ast_log(LOG_WARNING, "RTP Engine '%s' failed sanity check so it was not registered.\n", !ast_strlen_zero(engine->name) ? engine->name : "Unknown");
337  return -1;
338  }
339 
340  /* Link owner module to the RTP engine for reference counting purposes */
341  engine->mod = module;
342 
344 
345  /* Ensure that no two modules with the same name are registered at the same time */
346  AST_RWLIST_TRAVERSE(&engines, current_engine, entry) {
347  if (!strcmp(current_engine->name, engine->name)) {
348  ast_log(LOG_WARNING, "An RTP engine with the name '%s' has already been registered.\n", engine->name);
350  return -1;
351  }
352  }
353 
354  /* The engine survived our critique. Off to the list it goes to be used */
356 
358 
359  ast_verb(2, "Registered RTP engine '%s'\n", engine->name);
360 
361  return 0;
362 }
#define ast_verb(level,...)
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
int(* write)(struct ast_rtp_instance *instance, struct ast_frame *frame)
Definition: rtp_engine.h:624
int(* destroy)(struct ast_rtp_instance *instance)
Definition: rtp_engine.h:622
struct ast_module * mod
Definition: rtp_engine.h:618
int(* new)(struct ast_rtp_instance *instance, struct ast_sched_context *sched, struct ast_sockaddr *sa, void *data)
Definition: rtp_engine.h:620
const char * name
Definition: rtp_engine.h:616
struct ast_frame *(* read)(struct ast_rtp_instance *instance, int rtcp)
Definition: rtp_engine.h:661
Definition: search.h:40

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, LOG_WARNING, ast_rtp_engine::mod, ast_rtp_engine::name, ast_rtp_engine::new, ast_rtp_engine::read, and ast_rtp_engine::write.

◆ ast_rtp_engine_register_srtp()

int ast_rtp_engine_register_srtp ( struct ast_srtp_res srtp_res,
struct ast_srtp_policy_res policy_res 
)

Definition at line 2702 of file rtp_engine.c.

2703 {
2704  if (res_srtp || res_srtp_policy) {
2705  return -1;
2706  }
2707  if (!srtp_res || !policy_res) {
2708  return -1;
2709  }
2710 
2711  res_srtp = srtp_res;
2713 
2714  return 0;
2715 }
static struct ast_srtp_res srtp_res
Definition: res_srtp.c:103
static struct ast_srtp_policy_res policy_res
Definition: res_srtp.c:115
struct ast_srtp_res * res_srtp
Definition: rtp_engine.c:177
struct ast_srtp_policy_res * res_srtp_policy
Definition: rtp_engine.c:178

References policy_res, res_srtp, res_srtp_policy, and srtp_res.

Referenced by res_srtp_init().

◆ ast_rtp_engine_srtp_is_registered()

int ast_rtp_engine_srtp_is_registered ( void  )

Definition at line 2723 of file rtp_engine.c.

2724 {
2725  return res_srtp && res_srtp_policy;
2726 }

References res_srtp, and res_srtp_policy.

Referenced by ast_sdp_srtp_alloc(), and dialog_initialize_dtls_srtp().

◆ ast_rtp_engine_unload_format()

int ast_rtp_engine_unload_format ( struct ast_format format)

Formats requiring the use of a format attribute interface must have that interface registered in order for the rtp engine to handle it correctly. If an attribute interface is unloaded, this function must be called to notify the rtp_engine.

Definition at line 3237 of file rtp_engine.c.

3238 {
3239  int x;
3240  int y = 0;
3241 
3243  /* remove everything pertaining to this format id from the lists */
3244  for (x = 0; x < AST_RTP_MAX_PT; x++) {
3245  if (static_RTP_PT[x]
3247  ao2_ref(static_RTP_PT[x], -1);
3248  static_RTP_PT[x] = NULL;
3249  }
3250  }
3252 
3254  /* rebuild the list skipping the items matching this id */
3255  for (x = 0; x < mime_types_len; x++) {
3256  if (ast_format_cmp(ast_rtp_mime_types[x].payload_type.format, format) == AST_FORMAT_CMP_EQUAL) {
3258  continue;
3259  }
3260  if (x != y) {
3262  }
3263  y++;
3264  }
3265  mime_types_len = y;
3267  return 0;
3268 }
static void rtp_engine_mime_type_cleanup(int i)
Definition: rtp_engine.c:3141

References ao2_ref, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_RTP_MAX_PT, ast_rtp_mime_types, ast_rwlock_unlock, ast_rwlock_wrlock, format, mime_types_len, mime_types_lock, NULL, rtp_engine_mime_type_cleanup(), static_RTP_PT, and static_RTP_PT_lock.

Referenced by unload_module().

◆ ast_rtp_engine_unregister()

int ast_rtp_engine_unregister ( struct ast_rtp_engine engine)

Unregister an RTP engine.

Parameters
engineStructure of the RTP engine to unregister
Return values
0success
-1failure

Example usage:

ast_rtp_engine_unregister(&example_rtp_engine);
int ast_rtp_engine_unregister(struct ast_rtp_engine *engine)
Unregister an RTP engine.
Definition: rtp_engine.c:364

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 364 of file rtp_engine.c.

365 {
366  struct ast_rtp_engine *current_engine = NULL;
367 
369 
370  if ((current_engine = AST_RWLIST_REMOVE(&engines, engine, entry))) {
371  ast_verb(2, "Unregistered RTP engine '%s'\n", engine->name);
372  }
373 
375 
376  return current_engine ? 0 : -1;
377 }
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:885

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

Referenced by load_module().

◆ ast_rtp_engine_unregister_srtp()

void ast_rtp_engine_unregister_srtp ( void  )

Definition at line 2717 of file rtp_engine.c.

2718 {
2719  res_srtp = NULL;
2721 }

References NULL, res_srtp, and res_srtp_policy.

Referenced by res_srtp_shutdown().

◆ ast_rtp_get_rate()

int ast_rtp_get_rate ( const struct ast_format format)

Retrieve the sample rate of a format according to RTP specifications.

Since
16.7.0
17.1.0
Parameters
formatThe media format
Returns
The sample rate

Definition at line 4023 of file rtp_engine.c.

4024 {
4025  /* For those wondering: due to a fluke in RFC publication, G.722 is advertised
4026  * as having a sample rate of 8kHz, while implementations must know that its
4027  * real rate is 16kHz. Seriously.
4028  */
4030 }
struct ast_format * ast_format_g722
Built-in cached g722 format.
Definition: format_cache.c:106

Referenced by ast_rtcp_calculate_sr_rr_statistics(), ast_rtcp_generate_report(), ast_rtp_dtmf_end_with_duration(), ast_rtp_interpret(), calc_rxstamp(), process_dtmf_cisco(), process_dtmf_rfc2833(), and rtp_raw_write().

◆ ast_rtp_glue_register2()

int ast_rtp_glue_register2 ( struct ast_rtp_glue glue,
struct ast_module module 
)

Register RTP glue.

Parameters
glueThe glue to register
moduleModule that the RTP glue is part of
Return values
0success
-1failure

Example usage:

ast_rtp_glue_register2(&example_rtp_glue, NULL);
int ast_rtp_glue_register2(struct ast_rtp_glue *glue, struct ast_module *module)
Register RTP glue.
Definition: rtp_engine.c:379

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 379 of file rtp_engine.c.

380 {
381  struct ast_rtp_glue *current_glue = NULL;
382 
383  if (ast_strlen_zero(glue->type)) {
384  return -1;
385  }
386 
387  glue->mod = module;
388 
390 
391  AST_RWLIST_TRAVERSE(&glues, current_glue, entry) {
392  if (!strcasecmp(current_glue->type, glue->type)) {
393  ast_log(LOG_WARNING, "RTP glue with the name '%s' has already been registered.\n", glue->type);
395  return -1;
396  }
397  }
398 
400 
402 
403  ast_verb(2, "Registered RTP glue '%s'\n", glue->type);
404 
405  return 0;
406 }
const char * type
Definition: rtp_engine.h:722
struct ast_module * mod
Definition: rtp_engine.h:724

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

◆ ast_rtp_glue_unregister()

int ast_rtp_glue_unregister ( struct ast_rtp_glue glue)

Unregister RTP glue.

Parameters
glueThe glue to unregister
Return values
0success
-1failure

Example usage:

ast_rtp_glue_unregister(&example_rtp_glue);
int ast_rtp_glue_unregister(struct ast_rtp_glue *glue)
Unregister RTP glue.
Definition: rtp_engine.c:408

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 408 of file rtp_engine.c.

409 {
410  struct ast_rtp_glue *current_glue = NULL;
411 
413 
414  if ((current_glue = AST_RWLIST_REMOVE(&glues, glue, entry))) {
415  ast_verb(2, "Unregistered RTP glue '%s'\n", glue->type);
416  }
417 
419 
420  return current_glue ? 0 : -1;
421 }

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

Referenced by load_module(), and unload_module().

◆ ast_rtp_instance_activate()

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
instanceThe RTP instance
Return values
0success
-1failure

Example usage:

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.
Definition: rtp_engine.c:2639

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

Since
1.8

Definition at line 2639 of file rtp_engine.c.

2640 {
2641  int res;
2642 
2643  if (instance->engine->activate) {
2644  ao2_lock(instance);
2645  res = instance->engine->activate(instance);
2646  ao2_unlock(instance);
2647  } else {
2648  res = 0;
2649  }
2650  return res;
2651 }
int(* activate)(struct ast_rtp_instance *instance)
Definition: rtp_engine.h:673

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

Referenced by apply_negotiated_sdp_stream(), handle_response_invite(), rtp_call(), test_init_rtp_instances(), and transmit_response_with_sdp().

◆ ast_rtp_instance_add_srtp_policy()

int ast_rtp_instance_add_srtp_policy ( struct ast_rtp_instance instance,
struct ast_srtp_policy remote_policy,
struct ast_srtp_policy local_policy,
int  rtcp 
)

Add or replace the SRTP policies for the given RTP instance.

Parameters
instancethe RTP instance
remote_policythe remote endpoint's policy
local_policyour policy for this RTP instance's remote endpoint
rtcp1 for dedicated RTCP policies
Return values
0Success
non-zeroFailure
Note
If no remote policy is provided any existing SRTP policies are left and the new local policy is added

Definition at line 2728 of file rtp_engine.c.

2729 {
2730  int res = 0;
2731  struct ast_srtp **srtp;
2732 
2733  if (!res_srtp) {
2734  return -1;
2735  }
2736 
2737  ao2_lock(instance);
2738 
2739  srtp = rtcp ? &instance->rtcp_srtp : &instance->srtp;
2740 
2741  if (!*srtp) {
2742  res = res_srtp->create(srtp, instance, remote_policy);
2743  } else if (remote_policy) {
2744  res = res_srtp->replace(srtp, instance, remote_policy);
2745  }
2746  if (!res) {
2747  res = res_srtp->add_stream(*srtp, local_policy);
2748  }
2749 
2750  ao2_unlock(instance);
2751 
2752  return res;
2753 }
struct ast_srtp * rtcp_srtp
Definition: rtp_engine.c:217
struct ast_srtp * srtp
Definition: rtp_engine.c:215
int(* replace)(struct ast_srtp **srtp, struct ast_rtp_instance *rtp, struct ast_srtp_policy *policy)
Definition: res_srtp.h:38
int(* add_stream)(struct ast_srtp *srtp, struct ast_srtp_policy *policy)
Definition: res_srtp.h:42
int(* create)(struct ast_srtp **srtp, struct ast_rtp_instance *rtp, struct ast_srtp_policy *policy)
Definition: res_srtp.h:36

References ast_srtp_res::add_stream, ao2_lock, ao2_unlock, ast_srtp_res::create, ast_srtp_res::replace, res_srtp, ast_rtp_instance::rtcp_srtp, and ast_rtp_instance::srtp.

Referenced by crypto_activate().

◆ ast_rtp_instance_available_formats()

void ast_rtp_instance_available_formats ( struct ast_rtp_instance instance,
struct ast_format_cap to_endpoint,
struct ast_format_cap to_asterisk,
struct ast_format_cap result 
)

Request the formats that can be transcoded.

Parameters
instanceThe RTP instance
to_endpointFormats being sent/received towards the endpoint
to_asteriskFormats being sent/received towards Asterisk
resultcapabilities structure to store and return supported formats in.

Example usage:

ast_rtp_instance_available_formats(instance, to_capabilities, from_capabilities, result_capabilities);
void ast_rtp_instance_available_formats(struct ast_rtp_instance *instance, struct ast_format_cap *to_endpoint, struct ast_format_cap *to_asterisk, struct ast_format_cap *result)
Request the formats that can be transcoded.
Definition: rtp_engine.c:2625

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 2625 of file rtp_engine.c.

2626 {
2627  if (instance->engine->available_formats) {
2628  ao2_lock(instance);
2629  instance->engine->available_formats(instance, to_endpoint, to_asterisk, result);
2630  ao2_unlock(instance);
2632  return;
2633  }
2634  }
2635 
2636  ast_translate_available_formats(to_endpoint, to_asterisk, result);
2637 }
static PGresult * result
Definition: cel_pgsql.c:84
size_t ast_format_cap_count(const struct ast_format_cap *cap)
Get the number of formats present within the capabilities structure.
Definition: format_cap.c:395
void(* available_formats)(struct ast_rtp_instance *instance, struct ast_format_cap *to_endpoint, struct ast_format_cap *to_asterisk, struct ast_format_cap *result)
Definition: rtp_engine.h:677
void ast_translate_available_formats(struct ast_format_cap *dest, struct ast_format_cap *src, struct ast_format_cap *result)
Find available formats.
Definition: translate.c:1571

References ao2_lock, ao2_unlock, ast_format_cap_count(), ast_translate_available_formats(), ast_rtp_engine::available_formats, ast_rtp_instance::engine, and result.

Referenced by sip_call().

◆ ast_rtp_instance_bundle()

int ast_rtp_instance_bundle ( struct ast_rtp_instance child,
struct ast_rtp_instance parent 
)

Request that an RTP instance be bundled with another.

Since
15.0.0
Parameters
childThe child RTP instance
parentThe parent RTP instance the child should be bundled with
Return values
0success
-1failure

Definition at line 3797 of file rtp_engine.c.

3798 {
3799  int res = -1;
3800 
3801  if (parent && (child->engine != parent->engine)) {
3802  return -1;
3803  }
3804 
3805  ao2_lock(child);
3806  if (child->engine->bundle) {
3807  res = child->engine->bundle(child, parent);
3808  }
3809  ao2_unlock(child);
3810 
3811  return res;
3812 }
int(* bundle)(struct ast_rtp_instance *child, struct ast_rtp_instance *parent)
Definition: rtp_engine.h:685

References ao2_lock, ao2_unlock, ast_rtp_engine::bundle, and ast_rtp_instance::engine.

Referenced by apply_negotiated_sdp_stream(), and negotiate_incoming_sdp_stream().

◆ ast_rtp_instance_change_source()

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
instanceInstance that the new media source is feeding into

Example usage:

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.
Definition: rtp_engine.c:2152

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 2152 of file rtp_engine.c.

2153 {
2154  if (instance->engine->change_source) {
2155  ao2_lock(instance);
2156  instance->engine->change_source(instance);
2157  ao2_unlock(instance);
2158  }
2159 }
void(* change_source)(struct ast_rtp_instance *instance)
Definition: rtp_engine.h:635

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

Referenced by create_outgoing_sdp_stream(), jingle_indicate(), mgcp_indicate(), ooh323_indicate(), sip_indicate(), skinny_indicate(), and unistim_indicate().

◆ ast_rtp_instance_destroy()

int ast_rtp_instance_destroy ( struct ast_rtp_instance instance)

Destroy an RTP instance.

Parameters
instanceThe RTP instance to destroy
Return values
0success
-1failure

Example usage:

int ast_rtp_instance_destroy(struct ast_rtp_instance *instance)
Destroy an RTP instance.
Definition: rtp_engine.c:458

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 458 of file rtp_engine.c.

459 {
460  ao2_cleanup(instance);
461 
462  return 0;
463 }

References ao2_cleanup.

Referenced by AST_TEST_DEFINE(), destroy_endpoint(), destroy_rtp(), dialog_clean_rtp(), jingle_session_destructor(), mgcp_hangup(), multicast_rtp_request(), ooh323_destroy(), rtp_hangup(), sip_new(), start_rtp(), unalloc_sub(), unicast_rtp_request(), and unistim_hangup_clean().

◆ ast_rtp_instance_dtmf_begin()

int ast_rtp_instance_dtmf_begin ( struct ast_rtp_instance instance,
char  digit 
)

Begin sending a DTMF digit.

Parameters
instanceThe RTP instance to send the DTMF on
digitWhat DTMF digit to send
Return values
0success
-1failure

Example usage:

int ast_rtp_instance_dtmf_begin(struct ast_rtp_instance *instance, char digit)
Begin sending a DTMF digit.
Definition: rtp_engine.c:2073

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 2073 of file rtp_engine.c.

2074 {
2075  int res;
2076 
2077  if (instance->engine->dtmf_begin) {
2078  ao2_lock(instance);
2079  res = instance->engine->dtmf_begin(instance, digit);
2080  ao2_unlock(instance);
2081  } else {
2082  res = -1;
2083  }
2084  return res;
2085 }
char digit
int(* dtmf_begin)(struct ast_rtp_instance *instance, char digit)
Definition: rtp_engine.h:628

References ao2_lock, ao2_unlock, digit, ast_rtp_engine::dtmf_begin, and ast_rtp_instance::engine.

Referenced by chan_pjsip_digit_begin(), jingle_digit_begin(), mgcp_senddigit_begin(), ooh323_digit_begin(), and sip_senddigit_begin().

◆ ast_rtp_instance_dtmf_end()

int ast_rtp_instance_dtmf_end ( struct ast_rtp_instance instance,
char  digit 
)

Stop sending a DTMF digit.

Parameters
instanceThe RTP instance to stop the DTMF on
digitWhat DTMF digit to stop
Return values
0success
-1failure

Example usage:

int ast_rtp_instance_dtmf_end(struct ast_rtp_instance *instance, char digit)
Stop sending a DTMF digit.
Definition: rtp_engine.c:2087

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

Since
1.8

Definition at line 2087 of file rtp_engine.c.

2088 {
2089  int res;
2090 
2091  if (instance->engine->dtmf_end) {
2092  ao2_lock(instance);
2093  res = instance->engine->dtmf_end(instance, digit);
2094  ao2_unlock(instance);
2095  } else {
2096  res = -1;
2097  }
2098  return res;
2099 }
int(* dtmf_end)(struct ast_rtp_instance *instance, char digit)
Definition: rtp_engine.h:630

References ao2_lock, ao2_unlock, digit, ast_rtp_engine::dtmf_end, and ast_rtp_instance::engine.

Referenced by mgcp_senddigit_end(), and ooh323_digit_end().

◆ ast_rtp_instance_dtmf_end_with_duration()

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

Definition at line 2101 of file rtp_engine.c.

2102 {
2103  int res;
2104 
2105  if (instance->engine->dtmf_end_with_duration) {
2106  ao2_lock(instance);
2107  res = instance->engine->dtmf_end_with_duration(instance, digit, duration);
2108  ao2_unlock(instance);
2109  } else {
2110  res = -1;
2111  }
2112  return res;
2113 }
int(* dtmf_end_with_duration)(struct ast_rtp_instance *instance, char digit, unsigned int duration)
Definition: rtp_engine.h:631

References ao2_lock, ao2_unlock, digit, ast_rtp_engine::dtmf_end_with_duration, and ast_rtp_instance::engine.

Referenced by chan_pjsip_digit_end(), jingle_digit_end(), and sip_senddigit_end().

◆ ast_rtp_instance_dtmf_mode_get()

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
instanceThe RTP instance to get the DTMF mode of
Returns
DTMF mode

Example usage:

enum ast_rtp_dtmf_mode ast_rtp_instance_dtmf_mode_get(struct ast_rtp_instance *instance)
Get the DTMF mode of an RTP instance.
Definition: rtp_engine.c:2129
ast_rtp_dtmf_mode
Definition: rtp_engine.h:148

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

Since
1.8

Definition at line 2115 of file rtp_engine.c.

2130 {
2131  int res;
2132 
2133  if (instance->engine->dtmf_mode_get) {
2134  ao2_lock(instance);
2135  res = instance->engine->dtmf_mode_get(instance);
2136  ao2_unlock(instance);
2137  } else {
2138  res = 0;
2139  }
2140  return res;
2141 }
enum ast_rtp_dtmf_mode(* dtmf_mode_get)(struct ast_rtp_instance *instance)
Definition: rtp_engine.h:649

References ao2_lock, ao2_unlock, ast_rtp_engine::dtmf_mode_set, and ast_rtp_instance::engine.

Referenced by chan_pjsip_digit_begin(), chan_pjsip_digit_end(), native_rtp_bridge_compatible_check(), pjsip_acf_dtmf_mode_write(), and set_caps().

◆ ast_rtp_instance_dtmf_mode_set()

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
instancethe RTP instance to set DTMF mode on
dtmf_modeThe DTMF mode that is in use
Return values
0success
-1failure

Example usage:

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.
Definition: rtp_engine.c:2115

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

Since
1.8

Definition at line 2115 of file rtp_engine.c.

2116 {
2117  int res;
2118 
2119  if (instance->engine->dtmf_mode_set) {
2120  ao2_lock(instance);
2121  res = instance->engine->dtmf_mode_set(instance, dtmf_mode);
2122  ao2_unlock(instance);
2123  } else {
2124  res = -1;
2125  }
2126  return res;
2127 }
int(* dtmf_mode_set)(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
Definition: rtp_engine.h:647

Referenced by create_rtp(), enable_dsp_detect(), get_codecs(), pjsip_acf_dtmf_mode_write(), and sip_new().

◆ ast_rtp_instance_early_bridge()

int ast_rtp_instance_early_bridge ( struct ast_channel c0,
struct ast_channel c1 
)

Early bridge two channels that use RTP instances.

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

Definition at line 2329 of file rtp_engine.c.

2330 {
2331  struct ast_rtp_instance *instance0 = NULL, *instance1 = NULL,
2332  *vinstance0 = NULL, *vinstance1 = NULL,
2333  *tinstance0 = NULL, *tinstance1 = NULL;
2334  struct ast_rtp_glue *glue0, *glue1;
2335  enum ast_rtp_glue_result audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID, video_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
2336  enum ast_rtp_glue_result audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID, video_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
2339 
2340  /* If there is no second channel just immediately bail out, we are of no use in that scenario */
2341  if (!c1 || !cap1 || !cap0) {
2342  ao2_cleanup(cap0);
2343  ao2_cleanup(cap1);
2344  return -1;
2345  }
2346 
2347  /* Lock both channels so we can look for the glue that binds them together */
2348  ast_channel_lock_both(c0, c1);
2349 
2350  /* Grab glue that binds each channel to something using the RTP engine */
2352  ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", glue0 ? ast_channel_name(c1) : ast_channel_name(c0));
2353  goto done;
2354  }
2355 
2356  audio_glue0_res = glue0->get_rtp_info(c0, &instance0);
2357  video_glue0_res = glue0->get_vrtp_info ? glue0->get_vrtp_info(c0, &vinstance0) : AST_RTP_GLUE_RESULT_FORBID;
2358 
2359  audio_glue1_res = glue1->get_rtp_info(c1, &instance1);
2360  video_glue1_res = glue1->get_vrtp_info ? glue1->get_vrtp_info(c1, &vinstance1) : AST_RTP_GLUE_RESULT_FORBID;
2361 
2362  /* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
2363  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)) {
2364  audio_glue0_res = AST_RTP_GLUE_RESULT_FORBID;
2365  }
2366  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)) {
2367  audio_glue1_res = AST_RTP_GLUE_RESULT_FORBID;
2368  }
2369  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) {
2370  glue0->get_codec(c0, cap0);
2371  }
2372  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) {
2373  glue1->get_codec(c1, cap1);
2374  }
2375 
2376  /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
2377  if (audio_glue0_res != AST_RTP_GLUE_RESULT_REMOTE || audio_glue1_res != AST_RTP_GLUE_RESULT_REMOTE) {
2378  goto done;
2379  }
2380 
2381  /* Make sure we have matching codecs */
2382  if (!ast_format_cap_iscompatible(cap0, cap1)) {
2383  goto done;
2384  }
2385 
2386  /* Bridge media early */
2387  if (glue0->update_peer(c0, instance1, vinstance1, tinstance1, cap1, 0)) {
2388  ast_log(LOG_WARNING, "Channel '%s' failed to setup early bridge to '%s'\n", ast_channel_name(c0), c1 ? ast_channel_name(c1) : "<unspecified>");
2389  }
2390 
2391 done:
2392  ast_channel_unlock(c0);
2393  ast_channel_unlock(c1);
2394 
2395  ao2_cleanup(cap0);
2396  ao2_cleanup(cap1);
2397 
2398  unref_instance_cond(&instance0);
2399  unref_instance_cond(&instance1);
2400  unref_instance_cond(&vinstance0);
2401  unref_instance_cond(&vinstance1);
2402  unref_instance_cond(&tinstance0);
2403  unref_instance_cond(&tinstance1);
2404 
2405  ast_debug(1, "Setting early bridge SDP of '%s' with that of '%s'\n", ast_channel_name(c0), c1 ? ast_channel_name(c1) : "<unspecified>");
2406 
2407  return 0;
2408 }
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition: channel.h:2929
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition: channel.h:2923
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
int ast_format_cap_iscompatible(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
Determine if any joint capabilities exist between two capabilities structures.
Definition: format_cap.c:653
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
static void unref_instance_cond(struct ast_rtp_instance **instance)
Conditionally unref an rtp instance.
Definition: rtp_engine.c:2218
struct ast_rtp_glue * ast_rtp_instance_get_glue(const char *type)
Get the RTP glue that binds a channel to the RTP engine.
Definition: rtp_engine.c:2198
ast_rtp_glue_result
Definition: rtp_engine.h:158
enum ast_rtp_glue_result(* get_rtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance)
Callback for retrieving the RTP instance carrying audio.
Definition: rtp_engine.h:729
void(* get_codec)(struct ast_channel *chan, struct ast_format_cap *result_cap)
Callback for retrieving codecs that the channel can do. Result returned in result_cap.
Definition: rtp_engine.h:761
int(* update_peer)(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_rtp_instance *vinstance, struct ast_rtp_instance *tinstance, const struct ast_format_cap *cap, int nat_active)
Definition: rtp_engine.h:756
enum ast_rtp_glue_result(* get_vrtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance)
Callback for retrieving the RTP instance carrying video.
Definition: rtp_engine.h:741
int done
Definition: test_amihooks.c:48

References ao2_cleanup, ast_channel_lock_both, ast_channel_name(), ast_channel_tech(), ast_channel_unlock, ast_debug, ast_format_cap_alloc, AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_iscompatible(), ast_log, AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_REMOTE, ast_rtp_instance_get_glue(), done, ast_rtp_glue::get_codec, ast_rtp_glue::get_rtp_info, ast_rtp_glue::get_vrtp_info, LOG_WARNING, NULL, type, unref_instance_cond(), and ast_rtp_glue::update_peer.

◆ ast_rtp_instance_early_bridge_make_compatible()

void ast_rtp_instance_early_bridge_make_compatible ( struct ast_channel c_dst,
struct ast_channel c_src 
)

Make two channels compatible for early bridging.

Parameters
c_dstDestination channel to copy to
c_srcSource channel to copy from
Since
1.8

Definition at line 2243 of file rtp_engine.c.

2244 {
2245  struct ast_rtp_instance *instance_dst = NULL, *instance_src = NULL,
2246  *vinstance_dst = NULL, *vinstance_src = NULL,
2247  *tinstance_dst = NULL, *tinstance_src = NULL;
2248  struct ast_rtp_glue *glue_dst, *glue_src;
2249  enum ast_rtp_glue_result audio_glue_dst_res = AST_RTP_GLUE_RESULT_FORBID, video_glue_dst_res = AST_RTP_GLUE_RESULT_FORBID;
2250  enum ast_rtp_glue_result audio_glue_src_res = AST_RTP_GLUE_RESULT_FORBID, video_glue_src_res = AST_RTP_GLUE_RESULT_FORBID;
2253 
2254  /* Lock both channels so we can look for the glue that binds them together */
2255  ast_channel_lock_both(c_dst, c_src);
2256 
2257  if (!cap_src || !cap_dst) {
2258  goto done;
2259  }
2260 
2261  /* Grab glue that binds each channel to something using the RTP engine */
2262  if (!(glue_dst = ast_rtp_instance_get_glue(ast_channel_tech(c_dst)->type)) || !(glue_src = ast_rtp_instance_get_glue(ast_channel_tech(c_src)->type))) {
2263  ast_debug(1, "Can't find native functions for channel '%s'\n", glue_dst ? ast_channel_name(c_src) : ast_channel_name(c_dst));
2264  goto done;
2265  }
2266 
2267  audio_glue_dst_res = glue_dst->get_rtp_info(c_dst, &instance_dst);
2268  video_glue_dst_res = glue_dst->get_vrtp_info ? glue_dst->get_vrtp_info(c_dst, &vinstance_dst) : AST_RTP_GLUE_RESULT_FORBID;
2269 
2270  audio_glue_src_res = glue_src->get_rtp_info(c_src, &instance_src);
2271  video_glue_src_res = glue_src->get_vrtp_info ? glue_src->get_vrtp_info(c_src, &vinstance_src) : AST_RTP_GLUE_RESULT_FORBID;
2272 
2273  /* If we are carrying video, and both sides are not going to remotely bridge... fail the native bridge */
2274  if (video_glue_dst_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue_dst_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue_dst_res != AST_RTP_GLUE_RESULT_REMOTE)) {
2275  audio_glue_dst_res = AST_RTP_GLUE_RESULT_FORBID;
2276  }
2277  if (video_glue_src_res != AST_RTP_GLUE_RESULT_FORBID && (audio_glue_src_res != AST_RTP_GLUE_RESULT_REMOTE || video_glue_src_res != AST_RTP_GLUE_RESULT_REMOTE)) {
2278  audio_glue_src_res = AST_RTP_GLUE_RESULT_FORBID;
2279  }
2280  if (audio_glue_dst_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue_dst_res == AST_RTP_GLUE_RESULT_FORBID || video_glue_dst_res == AST_RTP_GLUE_RESULT_REMOTE) && glue_dst->get_codec) {
2281  glue_dst->get_codec(c_dst, cap_dst);
2282  }
2283  if (audio_glue_src_res == AST_RTP_GLUE_RESULT_REMOTE && (video_glue_src_res == AST_RTP_GLUE_RESULT_FORBID || video_glue_src_res == AST_RTP_GLUE_RESULT_REMOTE) && glue_src->get_codec) {
2284  glue_src->get_codec(c_src, cap_src);
2285  }
2286 
2287  /* If any sort of bridge is forbidden just completely bail out and go back to generic bridging */
2288  if (audio_glue_dst_res != AST_RTP_GLUE_RESULT_REMOTE || audio_glue_src_res != AST_RTP_GLUE_RESULT_REMOTE) {
2289  goto done;
2290  }
2291 
2292  /* Make sure we have matching codecs */
2293  if (!ast_format_cap_iscompatible(cap_dst, cap_src)) {
2294  goto done;
2295  }
2296 
2297  ast_rtp_codecs_payloads_xover(&instance_src->codecs, &instance_dst->codecs, instance_dst);
2298 
2299  if (vinstance_dst && vinstance_src) {
2300  ast_rtp_codecs_payloads_xover(&vinstance_src->codecs, &vinstance_dst->codecs, vinstance_dst);
2301  }
2302  if (tinstance_dst && tinstance_src) {
2303  ast_rtp_codecs_payloads_xover(&tinstance_src->codecs, &tinstance_dst->codecs, tinstance_dst);
2304  }
2305 
2306  if (glue_dst->update_peer(c_dst, instance_src, vinstance_src, tinstance_src, cap_src, 0)) {
2307  ast_log(LOG_WARNING, "Channel '%s' failed to setup early bridge to '%s'\n",
2308  ast_channel_name(c_dst), ast_channel_name(c_src));
2309  } else {
2310  ast_debug(1, "Seeded SDP of '%s' with that of '%s'\n",
2311  ast_channel_name(c_dst), ast_channel_name(c_src));
2312  }
2313 
2314 done:
2315  ast_channel_unlock(c_dst);
2316  ast_channel_unlock(c_src);
2317 
2318  ao2_cleanup(cap_dst);
2319  ao2_cleanup(cap_src);
2320 
2321  unref_instance_cond(&instance_dst);
2322  unref_instance_cond(&instance_src);
2323  unref_instance_cond(&vinstance_dst);
2324  unref_instance_cond(&vinstance_src);
2325  unref_instance_cond(&tinstance_dst);
2326  unref_instance_cond(&tinstance_src);
2327 }
void ast_rtp_codecs_payloads_xover(struct ast_rtp_codecs *src, struct ast_rtp_codecs *dest, struct ast_rtp_instance *instance)
Crossover copy the tx payload mapping of src to the rx payload mapping of dest.
Definition: rtp_engine.c:1249
struct ast_rtp_codecs codecs
Definition: rtp_engine.c:205

References ao2_cleanup, ast_channel_lock_both, ast_channel_name(), ast_channel_tech(), ast_channel_unlock, ast_debug, ast_format_cap_alloc, AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_iscompatible(), ast_log, ast_rtp_codecs_payloads_xover(), AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_REMOTE, ast_rtp_instance_get_glue(), ast_rtp_instance::codecs, done, ast_rtp_glue::get_codec, ast_rtp_glue::get_rtp_info, ast_rtp_glue::get_vrtp_info, LOG_WARNING, NULL, type, unref_instance_cond(), and ast_rtp_glue::update_peer.

Referenced by dial_exec_full(), and do_forward().

◆ ast_rtp_instance_extmap_clear()

void ast_rtp_instance_extmap_clear ( struct ast_rtp_instance instance)

Clear negotiated RTP extension information.

Parameters
instanceThe RTP instance to clear negotiated extension information on

Definition at line 862 of file rtp_engine.c.

863 {
864  static const struct rtp_extmap extmap_none = {
867  };
868  int idx;
869 
870  ao2_lock(instance);
871 
872  /* Clear both the known unique ids and the negotiated extensions as we are about to have
873  * new results set on us.
874  */
875  for (idx = 0; idx < AST_VECTOR_SIZE(&instance->extmap_unique_ids); ++idx) {
876  AST_VECTOR_REPLACE(&instance->extmap_unique_ids, idx, extmap_none);
877  }
878 
879  for (idx = 0; idx < AST_VECTOR_SIZE(&instance->extmap_negotiated); ++idx) {
880  AST_VECTOR_REPLACE(&instance->extmap_negotiated, idx, -1);
881  }
882 
883  ao2_unlock(instance);
884 }
struct ast_rtp_instance::@410 extmap_negotiated
struct ast_rtp_instance::@411 extmap_unique_ids
enum ast_rtp_extension extension
Definition: rtp_engine.c:183

References ao2_lock, ao2_unlock, AST_RTP_EXTENSION_DIRECTION_NONE, AST_RTP_EXTENSION_UNSUPPORTED, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, rtp_extmap::extension, ast_rtp_instance::extmap_negotiated, and ast_rtp_instance::extmap_unique_ids.

Referenced by process_extmap_attributes().

◆ ast_rtp_instance_extmap_count()

size_t ast_rtp_instance_extmap_count ( struct ast_rtp_instance instance)

Get the number of known unique identifiers.

Parameters
instanceThe RTP instance to retrieve the count from
Returns
the number of known unique identifiers
Since
15.5.0

Definition at line 899 of file rtp_engine.c.

900 {
901  size_t count;
902 
903  ao2_lock(instance);
904  count = AST_VECTOR_SIZE(&instance->extmap_unique_ids);
905  ao2_unlock(instance);
906 
907  return count;
908 }

References ao2_lock, ao2_unlock, AST_VECTOR_SIZE, and ast_rtp_instance::extmap_unique_ids.

Referenced by add_extmap_to_stream(), and enable_rtp_extension().

◆ ast_rtp_instance_extmap_enable()

int ast_rtp_instance_extmap_enable ( struct ast_rtp_instance instance,
int  id,
enum ast_rtp_extension  extension,
enum ast_rtp_extension_direction  direction 
)

Enable support for an RTP extension on an instance.

Parameters
instanceThe RTP instance to enable the extension on
idThe unique local identifier to use for this extension (-1 to have one auto selected)
extensionThe RTP extension
directionThe initial direction that the RTP extension should be used in
Return values
0success
-1failure
Since
15.5.0

Definition at line 732 of file rtp_engine.c.

734 {
735  struct rtp_extmap extmap = {
736  .extension = extension,
737  .direction = direction,
738  };
739 
740  ao2_lock(instance);
741 
742  if (!instance->engine->extension_enable || !instance->engine->extension_enable(instance, extension)) {
743  ao2_unlock(instance);
744  return 0;
745  }
746 
747  /* We store enabled extensions separately so we can easily do negotiation */
749  ao2_unlock(instance);
750  return -1;
751  }
752 
753  if (id <= 0) {
754  /* We find a free unique identifier for this extension by just appending it to the
755  * vector of unique ids. The size of the vector will become its unique identifier.
756  * As well when we are asking for information on the extensions it will be returned,
757  * allowing it to be added to the SDP offer.
758  */
759  if (AST_VECTOR_APPEND(&instance->extmap_unique_ids, extmap)) {
761  ao2_unlock(instance);
762  return -1;
763  }
764  id = AST_VECTOR_SIZE(&instance->extmap_unique_ids);
765  } else {
766  /* Otherwise we put it precisely where they want it */
767  if (AST_VECTOR_REPLACE(&instance->extmap_unique_ids, id - 1, extmap)) {
769  ao2_unlock(instance);
770  return -1;
771  }
772  }
773 
774  /* Now that we have an id add the extension to here */
775  if (AST_VECTOR_REPLACE(&instance->extmap_negotiated, extension, id)) {
779  AST_VECTOR_REPLACE(&instance->extmap_unique_ids, id - 1, extmap);
780  ao2_unlock(instance);
781  return -1;
782  }
783 
784  ao2_unlock(instance);
785 
786  return 0;
787 }
direction
int(* extension_enable)(struct ast_rtp_instance *instance, enum ast_rtp_extension extension)
Definition: rtp_engine.h:699
struct ast_rtp_instance::@409 extmap_enabled
structure to hold extensions
enum ast_rtp_extension_direction direction
Definition: rtp_engine.c:185
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256

References ao2_lock, ao2_unlock, AST_RTP_EXTENSION_DIRECTION_NONE, AST_RTP_EXTENSION_UNSUPPORTED, AST_VECTOR_APPEND, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, rtp_extmap::direction, ast_rtp_instance::engine, rtp_extmap::extension, ast_rtp_engine::extension_enable, ast_rtp_instance::extmap_enabled, ast_rtp_instance::extmap_negotiated, and ast_rtp_instance::extmap_unique_ids.

Referenced by enable_rtp_extension().

◆ ast_rtp_instance_extmap_get_direction()

enum ast_rtp_extension_direction ast_rtp_instance_extmap_get_direction ( struct ast_rtp_instance instance,
int  id 
)

Retrieve the negotiated direction for an RTP extension id.

Parameters
instanceThe RTP instance to retrieve the direction from
idThe negotiated RTP extension id
Returns
direction the direction that has been negotiated
Since
15.5.0

Definition at line 899 of file rtp_engine.c.

931 {
933 
934  ao2_lock(instance);
935 
936  if (0 < id && id <= AST_VECTOR_SIZE(&instance->extmap_unique_ids)) {
937  struct rtp_extmap *extmap = AST_VECTOR_GET_ADDR(&instance->extmap_unique_ids, id - 1);
938 
939  direction = extmap->direction;
940  }
941  ao2_unlock(instance);
942 
943  return direction;
944 }
ast_rtp_extension_direction
Directions for RTP extensions.
Definition: rtp_engine.h:769
#define AST_VECTOR_GET_ADDR(vec, idx)
Get an address of element in a vector.
Definition: vector.h:668

Referenced by add_extmap_to_stream().

◆ ast_rtp_instance_extmap_get_extension()

enum ast_rtp_extension ast_rtp_instance_extmap_get_extension ( struct ast_rtp_instance instance,
int  id 
)

Retrieve the extension for an RTP extension id.

Parameters
instanceThe RTP instance to retrieve the extension from
idThe negotiated RTP extension id
Returns
extension the extension that maps to the id
Since
15.5.0
Note
This will return AST_RTP_EXTENSION_UNSUPPORTED if an extension was proposed for this unique identifier but it is not supported or if the unique identifier is unused.

Definition at line 899 of file rtp_engine.c.

911 {
913 
914  ao2_lock(instance);
915 
916  /* The local unique identifier starts at '1' so the highest unique identifier
917  * can be the actual size of the vector. We compensate (as it is 0 index based)
918  * by dropping it down to 1 to get the correct information.
919  */
920  if (0 < id && id <= AST_VECTOR_SIZE(&instance->extmap_unique_ids)) {
921  struct rtp_extmap *extmap = AST_VECTOR_GET_ADDR(&instance->extmap_unique_ids, id - 1);
922 
923  extension = extmap->extension;
924  }
925  ao2_unlock(instance);
926 
927  return extension;
928 }
ast_rtp_extension
Known RTP extensions.
Definition: rtp_engine.h:542

Referenced by add_extmap_to_stream(), and ast_rtp_instance_extmap_get_uri().

◆ ast_rtp_instance_extmap_get_id()

int ast_rtp_instance_extmap_get_id ( struct ast_rtp_instance instance,
enum ast_rtp_extension  extension 
)

Retrieve the id for an RTP extension.

Parameters
instanceThe RTP instance to retrieve the id from
extensionThe RTP extension
Return values
-1not negotiated
idif negotiated
Since
15.5.0

Definition at line 886 of file rtp_engine.c.

887 {
888  int id = -1;
889 
890  ao2_lock(instance);
891  if (extension < AST_VECTOR_SIZE(&instance->extmap_negotiated)) {
892  id = AST_VECTOR_GET(&instance->extmap_negotiated, extension);
893  }
894  ao2_unlock(instance);
895 
896  return id;
897 }
enum queue_result id
Definition: app_queue.c:1640

References ao2_lock, ao2_unlock, AST_VECTOR_GET, AST_VECTOR_SIZE, ast_rtp_instance::extmap_negotiated, and id.

Referenced by ast_rtp_rtcp_handle_nack(), enable_rtp_extension(), rtp_instance_parse_extmap_extensions(), and rtp_raw_write().

◆ ast_rtp_instance_extmap_get_uri()

const char* ast_rtp_instance_extmap_get_uri ( struct ast_rtp_instance instance,
int  id 
)

Retrieve the URI for an RTP extension id.

Parameters
instanceThe RTP instance to retrieve the direction from
idThe negotiated RTP extension id
Returns
The URI for the RTP extension
Since
15.5.0

Definition at line 946 of file rtp_engine.c.

947 {
949 
951  (unsigned int)extension >= ARRAY_LEN(rtp_extension_uris)) {
952  return NULL;
953  }
954 
956 }
enum ast_rtp_extension ast_rtp_instance_extmap_get_extension(struct ast_rtp_instance *instance, int id)
Retrieve the extension for an RTP extension id.
Definition: rtp_engine.c:910
static const char *const rtp_extension_uris[AST_RTP_EXTENSION_MAX]
URIs for known RTP extensions.
Definition: rtp_engine.c:235
#define ARRAY_LEN(a)
Definition: utils.h:661

References ARRAY_LEN, AST_RTP_EXTENSION_UNSUPPORTED, ast_rtp_instance_extmap_get_extension(), rtp_extmap::extension, NULL, and rtp_extension_uris.

Referenced by add_extmap_to_stream().

◆ ast_rtp_instance_extmap_negotiate()

int ast_rtp_instance_extmap_negotiate ( struct ast_rtp_instance instance,
int  id,
enum ast_rtp_extension_direction  direction,
const char *  uri,
const char *  attributes 
)

Negotiate received RTP extension information.

Parameters
instanceThe RTP instance to set the extension on
idThe local identifier for the extension
directionThe direction that the extension should be used in
uriThe unique URI for the extension
attributesAttributes specific to this extension (if NULL or empty then no attributes)
Return values
0success
-1failure
Since
15.5.0

Definition at line 818 of file rtp_engine.c.

820 {
821  /* 'attributes' is currently unused but exists in the API to ensure it does not need to be altered
822  * in the future in case we need to use it.
823  */
824  int idx;
826 
827  /* Per the RFC the identifier has to be 1 or above */
828  if (id < 1) {
829  return -1;
830  }
831 
832  /* Convert the provided URI to the internal representation */
833  for (idx = 0; idx < ARRAY_LEN(rtp_extension_uris); ++idx) {
834  if (!strcasecmp(rtp_extension_uris[idx], uri)) {
835  extension = idx;
836  break;
837  }
838  }
839 
840  ao2_lock(instance);
841  /* We only accept the extension if it is enabled */
842  if (extension < AST_VECTOR_SIZE(&instance->extmap_enabled) &&
844  struct rtp_extmap extmap = {
845  .extension = extension,
847  };
848 
849  /* If the direction negotiation failed then don't accept or use this extension */
853  }
854  AST_VECTOR_REPLACE(&instance->extmap_unique_ids, id - 1, extmap);
855  }
856  }
857  ao2_unlock(instance);
858 
859  return 0;
860 }
static enum ast_rtp_extension_direction rtp_extmap_negotiate_direction(enum ast_rtp_extension_direction ours, enum ast_rtp_extension_direction theirs)
Helper function which negotiates two RTP extension directions to get our current direction.
Definition: rtp_engine.c:790

References ao2_lock, ao2_unlock, ARRAY_LEN, AST_RTP_EXTENSION_DIRECTION_NONE, AST_RTP_EXTENSION_UNSUPPORTED, AST_VECTOR_GET, AST_VECTOR_REPLACE, AST_VECTOR_SIZE, rtp_extmap::direction, rtp_extmap::extension, ast_rtp_instance::extmap_enabled, ast_rtp_instance::extmap_negotiated, ast_rtp_instance::extmap_unique_ids, rtp_extension_uris, and rtp_extmap_negotiate_direction().

Referenced by process_extmap_attributes().

◆ ast_rtp_instance_fd()

int ast_rtp_instance_fd ( struct ast_rtp_instance instance,
int  rtcp 
)

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

Parameters
instanceInstance to get the file descriptor for
rtcpWhether to retrieve the file descriptor for RTCP or not
Return values
fdsuccess
-1failure

Example usage:

int rtp_fd = ast_rtp_instance_fd(instance, 0);
int ast_rtp_instance_fd(struct ast_rtp_instance *instance, int rtcp)
Get the file descriptor for an RTP session (or RTCP)
Definition: rtp_engine.c:2184

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

Since
1.8

Definition at line 2184 of file rtp_engine.c.

2185 {
2186  int res;
2187 
2188  if (instance->engine->fd) {
2189  ao2_lock(instance);
2190  res = instance->engine->fd(instance, rtcp);
2191  ao2_unlock(instance);
2192  } else {
2193  res = -1;
2194  }
2195  return res;
2196 }
int(* fd)(struct ast_rtp_instance *instance, int rtcp)
Definition: rtp_engine.h:655

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

Referenced by apply_negotiated_sdp_stream(), check_for_rtp_changes(), configure_local_rtp(), configure_rtcp(), jingle_enable_video(), jingle_new(), mgcp_new(), rtp_find_rtcp_fd_position(), sip_new(), sip_set_rtp_peer(), skinny_new(), start_rtp(), transmit_reinvite_with_sdp(), unicast_rtp_request(), and unistim_new().

◆ ast_rtp_instance_get_active_glue()

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
instanceThe RTP instance
Returns
pointer to the glue

Example:

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.
Definition: rtp_engine.c:2697

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

Since
1.8

Definition at line 2697 of file rtp_engine.c.

2698 {
2699  return instance->glue;
2700 }
struct ast_rtp_glue * glue
Definition: rtp_engine.c:213

References ast_rtp_instance::glue.

◆ ast_rtp_instance_get_and_cmp_local_address()

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
instanceThe instance that we want to get the local address for
addressAn initialized address that may be overwritten if the local address is different
Return values
0address was not changed
1address was changed Example usage:
int ret;
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.
Definition: rtp_engine.c:629

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 629 of file rtp_engine.c.

631 {
632  ao2_lock(instance);
633  if (ast_sockaddr_cmp(address, &instance->local_address) != 0) {
635  ao2_unlock(instance);
636  return 1;
637  }
638  ao2_unlock(instance);
639 
640  return 0;
641 }
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
Definition: netsock2.h:167
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
Definition: netsock2.c:388
struct ast_sockaddr local_address
Definition: rtp_engine.c:197

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

◆ ast_rtp_instance_get_and_cmp_requested_target_address()

int ast_rtp_instance_get_and_cmp_requested_target_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the requested target address of the remote endpoint and compare it to the given address.

Parameters
instanceThe instance that we want to get the remote address for
addressAn initialized address that may be overwritten addresses differ
Return values
0address was not changed
1address was changed

Definition at line 651 of file rtp_engine.c.

653 {
654  ao2_lock(instance);
655  if (ast_sockaddr_cmp(address, &instance->requested_target_address) != 0) {
657  ao2_unlock(instance);
658  return 1;
659  }
660  ao2_unlock(instance);
661 
662  return 0;
663 }
struct ast_sockaddr requested_target_address
Definition: rtp_engine.c:199

References ao2_lock, ao2_unlock, ast_sockaddr_cmp(), ast_sockaddr_copy(), and ast_rtp_instance::requested_target_address.

◆ ast_rtp_instance_get_bridged()

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
instanceThe RTP instance that we want
Return values
non-NULLsuccess
NULLfailure

Example usage:

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.
Definition: rtp_engine.c:2226
struct ast_rtp_instance * bridged
Definition: rtp_engine.c:203

This gets the RTP instance that instance0 is bridged to.

Since
1.8

Definition at line 2226 of file rtp_engine.c.

2227 {
2228  struct ast_rtp_instance *bridged;
2229 
2230  ao2_lock(instance);
2231  bridged = instance->bridged;
2232  ao2_unlock(instance);
2233  return bridged;
2234 }

References ao2_lock, ao2_unlock, and ast_rtp_instance::bridged.

Referenced by ast_rtp_interpret(), and dialog_needdestroy().

◆ ast_rtp_instance_get_channel_id()

const char* ast_rtp_instance_get_channel_id ( struct ast_rtp_instance instance)

Get the unique ID of the channel that owns this RTP instance.

Note that this should remain valid for the lifetime of the RTP instance.

Parameters
instanceThe RTP instance
Returns
The unique ID of the channel
Return values
Emptystring if no channel owns this RTP instance
Since
12

Definition at line 548 of file rtp_engine.c.

549 {
550  return instance->channel_uniqueid;
551 }
char channel_uniqueid[AST_MAX_UNIQUEID]
Definition: rtp_engine.c:219

References ast_rtp_instance::channel_uniqueid.

Referenced by ast_rtp_get_stat(), rtp_check_timeout(), and rtp_transport_wide_cc_feedback_produce().

◆ ast_rtp_instance_get_cname()

const char* ast_rtp_instance_get_cname ( struct ast_rtp_instance rtp)

Retrieve the CNAME used in RTCP SDES items.

This is a pointer directly into the RTP struct, not a copy.

Parameters
rtpThe RTP instance
Returns
the CNAME

Definition at line 3784 of file rtp_engine.c.

3785 {
3786  const char *cname = "";
3787 
3788  ao2_lock(rtp);
3789  if (rtp->engine->cname_get) {
3790  cname = rtp->engine->cname_get(rtp);
3791  }
3792  ao2_unlock(rtp);
3793 
3794  return cname;
3795 }
const char *(* cname_get)(struct ast_rtp_instance *instance)
Definition: rtp_engine.h:683

References ao2_lock, ao2_unlock, ast_rtp_engine::cname_get, and ast_rtp_instance::engine.

Referenced by add_ssrc_to_stream().

◆ ast_rtp_instance_get_codecs()

struct ast_rtp_codecs* ast_rtp_instance_get_codecs ( struct ast_rtp_instance instance)

Get the codecs structure of an RTP instance.

Parameters
instanceThe RTP instance to get the codecs structure from

Example usage:

struct ast_rtp_codecs * ast_rtp_instance_get_codecs(struct ast_rtp_instance *instance)
Get the codecs structure of an RTP instance.
Definition: rtp_engine.c:727

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

Since
1.8

Definition at line 727 of file rtp_engine.c.

728 {
729  return &instance->codecs;
730 }

References ast_rtp_instance::codecs.

Referenced by add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), apply_cap_to_bundled(), ast_rtp_dtmf_begin(), ast_rtp_interpret(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_write(), bridge_p2p_rtp_write(), configure_local_rtp(), create_addr_from_peer(), create_outgoing_sdp_stream(), jingle_add_payloads_to_description(), jingle_enable_video(), jingle_interpret_description(), jingle_new(), multicast_rtp_write(), native_rtp_bridge_compatible_check(), ooh323_set_write_format(), process_sdp(), send_start_rtp(), set_caps(), set_incoming_call_offer_cap(), setup_rtp_connection(), and start_rtp().

◆ ast_rtp_instance_get_data()

void* ast_rtp_instance_get_data ( struct ast_rtp_instance instance)

Get the data portion of an RTP instance.

Parameters
instanceThe RTP instance we want the data portion from

Example usage:

struct *blob = ast_rtp_instance_get_data(instance);
(
void * ast_rtp_instance_get_data(struct ast_rtp_instance *instance)
Get the data portion of an RTP instance.
Definition: rtp_engine.c:563

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

Since
1.8

Definition at line 563 of file rtp_engine.c.

564 {
565  return instance->data;
566 }

References ast_rtp_instance::data.

Referenced by __rtp_recvfrom(), __rtp_sendto(), ast_rtcp_calculate_sr_rr_statistics(), ast_rtcp_generate_nack(), ast_rtcp_generate_report(), ast_rtcp_generate_sdes(), ast_rtcp_interpret(), ast_rtcp_read(), ast_rtcp_write(), ast_rtp_bundle(), ast_rtp_change_source(), ast_rtp_destroy(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_dtmf_mode_get(), ast_rtp_fd(), ast_rtp_get_cname(), ast_rtp_get_ssrc(), ast_rtp_get_stat(), ast_rtp_interpret(), ast_rtp_local_bridge(), ast_rtp_prop_set(), ast_rtp_qos_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_rtp_rtcp_handle_nack(), ast_rtp_sendcng(), ast_rtp_set_remote_ssrc(), ast_rtp_set_stream_num(), 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_instance_parse_transport_wide_cc(), rtp_raw_write(), rtp_red_buffer(), rtp_red_init(), rtp_sendto(), and rtp_transport_wide_cc_feedback_produce().

◆ ast_rtp_instance_get_dtls()

struct ast_rtp_engine_dtls* ast_rtp_instance_get_dtls ( struct ast_rtp_instance instance)

Obtain a pointer to the DTLS support present on an RTP instance.

Parameters
instancethe RTP instance
Returns
DTLS support if present
Return values
NULLif no DTLS support available

Definition at line 3003 of file rtp_engine.c.

3004 {
3005  if (instance->engine->dtls) {
3006  return &rtp_dtls_wrappers;
3007  }
3008  /* DTLS not available */
3009  return NULL;
3010 }
static struct ast_rtp_engine_dtls rtp_dtls_wrappers
Definition: rtp_engine.c:2990
struct ast_rtp_engine_dtls * dtls
Definition: rtp_engine.h:693

References ast_rtp_engine::dtls, ast_rtp_instance::engine, NULL, and rtp_dtls_wrappers.

Referenced by add_crypto_to_stream(), add_dtls_to_sdp(), apply_dtls_attrib(), ast_sdp_get_rtp_profile(), dialog_initialize_dtls_srtp(), process_crypto(), process_sdp(), process_sdp_a_dtls(), and setup_dtls_srtp().

◆ ast_rtp_instance_get_engine()

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
instanceThe RTP instance
Returns
pointer to the engine

Example usage:

struct ast_rtp_engine *engine = ast_rtp_instance_get_engine(instance);
struct ast_rtp_engine * ast_rtp_instance_get_engine(struct ast_rtp_instance *instance)
Get the RTP engine in use on an RTP instance.
Definition: rtp_engine.c:2692

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

Since
1.8

Definition at line 2692 of file rtp_engine.c.

2693 {
2694  return instance->engine;
2695 }

References ast_rtp_instance::engine.

Referenced by native_rtp_bridge_compatible_check(), native_rtp_bridge_start(), and native_rtp_bridge_stop().

◆ ast_rtp_instance_get_extended_prop()

void* ast_rtp_instance_get_extended_prop ( struct ast_rtp_instance instance,
int  property 
)

Get the value of an RTP instance extended property.

Parameters
instanceThe RTP instance to get the extended property on
propertyThe extended property to get
Since
1.8

Definition at line 690 of file rtp_engine.c.

691 {
692  void *prop;
693 
694  if (instance->engine->extended_prop_get) {
695  ao2_lock(instance);
696  prop = instance->engine->extended_prop_get(instance, property);
697  ao2_unlock(instance);
698  } else {
699  prop = NULL;
700  }
701 
702  return prop;
703 }
void *(* extended_prop_get)(struct ast_rtp_instance *instance, int property)
Definition: rtp_engine.h:639

References ao2_lock, ao2_unlock, ast_rtp_instance::engine, ast_rtp_engine::extended_prop_get, and NULL.

◆ ast_rtp_instance_get_glue()

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
typeName of the glue we want
Return values
non-NULLsuccess
NULLfailure

Example usage:

struct ast_rtp_glue *glue = ast_rtp_instance_get_glue("Example");
struct ast_rtp_glue * ast_rtp_instance_get_glue(const char *type)
Get the RTP glue that binds a channel to the RTP engine.
Definition: rtp_engine.c:2198

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

Since
1.8

Definition at line 2198 of file rtp_engine.c.

2199 {
2200  struct ast_rtp_glue *glue = NULL;
2201 
2203 
2204  AST_RWLIST_TRAVERSE(&glues, glue, entry) {
2205  if (!strcasecmp(glue->type, type)) {
2206  break;
2207  }
2208  }
2209 
2211 
2212  return glue;
2213 }
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78

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

Referenced by ast_ari_channels_rtpstatistics(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_make_compatible(), and rtp_glue_data_get().

◆ ast_rtp_instance_get_hold_timeout()

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
instanceThe RTP instance
Returns
timeout value

Example usage:

int timeout = ast_rtp_instance_get_hold_timeout(instance);
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.
Definition: rtp_engine.c:2682

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

Since
1.8

Definition at line 2682 of file rtp_engine.c.

2683 {
2684  return instance->holdtimeout;
2685 }

References ast_rtp_instance::holdtimeout.

Referenced by check_rtp_timeout().

◆ ast_rtp_instance_get_ice()

struct ast_rtp_engine_ice* ast_rtp_instance_get_ice ( struct ast_rtp_instance instance)

Obtain a pointer to the ICE support present on an RTP instance.

Parameters
instancethe RTP instance
Returns
ICE support if present
Return values
NULLif no ICE support available

Definition at line 2883 of file rtp_engine.c.

2884 {
2885  if (instance->engine->ice) {
2886  return &rtp_ice_wrappers;
2887  }
2888  /* ICE not available */
2889  return NULL;
2890 }
static struct ast_rtp_engine_ice rtp_ice_wrappers
Definition: rtp_engine.c:2869
struct ast_rtp_engine_ice * ice
Definition: rtp_engine.h:691

References ast_rtp_instance::engine, ast_rtp_engine::ice, NULL, and rtp_ice_wrappers.

Referenced by add_ice_to_sdp(), add_ice_to_stream(), check_ice_support(), create_rtp(), dialog_initialize_rtp(), jingle_add_google_candidates_to_transport(), jingle_add_ice_udp_candidates_to_transport(), jingle_enable_video(), jingle_interpret_google_transport(), jingle_interpret_ice_udp_transport(), jingle_new(), jingle_outgoing_hook(), jingle_request(), process_ice_attributes(), process_ice_auth_attrb(), process_sdp_a_ice(), set_ice_components(), and start_ice().

◆ ast_rtp_instance_get_incoming_source_address()

void ast_rtp_instance_get_incoming_source_address ( struct ast_rtp_instance instance,
struct ast_sockaddr address 
)

Get the incoming source address of the remote endpoint.

This returns the remote address the engine is sending RTP to. Usually this will be the same as the requested target address, however in the case where the engine "learns" the address (for instance, symmetric RTP enabled) this will then contain the learned address.

Parameters
instanceThe instance that we want to get the incoming source address for
addressA structure to put the address into

Definition at line 665 of file rtp_engine.c.

667 {
668  ao2_lock(instance);
670  ao2_unlock(instance);
671 }
struct ast_sockaddr incoming_source_address
Definition: rtp_engine.c:201

References ao2_lock, ao2_unlock, ast_sockaddr_copy(), and ast_rtp_instance::incoming_source_address.

◆ ast_rtp_instance_get_keepalive()

int ast_rtp_instance_get_keepalive ( struct ast_rtp_instance instance)

Get the RTP keepalive interval.

Parameters
instanceThe RTP instance
Returns
period Keepalive interval value

Example usage: