~noskcaj/ubuntu/saucy/sflphone/merge-1.2.3-2

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject-2.0.1/pjsip/include/pjsua-lib/pjsua_internal.h

  • Committer: Jackson Doak
  • Date: 2013-07-10 21:04:46 UTC
  • mfrom: (20.1.3 sid)
  • Revision ID: noskcaj@ubuntu.com-20130710210446-y8f587vza807icr9
Properly merged from upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: pjsua_internal.h 4175 2012-06-22 08:53:11Z nanang $ */
 
2
/*
 
3
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 
4
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 
5
 *
 
6
 * This program is free software; you can redistribute it and/or modify
 
7
 * it under the terms of the GNU General Public License as published by
 
8
 * the Free Software Foundation; either version 2 of the License, or
 
9
 * (at your option) any later version.
 
10
 *
 
11
 * This program is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 * GNU General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU General Public License
 
17
 * along with this program; if not, write to the Free Software
 
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
19
 */
 
20
#ifndef __PJSUA_INTERNAL_H__
 
21
#define __PJSUA_INTERNAL_H__
 
22
 
 
23
/**
 
24
 * This is the private header used by pjsua library implementation.
 
25
 * Applications should not include this file.
 
26
 */
 
27
 
 
28
PJ_BEGIN_DECL
 
29
 
 
30
/** Forward decl of pjsua call */
 
31
typedef struct pjsua_call pjsua_call;
 
32
 
 
33
/** Forward decl of pjsua call media */
 
34
typedef struct pjsua_call_media pjsua_call_media;
 
35
 
 
36
 
 
37
/**
 
38
 * Call's media stream.
 
39
 */
 
40
struct pjsua_call_media
 
41
{
 
42
    pjsua_call          *call;      /**< Parent call.                       */
 
43
    pjmedia_type         type;      /**< Media type.                        */
 
44
    unsigned             idx;       /**< This media index in parent call.   */
 
45
    pjsua_call_media_status state;  /**< Media state.                       */
 
46
    pjsua_call_media_status prev_state;/**< Previous media state.           */
 
47
    pjmedia_dir          dir;       /**< Media direction.                   */
 
48
 
 
49
    /** The stream */
 
50
    struct {
 
51
        /** Audio stream */
 
52
        struct {
 
53
            pjmedia_stream *stream;    /**< The audio stream.               */
 
54
            int             conf_slot; /**< Slot # in conference bridge.    */
 
55
        } a;
 
56
 
 
57
        /** Video stream */
 
58
        struct {
 
59
            pjmedia_vid_stream  *stream;    /**< The video stream.          */
 
60
            pjsua_vid_win_id     cap_win_id;/**< The video capture window   */
 
61
            pjsua_vid_win_id     rdr_win_id;/**< The video render window    */
 
62
            pjmedia_vid_dev_index cap_dev;  /**< The video capture device   */
 
63
            pjmedia_vid_dev_index rdr_dev;  /**< The video-in render device */
 
64
        } v;
 
65
 
 
66
    } strm;
 
67
 
 
68
    pj_uint32_t          ssrc;      /**< RTP SSRC                           */
 
69
    pj_uint32_t          rtp_tx_ts; /**< Initial RTP timestamp for sender.  */
 
70
    pj_uint16_t          rtp_tx_seq;/**< Initial RTP sequence for sender.   */
 
71
    pj_uint8_t           rtp_tx_seq_ts_set;
 
72
                                    /**< Bitmask flags if initial RTP sequence
 
73
                                         and/or timestamp for sender are set.
 
74
                                         bit 0/LSB : sequence flag
 
75
                                         bit 1     : timestamp flag         */
 
76
 
 
77
    pjmedia_transport   *tp;        /**< Current media transport (can be 0) */
 
78
    pj_status_t          tp_ready;  /**< Media transport status.            */
 
79
    pj_status_t          tp_result; /**< Media transport creation result.   */
 
80
    pjmedia_transport   *tp_orig;   /**< Original media transport           */
 
81
    pj_bool_t            tp_auto_del; /**< May delete media transport       */
 
82
    pjsua_med_tp_st      tp_st;     /**< Media transport state              */
 
83
    pj_bool_t            use_custom_med_tp;/**< Use custom media transport? */
 
84
    pj_sockaddr          rtp_addr;  /**< Current RTP source address
 
85
                                            (used to update ICE default
 
86
                                            address)                        */
 
87
    pjmedia_srtp_use     rem_srtp_use; /**< Remote's SRTP usage policy.     */
 
88
    pj_timestamp         last_req_keyframe;/**< Last TX keyframe request.   */
 
89
 
 
90
    pjsua_med_tp_state_cb      med_init_cb;/**< Media transport
 
91
                                                initialization callback.    */
 
92
 
 
93
    /** Media transport creation callback. */
 
94
    pj_status_t (*med_create_cb)(pjsua_call_media *call_med,
 
95
                                 pj_status_t status, int security_level,
 
96
                                 int *sip_err_code);
 
97
};
 
