diff options
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_vid.c | 34 | ||||
-rw-r--r-- | pjsip/src/pjsua2/call.cpp | 2 | ||||
-rw-r--r-- | pjsip/src/pjsua2/media.cpp | 62 |
3 files changed, 98 insertions, 0 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c index 028c7a35..a1f54f34 100644 --- a/pjsip/src/pjsua-lib/pjsua_vid.c +++ b/pjsip/src/pjsua-lib/pjsua_vid.c @@ -1405,6 +1405,40 @@ PJ_DEF(pj_status_t) pjsua_vid_win_set_size( pjsua_vid_win_id wid, } /* + * Set output window. + */ +PJ_DEF(pj_status_t) pjsua_vid_win_set_win( pjsua_vid_win_id wid, + const pjmedia_vid_dev_hwnd *win) +{ + pjsua_vid_win *w; + pjmedia_vid_dev_stream *s; + pj_status_t status; + + PJ_ASSERT_RETURN(wid >= 0 && wid < PJSUA_MAX_VID_WINS && win, PJ_EINVAL); + + PJSUA_LOCK(); + w = &pjsua_var.win[wid]; + if (w->vp_rend == NULL) { + /* Native window */ + PJSUA_UNLOCK(); + return PJ_EINVAL; + } + + s = pjmedia_vid_port_get_stream(w->vp_rend); + if (s == NULL) { + PJSUA_UNLOCK(); + return PJ_EINVAL; + } + + status = pjmedia_vid_dev_stream_set_cap(s, + PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW, win); + + PJSUA_UNLOCK(); + + return status; +} + +/* * Set video orientation. */ PJ_DEF(pj_status_t) pjsua_vid_win_rotate( pjsua_vid_win_id wid, diff --git a/pjsip/src/pjsua2/call.cpp b/pjsip/src/pjsua2/call.cpp index 1e4e72f3..f0bba738 100644 --- a/pjsip/src/pjsua2/call.cpp +++ b/pjsip/src/pjsua2/call.cpp @@ -224,6 +224,7 @@ pjsua_call_setting CallSetting::toPj() const CallMediaInfo::CallMediaInfo() +: videoWindow(PJSUA_INVALID_ID) { } @@ -237,6 +238,7 @@ void CallMediaInfo::fromPj(const pjsua_call_media_info &prm) this->audioConfSlot = (int)prm.stream.aud.conf_slot; } else if (this->type == PJMEDIA_TYPE_VIDEO) { this->videoIncomingWindowId = prm.stream.vid.win_in; + this->videoWindow = VideoWindow(prm.stream.vid.win_in); this->videoCapDev = prm.stream.vid.cap_dev; } } diff --git a/pjsip/src/pjsua2/media.cpp b/pjsip/src/pjsua2/media.cpp index 0a8b7fdb..c08e20aa 100644 --- a/pjsip/src/pjsua2/media.cpp +++ b/pjsip/src/pjsua2/media.cpp @@ -1007,6 +1007,68 @@ int AudDevManager::getActiveDev(bool is_capture) const throw(Error) } /////////////////////////////////////////////////////////////////////////////// +VideoWindow::VideoWindow(pjsua_vid_win_id win_id) +: winId(win_id) +{ +} + +VideoWindowInfo VideoWindow::getInfo() const throw(Error) +{ + VideoWindowInfo vwi; + pjsua_vid_win_info pj_vwi; + + PJSUA2_CHECK_EXPR( pjsua_vid_win_get_info(winId, &pj_vwi) ); + vwi.isNative = pj_vwi.is_native; + vwi.winHandle.type = pj_vwi.hwnd.type; + vwi.winHandle.handle.window = pj_vwi.hwnd.info.window; + vwi.renderDeviceId = pj_vwi.rdr_dev; + vwi.show = pj_vwi.show; + vwi.pos.x = pj_vwi.pos.x; + vwi.pos.y = pj_vwi.pos.y; + vwi.size.w = pj_vwi.size.w; + vwi.size.h = pj_vwi.size.h; + + return vwi; +} + +void VideoWindow::Show(bool show) throw(Error) +{ + PJSUA2_CHECK_EXPR( pjsua_vid_win_set_show(winId, show) ); +} + +void VideoWindow::setPos(const MediaCoordinate &pos) throw(Error) +{ + pjmedia_coord pj_pos; + + pj_pos.x = pos.x; + pj_pos.y = pos.y; + PJSUA2_CHECK_EXPR( pjsua_vid_win_set_pos(winId, &pj_pos) ); +} + +void VideoWindow::setSize(const MediaSize &size) throw(Error) +{ + pjmedia_rect_size pj_size; + + pj_size.w = size.w; + pj_size.h = size.h; + PJSUA2_CHECK_EXPR( pjsua_vid_win_set_size(winId, &pj_size) ); +} + +void VideoWindow::rotate(int angle) throw(Error) +{ + PJSUA2_CHECK_EXPR( pjsua_vid_win_rotate(winId, angle) ); +} + +void VideoWindow::setWindow(const VideoWindowHandle &win) throw(Error) +{ + pjmedia_vid_dev_hwnd vhwnd; + + vhwnd.type = win.type; + vhwnd.info.window = win.handle.window; + PJSUA2_CHECK_EXPR( pjsua_vid_win_set_win(winId, &vhwnd) ); +} + +/////////////////////////////////////////////////////////////////////////////// void CodecInfo::fromPj(const pjsua_codec_info &codec_info) { codecId = pj2Str(codec_info.codec_id); |