~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

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

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2015-01-07 14:51:16 UTC
  • mfrom: (4.3.5 sid)
  • Revision ID: package-import@ubuntu.com-20150107145116-yxnafinf4lrdvrmx
Tags: 1.4.1-0.1ubuntu1
* Merge with Debian, remaining changes:
 - Drop soprano, nepomuk build-dep
* Drop ubuntu patches, now upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: pjsua_internal.h 4342 2013-02-06 13:48:45Z 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
 
        int              retry_cnt;  /**< Retry count.                      */
159
 
    } lock_codec;                    /**< Data for codec locking when answer
160
 
                                          contains multiple codecs.         */
161
 
 
162
 
    struct {
163
 
        pjsip_dialog        *dlg;    /**< Call dialog.                      */
164
 
        pjmedia_sdp_session *rem_sdp;/**< Remote SDP.                       */
165
 
        pj_pool_t           *pool_prov;/**< Provisional pool.               */
166
 
        pj_bool_t            med_ch_deinit;/**< Media channel de-init-ed?   */
167
 
        union {
168
 
            struct {
169
 
                pjsua_msg_data  *msg_data;/**< Headers for outgoing INVITE. */
170
 
                pj_bool_t        hangup;  /**< Call is hangup?              */
171
 
            } out_call;
172
 
            struct {
173
 
                call_answer      answers;/**< A list of call answers.       */
174
 
                pjsip_dialog    *replaced_dlg; /**< Replaced dialog.        */
175
 
            } inc_call;
176
 
        } call_var;
177
 
    } async_call;                      /**< Temporary storage for async
178
 
                                            outgoing/incoming call.         */
179
 
 
180
 
    pj_bool_t            rem_offerer;  /**< Was remote SDP offerer?         */
181
 
    unsigned             rem_aud_cnt;  /**< No of active audio in last remote
182
 
                                            offer.                          */
183
 
    unsigned             rem_vid_cnt;  /**< No of active video in last remote
184
 
                                            offer.                          */
185
 
    
186
 
    pj_timer_entry       reinv_timer;  /**< Reinvite retry timer.           */
187
 
    pj_bool_t            reinv_pending;/**< Pending until CONFIRMED state.  */
188
 
    pj_bool_t            reinv_ice_sent;/**< Has reinvite for ICE upd sent? */
189
 
};
190
 
 
191
 
 
192
 
/**
193
 
 * Server presence subscription list head.
194
 
 */
195
 
struct pjsua_srv_pres
196
 
{
197
 
    PJ_DECL_LIST_MEMBER(struct pjsua_srv_pres);
198
 
    pjsip_evsub     *sub;           /**< The evsub.                         */
199
 
    char            *remote;        /**< Remote URI.                        */
200
 
    int              acc_id;        /**< Account ID.                        */
201
 
    pjsip_dialog    *dlg;           /**< Dialog.                            */
202
 
    int              expires;       /**< "expires" value in the request.    */
203
 
};
204
 
 
205
 
/**
206
 
 * Account
207
 
 */
208
 
typedef struct pjsua_acc
209
 
