diff options
-rw-r--r-- | pjmedia/include/pjmedia-videodev/videodev.h | 31 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-videodev/sdl_dev.c | 27 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-videodev/videodev.c | 6 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 12 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 16 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 1 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_vid.c | 19 |
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(¶m); + param.wnd_flags = PJMEDIA_VID_DEV_WND_BORDER | + PJMEDIA_VID_DEV_WND_RESIZABLE; + pjsua_vid_preview_start(dev_id, ¶m); 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; } |