Asterisk - The Open Source Telephony Project GIT-master-7e7a603
Enumerations | Functions | Variables
chan_rtp.c File Reference

RTP (Multicast and Unicast) Media Channel. More...

#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/acl.h"
#include "asterisk/app.h"
#include "asterisk/rtp_engine.h"
#include "asterisk/causes.h"
#include "asterisk/format_cache.h"
#include "asterisk/multicast_rtp.h"
#include "asterisk/dns_core.h"
Include dependency graph for chan_rtp.c:

Go to the source code of this file.

Enumerations

enum  { OPT_RTP_CODEC = (1 << 0) , OPT_RTP_ENGINE = (1 << 1) , OPT_RTP_GLUE = (1 << 2) }
 
enum  { OPT_ARG_RTP_CODEC , OPT_ARG_RTP_ENGINE , OPT_ARG_ARRAY_SIZE }
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static void chan_rtp_get_codec (struct ast_channel *chan, struct ast_format_cap *result)
 Function called by RTP engine to get peer capabilities. More...
 
static enum ast_rtp_glue_result chan_rtp_get_rtp_peer (struct ast_channel *chan, struct ast_rtp_instance **instance)
 Function called by RTP engine to get local audio RTP peer. More...
 
static enum ast_rtp_glue_result chan_rtp_get_vrtp_peer (struct ast_channel *chan, struct ast_rtp_instance **instance)
 Function called by RTP engine to get local audio RTP peer. More...
 
static int chan_rtp_set_rtp_peer (struct ast_channel *chan, struct ast_rtp_instance *rtp, struct ast_rtp_instance *vrtp, struct ast_rtp_instance *tpeer, const struct ast_format_cap *cap, int nat_active)
 Function called by RTP engine to change where the remote party should send media. More...
 
static struct ast_formatderive_format_from_cap (struct ast_format_cap *cap)
 
static int load_module (void)
 Function called when our module is loaded. More...
 
