if (idx < 0 || idx > (int)(conference->canvas_count - 1)) idx = 0;
- switch_mutex_lock(conference->canvas_mutex);
+
if (conference_utils_test_flag(conference, CFLAG_PERSONAL_CANVAS)) {
stream->write_function(stream, "Change personal canvas set to layout [%s]\n", vlayout->name);
+ switch_mutex_lock(conference->member_mutex);
conference->new_personal_vlayout = vlayout;
+ switch_mutex_unlock(conference->member_mutex);
} else {
stream->write_function(stream, "Change canvas %d to layout [%s]\n", idx + 1, vlayout->name);
+ switch_mutex_lock(conference->canvases[idx]->mutex);
conference->canvases[idx]->new_vlayout = vlayout;
+ switch_mutex_unlock(conference->canvases[idx]->mutex);
}
- switch_mutex_unlock(conference->canvas_mutex);
return SWITCH_STATUS_SUCCESS;
}
return SWITCH_STATUS_SUCCESS;
}
- switch_mutex_lock(member->conference->canvas_mutex);
-
if (!strcasecmp(text, "clear") || (member->video_reservation_id && !strcasecmp(text, member->video_reservation_id))) {
member->video_reservation_id = NULL;
stream->write_function(stream, "+OK reservation_id cleared\n");
conference_video_detach_video_layer(member);
- switch_mutex_unlock(member->conference->canvas_mutex);
-
return SWITCH_STATUS_SUCCESS;
}
mcu_canvas_t *canvas = NULL;
if (!member || member->canvas_id < 0 || member->video_layer_id < 0) return NULL;
-
- canvas = member->conference->canvases[member->canvas_id];
- if (!canvas) {
- goto end;
- }
-
- switch_mutex_lock(canvas->mutex);
- layer = &canvas->layers[member->video_layer_id];
+ if ((canvas = conference_video_get_canvas_locked(member))) {
+ switch_mutex_lock(canvas->mutex);
+ layer = &canvas->layers[member->video_layer_id];
- if (!layer) {
- switch_mutex_unlock(canvas->mutex);
+ if (!layer) {
+ switch_mutex_unlock(canvas->mutex);
+ }
}
- end:
-
return layer;
}
if (!canvas) return;
switch_mutex_unlock(canvas->mutex);
+ conference_video_release_canvas(&canvas);
+
+ *layer = NULL;
+}
- switch_assert(canvas->conference);
+mcu_canvas_t *conference_video_get_canvas_locked(conference_member_t *member)
+{
+ mcu_canvas_t *canvas = NULL;
- *layer = NULL;
+ if (!member || member->canvas_id < 0 || member->video_layer_id < 0) return NULL;
+
+ switch_mutex_lock(member->conference->canvas_mutex);
+ canvas = member->conference->canvases[member->canvas_id];
+
+ if (!canvas) {
+ switch_mutex_unlock(member->conference->canvas_mutex);
+ }
+
+ return canvas;
}
+void conference_video_release_canvas(mcu_canvas_t **canvasP)
+{
+ mcu_canvas_t *canvas = NULL;
+
+ switch_assert(canvasP);
+
+ canvas = *canvasP;
+
+ if (!canvas) return;
+
+ switch_mutex_unlock(canvas->conference->canvas_mutex);
+ *canvasP = NULL;
+}
void conference_video_detach_video_layer(conference_member_t *member)
{
mcu_layer_t *layer = NULL;
mcu_canvas_t *canvas = NULL;
- switch_mutex_lock(member->conference->canvas_mutex);
+ if (member->canvas_id < 0) return;
- if (member->canvas_id < 0) goto end;
-
- canvas = member->conference->canvases[member->canvas_id];
+ canvas = conference_video_get_canvas_locked(member);
if (!canvas || member->video_layer_id < 0) {
- goto end;
+ return;
}
switch_mutex_lock(canvas->mutex);
}
switch_mutex_unlock(canvas->mutex);
-
- end:
-
- switch_mutex_unlock(member->conference->canvas_mutex);
-
+ conference_video_release_canvas(&canvas);
+
}
return SWITCH_STATUS_FALSE;
}
- switch_mutex_lock(member->conference->canvas_mutex);
-
switch_mutex_lock(canvas->mutex);
layer = &canvas->layers[idx];
switch_mutex_unlock(canvas->mutex);
- switch_mutex_unlock(member->conference->canvas_mutex);
-
return status;
}
if (!canvas) return;
switch_thread_rwlock_wrlock(canvas->video_rwlock);
- switch_mutex_lock(conference->canvas_mutex);
switch_mutex_lock(canvas->mutex);
canvas->layout_floor_id = -1;
if (!vlayout) {
switch_mutex_unlock(canvas->mutex);
- switch_mutex_lock(conference->canvas_mutex);
switch_thread_rwlock_unlock(canvas->video_rwlock);
return;
}
}
switch_mutex_unlock(canvas->mutex);
- switch_mutex_unlock(conference->canvas_mutex);
switch_thread_rwlock_unlock(canvas->video_rwlock);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Canvas position %d applied layout %s\n", canvas->canvas_id + 1, vlayout->name);
} else {
vlayout = switch_core_hash_find(conference->layout_hash, video_layout_name);
}
-
+
return vlayout;
}
mcu_layer_t *layer = NULL;
mcu_canvas_t *canvas = NULL;
- canvas = member->conference->canvases[member->canvas_id];
-
+ canvas = conference_video_get_canvas_locked(member);
+
switch_mutex_lock(canvas->mutex);
layer = &canvas->layers[member->video_layer_id];
switch_img_free(&layer->mute_img);
}
switch_mutex_unlock(canvas->mutex);
+ conference_video_release_canvas(&canvas);
}
}
switch_frame_buffer_free(member->fb, &frame);
}
+ canvas = NULL;
+ layer = NULL;
+
switch_mutex_lock(member->conference->canvas_mutex);
if (member->video_layer_id > -1 && member->canvas_id > -1) {
canvas = member->conference->canvases[member->canvas_id];
layer = &canvas->layers[member->video_layer_id];
-
- if (layer->need_patch) {
- switch_mutex_lock(canvas->mutex);
- } else {
- canvas = NULL;
- layer = NULL;
- }
}
- switch_mutex_unlock(member->conference->canvas_mutex);
- if (canvas) {
+ if (canvas && layer && layer->need_patch) {
switch_thread_rwlock_rdlock(canvas->video_rwlock);
conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
layer->need_patch = 0;
switch_thread_rwlock_unlock(canvas->video_rwlock);
- switch_mutex_unlock(canvas->mutex);
}
+ switch_mutex_unlock(member->conference->canvas_mutex);
}
}
return;
}
- canvas = member->conference->canvases[member->canvas_id];
+ canvas = conference_video_get_canvas_locked(member);
if (conference_utils_test_flag(member->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS) &&
(!switch_channel_test_flag(member->channel, CF_VIDEO) || switch_core_session_media_flow(member->session, SWITCH_MEDIA_TYPE_VIDEO) == SWITCH_MEDIA_FLOW_SENDONLY)) {
+ if (canvas) {
+ conference_video_release_canvas(&canvas);
+ }
return;
}
if (canvas) {
switch_mutex_unlock(canvas->mutex);
+ conference_video_release_canvas(&canvas);
}
}
mcu_layer_t *layer = NULL;
int i;
- switch_mutex_lock(conference->canvas_mutex);
+ switch_mutex_lock(canvas->mutex);
for (i = 0; i < canvas->total_layers; i++) {
mcu_layer_t *xlayer = &canvas->layers[i];
}
}
- switch_mutex_unlock(conference->canvas_mutex);
+ switch_mutex_unlock(canvas->mutex);
if (layer) {
*layerP = layer;
//printf("MEMBER %d layer_id %d canvas: %d/%d\n", imember->id, imember->video_layer_id,
// canvas->layers_used, canvas->total_layers);
- switch_mutex_lock(conference->canvas_mutex);
if (imember->video_layer_id > -1) {
layer = &canvas->layers[imember->video_layer_id];
if (layer->member_id != (int)imember->id) {
imember->layer_timeout = DEFAULT_LAYER_TIMEOUT;
}
}
- switch_mutex_unlock(conference->canvas_mutex);
-
if (imember->avatar_png_img) {
if (layer) {