98
 
 
99
/**
 
100
 * Maximum number of SDP "m=" lines to be supported.
 
101
 */
 
102
#define PJSUA_MAX_CALL_MEDIA            PJMEDIA_MAX_SDP_MEDIA
 
103
 
 
104
/* Call answer's list. */
 
105
typedef struct call_answer
 
106
{
 
107
    PJ_DECL_LIST_MEMBER(struct call_answer);
 
108
    pjsua_msg_data  *msg_data;      /**< Answer's headers list.       */
 
109
    pj_str_t        *reason;        /**< Answer's reason phrase.      */
 
110
    unsigned         code;          /**< Answer's status code.        */
 
111
    pjsua_call_setting *opt;        /**< Answer's call setting.       */
 
112
} call_answer;
 
113
 
 
114
 
 
115
/**
 
116
 * Structure to be attached to invite dialog.
 
117
 * Given a dialog "dlg", application can retrieve this structure
 
118
 * by accessing dlg->mod_data[pjsua.mod.id].
 
119
 */
 
120
struct pjsua_call
 
121
{
 
122
    unsigned             index;     /**< Index in pjsua array.              */
 
123
    pjsua_call_setting   opt;       /**< Call setting.                      */
 
124
    pj_bool_t            opt_inited;/**< Initial call setting has been set,
 
125
                                         to avoid different opt in answer.  */
 
126
    pjsip_inv_session   *inv;       /**< The invite session.                */
 
127
    void                *user_data; /**< User/application data.             */
 
128
    pjsip_status_code    last_code; /**< Last status code seen.             */
 
129
    pj_str_t             last_text; /**< Last status text seen.             */
 
130
    pj_time_val          start_time;/**< First INVITE sent/received.        */
 
131
    pj_time_val          res_time;  /**< First response sent/received.      */
 
132
    pj_time_val          conn_time; /**< Connected/confirmed time.          */
 
133
    pj_time_val          dis_time;  /**< Disconnect time.                   */
 
134
    pjsua_acc_id         acc_id;    /**< Account index being used.          */
 
135
    int                  secure_level;/**< Signaling security level.        */
 
136
    pjsua_call_hold_type call_hold_type; /**< How to do call hold.          */
 
137
    pj_bool_t            local_hold;/**< Flag for call-hold by local.       */
 
138
    void                *hold_msg;  /**< Outgoing hold tx_data.             */
 
139
 
 
140
    unsigned             med_cnt;   /**< Number of media in SDP.            */
 
141
    pjsua_call_media     media[PJSUA_MAX_CALL_MEDIA]; /**< Array of media   */
 
142
    unsigned             med_prov_cnt;/**< Number of provisional media.     */
 
143
    pjsua_call_media     media_prov[PJSUA_MAX_CALL_MEDIA];
 
144
                                    /**< Array of provisional media.        */
 
145
 
 
146
    int                  audio_idx; /**< First active audio media.          */
 
147
    pj_mutex_t          *med_ch_mutex;/**< Media channel callback's mutex.  */
 
148
    pjsua_med_tp_state_cb   med_ch_cb;/**< Media channel callback.          */
 
149
    pjsua_med_tp_state_info med_ch_info;/**< Media channel info.            */
 
150
 
 
151
    pjsip_evsub         *xfer_sub;  /**< Xfer server subscription, if this
 
152
                                         call was triggered by xfer.        */
 
153
    pj_stun_nat_type     rem_nat_type; /**< NAT type of remote endpoint.    */
 
154
 
 
155
    char    last_text_buf_[128];    /**< Buffer for last_text.              */
 
156
 
 
157
    struct {
 
158
        pj_timer_entry   reinv_timer;/**< Reinvite retry timer.             */
 
159
        pj_uint32_t      sdp_ver;    /**< SDP version of the bad answer     */
 
160
        int              retry_cnt;  /**< Retry count.                      */
 
161
        pj_bool_t        pending;    /**< Pending until CONFIRMED state     */
 
162
    } lock_codec;                    /**< Data for codec locking when answer
 
163
                                          contains multiple codecs.         */
 
164
 
 
165
    struct {
 
166
        pjsip_dialog        *dlg;    /**< Call dialog.                      */
 
167
        pjmedia_sdp_session *rem_sdp;/**< Remote SDP.                       */
 
168
        pj_pool_t           *pool_prov;/**< Provisional pool.               */
 
169
        pj_bool_t            med_ch_deinit;/**< Media channel de-init-ed?   */
 
170
        union {
 
171
            struct {
 
172
                pjsua_msg_data  *msg_data;/**< Headers for outgoing INVITE. */
 
173
            } out_call;
 
174
            struct {
 
175
                call_answer      answers;/**< A list of call answers.       */
 
176
                pjsip_dialog    *replaced_dlg; /**< Replaced dialog.        */
 
177
            } inc_call;
 
178
        } call_var;
 
179
    } async_call;                      /**< Temporary storage for async
 
180
                                            outgoing/incoming call.         */
 
181
 
 
182
    pj_bool_t            rem_offerer;  /**< Was remote SDP offerer?         */
 
183
    unsigned             rem_aud_cnt;  /**< No of active audio in last remote
 
184
                                            offer.                          */
 
185
    unsigned             rem_vid_cnt;  /**< No of active video in last remote
 
186
                                            offer.                          */
 
187
};
 