{
210
 
    pj_pool_t       *pool;          /**< Pool for this account.         */
211
 
    pjsua_acc_config cfg;           /**< Account configuration.         */
212
 
    pj_bool_t        valid;         /**< Is this account valid?         */
213
 
 
214
 
    int              index;         /**< Index in accounts array.       */
215
 
    pj_str_t         display;       /**< Display name, if any.          */
216
 
    pj_str_t         user_part;     /**< User part of local URI.        */
217
 
    pj_str_t         contact;       /**< Our Contact header.            */
218
 
    pj_str_t         reg_contact;   /**< Contact header for REGISTER.
219
 
                                         It may be different than acc
220
 
                                         contact if outbound is used    */
221
 
    pjsip_host_port  via_addr;      /**< Address for Via header         */
222
 
    pjsip_transport *via_tp;        /**< Transport associated with
223
 
                                         the Via address                */
224
 
 
225
 
    pj_str_t         srv_domain;    /**< Host part of reg server.       */
226
 
    int              srv_port;      /**< Port number of reg server.     */
227
 
 
228
 
    pjsip_regc      *regc;          /**< Client registration session.   */
229
 
    pj_status_t      reg_last_err;  /**< Last registration error.       */
230
 
    int              reg_last_code; /**< Last status last register.     */
231
 
 
232
 
    struct {
233
 
        pj_bool_t        active;    /**< Flag of reregister status.     */
234
 
        pj_timer_entry   timer;     /**< Timer for reregistration.      */
235
 
        void            *reg_tp;    /**< Transport for registration.    */
236
 
        unsigned         attempt_cnt; /**< Attempt counter.             */
237
 
    } auto_rereg;                   /**< Reregister/reconnect data.     */
238
 
 
239
 
    pj_timer_entry   ka_timer;      /**< Keep-alive timer for UDP.      */
240
 
    pjsip_transport *ka_transport;  /**< Transport for keep-alive.      */
241
 
    pj_sockaddr      ka_target;     /**< Destination address for K-A    */
242
 
    unsigned         ka_target_len; /**< Length of ka_target.           */
243
 
 
244
 
    pjsip_route_hdr  route_set;     /**< Complete route set inc. outbnd.*/
245
 
    pj_uint32_t      global_route_crc; /** CRC of global route setting. */
246
 
    pj_uint32_t      local_route_crc;  /** CRC of account route setting.*/
247
 
 
248
 
    unsigned         rfc5626_status;/**< SIP outbound status:
249
 
                                           0: not used
250
 
                                           1: requested
251
 
                                           2: acknowledged by servers   */
252
 
    pj_str_t         rfc5626_instprm;/**< SIP outbound instance param.  */
253
 
    pj_str_t         rfc5626_regprm;/**< SIP outbound reg param.        */
254
 
 
255
 
    unsigned         cred_cnt;      /**< Number of credentials.         */
256
 
    pjsip_cred_info  cred[PJSUA_ACC_MAX_PROXIES]; /**< Complete creds.  */
257
 
 
258
 
    pj_bool_t        online_status; /**< Our online status.             */
259
 
    pjrpid_element   rpid;          /**< RPID element information.      */
260
 
    pjsua_srv_pres   pres_srv_list; /**< Server subscription list.      */
261
 
    pjsip_publishc  *publish_sess;  /**< Client publication session.    */
262
 
    pj_bool_t        publish_state; /**< Last published online status   */
263
 
 
264
 
    pjsip_evsub     *mwi_sub;       /**< MWI client subscription        */
265
 
    pjsip_dialog    *mwi_dlg;       /**< Dialog for MWI sub.            */
266
 
} pjsua_acc;
267
 
 
268
 
 
269
 
/**
270
 
 *Transport.
271
 
 */
272
 
typedef struct pjsua_transport_data
273
 
{
274
 
    int                      index;
275
 
    pjsip_transport_type_e   type;
276
 
    pjsip_host_port          local_name;
277
 
 
278
 
    union {
279
 
        pjsip_transport     *tp;
280
 
        pjsip_tpfactory     *factory;
281
 
        void                *ptr;
282
 
    } data;
283
 
 
284
 
} pjsua_transport_data;
285
 
 
286
 
 
287
 
/** Maximum length of subscription termination reason. */
288
 
#define PJSUA_BUDDY_SUB_TERM_REASON_LEN     32
289
 
 
290
 
/**
291
 
 * Buddy data.
292
 
 */
293
 
typedef struct pjsua_buddy
294
 
{
295
 
    pj_pool_t           *pool;      /**< Pool for this buddy.           */
296
 
    unsigned             index;     /**< Buddy index.                   */
297
 
    void                *user_data; /**< Application data.              */
298
 
    pj_str_t             uri;       /**< Buddy URI.                     */
299
 
    pj_str_t             contact;   /**< Contact learned from subscrp.  */
300
 
    pj_str_t             name;      /**< Buddy name.                    */
301
 
    pj_str_t             display;   /**< Buddy display name.            */
302
 
    pj_str_t             host;      /**< Buddy host.                    */
303
 
    unsigned             port;      /**< Buddy port.                    */
304
 
    pj_bool_t            monitor;   /**< Should we monitor?             */
305
 
    pjsip_dialog        *dlg;       /**< The underlying dialog.         */
306
 
    pjsip_evsub         *sub;       /**< Buddy presence subscription    */
307
 
    unsigned             term_code; /**< Subscription termination code  */
308
 
    pj_str_t             term_reason;/**< Subscription termination reason */
309
 
    pjsip_pres_status    status;    /**< Buddy presence status.         */
310
 
    pj_timer_entry       timer;     /**< Resubscription timer           */
311
 
} pjsua_buddy;
312
 
 
313
 
 
314
 
