summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2011-08-25 11:59:39 +0000
committerBenny Prijono <bennylp@teluu.com>2011-08-25 11:59:39 +0000
commit3550a1860cb5812e76d132052c2c5a75bd84b03e (patch)
tree925bc609bda1552708d6cae62ac865da42effa70
parentddeb24066e2feafe9de7baef397d40b40c7fb537 (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.c5
-rw-r--r--pjsip-apps/src/vidgui/vidgui.cpp21
-rw-r--r--pjsip-apps/src/vidgui/vidwin.cpp46
-rw-r--r--pjsip-apps/src/vidgui/vidwin.h1
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h21
-rw-r--r--pjsip/src/pjsua-lib/pjsua_vid.c41
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;