188
 
 
189
 
 
190
/**
 
191
 * Server presence subscription list head.
 
192
 */
 
193
struct pjsua_srv_pres
 
194
{
 
195
    PJ_DECL_LIST_MEMBER(struct pjsua_srv_pres);
 
196
    pjsip_evsub     *sub;           /**< The evsub.                         */
 
197
    char            *remote;        /**< Remote URI.                        */
 
198
    int              acc_id;        /**< Account ID.                        */
 
199
    pjsip_dialog    *dlg;           /**< Dialog.                            */
 
200
    int              expires;       /**< "expires" value in the request.    */
 
201
};
 
202
 
 
203
/**
 
204
 * Account
 
205
 */
 
206
typedef struct pjsua_acc
 
207
{
 
208
    pj_pool_t       *pool;          /**< Pool for this account.         */
 
209
    pjsua_acc_config cfg;           /**< Account configuration.         */
 
210
    pj_bool_t        valid;         /**< Is this account valid?         */
 
211
 
 
212
    int              index;         /**< Index in accounts array.       */
 
213
    pj_str_t         display;       /**< Display name, if any.          */
 
214
    pj_str_t         user_part;     /**< User part of local URI.        */
 
215
    pj_str_t         contact;       /**< Our Contact header.            */
 
216
    pj_str_t         reg_contact;   /**< Contact header for REGISTER.
 
217
                                         It may be different than acc
 
218
                                         contact if outbound is used    */
 
219
    pjsip_host_port  via_addr;      /**< Address for Via header         */
 
220
    pjsip_transport *via_tp;        /**< Transport associated with
 
221
                                         the Via address                */
 
222
 
 
223
    pj_str_t         srv_domain;    /**< Host part of reg server.       */
 
224
    int              srv_port;      /**< Port number of reg server.     */
 
225
 
 
226
    pjsip_regc      *regc;          /**< Client registration session.   */
 
227
    pj_status_t      reg_last_err;  /**< Last registration error.       */
 
228
    int              reg_last_code; /**< Last status last register.     */
 
229
 
 
230
    struct {
 
231
        pj_bool_t        active;    /**< Flag of reregister status.     */
 
232
        pj_timer_entry   timer;     /**< Timer for reregistration.      */
 
233
        void            *reg_tp;    /**< Transport for registration.    */
 
234
        unsigned         attempt_cnt; /**< Attempt counter.             */
 
235
    } auto_rereg;                   /**< Reregister/reconnect data.     */
 
236
 
 
237
    pj_timer_entry   ka_timer;      /**< Keep-alive timer for UDP.      */
 
238
    pjsip_transport *ka_transport;  /**< Transport for keep-alive.      */
 
239
    pj_sockaddr      ka_target;     /**< Destination address for K-A    */
 
240
    unsigned         ka_target_len; /**< Length of ka_target.           */
 
241
 
 
242
    pjsip_route_hdr  route_set;     /**< Complete route set inc. outbnd.*/
 
243
    pj_uint32_t      global_route_crc; /** CRC of global route setting. */
 
244
    pj_uint32_t      local_route_crc;  /** CRC of account route setting.*/
 
245
 
 
246
    unsigned         rfc5626_status;/**< SIP outbound status:
 
247
                                           0: not used
 
248
                                           1: requested
 
249
                                           2: acknowledged by servers   */
 
250
    pj_str_t         rfc5626_instprm;/**< SIP outbound instance param.  */
 
251
    pj_str_t         rfc5626_regprm;/**< SIP outbound reg param.        */
 
252
 
 
253
    unsigned         cred_cnt;      /**< Number of credentials.         */
 
254
    pjsip_cred_info  cred[PJSUA_ACC_MAX_PROXIES]; /**< Complete creds.  */
 
255
 
 
256
    pj_bool_t        online_status; /**< Our online status.             */
 
257
    pjrpid_element   rpid;          /**< RPID element information.      */
 
258
    pjsua_srv_pres   pres_srv_list; /**< Server subscription list.      */
 
259
    pjsip_publishc  *publish_sess;  /**< Client publication session.    */
 
260
    pj_bool_t        publish_state; /**< Last published online status   */
 
261
 
 
262
    pjsip_evsub     *mwi_sub;       /**< MWI client subscription        */
 
263
    pjsip_dialog    *mwi_dlg;       /**< Dialog for MWI sub.            */
 
264
} pjsua_acc;
 
265
 
 
266
 
 
267
/**
 
268
 *Transport.
 
269
 */
 