/**
315
 
 * File player/recorder data.
316
 
 */
317
 
typedef struct pjsua_file_data
318
 
{
319
 
    pj_bool_t        type;  /* 0=player, 1=playlist */
320
 
    pjmedia_port    *port;
321
 
    pj_pool_t       *pool;
322
 
    unsigned         slot;
323
 
} pjsua_file_data;
324
 
 
325
 
 
326
 
/**
327
 
 * Additional parameters for conference bridge.
328
 
 */
329
 
typedef struct pjsua_conf_setting
330
 
{
331
 
    unsigned    channel_count;
332
 
    unsigned    samples_per_frame;
333
 
    unsigned    bits_per_sample;
334
 
} pjsua_conf_setting;
335
 
 
336
 
typedef struct pjsua_stun_resolve
337
 
{
338
 
    PJ_DECL_LIST_MEMBER(struct pjsua_stun_resolve);
339
 
 
340
 
    pj_pool_t           *pool;      /**< Pool               */
341
 
    int                  ref_cnt;   /**< Reference count    */
342
 
    pj_bool_t            destroy_flag; /**< To be destroyed */
343
 
    pj_bool_t            has_result;
344
 
    unsigned             count;     /**< # of entries       */
345
 
    pj_str_t            *srv;       /**< Array of entries   */
346
 
    unsigned             idx;       /**< Current index      */
347
 
    void                *token;     /**< App token          */
348
 
    pj_stun_resolve_cb   cb;        /**< App callback       */
349
 
    pj_bool_t            blocking;  /**< Blocking?          */
350
 
    pj_status_t          status;    /**< Session status     */
351
 
    pj_sockaddr          addr;      /**< Result             */
352
 
    pj_stun_sock        *stun_sock; /**< Testing STUN sock  */
353
 
} pjsua_stun_resolve;
354
 
 
355
 
/* See also pjsua_vid_win_type_name() */
356
 
typedef enum pjsua_vid_win_type
357
 
{
358
 
    PJSUA_WND_TYPE_NONE,
359
 
    PJSUA_WND_TYPE_PREVIEW,
360
 
    PJSUA_WND_TYPE_STREAM
361
 
} pjsua_vid_win_type;
362
 
 
363
 
typedef struct pjsua_vid_win
364
 
{
365
 
    pjsua_vid_win_type           type;          /**< Type.              */
366
 
    pj_pool_t                   *pool;          /**< Own pool.          */
367
 
    unsigned                     ref_cnt;       /**< Reference counter. */
368
 
    pjmedia_vid_port            *vp_cap;        /**< Capture vidport.   */
369
 
    pjmedia_vid_port            *vp_rend;       /**< Renderer vidport   */
370
 
    pjmedia_port                *tee;           /**< Video tee          */
371
 
    pjmedia_vid_dev_index        preview_cap_id;/**< Capture dev id     */
372
 
    pj_bool_t                    preview_running;/**< Preview is started*/
373
 
    pj_bool_t                    is_native;     /**< Preview is by dev  */
374
 
} pjsua_vid_win;
375
 
 
376
 
 
377
 
typedef struct pjsua_timer_list
378
 
{
379
 
    PJ_DECL_LIST_MEMBER(struct pjsua_timer_list);
380
 
    pj_timer_entry         entry;
381
 
    void                  (*cb)(void *user_data);
382
 
    void                   *user_data;
383
 
} pjsua_timer_list;
384
 
 
385
 
 
386
 
/**
387
 
 * Global pjsua application data.
388
 
 */
