channel = switch_core_session_get_channel(member->session);
+ if (conference_utils_test_flag(member->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) &&
+ !conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
if (!switch_channel_test_flag(channel, CF_VIDEO_READY) && !member->avatar_png_img) {
return SWITCH_STATUS_FALSE;
mcu_layer_t *layer = NULL;
int i;
+ if (conference_utils_test_flag(conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) &&
+ !conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
switch_mutex_lock(canvas->mutex);
for (i = 0; i < canvas->total_layers; i++) {
layout_group_t *lg = NULL;
video_layout_t *vlayout = NULL;
int canvas_count = 0;
-
+
switch_mutex_lock(conference->member_mutex);
for (imember = conference->members; imember; imember = imember->next) {
+ int no_muted = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS);
+ int no_av = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS);
+ int seen = conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN);
+
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
- conference_utils_member_test_flag(imember, MFLAG_RUNNING)
+ 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) {
canvas_count++;
}
continue;
}
+ if (conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) &&
+ !conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) && imember->video_layer_id > -1) {
+ conference_video_detach_video_layer(imember);
+ switch_img_free(&imember->video_mute_img);
+
+ if (imember->id == imember->conference->video_floor_holder) {
+ conference_video_set_floor_holder(conference, NULL, SWITCH_FALSE);
+ } else if (imember->id == imember->conference->last_video_floor_holder) {
+ conference->last_video_floor_holder = 0;
+ }
+
+ switch_core_session_rwunlock(imember->session);
+ continue;
+ }
+
//VIDFLOOR
if (canvas->layout_floor_id > -1 && imember->id == conference->video_floor_holder &&
imember->video_layer_id != canvas->layout_floor_id) {
continue;
}
-
-
switch_mutex_lock(canvas->mutex);
//printf("MEMBER %d layer_id %d canvas: %d/%d\n", imember->id, imember->video_layer_id,
// switch_img_free(&layer->cur_img);
//}
- if (conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN)) {
+ if (conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN) || switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY || conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS)) {
layer->mute_patched = 0;
} else {
switch_image_t *tmp;