270
typedef struct pjsua_transport_data
 
271
{
 
272
    int                      index;
 
273
    pjsip_transport_type_e   type;
 
274
    pjsip_host_port          local_name;
 
275
 
 
276
    union {
 
277
        pjsip_transport     *tp;
 
278
        pjsip_tpfactory     *factory;
 
279
        void                *ptr;
 
280
    } data;
 
281
 
 
282
} pjsua_transport_data;
 
283
 
 
284
 
 
285
/** Maximum length of subscription termination reason. */
 
286
#define PJSUA_BUDDY_SUB_TERM_REASON_LEN     32
 
287
 
 
288
/**
 
289
 * Buddy data.
 
290
 */
 
291
typedef struct pjsua_buddy
 
292
{
 
293
    pj_pool_t           *pool;      /**< Pool for this buddy.           */
 
294
    unsigned             index;     /**< Buddy index.                   */
 
295
    void                *user_data; /**< Application data.              */
 
296
    pj_str_t             uri;       /**< Buddy URI.                     */
 
297
    pj_str_t             contact;   /**< Contact learned from subscrp.  */
 
298
    pj_str_t             name;      /**< Buddy name.                    */
 
299
    pj_str_t             display;   /**< Buddy display name.            */
 
300
    pj_str_t             host;      /**< Buddy host.                    */
 
301
    unsigned             port;      /**< Buddy port.                    */
 
302
    pj_bool_t            monitor;   /**< Should we monitor?             */
 
303
    pjsip_dialog        *dlg;       /**< The underlying dialog.         */
 
304
    pjsip_evsub         *sub;       /**< Buddy presence subscription    */
 
305
    unsigned             term_code; /**< Subscription termination code  */
 
306
    pj_str_t             term_reason;/**< Subscription termination reason */
 
307
    pjsip_pres_status    status;    /**< Buddy presence status.         */
 
308
    pj_timer_entry       timer;     /**< Resubscription timer           */
 
309
} pjsua_buddy;
 
310
 
 
311
 
 
312
/**
 
313
 * File player/recorder data.
 
314
 */
 
315
typedef struct pjsua_file_data
 
316
{
 
317
    pj_bool_t        type;  /* 0=player, 1=playlist */
 
318
    pjmedia_port    *port;
 
319
    pj_pool_t       *pool;
 
320
    unsigned         slot;
 
321
} pjsua_file_data;
 
322
 
 
323
 
 
324
/**
 
325
 * Additional parameters for conference bridge.
 
326
 */
 
327
typedef struct pjsua_conf_setting
 
328
{
 
329
    unsigned    channel_count;
 
330
    unsigned    samples_per_frame;
 
331
    unsigned    bits_per_sample;
 
332
} pjsua_conf_setting;
 
333
 
 
334
typedef struct pjsua_stun_resolve
 
335
{
 
336
    PJ_DECL_LIST_MEMBER(struct pjsua_stun_resolve);
 
337
 
 
338
    pj_pool_t           *pool;      /**< Pool               */
 
339
    unsigned             count;     /**< # of entries       */
 
340
    pj_str_t            *srv;       /**< Array of entries   */
 
341
    unsigned             idx;       /**< Current index      */
 
342
    void                *token;     /**< App token          */
 
343
    pj_stun_resolve_cb   cb;        /**< App callback       */
 
344
    pj_bool_t            blocking;  /**< Blocking?          */
 
345
    pj_status_t          status;    /**< Session status     */
 
346
    pj_sockaddr          addr;      /**< Result             */
 
347
    pj_stun_sock        *stun_sock; /**< Testing STUN sock  */
 
348
} pjsua_stun_resolve;
 
349
 
 
350
/* See also pjsua_vid_win_type_name() */
 
351
typedef enum pjsua_vid_win_type
 
352
{
 
353
    PJSUA_WND_TYPE_NONE,
 
354
    PJSUA_WND_TYPE_PREVIEW,
 
355
    PJSUA_WND_TYPE_STREAM
 
356
} pjsua_vid_win_type;
 
357
 
 
358
typedef struct pjsua_vid_win
 
359
{
 
360
    pjsua_vid_win_type           type;          /**< Type.              */
 
361
    pj_pool_t                   *pool;          /**< Own pool.          */
 
362
    unsigned                     ref_cnt;       /**< Reference counter. */
 
363
    pjmedia_vid_port            *vp_cap;        /**< Capture vidport.   */
 
364
    pjmedia_vid_port            *vp_rend;       /**< Renderer vidport   */
 
365
    pjmedia_port                *tee;           /**< Video tee          */
 
366
    pjmedia_vid_dev_index        preview_cap_id;/**< Capture dev id     */
 
367
    pj_bool_t                    preview_running;/**< Preview is started*/
 
368
    pj_bool_t                    is_native;     /**< Preview is by dev  */
 
369
} pjsua_vid_win;
 
370
 
 
371
 
 
372
typedef struct pjsua_timer_list
 