389
 
struct pjsua_data
390
 
{
391
 
 
392
 
    /* Control: */
393
 
    pj_caching_pool      cp;        /**< Global pool factory.           */
394
 
    pj_pool_t           *pool;      /**< pjsua's private pool.          */
395
 
    pj_mutex_t          *mutex;     /**< Mutex protection for this data */
396
 
    unsigned             mutex_nesting_level; /**< Mutex nesting level. */
397
 
    pj_thread_t         *mutex_owner; /**< Mutex owner.                 */
398
 
    pjsua_state          state;     /**< Library state.                 */
399
 
 
400
 
    /* Logging: */
401
 
    pjsua_logging_config log_cfg;   /**< Current logging config.        */
402
 
    pj_oshandle_t        log_file;  /**<Output log file handle          */
403
 
 
404
 
    /* SIP: */
405
 
    pjsip_endpoint      *endpt;     /**< Global endpoint.               */
406
 
    pjsip_module         mod;       /**< pjsua's PJSIP module.          */
407
 
    pjsua_transport_data tpdata[8]; /**< Array of transports.           */
408
 
    pjsip_tp_state_callback old_tp_cb; /**< Old transport callback.     */
409
 
 
410
 
    /* Threading: */
411
 
    pj_bool_t            thread_quit_flag;  /**< Thread quit flag.      */
412
 
    pj_thread_t         *thread[4];         /**< Array of threads.      */
413
 
 
414
 
    /* STUN and resolver */
415
 
    pj_stun_config       stun_cfg;  /**< Global STUN settings.          */
416
 
    pj_sockaddr          stun_srv;  /**< Resolved STUN server address   */
417
 
    pj_status_t          stun_status; /**< STUN server status.          */
418
 
    pjsua_stun_resolve   stun_res;  /**< List of pending STUN resolution*/
419
 
    pj_dns_resolver     *resolver;  /**< DNS resolver.                  */
420
 
 
421
 
    /* Detected NAT type */
422
 
    pj_stun_nat_type     nat_type;      /**< NAT type.                  */
423
 
    pj_status_t          nat_status;    /**< Detection status.          */
424
 
    pj_bool_t            nat_in_progress; /**< Detection in progress    */
425
 
 
426
 
    /* List of outbound proxies: */
427
 
    pjsip_route_hdr      outbound_proxy;
428
 
 
429
 
    /* Account: */
430
 
    unsigned             acc_cnt;            /**< Number of accounts.   */
431
 
    pjsua_acc_id         default_acc;        /**< Default account ID    */
432
 
    pjsua_acc            acc[PJSUA_MAX_ACC]; /**< Account array.        */
433
 
    pjsua_acc_id         acc_ids[PJSUA_MAX_ACC]; /**< Acc sorted by prio*/
434
 
 
435
 
    /* Calls: */
436
 
    pjsua_config         ua_cfg;                /**< UA config.         */
437
 
    unsigned             call_cnt;              /**< Call counter.      */
438
 
    pjsua_call           calls[PJSUA_MAX_CALLS];/**< Calls array.       */
439
 
    pjsua_call_id        next_call_id;          /**< Next call id to use*/
440
 
 
441
 
    /* Buddy; */
442
 
    unsigned             buddy_cnt;                 /**< Buddy count.   */
443
 
    pjsua_buddy          buddy[PJSUA_MAX_BUDDIES];  /**< Buddy array.   */
444
 
 
445
 
    /* Presence: */
446
 
    pj_timer_entry       pres_timer;/**< Presence refresh timer.        */
447
 
 
448
 
    /* Media: */
449
 
    pjsua_media_config   media_cfg; /**< Media config.                  */
450
 
    pjmedia_endpt       *med_endpt; /**< Media endpoint.                */
451
 
    pjsua_conf_setting   mconf_cfg; /**< Additionan conf. bridge. param */
452
 
    pjmedia_conf        *mconf;     /**< Conference bridge.             */
453
 
    pj_bool_t            is_mswitch;/**< Are we using audio switchboard
454
 
                                         (a.k.a APS-Direct)             */
455
 
 
456
 
    /* Sound device */
457
 
    pjmedia_aud_dev_index cap_dev;  /**< Capture device ID.             */
458
 
    pjmedia_aud_dev_index play_dev; /**< Playback device ID.            */
459
 
    pj_uint32_t          aud_svmask;/**< Which settings to save         */
460
 
    pjmedia_aud_param    aud_param; /**< User settings to sound dev     */
461
 
    pj_bool_t            aud_open_cnt;/**< How many # device is opened  */
462
 
    pj_bool_t            no_snd;    /**< No sound (app will manage it)  */
463
 
    pj_pool_t           *snd_pool;  /**< Sound's private pool.          */
464
 
    pjmedia_snd_port    *snd_port;  /**< Sound port.                    */
465
 
    pj_timer_entry       snd_idle_timer;/**< Sound device idle timer.   */
466
 
    pjmedia_master_port *null_snd;  /**< Master port for null sound.    */
467
 
    pjmedia_port        *null_port; /**< Null port.                     */
468
 
    pj_bool_t            snd_is_on; /**< Media flow is currently active */
469
 
 
470
 
    /* Video device */
471
 
    pjmedia_vid_dev_index vcap_dev;  /**< Capture device ID.            */
472
 
    pjmedia_vid_dev_index vrdr_dev;  /**< Playback device ID.           */
473
 
 
474
 
    /* File players: */
475
 
    unsigned             player_cnt;/**< Number of file players.        */
476
 
    pjsua_file_data      player[PJSUA_MAX_PLAYERS];/**< Array of players.*/
477
 
 
478
 
    /* File recorders: */
479
 
    unsigned             rec_cnt;   /**< Number of file recorders.      */
480
 
    pjsua_file_data      recorder[PJSUA_MAX_RECORDERS];/**< Array of recs.*/
481
 
 
482
 
    /* Video windows */
483
 
#if PJSUA_HAS_VIDEO
484
 
    pjsua_vid_win        win[PJSUA_MAX_VID_WINS]; /**< Array of windows */
485
 
#endif
486
 
 
487
 
    /* Timer entry list */
488
 
    pjsua_timer_list     timer_list;
489
 
    pj_mutex_t          *timer_mutex;
490
 
};
491
 
 
492
 
 
493
 
