diff options
author | Benny Prijono <bennylp@teluu.com> | 2011-08-25 11:59:39 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2011-08-25 11:59:39 +0000 |
commit | 3550a1860cb5812e76d132052c2c5a75bd84b03e (patch) | |
tree | 925bc609bda1552708d6cae62ac865da42effa70 | |
parent | ddeb24066e2feafe9de7baef397d40b40c7fb537 (diff) |
Re #1351: option to initially hide video preview window to avoid floating window. Also added pjsua_vid_preview_param_default()
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3724 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/src/pjmedia-videodev/sdl_dev.c | 5 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidgui.cpp | 21 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidwin.cpp | 46 | ||||
-rw-r--r-- | pjsip-apps/src/vidgui/vidwin.h | 1 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 21 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_vid.c | 41 |
6 files changed, 106 insertions, 29 deletions
diff --git a/pjmedia/src/pjmedia-videodev/sdl_dev.c b/pjmedia/src/pjmedia-videodev/sdl_dev.c index 91fb733b..9ecdb77d 100644 --- a/pjmedia/src/pjmedia-videodev/sdl_dev.c +++ b/pjmedia/src/pjmedia-videodev/sdl_dev.c @@ -704,7 +704,12 @@ static pj_status_t sdl_create_rend(struct sdl_stream * strm, if (!((strm->param.flags & PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE) && strm->param.window_hide)) + { flags |= SDL_WINDOW_SHOWN; + } else { + flags &= ~SDL_WINDOW_SHOWN; + flags |= SDL_WINDOW_HIDDEN; + } #if PJMEDIA_VIDEO_DEV_SDL_HAS_OPENGL if (strm->param.rend_id == OPENGL_DEV_IDX) diff --git a/pjsip-apps/src/vidgui/vidgui.cpp b/pjsip-apps/src/vidgui/vidgui.cpp index 93c76b85..f59911b4 100644 --- a/pjsip-apps/src/vidgui/vidgui.cpp +++ b/pjsip-apps/src/vidgui/vidgui.cpp @@ -28,6 +28,7 @@ #include <QMessageBox> #define LOG_FILE "vidgui.log" +#define THIS_FILE "vidgui.cpp" // These configure SIP registration #define SIP_DOMAIN NULL @@ -83,7 +84,7 @@ void MainWin::initLayout() /* Right pane */ vbox_right->addWidget((localUri_ = new QLabel)); - vbox_right->addWidget((previewButton_=new QPushButton(tr("Start Preview")))); + vbox_right->addWidget((previewButton_=new QPushButton(tr("Start &Preview")))); vbox_right->addWidget((callButton_=new QPushButton(tr("Call")))); vbox_right->addWidget((hangupButton_=new QPushButton(tr("Hangup")))); vbox_right->addWidget((quitButton_=new QPushButton(tr("Quit")))); @@ -120,7 +121,7 @@ void MainWin::showStatus(const char *msg) { //statusBar_->showMessage(msg); statusBar_->setText(msg); - PJ_LOG(3,("vidgui.cpp", "%s", msg)); + PJ_LOG(3,(THIS_FILE, "%s", msg)); } void MainWin::showError(const char *title, pj_status_t status) @@ -176,15 +177,17 @@ void MainWin::preview() pjsua_vid_preview_stop(DEFAULT_CAP_DEV); - previewButton_->setText(tr("Start Preview")); + showStatus("Preview stopped"); + previewButton_->setText(tr("Start &Preview")); } else { pjsua_vid_win_id wid; pjsua_vid_win_info wi; pjsua_vid_preview_param pre_param; pj_status_t status; - pj_bzero(&pre_param, sizeof(pre_param)); + pjsua_vid_preview_param_default(&pre_param); pre_param.rend_id = DEFAULT_REND_DEV; + pre_param.show = PJ_FALSE; status = pjsua_vid_preview_start(DEFAULT_CAP_DEV, &pre_param); if (status != PJ_SUCCESS) { @@ -198,8 +201,14 @@ void MainWin::preview() video_prev_ = new VidWin(&wi.hwnd); vbox_left->addWidget(video_prev_, 1); - - previewButton_->setText(tr("Stop Preview")); + //Using this will cause SDL window to display blank + //screen sometimes, probably because it's using different + //X11 Display + //status = pjsua_vid_win_set_show(wid, PJ_TRUE); + video_prev_->show(); + showStatus("Preview started"); + + previewButton_->setText(tr("Stop &Preview")); } preview_on = !preview_on; } diff --git a/pjsip-apps/src/vidgui/vidwin.cpp b/pjsip-apps/src/vidgui/vidwin.cpp index 1376cb68..cc97b821 100644 --- a/pjsip-apps/src/vidgui/vidwin.cpp +++ b/pjsip-apps/src/vidgui/vidwin.cpp @@ -140,6 +140,13 @@ void VidWin::get_size() TRACE_("%p size = %dx%d", w, size_hint.width(), size_hint.height()); } +void VidWin::show(bool visible) +{ + if (!hwnd.info.win.hwnd) return; + + ShowWindow(hwnd.info.win.hwnd, visible ? SW_SHOW : SW_HIDE); +} + #elif defined(__APPLE__) #import<Cocoa/Cocoa.h> @@ -203,6 +210,20 @@ void VidWin::get_size() TRACE_("%p size = %dx%d", 0, size_hint.width(), size_hint.height()); } +void VidWin::show(bool visible) +{ + if (!hwnd.info.cocoa.window) return; + + NSWindow *w = (NSWindow*)hwnd.info.cocoa.window; + + if (visible) { + if (![w isMiniaturized]) { + [w makeKeyAndOrderFront:nil]; + } + } else { + [w orderOut:nil]; + } +} #elif defined(linux) || defined(__linux) @@ -211,6 +232,9 @@ void VidWin::get_size() #include <QX11Info> #include <stdio.h> +#define GET_DISPLAY() QX11Info::display() +//#define GET_DISPLAY() (Display*)hwnd.info.x11.display + void VidWin::attach() { if (!hwnd.info.x11.window) return; @@ -220,7 +244,7 @@ void VidWin::attach() // Use Qt X11 display here, using window creator X11 display may cause // the window failing to embed to this QWidget. //Display *d = (Display*)hwnd.info.x11.display; - Display *d = QX11Info::display(); + Display *d = GET_DISPLAY(); Window w = (Window)hwnd.info.x11.window; Window parent = (Window)this->winId(); int err = XReparentWindow(d, w, parent, 0, 0); @@ -239,7 +263,7 @@ void VidWin::set_size() if (!hwnd.info.x11.window) return; /* Update position and size */ - Display *d = QX11Info::display(); + Display *d = GET_DISPLAY(); Window w = (Window)hwnd.info.x11.window; QRect qr = rect(); @@ -252,7 +276,7 @@ void VidWin::get_size() { if (!hwnd.info.x11.window) return; - Display *d = QX11Info::display(); + Display *d = GET_DISPLAY(); Window w = (Window)hwnd.info.x11.window; XWindowAttributes attr; @@ -261,5 +285,21 @@ void VidWin::get_size() TRACE_("%p size = %dx%d", w, size_hint.width(), size_hint.height()); } +void VidWin::show(bool visible) +{ + if (!hwnd.info.x11.window) return; + + Display *d = GET_DISPLAY(); + Window w = (Window)hwnd.info.x11.window; + + if (visible) { + XMapRaised(d, w); + } else { + XUnmapWindow(d, w); + } + + XFlush(d); +} + #endif diff --git a/pjsip-apps/src/vidgui/vidwin.h b/pjsip-apps/src/vidgui/vidwin.h index d9f8831c..8a18785f 100644 --- a/pjsip-apps/src/vidgui/vidwin.h +++ b/pjsip-apps/src/vidgui/vidwin.h @@ -32,6 +32,7 @@ public: Qt::WindowFlags f = 0); virtual ~VidWin(); QSize sizeHint() const { return size_hint; } + void show(bool visible=true); protected: virtual bool event(QEvent *e); diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index e0f33514..2fdea68e 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -5437,23 +5437,40 @@ typedef struct pjsua_vid_preview_param /** * Device ID for the video renderer to be used for rendering the * capture stream for preview. + * + * Default: PJMEDIA_VID_DEFAULT_RENDER_DEV */ pjmedia_vid_dev_index rend_id; + + /** + * Show window initially. + * + * Default: PJ_TRUE. + */ + pj_bool_t show; + } pjsua_vid_preview_param; /** + * Initialize pjsua_vid_preview_param + * + * @param p The parameter to be initialized. + */ +PJ_DECL(void) pjsua_vid_preview_param_default(pjsua_vid_preview_param *p); + +/** * Start video preview window for the specified capture device. * * @param id The capture device ID where its preview will be * started. - * @param prm Optional video preview parameters. Specify NULL + * @param p Optional video preview parameters. Specify NULL * to use default values. * * @return PJ_SUCCESS on success, or the appropriate error code. */ PJ_DECL(pj_status_t) pjsua_vid_preview_start(pjmedia_vid_dev_index id, - pjsua_vid_preview_param *prm); + const pjsua_vid_preview_param *p); /** * Get the preview window handle associated with the capture device, if any. diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c index 72580f9f..8083445a 100644 --- a/pjsip/src/pjsua-lib/pjsua_vid.c +++ b/pjsip/src/pjsua-lib/pjsua_vid.c @@ -116,6 +116,13 @@ pjsua_call_vid_strm_op_param_default(pjsua_call_vid_strm_op_param *param) param->cap_dev = PJMEDIA_VID_DEFAULT_CAPTURE_DEV; } +PJ_DEF(void) pjsua_vid_preview_param_default(pjsua_vid_preview_param *p) +{ + p->rend_id = PJMEDIA_VID_DEFAULT_RENDER_DEV; + p->show = PJ_TRUE; +} + + /***************************************************************************** * Devices. */ @@ -338,19 +345,15 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type, wid = pjsua_vid_preview_get_win(cap_id); if (wid != PJSUA_INVALID_ID) { /* Yes, it exists */ + /* Show/hide window */ + pjmedia_vid_dev_stream *rdr; + pj_bool_t hide = !show; - /* Show window if requested */ - if (show) { - pjmedia_vid_dev_stream *rdr; - pj_bool_t hide = PJ_FALSE; - - rdr = pjmedia_vid_port_get_stream(pjsua_var.win[wid].vp_rend); - pj_assert(rdr); - status = pjmedia_vid_dev_stream_set_cap( - rdr, - PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE, - &hide); - } + rdr = pjmedia_vid_port_get_stream(pjsua_var.win[wid].vp_rend); + pj_assert(rdr); + status = pjmedia_vid_dev_stream_set_cap( + rdr, PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE, + &hide); /* Done */ *id = wid; @@ -832,23 +835,25 @@ void stop_video_stream(pjsua_call_media *call_med) * Start video preview window for the specified capture device. */ PJ_DEF(pj_status_t) pjsua_vid_preview_start(pjmedia_vid_dev_index id, - pjsua_vid_preview_param *prm) + const pjsua_vid_preview_param *prm) { pjsua_vid_win_id wid; pjsua_vid_win *w; pjmedia_vid_dev_index rend_id; + pjsua_vid_preview_param default_param; pj_status_t status; PJSUA_LOCK(); - if (prm) { - rend_id = prm->rend_id; - } else { - rend_id = PJMEDIA_VID_DEFAULT_RENDER_DEV; + if (!prm) { + pjsua_vid_preview_param_default(&default_param); + prm = &default_param; } + rend_id = prm->rend_id; + status = create_vid_win(PJSUA_WND_TYPE_PREVIEW, NULL, rend_id, id, - PJ_TRUE, &wid); + prm->show, &wid); if (status != PJ_SUCCESS) { PJSUA_UNLOCK(); return status; |