373
{
 
374
    PJ_DECL_LIST_MEMBER(struct pjsua_timer_list);
 
375
    pj_timer_entry         entry;
 
376
    void                  (*cb)(void *user_data);
 
377
    void                   *user_data;
 
378
} pjsua_timer_list;
 
379
 
 
380
 
 
381
/**
 
382
 * Global pjsua application data.
 
383
 */
 
384
struct pjsua_data
 
385
{
 
386
 
 
387
    /* Control: */
 
388
    pj_caching_pool      cp;        /**< Global pool factory.           */
 
389
    pj_pool_t           *pool;      /**< pjsua's private pool.          */
 
390
    pj_mutex_t          *mutex;     /**< Mutex protection for this data */
 
391
    unsigned             mutex_nesting_level; /**< Mutex nesting level. */
 
392
    pj_thread_t         *mutex_owner; /**< Mutex owner.                 */
 
393
    pjsua_state          state;     /**< Library state.                 */
 
394
 
 
395
    /* Logging: */
 
396
    pjsua_logging_config log_cfg;   /**< Current logging config.        */
 
397
    pj_oshandle_t        log_file;  /**<Output log file handle          */
 
398
 
 
399
    /* SIP: */
 
400
    pjsip_endpoint      *endpt;     /**< Global endpoint.               */
 
401
    pjsip_module         mod;       /**< pjsua's PJSIP module.          */
 
402
    pjsua_transport_data tpdata[8]; /**< Array of transports.           */
 
403
    pjsip_tp_state_callback old_tp_cb; /**< Old transport callback.     */
 
404
 
 
405
    /* Threading: */
 
406
    pj_bool_t            thread_quit_flag;  /**< Thread quit flag.      */
 
407
    pj_thread_t         *thread[4];         /**< Array of threads.      */
 
408
 
 
409
    /* STUN and resolver */
 
410
    pj_stun_config       stun_cfg;  /**< Global STUN settings.          */
 
411
    pj_sockaddr          stun_srv;  /**< Resolved STUN server address   */
 
412
    pj_status_t          stun_status; /**< STUN server status.          */
 
413
    pjsua_stun_resolve   stun_res;  /**< List of pending STUN resolution*/
 
414
    pj_dns_resolver     *resolver;  /**< DNS resolver.                  */
 
415
 
 
416
    /* Detected NAT type */
 
417
    pj_stun_nat_type     nat_type;      /**< NAT type.                  */
 
418
    pj_status_t          nat_status;    /**< Detection status.          */
 
419
    pj_bool_t            nat_in_progress; /**< Detection in progress    */
 
420
 
 
421
    /* List of outbound proxies: */
 
422
    pjsip_route_hdr      outbound_proxy;
 
423
 
 
424
    /* Account: */
 
425
    unsigned             acc_cnt;            /**< Number of accounts.   */
 
426
    pjsua_acc_id         default_acc;        /**< Default account ID    */
 
427
    pjsua_acc            acc[PJSUA_MAX_ACC]; /**< Account array.        */
 
428
    pjsua_acc_id         acc_ids[PJSUA_MAX_ACC]; /**< Acc sorted by prio*/
 
429
 
 
430
    /* Calls: */
 
431
    pjsua_config         ua_cfg;                /**< UA config.         */
 
432
    unsigned             call_cnt;              /**< Call counter.      */
 
433
    pjsua_call           calls[PJSUA_MAX_CALLS];/**< Calls array.       */
 
434
    pjsua_call_id        next_call_id;          /**< Next call id to use*/
 
435
 
 
436
    /* Buddy; */
 
437
    unsigned             buddy_cnt;                 /**< Buddy count.   */
 
438
    pjsua_buddy          buddy[PJSUA_MAX_BUDDIES];  /**< Buddy array.   */
 
439
 
 
440
    /* Presence: */
 
441
    pj_timer_entry       pres_timer;/**< Presence refresh timer.        */
 
442
 
 
443
    /* Media: */
 
444
    pjsua_media_config   media_cfg; /**< Media config.                  */
 
445
    pjmedia_endpt       *med_endpt; /**< Media endpoint.                */
 
446
    pjsua_conf_setting   mconf_cfg; /**< Additionan conf. bridge. param */
 
447
    pjmedia_conf        *mconf;     /**< Conference bridge.             */
 
448
    pj_bool_t            is_mswitch;/**< Are we using audio switchboard
 
449
                                         (a.k.a APS-Direct)             */
 
450
 
 
451
    /* Sound device */
 
452
    pjmedia_aud_dev_index cap_dev;  /**< Capture device ID.             */
 
453
    pjmedia_aud_dev_index play_dev; /**< Playback device ID.            */
 
454
    pj_uint32_t          aud_svmask;/**< Which settings to save         */
 
455
    pjmedia_aud_param    aud_param; /**< User settings to sound dev     */
 
456
    pj_bool_t            aud_open_cnt;/**< How many # device is opened  */
 
457
    pj_bool_t            no_snd;    /**< No sound (app will manage it)  */
 
458
    pj_pool_t           *snd_pool;  /**< Sound's private pool.          */
 
459
    pjmedia_snd_port    *snd_port;  /**< Sound port.                    */
 
460
    pj_timer_entry       snd_idle_timer;/**< Sound device idle timer.   */
 
461
    pjmedia_master_port *null_snd;  /**< Master port for null sound.    */
 
462
    pjmedia_port        *null_port; /**< Null port.                     */
 
463
    pj_bool_t            snd_is_on; /**< Media flow is currently active */
 
464
 
 
465
    /* Video device */
 
466
    pjmedia_vid_dev_index vcap_dev;  /**< Capture device ID.            */
 
467
    pjmedia_vid_dev_index vrdr_dev;  /**< Playback device ID.           */
 
468
 
 
469
    /* File players: */
 
470
    unsigned             player_cnt;/**< Number of file players.        */
 
471
    pjsua_file_data      player[PJSUA_MAX_PLAYERS];/**< Array of players.*/
 
472
 
 
473
    /* File recorders: */
 
474
    unsigned             rec_cnt;   /**< Number of file recorders.      */
 
475
    pjsua_file_data      recorder[PJSUA_MAX_RECORDERS];/**< Array of recs.*/
 
476
 
 
477
    /* Video windows */
 
478
#if PJSUA_HAS_VIDEO
 
479
    pjsua_vid_win        win[PJSUA_MAX_VID_WINS]; /**< Array of windows */
 
480
#endif
 
481
 
 
482
    /* Timer entry list */
 
483
    pjsua_timer_list     timer_list;
 
484
    pj_mutex_t          *timer_mutex;
 
485
};
 