extern struct pjsua_data pjsua_var;
494
 
 
495
 
/**
496
 
 * Get the instance of pjsua
497
 
 */
498
 
PJ_DECL(struct pjsua_data*) pjsua_get_var(void);
499
 
 
500
 
 
501
 
 
502
 
/**
503
 
 * IM callback data.
504
 
 */
505
 
typedef struct pjsua_im_data
506
 
{
507
 
    pjsua_acc_id     acc_id;
508
 
    pjsua_call_id    call_id;
509
 
    pj_str_t         to;
510
 
    pj_str_t         body;
511
 
    void            *user_data;
512
 
} pjsua_im_data;
513
 
 
514
 
pj_status_t pjsua_media_apply_xml_control(pjsua_call_id call_id,
515
 
                                          const pj_str_t *xml_st);
516
 
 
517
 
 
518
 
/**
519
 
 * Duplicate IM data.
520
 
 */
521
 
PJ_INLINE(pjsua_im_data*) pjsua_im_data_dup(pj_pool_t *pool, 
522
 
                                            const pjsua_im_data *src)
523
 
{
524
 
    pjsua_im_data *dst;
525
 
 
526
 
    dst = (pjsua_im_data*) pj_pool_alloc(pool, sizeof(*dst));
527
 
    dst->acc_id = src->acc_id;
528
 
    dst->call_id = src->call_id;
529
 
    pj_strdup_with_null(pool, &dst->to, &src->to);
530
 
    dst->user_data = src->user_data;
531
 
    pj_strdup_with_null(pool, &dst->body, &src->body);
532
 
 
533
 
    return dst;
534
 
}
535
 
 
536
 
 
537
 
#if 1
538
 
 
539
 
PJ_INLINE(void) PJSUA_LOCK()
540
 
