Video source reuse API

This commit is contained in:
Guillaume BIENKOWSKI 2014-09-17 14:58:56 +02:00
parent b71182e56b
commit b7c6893d27
4 changed files with 61 additions and 8 deletions

View file

@ -1108,7 +1108,7 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){
const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){
if (call->op){
LinphoneCallParams *cp;
SalMediaDescription *md;
SalMediaDescription *md;
if (call->remote_params != NULL) linphone_call_params_unref(call->remote_params);
cp = call->remote_params = linphone_call_params_new();
md=sal_call_get_remote_media_description(call->op);
@ -2025,12 +2025,17 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
int used_pt=-1;
char rtcp_tool[128]={0};
const SalStreamDescription *vstream;
MSFilter* source = NULL;
bool_t reused_preview = FALSE;
snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version());
/* shutdown preview */
if (lc->previewstream!=NULL) {
video_preview_stop(lc->previewstream);
if( lc->video_conf.reuse_preview_source == FALSE) video_preview_stop(lc->previewstream);
else source = video_preview_stop_reuse_source(lc->previewstream);
lc->previewstream=NULL;
}
@ -2105,16 +2110,31 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
video_stream_set_device_rotation(call->videostream, lc->device_rotation);
video_stream_set_rtcp_information(call->videostream, cname, rtcp_tool);
video_stream_set_freeze_on_error(call->videostream, lp_config_get_int(lc->config, "video", "freeze_on_error", 0));
video_stream_start(call->videostream,
call->video_profile, rtp_addr, vstream->rtp_port,
rtcp_addr,
linphone_core_rtcp_enabled(lc) ? (vstream->rtcp_port ? vstream->rtcp_port : vstream->rtp_port+1) : 0,
used_pt, linphone_core_get_video_jittcomp(lc), cam);
if( lc->video_conf.reuse_preview_source && source ){
ms_message("video_stream_start_with_source kept: %p", source);
video_stream_start_with_source(call->videostream,
call->video_profile, rtp_addr, vstream->rtp_port,
rtcp_addr,
linphone_core_rtcp_enabled(lc) ? (vstream->rtcp_port ? vstream->rtcp_port : vstream->rtp_port+1) : 0,
used_pt, linphone_core_get_video_jittcomp(lc), cam, source);
reused_preview = TRUE;
} else {
video_stream_start(call->videostream,
call->video_profile, rtp_addr, vstream->rtp_port,
rtcp_addr,
linphone_core_rtcp_enabled(lc) ? (vstream->rtcp_port ? vstream->rtcp_port : vstream->rtp_port+1) : 0,
used_pt, linphone_core_get_video_jittcomp(lc), cam);
}
}
}else ms_warning("No video stream accepted.");
}else{
ms_message("No valid video stream defined.");
}
if( reused_preview == FALSE && source != NULL ){
/* destroy not-reused source filter */
ms_warning("Video preview (%p) not reused: destroying it.", source);
ms_filter_destroy(source);
}
#endif
}

View file

@ -692,7 +692,7 @@ static void build_video_devices_table(LinphoneCore *lc){
static void video_config_read(LinphoneCore *lc){
#ifdef VIDEO_ENABLED
int capture, display, self_view;
int capture, display, self_view, reuse_source;
int automatic_video=1;
#endif
const char *str;
@ -721,12 +721,14 @@ static void video_config_read(LinphoneCore *lc){
capture=lp_config_get_int(lc->config,"video","capture",1);
display=lp_config_get_int(lc->config,"video","display",1);
self_view=lp_config_get_int(lc->config,"video","self_view",1);
reuse_source=lp_config_get_int(lc->config,"video","reuse_source",0);
vpol.automatically_initiate=lp_config_get_int(lc->config,"video","automatically_initiate",automatic_video);
vpol.automatically_accept=lp_config_get_int(lc->config,"video","automatically_accept",automatic_video);
linphone_core_enable_video_capture(lc, capture);
linphone_core_enable_video_display(lc, display);
linphone_core_enable_video_preview(lc,lp_config_get_int(lc->config,"video","show_local",0));
linphone_core_enable_self_view(lc,self_view);
linphone_core_enable_video_source_reuse(lc, reuse_source);
linphone_core_set_video_policy(lc,&vpol);
#endif
}
@ -4593,6 +4595,18 @@ void linphone_core_enable_video_display(LinphoneCore *lc, bool_t enable) {
reapply_network_bandwidth_settings(lc);
}
void linphone_core_enable_video_source_reuse(LinphoneCore* lc, bool_t enable){
#ifndef VIDEO_ENABLED
if (enable == TRUE) {
ms_warning("Cannot enable video display, this version of linphone was built without video support.");
}
#endif
lc->video_conf.reuse_preview_source = enable;
if( linphone_core_ready(lc) ){
lp_config_set_int(lc->config, "video", "reuse_source", lc->video_conf.reuse_preview_source);
}
}
bool_t linphone_core_video_capture_enabled(LinphoneCore *lc) {
return lc->video_conf.capture;
}

View file

@ -2486,6 +2486,24 @@ LINPHONE_PUBLIC void linphone_core_enable_video_capture(LinphoneCore *lc, bool_t
**/
LINPHONE_PUBLIC void linphone_core_enable_video_display(LinphoneCore *lc, bool_t enable);
/**
* Enable or disable video source reuse when switching from preview to actual video call.
*
* This source reuse is useful when you always display the preview, even before calls are initiated.
* By keeping the video source for the transition to a real video call, you will smooth out the
* source close/reopen cycle.
*
* This function does not have any effect durfing calls. It just indicates the #LinphoneCore to
* initiate future calls with video source reuse or not.
* Also, at the end of a video call, the source will be closed whatsoever for now.
* @param[in] lc #LinphoneCore object
* @param[in] enable TRUE to enable video source reuse. FALSE to disable it for subsequent calls.
* @ingroup media_parameters
*
*/
LINPHONE_PUBLIC void linphone_core_enable_video_source_reuse(LinphoneCore* lc, bool_t enable);
/**
* Tells whether video capture is enabled.
* @param[in] lc #LinphoneCore object.

View file

@ -632,6 +632,7 @@ typedef struct video_config{
bool_t show_local;
bool_t display;
bool_t selfview; /*during calls*/
bool_t reuse_preview_source;
}video_config_t;
typedef struct ui_config