summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-06-12 08:27:52 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-06-12 08:27:52 +0000
commit110117d73d7d0374f26a1336eee196692a7fe182 (patch)
tree99ed322034a9f109fc2de6b7a0cd999798bfe27c
parent21b186195eecc5a92de07e4b2d7e126a2d5ff9f0 (diff)
Close #1534: done.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4164 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h97
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c32
2 files changed, 87 insertions, 42 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index 02dc3f9b..8723c2bc 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -3560,6 +3560,50 @@ typedef enum pjsua_vid_req_keyframe_method
/**
+ * Call media information.
+ */
+typedef struct pjsua_call_media_info
+{
+ /** Media index in SDP. */
+ unsigned index;
+
+ /** Media type. */
+ pjmedia_type type;
+
+ /** Media direction. */
+ pjmedia_dir dir;
+
+ /** Call media status. */
+ pjsua_call_media_status status;
+
+ /** The specific media stream info. */
+ union {
+ /** Audio stream */
+ struct {
+ /** The conference port number for the call. */
+ pjsua_conf_port_id conf_slot;
+ } aud;
+
+ /** Video stream */
+ struct {
+ /**
+ * The window id for incoming video, if any, or
+ * PJSUA_INVALID_ID.
+ */
+ pjsua_vid_win_id win_in;
+
+ /** The video capture device for outgoing transmission,
+ * if any, or PJMEDIA_VID_INVALID_DEV
+ */
+ pjmedia_vid_dev_index cap_dev;
+
+ } vid;
+ } stream;
+
+} pjsua_call_media_info;
+
+
+/**
* This structure describes the information and current status of a call.
*/
typedef struct pjsua_call_info
@@ -3612,49 +3656,20 @@ typedef struct pjsua_call_info
/** The conference port number for the first audio stream. */
pjsua_conf_port_id conf_slot;
- /** Number of media streams in this call */
+ /** Number of active media info in this call. */
unsigned media_cnt;
- /** Array of media stream information */
- struct
- {
- /** Media index in SDP. */
- unsigned index;
-
- /** Media type. */
- pjmedia_type type;
-
- /** Media direction. */
- pjmedia_dir dir;
-
- /** Call media status. */
- pjsua_call_media_status status;
-
- /** The specific media stream info. */
- union {
- /** Audio stream */
- struct {
- /** The conference port number for the call. */
- pjsua_conf_port_id conf_slot;
- } aud;
-
- /** Video stream */
- struct {
- /**
- * The window id for incoming video, if any, or
- * PJSUA_INVALID_ID.
- */
- pjsua_vid_win_id win_in;
-
- /** The video capture device for outgoing transmission,
- * if any, or PJMEDIA_VID_INVALID_DEV
- */
- pjmedia_vid_dev_index cap_dev;
-
- } vid;
- } stream;
-
- } media[PJMEDIA_MAX_SDP_MEDIA];
+ /** Array of active media information. */
+ pjsua_call_media_info media[PJMEDIA_MAX_SDP_MEDIA];
+
+ /** Number of provisional media info in this call. */
+ unsigned prov_media_cnt;
+
+ /** Array of provisional media information. This contains the media info
+ * in the provisioning state, that is when the media session is being
+ * created/updated (SDP offer/answer is on progress).
+ */
+ pjsua_call_media_info prov_media[PJMEDIA_MAX_SDP_MEDIA];
/** Up-to-date call connected duration (zero when call is not
* established)
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 460c269e..ccc06538 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -1614,7 +1614,7 @@ PJ_DEF(pj_status_t) pjsua_call_get_info( pjsua_call_id call_id,
info->rem_vid_cnt = call->rem_vid_cnt;
}
- /* Build array of media status and dir */
+ /* Build array of active media info */
info->media_cnt = 0;
for (mi=0; mi < call->med_cnt &&
info->media_cnt < PJ_ARRAY_SIZE(info->media); ++mi)
@@ -1651,6 +1651,36 @@ PJ_DEF(pj_status_t) pjsua_call_get_info( pjsua_call_id call_id,
info->conf_slot = call->media[call->audio_idx].strm.a.conf_slot;
}
+ /* Build array of provisional media info */
+ info->prov_media_cnt = 0;
+ for (mi=0; mi < call->med_prov_cnt &&
+ info->prov_media_cnt < PJ_ARRAY_SIZE(info->prov_media); ++mi)
+ {
+ pjsua_call_media *call_med = &call->media_prov[mi];
+
+ info->prov_media[info->prov_media_cnt].index = mi;
+ info->prov_media[info->prov_media_cnt].status = call_med->state;
+ info->prov_media[info->prov_media_cnt].dir = call_med->dir;
+ info->prov_media[info->prov_media_cnt].type = call_med->type;
+ if (call_med->type == PJMEDIA_TYPE_AUDIO) {
+ info->prov_media[info->prov_media_cnt].stream.aud.conf_slot =
+ call_med->strm.a.conf_slot;
+ } else if (call_med->type == PJMEDIA_TYPE_VIDEO) {
+ pjmedia_vid_dev_index cap_dev = PJMEDIA_VID_INVALID_DEV;
+
+ info->prov_media[info->prov_media_cnt].stream.vid.win_in =
+ call_med->strm.v.rdr_win_id;
+
+ if (call_med->strm.v.cap_win_id != PJSUA_INVALID_ID) {
+ cap_dev = call_med->strm.v.cap_dev;
+ }
+ info->prov_media[info->prov_media_cnt].stream.vid.cap_dev=cap_dev;
+ } else {
+ continue;
+ }
+ ++info->prov_media_cnt;
+ }
+
/* calculate duration */
if (info->state >= PJSIP_INV_STATE_DISCONNECTED) {