{
541
 
    pj_mutex_lock(pjsua_var.mutex);
542
 
    pjsua_var.mutex_owner = pj_thread_this();
543
 
    ++pjsua_var.mutex_nesting_level;
544
 
}
545
 
 
546
 
PJ_INLINE(void) PJSUA_UNLOCK()
547
 
{
548
 
    if (--pjsua_var.mutex_nesting_level == 0)
549
 
        pjsua_var.mutex_owner = NULL;
550
 
    pj_mutex_unlock(pjsua_var.mutex);
551
 
}
552
 
 
553
 
PJ_INLINE(pj_status_t) PJSUA_TRY_LOCK()
554
 
{
555
 
    pj_status_t status;
556
 
    status = pj_mutex_trylock(pjsua_var.mutex);
557
 
    if (status == PJ_SUCCESS) {
558
 
        pjsua_var.mutex_owner = pj_thread_this();
559
 
        ++pjsua_var.mutex_nesting_level;
560
 
    }
561
 
    return status;
562
 
}
563
 
 
564
 
PJ_INLINE(pj_bool_t) PJSUA_LOCK_IS_LOCKED()
565
 
{
566
 
    return pjsua_var.mutex_owner == pj_thread_this();
567
 
}
568
 
 
569
 
#else
570
 
#define PJSUA_LOCK()
571
 
#define PJSUA_TRY_LOCK()        PJ_SUCCESS
572
 
#define PJSUA_UNLOCK()
573
 
#define PJSUA_LOCK_IS_LOCKED()  PJ_TRUE
574
 
#endif
575
 
 
576
 
/* Core */
577
 
void pjsua_set_state(pjsua_state new_state);
578
 
 
579
 
/******
580
 
 * STUN resolution
581
 
 */
582
 
/* Resolve the STUN server */
583
 
pj_status_t resolve_stun_server(pj_bool_t wait);
584
 
 
585
 
/** 
586
 
 * Normalize route URI (check for ";lr" and append one if it doesn't
587
 
 * exist and pjsua_config.force_lr is set.
588
 
 */
589
 
pj_status_t normalize_route_uri(pj_pool_t *pool, pj_str_t *uri);
590
 
 
591
 
/* acc use stun? */
592
 
pj_bool_t pjsua_sip_acc_is_using_stun(pjsua_acc_id acc_id);
593
 
 
594
 
/* Get local transport address suitable to be used for Via or Contact address
595
 
 * to send request to the specified destination URI.
596
 
 */
597
 
pj_status_t pjsua_acc_get_uac_addr(pjsua_acc_id acc_id,
598
 
                                   pj_pool_t *pool,
599
 
                                   const pj_str_t *dst_uri,
600
 
                                   pjsip_host_port *addr,
601
 
                                   pjsip_transport_type_e *p_tp_type,
602
 
                                   int *p_secure,
603
 
                                   const void **p_tp);
604
 
 
605
 
/**
606
 
 * Handle incoming invite request.
607
 
 */
608
 
pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata);
609
 
 
610
 
/*
611
 
 * Media channel.
612
 
 */
613
 
pj_status_t pjsua_media_channel_init(pjsua_call_id call_id,
614
 
                                     pjsip_role_e role,
615
 
                                     int security_level,
616
 
                                     pj_pool_t *tmp_pool,
617
 
                                     const pjmedia_sdp_session *rem_sdp,
618
 
                                     int *sip_err_code,
619
 
                                     pj_bool_t async,
620
 
                                     pjsua_med_tp_state_cb cb);
621
 
pj_status_t pjsua_media_channel_create_sdp(pjsua_call_id call_id, 
622
 
                                           pj_pool_t *pool,
623
 
                                           const pjmedia_sdp_session *rem_sdp,
624
 
                                           pjmedia_sdp_session **p_sdp,
625
 
                                           int *sip_err_code);
626
 
pj_status_t pjsua_media_channel_update(pjsua_call_id call_id,
627
 
                                       const pjmedia_sdp_session *local_sdp,
628
 
                                       const pjmedia_sdp_session *remote_sdp);
629
 
pj_status_t pjsua_media_channel_deinit(pjsua_call_id call_id);
630
 
 
631
 
