FS-11903: Fix errors reported by PVS-Studio Static Code Analyzer for mod_conference

This commit is contained in:
Andrey Volk 2019-07-12 20:53:52 +04:00
parent c952a025dd
commit 44c38c5273
8 changed files with 106 additions and 144 deletions

View File

@ -512,7 +512,7 @@ switch_status_t conference_api_sub_conference_video_vmute_snap(conference_member
} }
if (!member->conference->canvases[0]) { if (!member->conference->canvases[0]) {
stream->write_function(stream, "-ERR Conference is not in mixing mode\n"); if (stream) stream->write_function(stream, "-ERR Conference is not in mixing mode\n");
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
@ -974,12 +974,12 @@ switch_status_t conference_api_sub_dtmf(conference_member_t *member, switch_stre
char *dtmf = (char *) data; char *dtmf = (char *) data;
if (member == NULL) { if (member == NULL) {
stream->write_function(stream, "-ERR Invalid member!\n"); if (stream != NULL) stream->write_function(stream, "-ERR Invalid member!\n");
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
} }
if (zstr(dtmf)) { if (zstr(dtmf)) {
stream->write_function(stream, "-ERR Invalid input!\n"); if (stream != NULL) stream->write_function(stream, "-ERR Invalid input!\n");
return SWITCH_STATUS_GENERR; return SWITCH_STATUS_GENERR;
} else { } else {
char *p; char *p;
@ -1365,7 +1365,7 @@ switch_status_t conference_api_sub_max_energy(conference_member_t *member, switc
if (member->max_energy_level && member->max_energy_level < member->energy_level) { if (member->max_energy_level && member->max_energy_level < member->energy_level) {
member->max_energy_level = 0; member->max_energy_level = 0;
stream->write_function(stream, "-ERR %u Max-Energy cannot exceed energy level.\n", member->id); if (stream != NULL) stream->write_function(stream, "-ERR %u Max-Energy cannot exceed energy level.\n", member->id);
} else if (data) { } else if (data) {
char *p, *q; char *p, *q;
if ((p = strchr(data, ':'))) { if ((p = strchr(data, ':'))) {
@ -1656,10 +1656,7 @@ switch_status_t conference_api_sub_vid_bandwidth(conference_obj_t *conference, s
} }
if (argv[4]) { if (argv[4]) {
id = atoi(argv[4]);
if (argv[4]) {
id = atoi(argv[4]);
}
if (id < 1 || id > MAX_CANVASES+1) { if (id < 1 || id > MAX_CANVASES+1) {
id = -1; id = -1;
@ -1685,7 +1682,7 @@ switch_status_t conference_api_sub_vid_bandwidth(conference_obj_t *conference, s
} }
for (i = 0; i <= conference->canvas_count; i++) { for (i = 0; i <= conference->canvas_count; i++) {
if (i > -1 && i != id - 1) { if (i != id - 1) {
continue; continue;
} }
@ -1768,15 +1765,14 @@ switch_status_t conference_api_sub_canvas_bgimg(conference_obj_t *conference, sw
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
if ((canvas = conference->canvases[idx])) { canvas = conference->canvases[idx];
switch_mutex_lock(canvas->mutex); switch_mutex_lock(canvas->mutex);
if (!strcasecmp(file, "clear")) { if (!strcasecmp(file, "clear")) {
conference_video_reset_image(canvas->img, &canvas->bgcolor); conference_video_reset_image(canvas->img, &canvas->bgcolor);
} else { } else {
status = conference_video_set_canvas_bgimg(canvas, file); status = conference_video_set_canvas_bgimg(canvas, file);
}
switch_mutex_unlock(canvas->mutex);
} }
switch_mutex_unlock(canvas->mutex);
if (status == SWITCH_STATUS_SUCCESS) { if (status == SWITCH_STATUS_SUCCESS) {
stream->write_function(stream, "+OK Set Bgimg %s\n", file); stream->write_function(stream, "+OK Set Bgimg %s\n", file);
@ -1882,7 +1878,7 @@ switch_status_t conference_api_sub_vid_res(conference_obj_t *conference, switch_
} }
if (id == 0 && conference->canvases[0]) id = 1; if (id == 0) id = 1;
if (id > conference->canvas_count + 1) { if (id > conference->canvas_count + 1) {
id = 1; id = 1;
@ -2018,7 +2014,7 @@ switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, swit
} }
} }
if (!vlayout && (vlayout = switch_core_hash_find(conference->layout_hash, argv[2]))) { if ((vlayout = switch_core_hash_find(conference->layout_hash, argv[2]))) {
if (argv[3]) { if (argv[3]) {
if ((idx = atoi(argv[3]))) { if ((idx = atoi(argv[3]))) {
idx--; idx--;
@ -2964,7 +2960,6 @@ switch_status_t conference_api_sub_cam(conference_obj_t *conference, switch_stre
if (p) { if (p) {
*p++ = '\0'; *p++ = '\0';
if (!p) p = "";
if (!strcasecmp(argv[x], "zoom") || !strcasecmp(argv[x], "pan")) { if (!strcasecmp(argv[x], "zoom") || !strcasecmp(argv[x], "pan")) {
str_arg = p; str_arg = p;
@ -3612,7 +3607,6 @@ switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch
{ {
switch_status_t ret_status = SWITCH_STATUS_SUCCESS; switch_status_t ret_status = SWITCH_STATUS_SUCCESS;
char *conference_name = NULL, *profile_name; char *conference_name = NULL, *profile_name;
switch_event_t *params = NULL;
switch_assert(conference != NULL); switch_assert(conference != NULL);
switch_assert(stream != NULL); switch_assert(stream != NULL);
@ -3621,6 +3615,7 @@ switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch
int x; int x;
conference_name = strdup(argv[2]); conference_name = strdup(argv[2]);
switch_assert(conference_name);
if ((profile_name = strchr(conference_name, '@'))) { if ((profile_name = strchr(conference_name, '@'))) {
*profile_name++ = '\0'; *profile_name++ = '\0';
@ -3664,10 +3659,6 @@ switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch
ret_status = SWITCH_STATUS_GENERR; ret_status = SWITCH_STATUS_GENERR;
} }
if (params) {
switch_event_destroy(&params);
}
switch_safe_free(conference_name); switch_safe_free(conference_name);
return ret_status; return ret_status;
@ -4197,6 +4188,7 @@ switch_status_t conference_api_dispatch(conference_obj_t *conference, switch_str
char *var, *val; char *var, *val;
var = strdup(argv[argn + 1]); var = strdup(argv[argn + 1]);
switch_assert(var);
if ((val = strchr(var, '='))) { if ((val = strchr(var, '='))) {
*val++ = '\0'; *val++ = '\0';

View File

@ -213,7 +213,7 @@ char *conference_cdr_rfc4579_render(conference_obj_t *conference, switch_event_t
if (!(x_tag3 = switch_xml_add_child_d(x_tag2, "status", off3++))) { if (!(x_tag3 = switch_xml_add_child_d(x_tag2, "status", off3++))) {
abort(); abort();
} }
switch_xml_set_txt_d(x_tag3, np->leave_time ? "disconnected" : "connected"); switch_xml_set_txt_d(x_tag3, "connected");
if (!(x_tag3 = switch_xml_add_child_d(x_tag2, "joining-info", off3++))) { if (!(x_tag3 = switch_xml_add_child_d(x_tag2, "joining-info", off3++))) {
@ -398,16 +398,13 @@ cJSON *conference_cdr_json_render(conference_obj_t *conference, cJSON *req)
} }
} }
if (np->cp) { if (!user_uri) {
user_uri = switch_mprintf("%s@%s", np->cp->caller_id_number, domain);
if (!user_uri) {
user_uri = switch_mprintf("%s@%s", np->cp->caller_id_number, domain);
}
json_add_child_string(juser, "entity", user_uri);
json_add_child_string(juser, "displayText", np->cp->caller_id_name);
} }
json_add_child_string(juser, "entity", user_uri);
json_add_child_string(juser, "displayText", np->cp->caller_id_name);
//if (np->record_path) { //if (np->record_path) {
//json_add_child_string(juser, "recordingPATH", np->record_path); //json_add_child_string(juser, "recordingPATH", np->record_path);
//} //}
@ -494,11 +491,9 @@ void conference_cdr_del(conference_member_t *member)
switch_channel_get_variables(member->channel, &member->cdr_node->var_event); switch_channel_get_variables(member->channel, &member->cdr_node->var_event);
} }
if (member->cdr_node) { member->cdr_node->leave_time = switch_epoch_time_now(NULL);
member->cdr_node->leave_time = switch_epoch_time_now(NULL); memcpy(member->cdr_node->mflags, member->flags, sizeof(member->flags));
memcpy(member->cdr_node->mflags, member->flags, sizeof(member->flags)); member->cdr_node->member = NULL;
member->cdr_node->member = NULL;
}
} }
switch_mutex_unlock(member->conference->member_mutex); switch_mutex_unlock(member->conference->member_mutex);
} }

View File

@ -1019,7 +1019,7 @@ switch_status_t chat_send(switch_event_t *message_event)
SWITCH_STANDARD_STREAM(stream); SWITCH_STANDARD_STREAM(stream);
if (body != NULL && (lbuf = strdup(body))) { if ((lbuf = strdup(body))) {
/* special case list */ /* special case list */
if (conference->broadcast_chat_messages) { if (conference->broadcast_chat_messages) {
conference_event_chat_message_broadcast(conference, message_event); conference_event_chat_message_broadcast(conference, message_event);

View File

@ -1007,12 +1007,12 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
} else if (!member->mute_counter && member->score > (int)((double)member->max_energy_level * .75)) { } else if (!member->mute_counter && member->score > (int)((double)member->max_energy_level * .75)) {
int dec = 1; int dec = 1;
if (member->score_count > 3) { if (member->score_count > 9) {
dec = 2; dec = 4;
} else if (member->score_count > 6) { } else if (member->score_count > 6) {
dec = 3; dec = 3;
} else if (member->score_count > 9) { } else if (member->score_count > 3) {
dec = 4; dec = 2;
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG2, "MAX ENERGY THRESHOLD! -%d\n", dec); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG2, "MAX ENERGY THRESHOLD! -%d\n", dec);
@ -1444,7 +1444,6 @@ void conference_loop_output(conference_member_t *member)
while (!member->loop_loop && conference_utils_member_test_flag(member, MFLAG_RUNNING) && conference_utils_member_test_flag(member, MFLAG_ITHREAD) while (!member->loop_loop && conference_utils_member_test_flag(member, MFLAG_RUNNING) && conference_utils_member_test_flag(member, MFLAG_ITHREAD)
&& switch_channel_ready(channel)) { && switch_channel_ready(channel)) {
switch_event_t *event; switch_event_t *event;
int use_timer = 0;
switch_buffer_t *use_buffer = NULL; switch_buffer_t *use_buffer = NULL;
uint32_t mux_used = 0; uint32_t mux_used = 0;
@ -1503,8 +1502,6 @@ void conference_loop_output(conference_member_t *member)
use_buffer = NULL; use_buffer = NULL;
mux_used = (uint32_t) switch_buffer_inuse(member->mux_buffer); mux_used = (uint32_t) switch_buffer_inuse(member->mux_buffer);
use_timer = 1;
if (mux_used) { if (mux_used) {
if (mux_used < bytes) { if (mux_used < bytes) {
if (++low_count >= 5) { if (++low_count >= 5) {
@ -1527,28 +1524,26 @@ void conference_loop_output(conference_member_t *member)
low_count = 0; low_count = 0;
if ((write_frame.datalen = (uint32_t) switch_buffer_read(use_buffer, write_frame.data, bytes))) { if ((write_frame.datalen = (uint32_t) switch_buffer_read(use_buffer, write_frame.data, bytes))) {
if (write_frame.datalen) { write_frame.samples = write_frame.datalen / 2 / member->conference->channels;
write_frame.samples = write_frame.datalen / 2 / member->conference->channels;
if( !conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) { if( !conference_utils_member_test_flag(member, MFLAG_CAN_HEAR)) {
memset(write_frame.data, 255, write_frame.datalen); memset(write_frame.data, 255, write_frame.datalen);
} else if (member->volume_out_level) { /* Check for output volume adjustments */ } else if (member->volume_out_level) { /* Check for output volume adjustments */
switch_change_sln_volume(write_frame.data, write_frame.samples * member->conference->channels, member->volume_out_level); switch_change_sln_volume(write_frame.data, write_frame.samples * member->conference->channels, member->volume_out_level);
} }
//write_frame.timestamp = timer.samplecount; //write_frame.timestamp = timer.samplecount;
if (member->fnode) { if (member->fnode) {
conference_member_add_file_data(member, write_frame.data, write_frame.datalen); conference_member_add_file_data(member, write_frame.data, write_frame.datalen);
} }
conference_member_check_channels(&write_frame, member, SWITCH_FALSE); conference_member_check_channels(&write_frame, member, SWITCH_FALSE);
if (switch_core_session_write_frame(member->session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { if (switch_core_session_write_frame(member->session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
switch_mutex_unlock(member->audio_out_mutex); switch_mutex_unlock(member->audio_out_mutex);
switch_mutex_unlock(member->write_mutex); switch_mutex_unlock(member->write_mutex);
break; break;
}
} }
} }
@ -1641,11 +1636,7 @@ void conference_loop_output(conference_member_t *member)
switch_ivr_parse_all_messages(member->session); switch_ivr_parse_all_messages(member->session);
} }
if (use_timer) { switch_core_timer_next(&timer);
switch_core_timer_next(&timer);
} else {
switch_cond_next();
}
} /* Rinse ... Repeat */ } /* Rinse ... Repeat */

View File

@ -128,7 +128,7 @@ void conference_member_update_status_field(conference_member_t *member)
char *str, *vstr = "", display[128] = "", *json_display = NULL; char *str, *vstr = "", display[128] = "", *json_display = NULL;
cJSON *json, *audio, *video; cJSON *json, *audio, *video;
if (!member->conference->la || !member->json || !member->status_field || conference_utils_member_test_flag(member, MFLAG_SECOND_SCREEN)) { if (!member || !member->conference || !member->conference->la || !member->json || !member->status_field || conference_utils_member_test_flag(member, MFLAG_SECOND_SCREEN)) {
return; return;
} }
@ -157,7 +157,7 @@ void conference_member_update_status_field(conference_member_t *member)
vstr = " VIDEO (BLIND)"; vstr = " VIDEO (BLIND)";
} else { } else {
vstr = " VIDEO"; vstr = " VIDEO";
if (member && member->id == member->conference->video_floor_holder) { if (member->id == member->conference->video_floor_holder) {
vstr = " VIDEO (FLOOR)"; vstr = " VIDEO (FLOOR)";
} }
} }
@ -194,8 +194,8 @@ void conference_member_update_status_field(conference_member_t *member)
cJSON_AddItemToObject(video, "avatarPresented", cJSON_CreateBool(!!member->avatar_png_img)); cJSON_AddItemToObject(video, "avatarPresented", cJSON_CreateBool(!!member->avatar_png_img));
cJSON_AddItemToObject(video, "mediaFlow", cJSON_CreateString(switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY ? "sendOnly" : "sendRecv")); cJSON_AddItemToObject(video, "mediaFlow", cJSON_CreateString(switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY ? "sendOnly" : "sendRecv"));
cJSON_AddItemToObject(video, "muted", cJSON_CreateBool(!conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN))); cJSON_AddItemToObject(video, "muted", cJSON_CreateBool(!conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)));
cJSON_AddItemToObject(video, "floor", cJSON_CreateBool(member && member->id == member->conference->video_floor_holder)); cJSON_AddItemToObject(video, "floor", cJSON_CreateBool(member->id == member->conference->video_floor_holder));
if (member && member->id == member->conference->video_floor_holder && conference_utils_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) { if (member->id == member->conference->video_floor_holder && conference_utils_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK)) {
cJSON_AddItemToObject(video, "floorLocked", cJSON_CreateTrue()); cJSON_AddItemToObject(video, "floorLocked", cJSON_CreateTrue());
} }
cJSON_AddItemToObject(video, "reservationID", member->video_reservation_id ? cJSON_AddItemToObject(video, "reservationID", member->video_reservation_id ?
@ -502,7 +502,7 @@ void conference_member_check_channels(switch_frame_t *frame, conference_member_t
rlen = frame->datalen / 2 / from; rlen = frame->datalen / 2 / from;
if (in && frame->rate == 48000 && ((from == 1 && to == 2) || (from == 2 && to == 2)) && conference_utils_member_test_flag(member, MFLAG_POSITIONAL)) { if (in && frame->rate == 48000 && ((from == 1 && to == 2) || (from == 2 && to == 2)) && conference_utils_member_test_flag(member, MFLAG_POSITIONAL)) {
if (from == 2 && to == 2) { if (from == 2) {
switch_mux_channels((int16_t *) frame->data, rlen, 2, 1); switch_mux_channels((int16_t *) frame->data, rlen, 2, 1);
frame->datalen /= 2; frame->datalen /= 2;
rlen = frame->datalen / 2; rlen = frame->datalen / 2;
@ -1397,12 +1397,14 @@ switch_status_t conference_member_play_file(conference_member_t *member, char *f
char *dfile = NULL, *expanded = NULL; char *dfile = NULL, *expanded = NULL;
conference_file_node_t *fnode, *nptr = NULL; conference_file_node_t *fnode, *nptr = NULL;
switch_memory_pool_t *pool; switch_memory_pool_t *pool;
int channels = member->conference->channels; int channels = 0;
int bad_params = 0; int bad_params = 0;
if (member == NULL || file == NULL || conference_utils_member_test_flag(member, MFLAG_KICKED)) if (member == NULL || file == NULL || conference_utils_member_test_flag(member, MFLAG_KICKED))
return status; return status;
channels = member->conference->channels;
if ((expanded = switch_channel_expand_variables(switch_core_session_get_channel(member->session), file)) != file) { if ((expanded = switch_channel_expand_variables(switch_core_session_get_channel(member->session), file)) != file) {
file = expanded; file = expanded;
} else { } else {
@ -1510,20 +1512,22 @@ switch_status_t conference_member_play_file(conference_member_t *member, char *f
/* Say some thing with TTS in the conference room */ /* Say some thing with TTS in the conference room */
switch_status_t conference_member_say(conference_member_t *member, char *text, uint32_t leadin) switch_status_t conference_member_say(conference_member_t *member, char *text, uint32_t leadin)
{ {
conference_obj_t *conference = member->conference; conference_obj_t *conference = NULL;
conference_file_node_t *fnode, *nptr; conference_file_node_t *fnode, *nptr;
switch_memory_pool_t *pool; switch_memory_pool_t *pool;
switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
switch_status_t status = SWITCH_STATUS_FALSE; switch_status_t status = SWITCH_STATUS_FALSE;
char *fp = NULL; char *fp = NULL;
int channels = member->conference->channels; int channels = 0;
switch_event_t *params = NULL; switch_event_t *params = NULL;
const char *position = NULL; const char *position = NULL;
if (member == NULL || zstr(text)) if (member == NULL || zstr(text))
return SWITCH_STATUS_FALSE; return SWITCH_STATUS_FALSE;
conference = member->conference;
switch_assert(conference != NULL); switch_assert(conference != NULL);
channels = conference->channels;
if (!(conference->tts_engine && conference->tts_voice)) { if (!(conference->tts_engine && conference->tts_voice)) {
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;

View File

@ -328,7 +328,7 @@ void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *thread, v
goto end; goto end;
} }
while (conference_utils_member_test_flag(member, MFLAG_RUNNING) && conference_utils_test_flag(conference, CFLAG_RUNNING) && (conference->count + conference->count_ghosts)) { while (conference_utils_member_test_flag(member, MFLAG_RUNNING) && conference_utils_test_flag(conference, CFLAG_RUNNING) && (conference->count + conference->count_ghosts) > 0) {
len = 0; len = 0;

View File

@ -203,7 +203,7 @@ void conference_video_parse_layouts(conference_obj_t *conference, int WIDTH, int
if (border > 50) border = 50; if (border > 50) border = 50;
} }
if (x < 0 || y < 0 || scale < 0 || !name) { if (x < 0 || y < 0 || scale < 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid image\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid image\n");
continue; continue;
} }
@ -297,7 +297,7 @@ void conference_video_parse_layouts(conference_obj_t *conference, int WIDTH, int
x_layout = switch_xml_child(x_group, "layout"); x_layout = switch_xml_child(x_group, "layout");
if (!name || !x_group || !x_layout) { if (!name || !x_layout) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid group\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid group\n");
continue; continue;
} }
@ -419,7 +419,7 @@ void conference_video_reset_layer(mcu_layer_t *layer)
conference_video_reset_layer_cam(layer); conference_video_reset_layer_cam(layer);
if (layer->geometry.overlap) { if (layer->geometry.overlap && layer->canvas) {
layer->canvas->refresh = 1; layer->canvas->refresh = 1;
} }
@ -820,7 +820,7 @@ void conference_video_scale_and_patch(mcu_layer_t *layer, switch_image_t *ximg,
if (layer->manual_border) { if (layer->manual_border) {
border = layer->manual_border; border = layer->manual_border;
} if (layer->geometry.border) { } else if (layer->geometry.border) {
border = layer->geometry.border; border = layer->geometry.border;
} }
@ -2450,7 +2450,7 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo
return; return;
} }
if (conference_utils_member_test_flag(member, MFLAG_SECOND_SCREEN)) { if (conference_utils_member_test_flag(member, MFLAG_SECOND_SCREEN) || !member->conference) {
return; return;
} }
@ -2508,9 +2508,7 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo
if (force && !member->avatar_png_img && member->video_mute_img) { if (force && !member->avatar_png_img && member->video_mute_img) {
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT); switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT);
if (member->conference) { conference_event_add_data(member->conference, event);
conference_event_add_data(member->conference, event);
}
conference_member_add_event_data(member, event); conference_member_add_event_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "vfi-triggered-member"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "vfi-triggered-member");
switch_event_fire(&event); switch_event_fire(&event);
@ -2555,7 +2553,7 @@ void conference_video_check_flush(conference_member_t *member, switch_bool_t for
void conference_video_patch_fnode(mcu_canvas_t *canvas, conference_file_node_t *fnode) void conference_video_patch_fnode(mcu_canvas_t *canvas, conference_file_node_t *fnode)
{ {
if (fnode && fnode->layer_id > -1) { if (canvas && fnode && fnode->layer_id > -1) {
mcu_layer_t *layer = &canvas->layers[fnode->layer_id]; mcu_layer_t *layer = &canvas->layers[fnode->layer_id];
switch_frame_t file_frame = { 0 }; switch_frame_t file_frame = { 0 };
switch_status_t status = switch_core_file_read_video(&fnode->fh, &file_frame, SVR_FLUSH); switch_status_t status = switch_core_file_read_video(&fnode->fh, &file_frame, SVR_FLUSH);
@ -2580,10 +2578,8 @@ void conference_video_patch_fnode(mcu_canvas_t *canvas, conference_file_node_t *
layer->tagged = 1; layer->tagged = 1;
} else if (status == SWITCH_STATUS_IGNORE) { } else if (status == SWITCH_STATUS_IGNORE) {
if (canvas && fnode->layer_id > -1 ) { conference_video_canvas_del_fnode_layer(canvas->conference, fnode);
conference_video_canvas_del_fnode_layer(canvas->conference, fnode); fnode->canvas_id = canvas->canvas_id;
fnode->canvas_id = canvas->canvas_id;
}
} }
} }
} }
@ -2663,8 +2659,7 @@ switch_status_t conference_video_find_layer(conference_obj_t *conference, mcu_ca
} }
} }
if (!layer && if ((canvas->layers_used < canvas->total_layers ||
(canvas->layers_used < canvas->total_layers ||
(avatar_layers && !member->avatar_png_img) || conference_utils_member_test_flag(member, MFLAG_MOD)) && (avatar_layers && !member->avatar_png_img) || conference_utils_member_test_flag(member, MFLAG_MOD)) &&
(member->avatar_png_img || (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY && (member->avatar_png_img || (switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY &&
switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE))) { switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE))) {
@ -3233,7 +3228,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) && if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
!conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) && !hold && !conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) && !hold &&
conference_utils_member_test_flag(imember, MFLAG_RUNNING) && (!no_muted || seen) && (!no_av || (no_av && !imember->avatar_png_img)) conference_utils_member_test_flag(imember, MFLAG_RUNNING) && (!no_muted || seen) && (!(no_av && imember->avatar_png_img))
&& imember->canvas_id == canvas->canvas_id && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY && imember->video_media_flow != SWITCH_MEDIA_FLOW_INACTIVE) { && imember->canvas_id == canvas->canvas_id && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY && imember->video_media_flow != SWITCH_MEDIA_FLOW_INACTIVE) {
video_count++; video_count++;
} }
@ -3688,7 +3683,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
(!conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) || (!conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) ||
(conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(imember, MFLAG_HOLD))) && (conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && !conference_utils_member_test_flag(imember, MFLAG_HOLD))) &&
imember->session && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY && imember->session && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY &&
imember->session && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE) { switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_INACTIVE) {
total--; total--;
} }
@ -4001,13 +3996,11 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
canvas->refresh++; canvas->refresh++;
} }
if (layer->cur_img) { if (layer->member && switch_core_cpu_count() > 2) {
if (layer->member && switch_core_cpu_count() > 2) { layer->need_patch = 1;
layer->need_patch = 1; conference_video_wake_layer_thread(layer->member);
conference_video_wake_layer_thread(layer->member); } else {
} else { conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
}
} }
layer->tagged = 0; layer->tagged = 0;
@ -4030,13 +4023,11 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
canvas->refresh++; canvas->refresh++;
} }
if (layer->cur_img) { if (layer->member && switch_core_cpu_count() > 2) {
if (layer->member && switch_core_cpu_count() > 2) { layer->need_patch = 1;
layer->need_patch = 1; conference_video_wake_layer_thread(layer->member);
conference_video_wake_layer_thread(layer->member); } else {
} else { conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
}
} }
} }
} }
@ -4725,7 +4716,7 @@ void conference_video_set_floor_holder(conference_obj_t *conference, conference_
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Setting floor not allowed on a member in a dedicated layer\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Setting floor not allowed on a member in a dedicated layer\n");
} }
if ((!force && conference_utils_test_flag(conference, CFLAG_VID_FLOOR_LOCK))) { if (!force && conference_utils_test_flag(conference, CFLAG_VID_FLOOR_LOCK)) {
return; return;
} }
@ -4880,7 +4871,7 @@ void conference_video_write_frame(conference_obj_t *conference, conference_membe
switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ); switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ);
} }
if (isession && switch_channel_test_flag(imember->channel, CF_VIDEO_READY)) { if (switch_channel_test_flag(imember->channel, CF_VIDEO_READY)) {
int send_frame = 0; int send_frame = 0;
if (conference->canvases[0] && conference_utils_test_flag(imember->conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) { if (conference->canvases[0] && conference_utils_test_flag(imember->conference, CFLAG_VIDEO_BRIDGE_FIRST_TWO)) {
@ -5065,18 +5056,16 @@ switch_status_t conference_video_thread_callback(switch_core_session_t *session,
} }
if (member) { if (member->id == member->conference->video_floor_holder) {
if (member->id == member->conference->video_floor_holder) { conference_video_write_frame(member->conference, member, frame);
conference_video_write_frame(member->conference, member, frame); conference_video_check_recording(member->conference, NULL, frame);
conference_video_check_recording(member->conference, NULL, frame); } else if (!conference_utils_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK) && member->id == member->conference->last_video_floor_holder) {
} else if (!conference_utils_test_flag(member->conference, CFLAG_VID_FLOOR_LOCK) && member->id == member->conference->last_video_floor_holder) { conference_member_t *fmember;
conference_member_t *fmember;
if ((fmember = conference_member_get(member->conference, member->conference->video_floor_holder))) { if ((fmember = conference_member_get(member->conference, member->conference->video_floor_holder))) {
if (!conference_utils_member_test_flag(fmember, MFLAG_RECEIVING_VIDEO)) if (!conference_utils_member_test_flag(fmember, MFLAG_RECEIVING_VIDEO))
switch_core_session_write_video_frame(fmember->session, frame, SWITCH_IO_FLAG_NONE, 0); switch_core_session_write_video_frame(fmember->session, frame, SWITCH_IO_FLAG_NONE, 0);
switch_thread_rwlock_unlock(fmember->rwlock); switch_thread_rwlock_unlock(fmember->rwlock);
}
} }
} }

View File

@ -1841,6 +1841,7 @@ switch_status_t conference_text_thread_callback(switch_core_session_t *session,
if (inuse + 1 > member->text_framesize) { if (inuse + 1 > member->text_framesize) {
void *tmp = malloc(inuse + 1024); void *tmp = malloc(inuse + 1024);
switch_assert(tmp);
memcpy(tmp, member->text_framedata, member->text_framesize); memcpy(tmp, member->text_framedata, member->text_framesize);
switch_assert(tmp); switch_assert(tmp);
@ -2029,10 +2030,8 @@ SWITCH_STANDARD_APP(conference_function)
/* if this is a bridging call, and it's not a duplicate, build a */ /* if this is a bridging call, and it's not a duplicate, build a */
/* conference object, and skip pin handling, and locked checking */ /* conference object, and skip pin handling, and locked checking */
if (!locked) { switch_mutex_lock(conference_globals.setup_mutex);
switch_mutex_lock(conference_globals.setup_mutex); locked = 1;
locked = 1;
}
if (isbr) { if (isbr) {
char *uuid = switch_core_session_get_uuid(session); char *uuid = switch_core_session_get_uuid(session);
@ -2057,10 +2056,8 @@ SWITCH_STANDARD_APP(conference_function)
conference->flags[CFLAG_JSON_STATUS] = 1; conference->flags[CFLAG_JSON_STATUS] = 1;
conference_utils_set_cflags(cflags_str, conference->flags); conference_utils_set_cflags(cflags_str, conference->flags);
if (locked) { switch_mutex_unlock(conference_globals.setup_mutex);
switch_mutex_unlock(conference_globals.setup_mutex); locked = 0;
locked = 0;
}
switch_channel_set_variable(channel, "conference_name", conference->name); switch_channel_set_variable(channel, "conference_name", conference->name);
@ -2086,10 +2083,8 @@ SWITCH_STANDARD_APP(conference_function)
} }
if ((conference = conference_find(conference_name, NULL))) { if ((conference = conference_find(conference_name, NULL))) {
if (locked) { switch_mutex_unlock(conference_globals.setup_mutex);
switch_mutex_unlock(conference_globals.setup_mutex); locked = 0;
locked = 0;
}
} }
/* if the conference exists, get the pointer to it */ /* if the conference exists, get the pointer to it */
@ -2267,7 +2262,7 @@ SWITCH_STANDARD_APP(conference_function)
} }
while (!pin_valid && pin_retries && status == SWITCH_STATUS_SUCCESS) { while (!pin_valid && pin_retries && status == SWITCH_STATUS_SUCCESS) {
size_t dpin_length = dpin ? strlen(dpin) : 0; size_t dpin_length = strlen(dpin);
size_t mdpin_length = mdpin ? strlen(mdpin) : 0; size_t mdpin_length = mdpin ? strlen(mdpin) : 0;
int maxpin = dpin_length > mdpin_length ? (int)dpin_length : (int)mdpin_length; int maxpin = dpin_length > mdpin_length ? (int)dpin_length : (int)mdpin_length;
switch_status_t pstatus = SWITCH_STATUS_FALSE; switch_status_t pstatus = SWITCH_STATUS_FALSE;
@ -2361,10 +2356,8 @@ SWITCH_STANDARD_APP(conference_function)
} }
/* Release the config registry handle */ /* Release the config registry handle */
if (cxml) { switch_xml_free(cxml);
switch_xml_free(cxml); cxml = NULL;
cxml = NULL;
}
/* if we're using "bridge:" make an outbound call and bridge it in */ /* if we're using "bridge:" make an outbound call and bridge it in */
if (!zstr(bridgeto) && strcasecmp(bridgeto, "none")) { if (!zstr(bridgeto) && strcasecmp(bridgeto, "none")) {
@ -3308,10 +3301,10 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
video_layout_name = CONFERENCE_MUX_DEFAULT_LAYOUT; video_layout_name = CONFERENCE_MUX_DEFAULT_LAYOUT;
} }
if (!strncasecmp(video_layout_name, "group:", 6)) {
video_layout_group = video_layout_name + 6;
}
if (video_layout_name) { if (video_layout_name) {
if (!strncasecmp(video_layout_name, "group:", 6)) {
video_layout_group = video_layout_name + 6;
}
conference->video_layout_name = switch_core_strdup(conference->pool, video_layout_name); conference->video_layout_name = switch_core_strdup(conference->pool, video_layout_name);
} }
@ -3516,9 +3509,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
if (conference->max_energy_hit_trigger < 0) { if (conference->max_energy_hit_trigger < 0) {
conference->max_energy_hit_trigger = 0; conference->max_energy_hit_trigger = 0;
} }
}
if (!zstr(max_energy_level)) {
conference->max_energy_level = atoi(max_energy_level); conference->max_energy_level = atoi(max_energy_level);
if (conference->max_energy_level < 0) { if (conference->max_energy_level < 0) {
conference->max_energy_level = 0; conference->max_energy_level = 0;