char *video_layout_group;
char *video_canvas_bgcolor;
char *video_layout_bgcolor;
+ char *no_video_avatar;
conf_video_mode_t conf_video_mode;
int members_with_video;
int video_timer_reset;
char *video_reservation_id;
switch_media_flow_t video_flow;
switch_frame_buffer_t *fb;
+ switch_image_t *avatar_png_img;
};
typedef enum {
channel = switch_core_session_get_channel(member->session);
- if (!switch_channel_test_flag(channel, CF_VIDEO)) {
+ if (!switch_channel_test_flag(channel, CF_VIDEO) && !member->avatar_png_img) {
return SWITCH_STATUS_FALSE;
}
switch_image_t *img = NULL;
int size = 0;
- if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO) ||
+ if (!imember->session || (!switch_channel_test_flag(imember->channel, CF_VIDEO) && !imember->avatar_png_img) ||
switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) {
continue;
}
attach_video_layer(imember, conference->canvas->layout_floor_id);
}
- if (switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) {
+ if (switch_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING) && switch_channel_test_flag(imember->channel, CF_VIDEO)) {
if (switch_channel_test_flag(imember->channel, CF_VIDEO_REFRESH_REQ)) {
switch_channel_clear_flag(imember->channel, CF_VIDEO_REFRESH_REQ);
need_refresh = SWITCH_TRUE;
img = NULL;
size = 0;
- do {
- if (switch_queue_trypop(imember->video_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
- switch_img_free(&img);
- img = (switch_image_t *)pop;
- } else {
- break;
- }
- size = switch_queue_size(imember->video_queue);
- } while(size > 0);
+ if (!imember->avatar_png_img && switch_channel_test_flag(imember->channel, CF_VIDEO)) {
+ do {
+ if (switch_queue_trypop(imember->video_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
+ switch_img_free(&img);
+ img = (switch_image_t *)pop;
+ } else {
+ break;
+ }
+ size = switch_queue_size(imember->video_queue);
+ } while(size > 0);
+ } else {
+ img = imember->avatar_png_img;
+ }
if (img) {
int i;
}
if (layer) {
- switch_img_free(&layer->cur_img);
+ if (layer->cur_img && layer->cur_img != imember->avatar_png_img) {
+ switch_img_free(&layer->cur_img);
+ }
if (switch_test_flag(imember, MFLAG_CAN_BE_SEEN)) {
layer->mute_patched = 0;
} else {
- switch_img_free(&img);
+ if (img && img != imember->avatar_png_img) {
+ switch_img_free(&img);
+ }
if (!layer->mute_patched) {
if (imember->video_mute_png || layer->mute_img) {
}
if (img) {
- layer->cur_img = img;
+ if (imember->avatar_png_img) {
+ if (!layer->cur_img) {
+ switch_img_copy(imember->avatar_png_img, &layer->cur_img);
+ }
+
+ if (img != imember->avatar_png_img) {
+ switch_img_free(&img);
+ }
+
+ } else {
+ layer->cur_img = img;
+ }
+
img = NULL;
layer->tagged = 1;
}
}
switch_mutex_unlock(conference->canvas->mutex);
- switch_img_free(&img);
+ if (img && img != imember->avatar_png_img) {
+ switch_img_free(&img);
+ }
}
if (imember->session) {
call_list_t *call_list = NULL;
switch_channel_t *channel;
const char *controls = NULL, *position = NULL, *var = NULL;
+ const char *avatar = NULL;
+
switch_assert(conference != NULL);
switch_assert(member != NULL);
if (switch_channel_test_flag(channel, CF_VIDEO)) {
switch_set_flag_locked(member, MFLAG_ACK_VIDEO);
+ } else {
+ if (conference->no_video_avatar) {
+ avatar = conference->no_video_avatar;
+ }
+
+ if ((var = switch_channel_get_variable_dup(member->channel, "video_no_video_avatar_png", SWITCH_FALSE, -1))) {
+ avatar = var;
+ }
+ }
+
+ if ((var = switch_channel_get_variable_dup(member->channel, "video_avatar_png", SWITCH_FALSE, -1))) {
+ avatar = var;
+ }
+
+ if (avatar) {
+ member->avatar_png_img = switch_img_read_png(avatar);
}
if ((var = switch_channel_get_variable_dup(member->channel, "video_mute_png", SWITCH_FALSE, -1))) {
switch_ivr_dmachine_destroy(&member->dmachine);
}
+ switch_img_free(&member->avatar_png_img);
+
switch_mutex_lock(conference->mutex);
switch_mutex_lock(conference->member_mutex);
switch_mutex_lock(member->audio_in_mutex);
char *video_canvas_bgcolor = NULL;
char *video_layout_bgcolor = NULL;
char *video_codec_bandwidth = NULL;
+ char *no_video_avatar = NULL;
conf_video_mode_t conf_video_mode = CONF_VIDEO_MODE_PASSTHROUGH;
float fps = 15.0f;
uint32_t max_members = 0;
fps = atof(val);
} else if (!strcasecmp(var, "video-codec-bandwidth") && !zstr(val)) {
video_codec_bandwidth = val;
+ } else if (!strcasecmp(var, "video-no-video-avatar") && !zstr(val)) {
+ no_video_avatar = val;
} else if (!strcasecmp(var, "exit-sound") && !zstr(val)) {
exit_sound = val;
} else if (!strcasecmp(var, "alone-sound") && !zstr(val)) {
video_layout_bgcolor = "#000000";
}
+ if (no_video_avatar) {
+ conference->no_video_avatar = switch_core_strdup(conference->pool, no_video_avatar);
+ }
+
conference->video_canvas_bgcolor = switch_core_strdup(conference->pool, video_canvas_bgcolor);
conference->video_layout_bgcolor = switch_core_strdup(conference->pool, video_layout_bgcolor);