static struct ast_channelmulticast_rtp_request (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
 Function called when we should prepare to call the multicast destination. More...
 
static int rtp_call (struct ast_channel *ast, const char *dest, int timeout)
 Function called when we should actually call the destination. More...
 
static int rtp_hangup (struct ast_channel *ast)
 Function called when we should hang the channel up. More...
 
static struct ast_framertp_read (struct ast_channel *ast)
 Function called when we should read a frame from the channel. More...
 
static int rtp_write (struct ast_channel *ast, struct ast_frame *f)
 Function called when we should write a frame to the channel. More...
 
static struct ast_channelunicast_rtp_request (const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
 Function called when we should prepare to call the unicast destination. More...
 
static int unload_module (void)
 Function called when our module is unloaded. More...
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "RTP Media Channel" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DRIVER, .requires = "res_rtp_multicast", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static const struct ast_datastore_info chan_rtp_datastore_info
 
static struct ast_channel_tech multicast_rtp_tech
 
static struct ast_rtp_glue unicast_rtp_glue
 Local glue for interacting with the RTP engine core. More...
 
static const struct ast_app_option unicast_rtp_options [128] = { [ 'c' ] = { .flag = OPT_RTP_CODEC , .arg_index = OPT_ARG_RTP_CODEC + 1 }, [ 'e' ] = { .flag = OPT_RTP_ENGINE , .arg_index = OPT_ARG_RTP_ENGINE + 1 }, [ 'g' ] = { .flag = OPT_RTP_GLUE }, }
 
static struct ast_channel_tech unicast_rtp_tech
 

Detailed Description

RTP (Multicast and Unicast) Media Channel.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om
Andreas 'MacBrody' Brodmann andre.nosp@m.as.b.nosp@m.rodma.nosp@m.nn@g.nosp@m.mail..nosp@m.com

Definition in file chan_rtp.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
OPT_RTP_CODEC 
OPT_RTP_ENGINE 
OPT_RTP_GLUE 

Definition at line 250 of file chan_rtp.c.

250 {
251 OPT_RTP_CODEC = (1 << 0),
252 OPT_RTP_ENGINE = (1 << 1),
253 OPT_RTP_GLUE = (1 << 2),
254};
@ OPT_RTP_GLUE
Definition: chan_rtp.c:253
@ OPT_RTP_CODEC
Definition: chan_rtp.c:251
@ OPT_RTP_ENGINE
Definition: chan_rtp.c:252

◆ anonymous enum

anonymous enum
Enumerator
OPT_ARG_RTP_CODEC 
OPT_ARG_RTP_ENGINE 
OPT_ARG_ARRAY_SIZE 

Definition at line 256 of file chan_rtp.c.

256 {
259 /* note: this entry _MUST_ be the last one in the enum */
261};
@ OPT_ARG_RTP_CODEC
Definition: chan_rtp.c:257
@ OPT_ARG_RTP_ENGINE
Definition: chan_rtp.c:258
@ OPT_ARG_ARRAY_SIZE
Definition: chan_rtp.c:260

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 526 of file chan_rtp.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 526 of file chan_rtp.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 526 of file chan_rtp.c.

◆ chan_rtp_get_codec()

static void chan_rtp_get_codec ( struct ast_channel chan,
struct ast_format_cap result 
)
static

Function called by RTP engine to get peer capabilities.

Definition at line 420 of file chan_rtp.c.

421{
422 SCOPE_ENTER(1, "%s Native formats %s\n", ast_channel_name(chan),
426}
static PGresult * result
Definition: cel_pgsql.c:84
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
@ AST_MEDIA_TYPE_UNKNOWN
Definition: codec.h:31
#define AST_FORMAT_CAP_NAMES_LEN
Definition: format_cap.h:324
int ast_format_cap_append_from_cap(struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
Append the formats of provided type in src to dst.
Definition: format_cap.c:269
const char * ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf)
Get the names of codecs of a set of formats.
Definition: format_cap.c:734
#define SCOPE_EXIT_RTN(...)
#define SCOPE_ENTER(level,...)
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
Definition: strings.h:1189

References ast_channel_name(), ast_channel_nativeformats(), ast_format_cap_append_from_cap(), ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, AST_MEDIA_TYPE_UNKNOWN, ast_str_tmp, result, SCOPE_ENTER, and SCOPE_EXIT_RTN.

◆ chan_rtp_get_rtp_peer()

static enum ast_rtp_glue_result chan_rtp_get_rtp_peer ( struct ast_channel chan,
struct ast_rtp_instance **  instance 
)
static

Function called by RTP engine to get local audio RTP peer.

Definition at line 444 of file chan_rtp.c.

445{
446 struct ast_rtp_instance *rtp_instance = ast_channel_tech_pvt(chan);
447 struct ast_datastore *datastore;
448
449 if (!rtp_instance) {
451 }
452
453 if ((datastore = ast_channel_datastore_find(chan, &chan_rtp_datastore_info, NULL))) {
454 ao2_ref(datastore, -1);
455
456 *instance = rtp_instance;
457 ao2_ref(*instance, +1);
458
460 }
461
463}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
static const struct ast_datastore_info chan_rtp_datastore_info
Definition: chan_rtp.c:272
void * ast_channel_tech_pvt(const struct ast_channel *chan)
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition: channel.c:2399
#define NULL
Definition: resample.c:96
@ AST_RTP_GLUE_RESULT_LOCAL
Definition: rtp_engine.h:164
@ AST_RTP_GLUE_RESULT_FORBID
Definition: rtp_engine.h:160
Structure for a data store object.
Definition: datastore.h:64

References ao2_ref, ast_channel_datastore_find(), ast_channel_tech_pvt(), AST_RTP_GLUE_RESULT_FORBID, AST_RTP_GLUE_RESULT_LOCAL, chan_rtp_datastore_info, and NULL.

◆ chan_rtp_get_vrtp_peer()

static enum ast_rtp_glue_result chan_rtp_get_vrtp_peer ( struct ast_channel chan,
struct ast_rtp_instance **  instance 
)
static

Function called by RTP engine to get local audio RTP peer.

Definition at line 438 of file chan_rtp.c.

439{
441}

References AST_RTP_GLUE_RESULT_FORBID.

◆ chan_rtp_set_rtp_peer()

static int chan_rtp_set_rtp_peer ( struct ast_channel chan,
struct ast_rtp_instance rtp,
struct ast_rtp_instance vrtp,
struct ast_rtp_instance tpeer,
const struct ast_format_cap cap,
int  nat_active 
)
static

Function called by RTP engine to change where the remote party should send media.

chan_rtp is not able to actually update the peer, so this function has no effect.

Definition at line 432 of file chan_rtp.c.

433{
434 return -1;
435}

◆ derive_format_from_cap()

static struct ast_format * derive_format_from_cap ( struct ast_format_cap cap)
static

Definition at line 122 of file chan_rtp.c.

123{
124 struct ast_format *fmt = ast_format_cap_get_format(cap, 0);
125
126 if (ast_format_cap_count(cap) == 1 && fmt == ast_format_slin) {
127 /*
128 * Because we have no SDP, we must use one of the static RTP payload
129 * assignments. Signed linear @ 8kHz does not map, so if that is our
130 * only capability, we force μ-law instead.
131 */
132 ao2_ref(fmt, -1);
134 }
135
136 return fmt;
137}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
struct ast_format * ast_format_ulaw
Built-in cached ulaw format.
Definition: format_cache.c:86
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
struct ast_format * ast_format_cap_get_format(const struct ast_format_cap *cap, int position)
Get the format at a specific index.
Definition: format_cap.c:400
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
Definition of a media format.
Definition: format.c:43

References ao2_bump, ao2_ref, ast_format_cap_count(), ast_format_cap_get_format(), ast_format_slin, and ast_format_ulaw.

Referenced by multicast_rtp_request(), and unicast_rtp_request().

◆ load_module()

static int load_module ( void  )
static

Function called when our module is loaded.

Definition at line 491 of file chan_rtp.c.

492{
495 }
496
498
501 ast_log(LOG_ERROR, "Unable to register channel class 'MulticastRTP'\n");
504 }
505
509 }
512 ast_log(LOG_ERROR, "Unable to register channel class 'UnicastRTP'\n");
515 }
516
518}
#define ast_log
Definition: astobj2.c:42
static struct ast_channel_tech unicast_rtp_tech
Definition: chan_rtp.c:68
static struct ast_rtp_glue unicast_rtp_glue
Local glue for interacting with the RTP engine core.
Definition: chan_rtp.c:466
static int unload_module(void)
Function called when our module is unloaded.
Definition: chan_rtp.c:475
static struct ast_channel_tech multicast_rtp_tech
Definition: chan_rtp.c:57
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
Definition: channel.c:539
int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Add all codecs Asterisk knows about for a specific type to the capabilities structure.
Definition: format_cap.c:216
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition: format_cap.h:38
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition: format_cap.h:49
#define LOG_ERROR
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
#define ast_rtp_glue_register(glue)
Definition: rtp_engine.h:893
struct ast_format_cap * capabilities
Definition: channel.h:632