pj_status_t pjsua_call_media_init(pjsua_call_media *call_med,
632
 
                                  pjmedia_type type,
633
 
                                  const pjsua_transport_config *tcfg,
634
 
                                  int security_level,
635
 
                                  int *sip_err_code,
636
 
                                  pj_bool_t async,
637
 
                                  pjsua_med_tp_state_cb cb);
638
 
void pjsua_set_media_tp_state(pjsua_call_media *call_med, pjsua_med_tp_st tp_st);
639
 
 
640
 
void pjsua_media_prov_clean_up(pjsua_call_id call_id);
641
 
 
642
 
/* Callback to receive media events */
643
 
pj_status_t call_media_on_event(pjmedia_event *event,
644
 
                                void *user_data);
645
 
 
646
 
/**
647
 
 * Init presence.
648
 
 */
649
 
pj_status_t pjsua_pres_init();
650
 
 
651
 
/*
652
 
 * Start presence subsystem.
653
 
 */
654
 
pj_status_t pjsua_pres_start(void);
655
 
 
656
 
/**
657
 
 * Refresh presence subscriptions
658
 
 */
659
 
void pjsua_pres_refresh(void);
660
 
 
661
 
/*
662
 
 * Update server subscription (e.g. when our online status has changed)
663
 
 */
664
 
void pjsua_pres_update_acc(int acc_id, pj_bool_t force);
665
 
 
666
 
/*
667
 
 * Shutdown presence.
668
 
 */
669
 
void pjsua_pres_shutdown(unsigned flags);
670
 
 
671
 
/**
672
 
 * Init presence for aoocunt.
673
 
 */
674
 
pj_status_t pjsua_pres_init_acc(int acc_id);
675
 
 
676
 
/**
677
 
 * Send PUBLISH
678
 
 */
679
 
pj_status_t pjsua_pres_init_publish_acc(int acc_id);
680
 
 
681
 
/**
682
 
 *  Send un-PUBLISH
683
 
 */
684
 
void pjsua_pres_unpublish(pjsua_acc *acc, unsigned flags);
685
 
 
686
 
/**
687
 
 * Terminate server subscription for the account 
688
 
 */
689
 
void pjsua_pres_delete_acc(int acc_id, unsigned flags);
690
 
 
691
 
/**
692
 
 * Init IM module handler to handle incoming MESSAGE outside dialog.
693
 
 */
694
 
pj_status_t pjsua_im_init(void);
695
 
 
696
 
/**
697
 
 * Start MWI subscription
698
 
 */
699
 
pj_status_t pjsua_start_mwi(pjsua_acc_id acc_id, pj_bool_t force_renew);
700
 
 
701
 
/**
702
 
 * Init call subsystem.
703
 
 */
704
 
pj_status_t pjsua_call_subsys_init(const pjsua_config *cfg);
705
 
 
706
 
/**
707
 
 * Start call subsystem.
708
 
 */
709
 
pj_status_t pjsua_call_subsys_start(void);
710
 
 
711
 
/**
712
 
 * Init media subsystems.
713
 
 */
714
 
pj_status_t pjsua_media_subsys_init(const pjsua_media_config *cfg);
715
 
 
716
 
/**
717
 
 * Start pjsua media subsystem.
718
 
 */
719
 
pj_status_t pjsua_media_subsys_start(void);
720
 
 
721
 
/**
722
 
 * Destroy pjsua media subsystem.
723
 
 */
724
 
pj_status_t pjsua_media_subsys_destroy(unsigned flags);
725
 
 
726
 
/**
727
 
 * Private: check if we can accept the message.
728
 
 *          If not, then p_accept header will be filled with a valid
729
 
 *          Accept header.
730
 
 */
731
 
pj_bool_t pjsua_im_accept_pager(pjsip_rx_data *rdata,
732
 
                                pjsip_accept_hdr **p_accept_hdr);
733
 
 
734
 
/**
735
 
 * Private: process pager message.
736
 
 *          This may trigger pjsua_ui_on_pager() or pjsua_ui_on_typing().
737
 
 */
738
 
void pjsua_im_process_pager(int call_id, const pj_str_t *from,
739
 
                            const pj_str_t *to, pjsip_rx_data *rdata);
