summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/include/pjmedia-videodev/videodev.h31
-rw-r--r--pjmedia/src/pjmedia-videodev/sdl_dev.c27
-rw-r--r--pjmedia/src/pjmedia-videodev/videodev.c6
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c12
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h16
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_vid.c19
7 files changed, 106 insertions, 6 deletions
diff --git a/pjmedia/include/pjmedia-videodev/videodev.h b/pjmedia/include/pjmedia-videodev/videodev.h
index 06282c89..767fdf73 100644
--- a/pjmedia/include/pjmedia-videodev/videodev.h
+++ b/pjmedia/include/pjmedia-videodev/videodev.h
@@ -111,6 +111,24 @@ typedef struct pjmedia_vid_dev_switch_param
/**
+ * Enumeration of window flags.
+ */
+typedef enum pjmedia_vid_dev_wnd_flag
+{
+ /**
+ * Window with border.
+ */
+ PJMEDIA_VID_DEV_WND_BORDER = 1,
+
+ /**
+ * Window can be resized.
+ */
+ PJMEDIA_VID_DEV_WND_RESIZABLE = 2
+
+} pjmedia_vid_dev_wnd_flag;
+
+
+/**
* Device index constants.
*/
enum
@@ -239,6 +257,13 @@ typedef enum pjmedia_vid_dev_cap
PJMEDIA_VID_DEV_CAP_SWITCH = 256,
/**
+ * Support for setting the output video window's flags.
+ * The value of this capability is a bitmask combination of
+ * #pjmedia_vid_dev_wnd_flag.
+ */
+ PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS = 512,
+
+ /**
* End of standard capability
*/
PJMEDIA_VID_DEV_CAP_MAX = 16384
@@ -421,6 +446,12 @@ typedef struct pjmedia_vid_dev_param
*/
pjmedia_orient orient;
+ /**
+ * Video window flags. This setting is optional, and will only be used
+ * if PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS is set in the flags.
+ */
+ unsigned window_flags;
+
} pjmedia_vid_dev_param;
diff --git a/pjmedia/src/pjmedia-videodev/sdl_dev.c b/pjmedia/src/pjmedia-videodev/sdl_dev.c
index 72a89a61..465e37b5 100644
--- a/pjmedia/src/pjmedia-videodev/sdl_dev.c
+++ b/pjmedia/src/pjmedia-videodev/sdl_dev.c
@@ -493,6 +493,7 @@ static pj_status_t sdl_factory_init(pjmedia_vid_dev_factory *f)
ddi->info.caps = PJMEDIA_VID_DEV_CAP_FORMAT |
PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE;
ddi->info.caps |= PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW;
+ ddi->info.caps |= PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS;
for (j = 0; j < ddi->info.fmt_cnt; j++) {
pjmedia_format *fmt = &ddi->info.fmt[j];
@@ -699,7 +700,16 @@ static pj_status_t sdl_create_rend(struct sdl_stream * strm,
#endif /* PJMEDIA_VIDEO_DEV_SDL_HAS_OPENGL */
if (!strm->window) {
- Uint32 flags = /*SDL_WINDOW_RESIZABLE; */ SDL_WINDOW_BORDERLESS;
+ Uint32 flags = 0;
+
+ if (strm->param.flags & PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS) {
+ if (!(strm->param.window_flags & PJMEDIA_VID_DEV_WND_BORDER))
+ flags |= SDL_WINDOW_BORDERLESS;
+ if (strm->param.window_flags & PJMEDIA_VID_DEV_WND_RESIZABLE)
+ flags |= SDL_WINDOW_RESIZABLE;
+ } else {
+ flags |= SDL_WINDOW_BORDERLESS;
+ }
if (!((strm->param.flags & PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE) &&
strm->param.window_hide))
@@ -971,6 +981,11 @@ static pj_status_t sdl_stream_get_param(pjmedia_vid_dev_stream *s,
{
pi->flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE;
}
+ if (sdl_stream_get_cap(s, PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS,
+ &pi->window_flags) == PJ_SUCCESS)
+ {
+ pi->flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS;
+ }
return PJ_SUCCESS;
}
@@ -1037,7 +1052,15 @@ static pj_status_t get_cap(void *data)
return PJ_SUCCESS;
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE) {
Uint32 flag = SDL_GetWindowFlags(strm->window);
- *((pj_bool_t *)pval) = (flag | SDL_WINDOW_HIDDEN)? PJ_TRUE: PJ_FALSE;
+ *((pj_bool_t *)pval) = (flag & SDL_WINDOW_HIDDEN)? PJ_TRUE: PJ_FALSE;
+ return PJ_SUCCESS;
+ } else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS) {
+ Uint32 flag = SDL_GetWindowFlags(strm->window);
+ unsigned *wnd_flags = (unsigned *)pval;
+ if (!(flag & SDL_WINDOW_BORDERLESS))
+ *wnd_flags |= PJMEDIA_VID_DEV_WND_BORDER;
+ if (flag & SDL_WINDOW_RESIZABLE)
+ *wnd_flags |= PJMEDIA_VID_DEV_WND_RESIZABLE;
return PJ_SUCCESS;
}
diff --git a/pjmedia/src/pjmedia-videodev/videodev.c b/pjmedia/src/pjmedia-videodev/videodev.c
index dad2c12b..9a82ba6e 100644
--- a/pjmedia/src/pjmedia-videodev/videodev.c
+++ b/pjmedia/src/pjmedia-videodev/videodev.c
@@ -46,7 +46,8 @@ static struct cap_info
DEFINE_CAP("hide", "Renderer hide"),
DEFINE_CAP("preview", "Input preview"),
DEFINE_CAP("orientation", "Video orientation"),
- DEFINE_CAP("switch", "Switch device")
+ DEFINE_CAP("switch", "Switch device"),
+ DEFINE_CAP("wndflags", "Window flags")
};
@@ -188,6 +189,9 @@ static pj_status_t get_cap_pointer(const pjmedia_vid_dev_param *param,
* param (it doesn't make sense to open a stream and tell it
* to switch immediately).
*/
+ case PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS:
+ FIELD_INFO(window_flags);
+ break;
default:
return PJMEDIA_EVID_INVCAP;
}
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c
index d6afd89d..fecba36e 100644
--- a/pjsip-apps/src/pjsua/pjsua_app.c
+++ b/pjsip-apps/src/pjsua/pjsua_app.c
@@ -3866,6 +3866,11 @@ static void app_config_init_video(pjsua_acc_config *acc_cfg)
acc_cfg->max_video_cnt = app_config.vid.vid_cnt;
acc_cfg->vid_in_auto_show = app_config.vid.in_auto_show;
acc_cfg->vid_out_auto_transmit = app_config.vid.out_auto_transmit;
+ /* Note that normally GUI application will prefer a borderless
+ * window.
+ */
+ acc_cfg->vid_wnd_flags = PJMEDIA_VID_DEV_WND_BORDER |
+ PJMEDIA_VID_DEV_WND_RESIZABLE;
acc_cfg->vid_cap_dev = app_config.vid.vcapture_dev;
acc_cfg->vid_rend_dev = app_config.vid.vrender_dev;
}
@@ -4021,7 +4026,12 @@ static void vid_handle_menu(char *menuin)
pj_bool_t on = (strcmp(argv[3], "on") == 0);
int dev_id = atoi(argv[4]);
if (on) {
- pjsua_vid_preview_start(dev_id, NULL);
+ pjsua_vid_preview_param param;
+
+ pjsua_vid_preview_param_default(&param);
+ param.wnd_flags = PJMEDIA_VID_DEV_WND_BORDER |
+ PJMEDIA_VID_DEV_WND_RESIZABLE;
+ pjsua_vid_preview_start(dev_id, &param);
arrange_window(pjsua_vid_preview_get_win(dev_id));
} else {
pjsua_vid_win_id wid;
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index 4a8292c0..b45f69f7 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -2746,6 +2746,14 @@ typedef struct pjsua_acc_config
pj_bool_t vid_out_auto_transmit;
/**
+ * Specify video window's flags. The value is a bitmask combination of
+ * #pjmedia_vid_dev_wnd_flag.
+ *
+ * Default: 0
+ */
+ unsigned vid_wnd_flags;
+
+ /**
* Specify the default capture device to be used by this account. If
* \a vid_out_auto_transmit is enabled, this device will be used for
* capturing video.
@@ -5738,6 +5746,14 @@ typedef struct pjsua_vid_preview_param
*/
pj_bool_t show;
+ /**
+ * Window flags. The value is a bitmask combination of
+ * #pjmedia_vid_dev_wnd_flag.
+ *
+ * Default: 0.
+ */
+ unsigned wnd_flags;
+
} pjsua_vid_preview_param;
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 1e05503a..bd8096a3 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -1064,6 +1064,7 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id,
/* Video settings */
acc->cfg.vid_in_auto_show = cfg->vid_in_auto_show;
acc->cfg.vid_out_auto_transmit = cfg->vid_out_auto_transmit;
+ acc->cfg.vid_wnd_flags = cfg->vid_wnd_flags;
acc->cfg.vid_cap_dev = cfg->vid_cap_dev;
acc->cfg.vid_rend_dev = cfg->vid_rend_dev;
diff --git a/pjsip/src/pjsua-lib/pjsua_vid.c b/pjsip/src/pjsua-lib/pjsua_vid.c
index 1ceac97e..1cd890d0 100644
--- a/pjsip/src/pjsua-lib/pjsua_vid.c
+++ b/pjsip/src/pjsua-lib/pjsua_vid.c
@@ -388,6 +388,7 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type,
pjmedia_vid_dev_index rend_id,
pjmedia_vid_dev_index cap_id,
pj_bool_t show,
+ unsigned wnd_flags,
pjsua_vid_win_id *id)
{
pj_bool_t enable_native_preview;
@@ -432,6 +433,10 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type,
strm, PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE,
&hide);
+ pjmedia_vid_dev_stream_set_cap(
+ strm, PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS,
+ &wnd_flags);
+
/* Done */
*id = wid;
pj_log_pop_indent();
@@ -482,6 +487,8 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type,
if (w->is_native) {
vp_param.vidparam.flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE;
vp_param.vidparam.window_hide = !show;
+ vp_param.vidparam.flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS;
+ vp_param.vidparam.window_flags = wnd_flags;
}
/* Normalize capture ID, in case it was set to
@@ -543,6 +550,8 @@ static pj_status_t create_vid_win(pjsua_vid_win_type type,
vp_param.vidparam.disp_size = fmt->det.vid.size;
vp_param.vidparam.flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE;
vp_param.vidparam.window_hide = !show;
+ vp_param.vidparam.flags |= PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS;
+ vp_param.vidparam.window_flags = wnd_flags;
status = pjmedia_vid_port_create(w->pool, &vp_param, &w->vp_rend);
if (status != PJ_SUCCESS)
@@ -786,6 +795,7 @@ pj_status_t video_channel_update(pjsua_call_media *call_med,
//acc->cfg.vid_rend_dev,
PJSUA_INVALID_ID,
acc->cfg.vid_in_auto_show,
+ acc->cfg.vid_wnd_flags,
&wid);
if (status != PJ_SUCCESS) {
pj_log_pop_indent();
@@ -825,6 +835,7 @@ pj_status_t video_channel_update(pjsua_call_media *call_med,
/* Setup encoding direction */
if (si->dir & PJMEDIA_DIR_ENCODING && !call->local_hold)
{
+ pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];
pjsua_vid_win *w;
pjsua_vid_win_id wid;
pj_bool_t just_created = PJ_FALSE;
@@ -855,6 +866,7 @@ pj_status_t video_channel_update(pjsua_call_media *call_med,
//acc->cfg.vid_rend_dev,
//acc->cfg.vid_cap_dev,
PJSUA_HIDE_WINDOW,
+ acc->cfg.vid_wnd_flags,
&wid);
if (status != PJ_SUCCESS) {
pj_log_pop_indent();
@@ -1070,7 +1082,7 @@ PJ_DEF(pj_status_t) pjsua_vid_preview_start(pjmedia_vid_dev_index id,
rend_id = prm->rend_id;
status = create_vid_win(PJSUA_WND_TYPE_PREVIEW, NULL, rend_id, id,
- prm->show, &wid);
+ prm->show, prm->wnd_flags, &wid);
if (status != PJ_SUCCESS) {
PJSUA_UNLOCK();
pj_log_pop_indent();
@@ -1847,13 +1859,16 @@ static pj_status_t call_change_cap_dev(pjsua_call *call,
*/
new_wid = vid_preview_get_win(cap_dev, PJ_FALSE);
if (new_wid == PJSUA_INVALID_ID) {
+ pjsua_acc *acc = &pjsua_var.acc[call_med->call->acc_id];
+
/* Create preview video window */
status = create_vid_win(PJSUA_WND_TYPE_PREVIEW,
&media_port->info.fmt,
call_med->strm.v.rdr_dev,
cap_dev,
PJSUA_HIDE_WINDOW,
- &new_wid);
+ acc->cfg.vid_wnd_flags,
+ &new_wid);
if (status != PJ_SUCCESS)
goto on_error;
}