486
 
 
487
 
 
488
extern struct pjsua_data pjsua_var;
 
489
 
 
490
/**
 
491
 * Get the instance of pjsua
 
492
 */
 
493
PJ_DECL(struct pjsua_data*) pjsua_get_var(void);
 
494
 
 
495
 
 
496
 
 
497
/**
 
498
 * IM callback data.
 
499
 */
 
500
typedef struct pjsua_im_data
 
501
{
 
502
    pjsua_acc_id     acc_id;
 
503
    pjsua_call_id    call_id;
 
504
    pj_str_t         to;
 
505
    pj_str_t         body;
 
506
    void            *user_data;
 
507
} pjsua_im_data;
 
508
 
 
509
pj_status_t pjsua_media_apply_xml_control(pjsua_call_id call_id,
 
510
                                          const pj_str_t *xml_st);
 
511
 
 
512
 
 
513
/**
 
514
 * Duplicate IM data.
 
515
 */
 
516
PJ_INLINE(pjsua_im_data*) pjsua_im_data_dup(pj_pool_t *pool,
 
517
                                            const pjsua_im_data *src)
 
518
{
 
519
    pjsua_im_data *dst;
 
520
 
 
521
    dst = (pjsua_im_data*) pj_pool_alloc(pool, sizeof(*dst));
 
522
    dst->acc_id = src->acc_id;
 
523
    dst->call_id = src->call_id;
 
524
    pj_strdup_with_null(pool, &dst->to, &src->to);
 
525
    dst->user_data = src->user_data;
 
526
    pj_strdup_with_null(pool, &dst->body, &src->body);
 
527
 
 
528
    return dst;
 
529
}
 
530
 
 
531
 
 
532
#if 1
 
533
 
 
534
PJ_INLINE(void) PJSUA_LOCK()
 
535
{
 
536
    pj_mutex_lock(pjsua_var.mutex);
 
537
    pjsua_var.mutex_owner = pj_thread_this();
 
538
    ++pjsua_var.mutex_nesting_level;
 
539
}
 
540
 
 
541
PJ_INLINE(void) PJSUA_UNLOCK()
 
542
{
 
543
    if (--pjsua_var.mutex_nesting_level == 0)
 
544
        pjsua_var.mutex_owner = NULL;
 
545
    pj_mutex_unlock(pjsua_var.mutex);
 
546
}
 
547
 
 
548
PJ_INLINE(pj_status_t) PJSUA_TRY_LOCK()
 
549
{
 
550
    pj_status_t status;
 
551
    status = pj_mutex_trylock(pjsua_var.mutex);
 
552
    if (status == PJ_SUCCESS) {
 
553
        pjsua_var.mutex_owner = pj_thread_this();
 
554
        ++pjsua_var.mutex_nesting_level;
 
555
    }
 
556
    return status;
 
557
}
 
558
 
 
559
PJ_INLINE(pj_bool_t) PJSUA_LOCK_IS_LOCKED()
 
560
{
 
561
    return pjsua_var.mutex_owner == pj_thread_this();
 
562
}
 
563
 
 
564
#else
 
565
#define PJSUA_LOCK()
 
566
#define PJSUA_TRY_LOCK()        PJ_SUCCESS
 
567
#define PJSUA_UNLOCK()
 
