FS-7513: favor callers with video to take spaces in the layouts over callers with avatars

This commit is contained in:
Anthony Minessale 2015-04-09 14:09:50 -05:00 committed by Michael Jerris
parent 5d9e4752a5
commit d10ea7f943

View File

@ -398,6 +398,7 @@ typedef struct mcu_layer_s {
int banner_patched; int banner_patched;
int mute_patched; int mute_patched;
int refresh; int refresh;
int is_avatar;
switch_img_position_t logo_pos; switch_img_position_t logo_pos;
switch_image_t *img; switch_image_t *img;
switch_image_t *cur_img; switch_image_t *cur_img;
@ -1017,6 +1018,7 @@ static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
switch_img_free(&layer->logo_img); switch_img_free(&layer->logo_img);
layer->banner_patched = 0; layer->banner_patched = 0;
layer->is_avatar = 0;
if (layer->geometry.overlap) { if (layer->geometry.overlap) {
canvas->refresh = 1; canvas->refresh = 1;
@ -1403,6 +1405,10 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
reset_layer(member->conference->canvas, layer); reset_layer(member->conference->canvas, layer);
switch_img_free(&layer->mute_img); switch_img_free(&layer->mute_img);
if (member->avatar_png_img) {
layer->is_avatar = 1;
}
var = NULL; var = NULL;
if (member->video_banner_text || (var = switch_channel_get_variable_dup(channel, "video_banner_text", SWITCH_FALSE, -1))) { if (member->video_banner_text || (var = switch_channel_get_variable_dup(channel, "video_banner_text", SWITCH_FALSE, -1))) {
layer_set_banner(member, layer, var); layer_set_banner(member, layer, var);
@ -1907,7 +1913,8 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
} }
} }
if (!layer && conference->canvas->layers_used < conference->canvas->total_layers && (imember->avatar_png_img || imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY)) { if (!layer && conference->canvas->layers_used < conference->canvas->total_layers &&
(imember->avatar_png_img || imember->video_flow != SWITCH_MEDIA_FLOW_SENDONLY)) {
/* find an empty layer */ /* find an empty layer */
for (i = 0; i < conference->canvas->total_layers; i++) { for (i = 0; i < conference->canvas->total_layers; i++) {
mcu_layer_t *xlayer = &conference->canvas->layers[i]; mcu_layer_t *xlayer = &conference->canvas->layers[i];
@ -1924,7 +1931,10 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
attach_video_layer(imember, i); attach_video_layer(imember, i);
break; break;
} }
} else if (!xlayer->member_id && !xlayer->fnode && !xlayer->geometry.fileonly) { } else if ((!xlayer->member_id || (!imember->avatar_png_img &&
xlayer->is_avatar &&
xlayer->member_id != conference->video_floor_holder)) &&
!xlayer->fnode && !xlayer->geometry.fileonly) {
switch_status_t lstatus; switch_status_t lstatus;
lstatus = attach_video_layer(imember, i); lstatus = attach_video_layer(imember, i);
@ -3811,6 +3821,11 @@ static void find_video_floor(conference_member_t *member, switch_bool_t entering
continue; continue;
} }
if (conference->floor_holder && imember == conference->floor_holder) {
conference_set_video_floor_holder(conference, imember, 0);
continue;
}
if (!conference->video_floor_holder) { if (!conference->video_floor_holder) {
conference_set_video_floor_holder(conference, imember, 0); conference_set_video_floor_holder(conference, imember, 0);
continue; continue;
@ -4246,8 +4261,11 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference
if (((conference->video_floor_holder && !member && !switch_test_flag(conference, CFLAG_VID_FLOOR_LOCK)) || if (((conference->video_floor_holder && !member && !switch_test_flag(conference, CFLAG_VID_FLOOR_LOCK)) ||
(member && member->channel && (switch_channel_test_flag(member->channel, CF_VIDEO) || member->avatar_png_img)))) { (member && member->channel && (switch_channel_test_flag(member->channel, CF_VIDEO) || member->avatar_png_img)))) {
if (member && member->id != conference->video_floor_holder) {
conference_set_video_floor_holder(conference, member, SWITCH_FALSE); conference_set_video_floor_holder(conference, member, SWITCH_FALSE);
} }
}
if (conference->floor_holder) { if (conference->floor_holder) {
if (conference->floor_holder == member) { if (conference->floor_holder == member) {
@ -6168,6 +6186,10 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
member->score_iir = SCORE_MAX_IIR; member->score_iir = SCORE_MAX_IIR;
} }
if (member == member->conference->floor_holder && member->id != member->conference->video_floor_holder) {
conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE);
}
if (noise_gate_check(member)) { if (noise_gate_check(member)) {
uint32_t diff = member->score - member->energy_level; uint32_t diff = member->score - member->energy_level;
if (hangover_hits) { if (hangover_hits) {
@ -6183,9 +6205,11 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
hangover_hits = hangunder_hits = 0; hangover_hits = hangunder_hits = 0;
member->last_talking = switch_epoch_time_now(NULL); member->last_talking = switch_epoch_time_now(NULL);
if (!switch_test_flag(member, MFLAG_TALKING)) { if (!switch_test_flag(member, MFLAG_TALKING)) {
switch_set_flag_locked(member, MFLAG_TALKING); switch_set_flag_locked(member, MFLAG_TALKING);
member_update_status_field(member); member_update_status_field(member);
if (test_eflag(member->conference, EFLAG_START_TALKING) && switch_test_flag(member, MFLAG_CAN_SPEAK) && if (test_eflag(member->conference, EFLAG_START_TALKING) && switch_test_flag(member, MFLAG_CAN_SPEAK) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event); conference_add_event_member_data(member, event);