740
 
 
741
 
 
742
 
/**
743
 
 * Create Accept header for MESSAGE.
744
 
 */
745
 
pjsip_accept_hdr* pjsua_im_create_accept(pj_pool_t *pool);
746
 
 
747
 
/*
748
 
 * Add additional headers etc in msg_data specified by application
749
 
 * when sending requests.
750
 
 */
751
 
void pjsua_process_msg_data(pjsip_tx_data *tdata,
752
 
                            const pjsua_msg_data *msg_data);
753
 
 
754
 
 
755
 
/*
756
 
 * Add route_set to outgoing requests
757
 
 */
758
 
void pjsua_set_msg_route_set( pjsip_tx_data *tdata,
759
 
                              const pjsip_route_hdr *route_set );
760
 
 
761
 
 
762
 
/*
763
 
 * Simple version of MIME type parsing (it doesn't support parameters)
764
 
 */
765
 
void pjsua_parse_media_type( pj_pool_t *pool,
766
 
                             const pj_str_t *mime,
767
 
                             pjsip_media_type *media_type);
768
 
 
769
 
 
770
 
/*
771
 
 * Internal function to init transport selector from transport id.
772
 
 */
773
 
void pjsua_init_tpselector(pjsua_transport_id tp_id,
774
 
                           pjsip_tpselector *sel);
775
 
 
776
 
pjsip_dialog* on_dlg_forked(pjsip_dialog *first_set, pjsip_rx_data *res);
777
 
pj_status_t acquire_call(const char *title,
778
 
                         pjsua_call_id call_id,
779
 
                         pjsua_call **p_call,
780
 
                         pjsip_dialog **p_dlg);
781
 
const char *good_number(char *buf, pj_int32_t val);
782
 
void print_call(const char *title,
783
 
                int call_id,
784
 
                char *buf, pj_size_t size);
785
 
 
786
 
/*
787
 
 * Audio
788
 
 */
789
 
pj_status_t pjsua_aud_subsys_init(void);
790
 
pj_status_t pjsua_aud_subsys_start(void);
791
 
pj_status_t pjsua_aud_subsys_destroy(void);
792
 
void pjsua_aud_stop_stream(pjsua_call_media *call_med);
793
 
pj_status_t pjsua_aud_channel_update(pjsua_call_media *call_med,
794
 
                                     pj_pool_t *tmp_pool,
795
 
                                     pjmedia_stream_info *si,
796
 
                                     const pjmedia_sdp_session *local_sdp,
797
 
                                     const pjmedia_sdp_session *remote_sdp);
798
 
void pjsua_check_snd_dev_idle();
799
 
 
800
 
/*
801
 
 * Video
802
 
 */
803
 
pj_status_t pjsua_vid_subsys_init(void);
804
 
pj_status_t pjsua_vid_subsys_start(void);
805
 
pj_status_t pjsua_vid_subsys_destroy(void);
806
 
void pjsua_vid_stop_stream(pjsua_call_media *call_med);
807
 
pj_status_t pjsua_vid_channel_init(pjsua_call_media *call_med);
808
 
pj_status_t pjsua_vid_channel_update(pjsua_call_media *call_med,
809
 
                                     pj_pool_t *tmp_pool,
810
 
                                     pjmedia_vid_stream_info *si,
811
 
                                     const pjmedia_sdp_session *local_sdp,
812
 
                                     const pjmedia_sdp_session *remote_sdp);
813
 
 
814
 
#if PJSUA_HAS_VIDEO
815
 
PJ_DECL(void) pjsua_vid_win_reset(pjsua_vid_win_id wid);
816
 
#else
817
 
#  define pjsua_vid_win_reset(wid)
818
 
#endif
819
 
 
820
 
/*
821
 
 * Schedule check for the need of re-INVITE/UPDATE after media update
822
 
 */
823
 
void pjsua_call_schedule_reinvite_check(pjsua_call *call, unsigned delay_ms);
824
 
 
825
 
PJ_END_DECL
826
 
 
827
 
#endif  /* __PJSUA_INTERNAL_H__ */
828