568
#define PJSUA_LOCK_IS_LOCKED()  PJ_TRUE
 
569
#endif
 
570
 
 
571
/* Core */
 
572
void pjsua_set_state(pjsua_state new_state);
 
573
 
 
574
/******
 
575
 * STUN resolution
 
576
 */
 
577
/* Resolve the STUN server */
 
578
pj_status_t resolve_stun_server(pj_bool_t wait);
 
579
 
 
580
/**
 
581
 * Normalize route URI (check for ";lr" and append one if it doesn't
 
582
 * exist and pjsua_config.force_lr is set.
 
583
 */
 
584
pj_status_t normalize_route_uri(pj_pool_t *pool, pj_str_t *uri);
 
585
 
 
586
/**
 
587
 * Handle incoming invite request.
 
588
 */
 
589
pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata);
 
590
 
 
591
/*
 
592
 * Media channel.
 
593
 */
 
594
pj_status_t pjsua_media_channel_init(pjsua_call_id call_id,
 
595
                                     pjsip_role_e role,
 
596
                                     int security_level,
 
597
                                     pj_pool_t *tmp_pool,
 
598
                                     const pjmedia_sdp_session *rem_sdp,
 
599
                                     int *sip_err_code,
 
600
                                     pj_bool_t async,
 
601
                                     pjsua_med_tp_state_cb cb);
 
602
pj_status_t pjsua_media_channel_create_sdp(pjsua_call_id call_id,
 
603
                                           pj_pool_t *pool,
 
604
                                           const pjmedia_sdp_session *rem_sdp,
 
605
                                           pjmedia_sdp_session **p_sdp,
 
606
                                           int *sip_err_code);
 
607
pj_status_t pjsua_media_channel_update(pjsua_call_id call_id,
 
608
                                       const pjmedia_sdp_session *local_sdp,
 
609
                                       const pjmedia_sdp_session *remote_sdp);
 
610
pj_status_t pjsua_media_channel_deinit(pjsua_call_id call_id);
 
611
 
 
612
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
 
613
                                  pjmedia_type type,
 
614
                                  const pjsua_transport_config *tcfg,
 
615
                                  int security_level,
 
616
                                  int *sip_err_code,
 
617
                                  pj_bool_t async,
 
618
                                  pjsua_med_tp_state_cb cb);
 
619
void pjsua_set_media_tp_state(pjsua_call_media *call_med, pjsua_med_tp_st tp_st);
 
620
 
 
621
void pjsua_media_prov_clean_up(pjsua_call_id call_id);
 
622
 
 
623
/* Callback to receive media events */
 
624
pj_status_t call_media_on_event(pjmedia_event *event,
 
625
                                void *user_data);
 
626
 
 
627
/**
 
628
 * Init presence.
 
629
 */
 
630
pj_status_t pjsua_pres_init();
 
631
 
 
632
/*
 
633
 * Start presence subsystem.
 
634
 */
 
635
pj_status_t pjsua_pres_start(void);
 
636
 
 
637
/**
 
638
 * Refresh presence subscriptions
 
639
 */
 
640
void pjsua_pres_refresh(void);
 
641
 
 
642
/*
 
643
 * Update server subscription (e.g. when our online status has changed)
 
644
 */
 
645
void pjsua_pres_update_acc(int acc_id, pj_bool_t force);
 
646
 
 
647
/*
 
648
 * Shutdown presence.
 
649
 */
 
650
void pjsua_pres_shutdown(unsigned flags);
 
651
 
 
652
/**
 
653
 * Init presence for aoocunt.
 
654
 */
 
655
pj_status_t pjsua_pres_init_acc(int acc_id);
 
656
 
 
657
/**
 
658
 * Send PUBLISH
 
659
 */
 
660
pj_status_t pjsua_pres_init_publish_acc(int acc_id);
 
661
 
 
662
/**
 
663
 *  Send un-PUBLISH
 
664
 */
 
665
void pjsua_pres_unpublish(pjsua_acc *acc, unsigned flags);
 
666
 
 
667
/**
 
668
 * Terminate server subscription for the account
 
669
 */
 
670
void pjsua_pres_delete_acc(int acc_id, unsigned flags);
 
671
 
 
672
/**
 
673
 * Init IM module handler to handle incoming MESSAGE outside dialog.
 
674
 */
 
675
pj_status_t pjsua_im_init(void);
 
676
 
 
677
/**
 
678
 * Start MWI subscription
 
679
 */
 
680
pj_status_t pjsua_start_mwi(pjsua_acc_id acc_id, pj_bool_t force_renew);
 
681
 
 
682
/**
 
683
 * Init call subsystem.
 
684
 */
 
685
pj_status_t pjsua_call_subsys_init(const pjsua_config *cfg);
 
686
 
 
687
/**
 
688
 * Start call subsystem.
 
689
 */
 
690
pj_status_t pjsua_call_subsys_start(void);
 