References ast_channel_register(), ast_format_cap_alloc, ast_format_cap_append_by_type(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_log, AST_MEDIA_TYPE_UNKNOWN, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_rtp_glue_register, ast_channel_tech::capabilities, LOG_ERROR, multicast_rtp_tech, unicast_rtp_glue, unicast_rtp_tech, and unload_module().

◆ multicast_rtp_request()

static struct ast_channel * multicast_rtp_request ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  data,
int *  cause 
)
static

Function called when we should prepare to call the multicast destination.

Definition at line 140 of file chan_rtp.c.

141{
142 char *parse;
143 struct ast_rtp_instance *instance;
144 struct ast_sockaddr control_address;
145 struct ast_sockaddr destination_address;
146 struct ast_channel *chan;
147 struct ast_format_cap *caps = NULL;
148 struct ast_format *fmt = NULL;
151 AST_APP_ARG(destination);
152 AST_APP_ARG(control);
154 );
155 struct ast_multicast_rtp_options *mcast_options = NULL;
156
157 if (ast_strlen_zero(data)) {
158 ast_log(LOG_ERROR, "A multicast type and destination must be given to the 'MulticastRTP' channel\n");
159 goto failure;
160 }
161 parse = ast_strdupa(data);
162 AST_NONSTANDARD_APP_ARGS(args, parse, '/');
163
164 if (ast_strlen_zero(args.type)) {
165 ast_log(LOG_ERROR, "Type is required for the 'MulticastRTP' channel\n");
166 goto failure;
167 }
168
169 if (ast_strlen_zero(args.destination)) {
170 ast_log(LOG_ERROR, "Destination is required for the 'MulticastRTP' channel\n");
171 goto failure;
172 }
173 if (!ast_sockaddr_parse(&destination_address, args.destination, PARSE_PORT_REQUIRE)) {
174 ast_log(LOG_ERROR, "Destination address '%s' could not be parsed\n",
175 args.destination);
176 goto failure;
177 }
178
179 ast_sockaddr_setnull(&control_address);
180 if (!ast_strlen_zero(args.control)
181 && !ast_sockaddr_parse(&control_address, args.control, PARSE_PORT_REQUIRE)) {
182 ast_log(LOG_ERROR, "Control address '%s' could not be parsed\n", args.control);
183 goto failure;
184 }
185
186 mcast_options = ast_multicast_rtp_create_options(args.type, args.options);
187 if (!mcast_options) {
188 goto failure;
189 }
190
192 if (!fmt) {
194 }
195 if (!fmt) {
196 ast_log(LOG_ERROR, "No codec available for sending RTP to '%s'\n",
197 args.destination);
198 goto failure;
199 }
200
202 if (!caps) {
203 goto failure;
204 }
205
206 instance = ast_rtp_instance_new("multicast", NULL, &control_address, mcast_options);
207 if (!instance) {
209 "Could not create '%s' multicast RTP instance for sending media to '%s'\n",
210 args.type, args.destination);
211 goto failure;
212 }
213
214 chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids,
215 requestor, 0, "MulticastRTP/%s-%p", args.destination, instance);
216 if (!chan) {
217 ast_rtp_instance_destroy(instance);
218 goto failure;
219 }
221 ast_rtp_instance_set_remote_address(instance, &destination_address);
222
224
225 ast_format_cap_append(caps, fmt, 0);
231
232 ast_channel_tech_pvt_set(chan, instance);
233
234 ast_channel_unlock(chan);
235
236 ao2_ref(fmt, -1);
237 ao2_ref(caps, -1);
238 ast_multicast_rtp_free_options(mcast_options);
239
240 return chan;
241
242failure:
244 ao2_cleanup(caps);
245 ast_multicast_rtp_free_options(mcast_options);
246 *cause = AST_CAUSE_FAILURE;
247 return NULL;
248}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define AST_CAUSE_FAILURE
Definition: causes.h:150
static const char type[]
Definition: chan_ooh323.c:109
static struct ast_format * derive_format_from_cap(struct ast_format_cap *cap)
Definition: chan_rtp.c:122
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition: channel.h:1258
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
#define ast_channel_unlock(chan)
Definition: channel.h:2923
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
@ AST_STATE_DOWN
Definition: channelstate.h:36
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition: format_cap.h:99
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the 'nonstandard' argument separation process for an application.
@ PARSE_PORT_REQUIRE
struct ast_multicast_rtp_options * ast_multicast_rtp_create_options(const char *type, const char *options)
Create multicast RTP options.
struct ast_format * ast_multicast_rtp_options_get_format(struct ast_multicast_rtp_options *mcast_options)
Get format specified in multicast options.
void ast_multicast_rtp_free_options(struct ast_multicast_rtp_options *mcast_options)
Free multicast RTP options.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition: netsock2.c:230
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
Definition: netsock2.h:138
int ast_rtp_instance_destroy(struct ast_rtp_instance *instance)
Destroy an RTP instance.
Definition: rtp_engine.c:457
struct ast_rtp_instance * ast_rtp_instance_new(const char *engine_name, struct ast_sched_context *sched, const struct ast_sockaddr *sa, void *data)
Create a new RTP instance.
Definition: rtp_engine.c:486
#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:1126
void ast_rtp_instance_set_channel_id(struct ast_rtp_instance *instance, const char *uniqueid)
Set the channel that owns this RTP instance.
Definition: rtp_engine.c:574
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Main Channel structure associated with a channel.
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Socket address structure.
Definition: netsock2.h:97
const char * args
static struct test_options options

