From 47b179cfea4ad6c423a7d3281920e0d195e6e60b Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 4 Oct 2011 13:35:41 +0000 Subject: More re #1362: actually try to use the device switching capability in pjsua-lib, in pjsua_call_set_vid_strm(PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV) operation git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3787 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia-videodev/videodev.h | 12 ++++++++++++ pjsip/src/pjsua-lib/pjsua_vid.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pjmedia/include/pjmedia-videodev/videodev.h b/pjmedia/include/pjmedia-videodev/videodev.h index f64479d6..06282c89 100644 --- a/pjmedia/include/pjmedia-videodev/videodev.h +++ b/pjmedia/include/pjmedia-videodev/videodev.h @@ -97,6 +97,7 @@ typedef struct pjmedia_vid_dev_hwnd /** * Parameter for switching device with PJMEDIA_VID_DEV_CAP_SWITCH capability. + * Initialize this with pjmedia_vid_dev_switch_param_default() */ typedef struct pjmedia_vid_dev_switch_param { @@ -430,6 +431,17 @@ typedef struct pjmedia_vid_dev_factory pjmedia_vid_dev_factory; typedef pjmedia_vid_dev_factory* (*pjmedia_vid_dev_factory_create_func_ptr)(pj_pool_factory*); +/** + * Initialize pjmedia_vid_dev_switch_param. + * + * @param p Parameter to be initialized. + */ +PJ_INLINE(void) +pjmedia_vid_dev_switch_param_default(pjmedia_vid_dev_switch_param *p) +{ + pj_bzero(p, sizeof(*p)); + p->target_id = PJMEDIA_VID_INVALID_DEV; +} /** * Get string info for the specified capability. diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c index 7ad73bbb..2a4c99f5 100644 --- a/pjsip/src/pjsua-lib/pjsua_vid.c +++ b/pjsip/src/pjsua-lib/pjsua_vid.c @@ -1756,6 +1756,8 @@ static pj_status_t call_change_cap_dev(pjsua_call *call, pjmedia_vid_dev_index cap_dev) { pjsua_call_media *call_med; + pjmedia_vid_dev_stream *old_dev; + pjmedia_vid_dev_switch_param switch_prm; pjmedia_vid_dev_info info; pjsua_vid_win *w, *new_w = NULL; pjsua_vid_win_id wid, new_wid; @@ -1794,6 +1796,19 @@ static pj_status_t call_change_cap_dev(pjsua_call *call, w = &pjsua_var.win[wid]; pj_assert(w->type == PJSUA_WND_TYPE_PREVIEW && w->vp_cap); + /* If the old device supports fast switching, then that's excellent! */ + old_dev = pjmedia_vid_port_get_stream(w->vp_cap); + pjmedia_vid_dev_switch_param_default(&switch_prm); + switch_prm.target_id = cap_dev; + status = pjmedia_vid_dev_stream_set_cap(old_dev, + PJMEDIA_VID_DEV_CAP_SWITCH, + &switch_prm); + if (status == PJ_SUCCESS) { + w->preview_cap_id = cap_dev; + return PJ_SUCCESS; + } + + /* No it doesn't support fast switching. Do slow switching then.. */ status = pjmedia_vid_stream_get_port(call_med->strm.v.stream, PJMEDIA_DIR_ENCODING, &media_port); if (status != PJ_SUCCESS) -- cgit v1.2.3