691
 
 
692
/**
 
693
 * Init media subsystems.
 
694
 */
 
695
pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg);
 
696
 
 
697
/**
 
698
 * Start pjsua media subsystem.
 
699
 */
 
700
pj_status_t pjsua_media_subsys_start(void);
 
701
 
 
702
/**
 
703
 * Destroy pjsua media subsystem.
 
704
 */
 
705
pj_status_t pjsua_media_subsys_destroy(unsigned flags);
 
706
 
 
707
/**
 
708
 * Private: check if we can accept the message.
 
709
 *          If not, then p_accept header will be filled with a valid
 
710
 *          Accept header.
 
711
 */
 
712
pj_bool_t pjsua_im_accept_pager(pjsip_rx_data *rdata,
 
713
                                pjsip_accept_hdr **p_accept_hdr);
 
714
 
 
715
/**
 
716
 * Private: process pager message.
 
717
 *          This may trigger pjsua_ui_on_pager() or pjsua_ui_on_typing().
 
718
 */
 
719
void pjsua_im_process_pager(int call_id, const pj_str_t *from,
 
720
                            const pj_str_t *to, pjsip_rx_data *rdata);
 
721
 
 
722
 
 
723
/**
 
724
 * Create Accept header for MESSAGE.
 
725
 */
 
726
pjsip_accept_hdr* pjsua_im_create_accept(pj_pool_t *pool);
 
727
 
 
728
/*
 
729
 * Add additional headers etc in msg_data specified by application
 
730
 * when sending requests.
 
731
 */
 
732
void pjsua_process_msg_data(pjsip_tx_data *tdata,
 
733
                            const pjsua_msg_data *msg_data);
 
734
 
 
735
 
 
736
/*
 
737
 * Add route_set to outgoing requests
 
738
 */
 
739
void pjsua_set_msg_route_set( pjsip_tx_data *tdata,
 
740
                              const pjsip_route_hdr *route_set );
 
741
 
 
742
 
 
743
/*
 
744
 * Simple version of MIME type parsing (it doesn't support parameters)
 
745
 */
 
746
void pjsua_parse_media_type( pj_pool_t *pool,
 
747
                             const pj_str_t *mime,
 
748
                             pjsip_media_type *media_type);
 
749
 
 
750
 
 
751
/*
 
752
 * Internal function to init transport selector from transport id.
 
753
 */
 
754
void pjsua_init_tpselector(pjsua_transport_id tp_id,
 
755
                           pjsip_tpselector *sel);
 
756
 
 
757
pjsip_dialog* on_dlg_forked(pjsip_dialog *first_set, pjsip_rx_data *res);
 
758
pj_status_t acquire_call(const char *title,
 
759
                         pjsua_call_id call_id,
 
760
                         pjsua_call **p_call,
 
761
                         pjsip_dialog **p_dlg);
 
762
const char *good_number(char *buf, pj_int32_t val);
 
763
void print_call(const char *title,
 
764
                int call_id,
 
765
                char *buf, pj_size_t size);
 
766
 
 
767
/*
 
768
 * Audio
 
769
 */
 
770
pj_status_t pjsua_aud_subsys_init(void);
 
771
pj_status_t pjsua_aud_subsys_start(void);
 
772
pj_status_t pjsua_aud_subsys_destroy(void);
 
773
void pjsua_aud_stop_stream(pjsua_call_media *call_med);
 
774
pj_status_t pjsua_aud_channel_update(pjsua_call_media *call_med,
 
775
                                     pj_pool_t *tmp_pool,
 
776
                                     pjmedia_stream_info *si,
 
777
                                     const pjmedia_sdp_session *local_sdp,
 
778
                                     const pjmedia_sdp_session *remote_sdp);
 
779
void pjsua_check_snd_dev_idle();
 
780
 
 
781
/*
 
782
 * Video
 
783
 */
 
784
pj_status_t pjsua_vid_subsys_init(void);
 
785
pj_status_t pjsua_vid_subsys_start(void);
 
786
pj_status_t pjsua_vid_subsys_destroy(void);
 
787
void pjsua_vid_stop_stream(pjsua_call_media *call_med);
 
788
pj_status_t pjsua_vid_channel_init(pjsua_call_media *call_med);
 
789
pj_status_t pjsua_vid_channel_update(pjsua_call_media *call_med,
 
790
                                     pj_pool_t *tmp_pool,
 
791
                                     pjmedia_vid_stream_info *si,
 
792
                                     const pjmedia_sdp_session *local_sdp,
 
793
                                     const pjmedia_sdp_session *remote_sdp);
 
794
 
 
795
#if PJSUA_HAS_VIDEO
 
796
PJ_DECL(void) pjsua_vid_win_reset(pjsua_vid_win_id wid);
 
797
#else
 
798
#  define pjsua_vid_win_reset(wid)
 
799
#endif
 
800
 
 
801
 
 
802
PJ_END_DECL
 
803
 
 
804
#endif  /* __PJSUA_INTERNAL_H__ */