References ao2_cleanup, ao2_ref, args, AST_APP_ARG, AST_CAUSE_FAILURE, ast_channel_alloc, ast_channel_nativeformats_set(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_tech_pvt_set(), ast_channel_tech_set(), ast_channel_uniqueid(), ast_channel_unlock, AST_DECLARE_APP_ARGS, ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, ast_log, ast_multicast_rtp_create_options(), ast_multicast_rtp_free_options(), ast_multicast_rtp_options_get_format(), AST_NONSTANDARD_APP_ARGS, ast_rtp_instance_destroy(), ast_rtp_instance_new(), ast_rtp_instance_set_channel_id(), ast_rtp_instance_set_remote_address, ast_sockaddr_parse(), ast_sockaddr_setnull(), AST_STATE_DOWN, ast_strdupa, ast_strlen_zero(), derive_format_from_cap(), ast_multicast_rtp_options::fmt, LOG_ERROR, multicast_rtp_tech, NULL, options, PARSE_PORT_REQUIRE, and type.

◆ rtp_call()

static int rtp_call ( struct ast_channel ast,
const char *  dest,
int  timeout 
)
static

Function called when we should actually call the destination.

Definition at line 101 of file chan_rtp.c.

102{
103 struct ast_rtp_instance *instance = ast_channel_tech_pvt(ast);
104
106
107 return ast_rtp_instance_activate(instance);
108}
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame without payload.
Definition: channel.c:1231
@ AST_CONTROL_ANSWER
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:2684

References ast_channel_tech_pvt(), AST_CONTROL_ANSWER, ast_queue_control(), and ast_rtp_instance_activate().

◆ rtp_hangup()

static int rtp_hangup ( struct ast_channel ast)
static

Function called when we should hang the channel up.

Definition at line 111 of file chan_rtp.c.

112{
113 struct ast_rtp_instance *instance = ast_channel_tech_pvt(ast);
114
115 ast_rtp_instance_destroy(instance);
116
118
119 return 0;
120}

References ast_channel_tech_pvt(), ast_channel_tech_pvt_set(), ast_rtp_instance_destroy(), and NULL.

◆ rtp_read()

static struct ast_frame * rtp_read ( struct ast_channel ast)
static

Function called when we should read a frame from the channel.

Definition at line 79 of file chan_rtp.c.

80{
81 struct ast_rtp_instance *instance = ast_channel_tech_pvt(ast);
82 int fdno = ast_channel_fdno(ast);
83
84 switch (fdno) {
85 case 0:
86 return ast_rtp_instance_read(instance, 0);
87 default:
88 return &ast_null_frame;
89 }
90}
int ast_channel_fdno(const struct ast_channel *chan)
struct ast_frame ast_null_frame
Definition: main/frame.c:79
struct ast_frame * ast_rtp_instance_read(struct ast_rtp_instance *instance, int rtcp)
Receive a frame over RTP.
Definition: rtp_engine.c:599

References ast_channel_fdno(), ast_channel_tech_pvt(), ast_null_frame, and ast_rtp_instance_read().

◆ rtp_write()

static int rtp_write ( struct ast_channel ast,
struct ast_frame f 
)
static

Function called when we should write a frame to the channel.

Definition at line 93 of file chan_rtp.c.

94{
95 struct ast_rtp_instance *instance = ast_channel_tech_pvt(ast);
96
97 return ast_rtp_instance_write(instance, f);
98}
int ast_rtp_instance_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
Send a frame out over RTP.
Definition: rtp_engine.c:589

References ast_channel_tech_pvt(), and ast_rtp_instance_write().

◆ unicast_rtp_request()

static struct ast_channel * unicast_rtp_request ( const char *  type,
struct ast_format_cap cap,
const struct ast_assigned_ids assignedids,
const struct ast_channel requestor,
const char *  data,
int *  cause 
)
static

Function called when we should prepare to call the unicast destination.

Definition at line 277 of file chan_rtp.c.

278{
279 char *parse;
280 struct ast_rtp_instance *instance;
281 struct ast_sockaddr address;
282 struct ast_sockaddr local_address;
283 struct ast_channel *chan;
284 struct ast_format_cap *caps = NULL;
285 struct ast_format *fmt = NULL;
286 const char *engine_name;
288 AST_APP_ARG(destination);
290 );
291 struct ast_flags opts = { 0, };
292 char *opt_args[OPT_ARG_ARRAY_SIZE];
293
294 if (ast_strlen_zero(data)) {
295 ast_log(LOG_ERROR, "Destination is required for the 'UnicastRTP' channel\n");
296 goto failure;
297 }
298 parse = ast_strdupa(data);
299 AST_NONSTANDARD_APP_ARGS(args, parse, '/');
300
301 if (ast_strlen_zero(args.destination)) {
302 ast_log(LOG_ERROR, "Destination is required for the 'UnicastRTP' channel\n");
303 goto failure;
304 }
305
306 if (!ast_sockaddr_parse(&address, args.destination, PARSE_PORT_REQUIRE)) {
307 int rc;
308 char *host;
309 char *port;
310
311 rc = ast_sockaddr_split_hostport(args.destination, &host, &port, PARSE_PORT_REQUIRE);
312 if (!rc) {
313 ast_log(LOG_ERROR, "Unable to parse destination '%s' into host and port\n", args.destination);
314 goto failure;
315 }
316
317 rc = ast_dns_resolve_ipv6_and_ipv4(&address, host, port);
318 if (rc != 0) {
319 ast_log(LOG_ERROR, "Unable to resolve host '%s'\n", host);
320 goto failure;
321 }
322 }
323
324 if (!ast_strlen_zero(args.options)
325 && ast_app_parse_options(unicast_rtp_options, &opts, opt_args,
326 ast_strdupa(args.options))) {
327 ast_log(LOG_ERROR, "'UnicastRTP' channel options '%s' parse error\n",
328 args.options);
329 goto failure;
330 }
331
332 if (ast_test_flag(&opts, OPT_RTP_CODEC)
333 && !ast_strlen_zero(opt_args[OPT_ARG_RTP_CODEC])) {
335 if (!fmt) {
336 ast_log(LOG_ERROR, "Codec '%s' not found for sending RTP to '%s'\n",
337 opt_args[OPT_ARG_RTP_CODEC], args.destination);
338 goto failure;
339 }
340 } else {
341 fmt = derive_format_from_cap(cap);
342 if (!fmt) {
343 ast_log(LOG_ERROR, "No codec available for sending RTP to '%s'\n",
344 args.destination);
345 goto failure;
346 }
347 }
348
350 if (!caps) {
351 goto failure;
352 }
353
354 engine_name = S_COR(ast_test_flag(&opts, OPT_RTP_ENGINE),
355 opt_args[OPT_ARG_RTP_ENGINE], "asterisk");
356
357 ast_sockaddr_copy(&local_address, &address);
358 if (ast_ouraddrfor(&address, &local_address)) {
359 ast_log(LOG_ERROR, "Could not get our address for sending media to '%s'\n",
360 args.destination);
361 goto failure;
362 }
363 instance = ast_rtp_instance_new(engine_name, NULL, &local_address, NULL);
364 if (!instance) {
366 "Could not create %s RTP instance for sending media to '%s'\n",
367 S_OR(engine_name, "default"), args.destination);
368 goto failure;
369 }
370
371 chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids,
372 requestor, 0, "UnicastRTP/%s-%p", args.destination, instance);
373 if (!chan) {
374 ast_rtp_instance_destroy(instance);
375 goto failure;
376 }
379 ast_channel_set_fd(chan, 0, ast_rtp_instance_fd(instance, 0));
380
382
383 if (ast_test_flag(&opts, OPT_RTP_GLUE)) {
384 struct ast_datastore *datastore;
385 if ((datastore = ast_datastore_alloc(&chan_rtp_datastore_info, NULL))) {
386 ast_channel_datastore_add(chan, datastore);
387 }
388 }
389
390 ast_format_cap_append(caps, fmt, 0);
396
397 ast_channel_tech_pvt_set(chan, instance);
398
399 ast_rtp_instance_get_local_address(instance, &local_address);
400 pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS",
401 ast_sockaddr_stringify_addr(&local_address));
402 pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT",
403 ast_sockaddr_stringify_port(&local_address));
404
405 ast_channel_unlock(chan);
406
407 ao2_ref(fmt, -1);
408 ao2_ref(caps, -1);
409
410 return chan;
411
412failure:
413 ao2_cleanup(fmt);
414 ao2_cleanup(caps);
415 *cause = AST_CAUSE_FAILURE;
416 return NULL;
417}
int ast_ouraddrfor(const struct ast_sockaddr *them, struct ast_sockaddr *us)
Get our local IP address when contacting a remote host.
Definition: acl.c:1004
static const struct ast_app_option unicast_rtp_options[128]
Definition: chan_rtp.c:270
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition: channel.c:2385
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition: channel.c:2426
#define ast_datastore_alloc(info, uid)
Definition: datastore.h:85
int ast_dns_resolve_ipv6_and_ipv4(struct ast_sockaddr *address, const char *host, const char *port)
Synchronously resolves host to an AAAA or A record.
Definition: dns_core.c:369
char * address
Definition: f2c.h:59
#define ast_format_cache_get(name)
Retrieve a named format from the cache.
Definition: format_cache.h:278
int ast_app_parse_options(const struct ast_app_option *options, struct ast_flags *flags, char **args, char *optstr)
Parses a string containing application options and sets flags/arguments.
Definition: main/app.c:3056
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_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
Definition: netsock2.c:164
static char * ast_sockaddr_stringify_port(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return a port only.
Definition: netsock2.h:358
static char * ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
Definition: netsock2.h:286
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
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.
Definition: rtp_engine.c:664
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:2205
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
Structure used to handle boolean flags.
Definition: utils.h:199
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ao2_cleanup, ao2_ref, args, AST_APP_ARG, ast_app_parse_options(), AST_CAUSE_FAILURE, ast_channel_alloc, ast_channel_datastore_add(), ast_channel_nativeformats_set(), ast_channel_set_fd(), ast_channel_set_rawreadformat(), ast_channel_set_rawwriteformat(), ast_channel_set_readformat(), ast_channel_set_writeformat(), ast_channel_tech_pvt_set(), ast_channel_tech_set(), ast_channel_uniqueid(), ast_channel_unlock, ast_datastore_alloc, AST_DECLARE_APP_ARGS, ast_dns_resolve_ipv6_and_ipv4(), ast_format_cache_get, ast_format_cap_alloc, ast_format_cap_append, AST_FORMAT_CAP_FLAG_DEFAULT, ast_log, AST_NONSTANDARD_APP_ARGS, ast_ouraddrfor(), ast_rtp_instance_destroy(), ast_rtp_instance_fd(), ast_rtp_instance_get_local_address(), ast_rtp_instance_new(), ast_rtp_instance_set_channel_id(), ast_rtp_instance_set_remote_address, ast_sockaddr_copy(), ast_sockaddr_parse(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_addr(), ast_sockaddr_stringify_port(), AST_STATE_DOWN, ast_strdupa, ast_strlen_zero(), ast_test_flag, chan_rtp_datastore_info, derive_format_from_cap(), LOG_ERROR, NULL, OPT_ARG_ARRAY_SIZE, OPT_ARG_RTP_CODEC, OPT_ARG_RTP_ENGINE, OPT_RTP_CODEC, OPT_RTP_ENGINE, OPT_RTP_GLUE, options, PARSE_PORT_REQUIRE, pbx_builtin_setvar_helper(), S_COR, S_OR, unicast_rtp_options, and unicast_rtp_tech.

◆ unload_module()

static int unload_module ( void  )
static

Function called when our module is unloaded.

Definition at line 475 of file chan_rtp.c.

476{
480
484
486
487 return 0;
488}
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
Definition: channel.c:570
int ast_rtp_glue_unregister(struct ast_rtp_glue *glue)
Unregister RTP glue.
Definition: rtp_engine.c:407

References ao2_cleanup, ast_channel_unregister(), ast_rtp_glue_unregister(), ast_channel_tech::capabilities, multicast_rtp_tech, NULL, unicast_rtp_glue, and unicast_rtp_tech.

Referenced by load_module().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "RTP Media Channel" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DRIVER, .requires = "res_rtp_multicast", }
static

Definition at line 526 of file chan_rtp.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 526 of file chan_rtp.c.

◆ chan_rtp_datastore_info

const struct ast_datastore_info chan_rtp_datastore_info
static
Initial value:
= {
.type = "CHAN_RTP_GLUE",
}

Definition at line 272 of file chan_rtp.c.

Referenced by chan_rtp_get_rtp_peer(), and unicast_rtp_request().

◆ multicast_rtp_tech

struct ast_channel_tech multicast_rtp_tech
static

Definition at line 57 of file chan_rtp.c.

Referenced by load_module(), multicast_rtp_request(), and unload_module().

◆ unicast_rtp_glue

struct ast_rtp_glue unicast_rtp_glue
static

Local glue for interacting with the RTP engine core.

Definition at line 466 of file chan_rtp.c.

Referenced by load_module(), and unload_module().

◆ unicast_rtp_options

const struct ast_app_option unicast_rtp_options[128] = { [ 'c' ] = { .flag = OPT_RTP_CODEC , .arg_index = OPT_ARG_RTP_CODEC + 1 }, [ 'e' ] = { .flag = OPT_RTP_ENGINE , .arg_index = OPT_ARG_RTP_ENGINE + 1 }, [ 'g' ] = { .flag = OPT_RTP_GLUE }, }
static

Set the codec to be used for unicast RTP

Set the RTP engine to use for unicast RTP

Provide RTP glue for the channel

Definition at line 270 of file chan_rtp.c.

Referenced by unicast_rtp_request().

◆ unicast_rtp_tech

struct ast_channel_tech unicast_rtp_tech
static

Definition at line 68 of file chan_rtp.c.

Referenced by load_module(), unicast_rtp_request(), and unload_module().