cJSON_AddItemToObject(msg, "eventChannel", cJSON_CreateString(conference->info_event_channel));
cJSON_AddItemToObject(data, "contentType", cJSON_CreateString("layout-info"));
- switch_thread_rwlock_rdlock(canvas->video_rwlock);
+ switch_mutex_lock(canvas->write_mutex);
switch_mutex_lock(canvas->mutex);
if ((obj = get_canvas_info(canvas))) {
cJSON_AddItemToObject(obj, "scale", cJSON_CreateNumber(VIDEO_LAYOUT_SCALE));
cJSON_AddItemToObject(data, "canvasInfo", obj);
}
-
+
+ switch_mutex_unlock(canvas->write_mutex);
switch_mutex_unlock(canvas->mutex);
- switch_thread_rwlock_unlock(canvas->video_rwlock);
switch_event_channel_broadcast(conference->info_event_channel, &msg, "mod_conference", conference_globals.event_channel_id);
}
switch_mutex_lock(canvas->mutex);
+ switch_mutex_lock(canvas->write_mutex);
if (member->video_layer_id < 0) {
goto end;
end:
+ switch_mutex_unlock(canvas->write_mutex);
switch_mutex_unlock(canvas->mutex);
conference_video_release_canvas(&canvas);
if (!canvas) return;
- switch_thread_rwlock_wrlock(canvas->video_rwlock);
+
switch_mutex_lock(canvas->mutex);
+ switch_mutex_lock(canvas->write_mutex);
for (i = 0; i < MCU_MAX_LAYERS; i++) {
mcu_layer_t *layer = &canvas->layers[i];
}
if (vlayout && canvas->vlayout == vlayout && !force) {
+ switch_mutex_unlock(canvas->write_mutex);
switch_mutex_unlock(canvas->mutex);
- switch_thread_rwlock_unlock(canvas->video_rwlock);
return;
}
}
if (!vlayout) {
+ switch_mutex_unlock(canvas->write_mutex);
switch_mutex_unlock(canvas->mutex);
- switch_thread_rwlock_unlock(canvas->video_rwlock);
return;
}
conference_video_set_canvas_bgimg(canvas, conference->video_canvas_bgimg);
}
+ switch_mutex_unlock(canvas->write_mutex);
switch_mutex_unlock(canvas->mutex);
- switch_thread_rwlock_unlock(canvas->video_rwlock);
conference_event_adv_layout(conference, canvas, vlayout);
canvas->conference = conference;
canvas->pool = conference->pool;
switch_mutex_init(&canvas->mutex, SWITCH_MUTEX_NESTED, conference->pool);
+ switch_mutex_init(&canvas->write_mutex, SWITCH_MUTEX_NESTED, conference->pool);
canvas->layout_floor_id = -1;
switch_img_free(&canvas->img);
canvas->img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, canvas->width, canvas->height, 0);
switch_queue_create(&canvas->video_queue, 200, canvas->pool);
- switch_thread_rwlock_create(&canvas->video_rwlock, canvas->pool);
switch_assert(canvas->img);
break;
}
- 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_thread_rwlock_tryrdlock(canvas->video_rwlock) == SWITCH_STATUS_SUCCESS) {
- if (layer->need_patch) {
- conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
- layer->need_patch = 0;
- }
- switch_thread_rwlock_unlock(canvas->video_rwlock);
+ if (layer) {
+ if (layer->need_patch) {
+ conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
+ layer->need_patch = 0;
}
}
- switch_mutex_unlock(member->conference->canvas_mutex);
}
switch_mutex_unlock(member->layer_cond_mutex);
}
if (full_screen) {
+ canvas->send_keyframe = 1;
if (canvas->play_file == 0) {
canvas->play_file = 1;
}
static void wait_for_canvas(mcu_canvas_t *canvas)
{
- //int q = 0;
-
+ switch_mutex_lock(canvas->write_mutex);
for (;;) {
int x = 0;
int i = 0;
if (layer->need_patch) {
if (layer->member_id && layer->member && conference_utils_member_test_flag(layer->member, MFLAG_RUNNING) && layer->member->fb) {
conference_video_wake_layer_thread(layer->member);
- //printf("BALLZ? %d\n", q++);
x++;
} else {
layer->need_patch = 0;
if (!x) break;
- switch_thread_rwlock_wrlock(canvas->video_rwlock);
- switch_thread_rwlock_unlock(canvas->video_rwlock);
+ switch_cond_next();
}
+ switch_mutex_unlock(canvas->write_mutex);
}
static void personal_attach(mcu_layer_t *layer, conference_member_t *member)
}
if (layer->cur_img) {
- if (layer->member && switch_core_cpu_count() > 2) {
+ if (layer->member && switch_core_cpu_count() > 200) {
layer->need_patch = 1;
conference_video_wake_layer_thread(layer->member);
} else {
if (frame->img && (((member->video_layer_id > -1) && canvas_id > -1) || member->canvas) &&
conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) &&
- switch_queue_size(member->video_queue) < member->conference->video_fps.fps * 2 &&
+ switch_queue_size(member->video_queue) < 2 && //member->conference->video_fps.fps * 2 &&
!member->conference->canvases[canvas_id]->playing_video_file) {
if (conference_utils_member_test_flag(member, MFLAG_FLIP_VIDEO) || conference_utils_member_test_flag(member, MFLAG_ROTATE_VIDEO)) {
int buflen = SWITCH_RTP_MAX_BUF_LEN;
switch_timer_t timer = { 0 };
int fps;
- switch_video_read_flag_t read_flags = SVR_FLUSH;
+ switch_video_read_flag_t read_flags = SVR_BLOCK;
switch_core_session_t *b_session = NULL;
core_fps_t fps_data = { 0 };
switch_image_t *last_frame = NULL;
switch_core_timer_next(&timer);
switch_mutex_lock(v_engine->mh.file_write_mutex);
- if (smh->video_write_fh && smh->video_write_fh->mm.source_fps && smh->video_write_fh->mm.source_fps != fps) {
- switch_core_timer_destroy(&timer);
- video_get_fps(&fps_data, fps);
- switch_core_timer_init(&timer, "soft", (int)(1000 / fps) , fps_data.samples, switch_core_session_get_pool(session));
- }
+ //if (smh->video_write_fh && smh->video_write_fh->mm.source_fps && smh->video_write_fh->mm.source_fps != fps) {
+ // switch_core_timer_destroy(&timer);
+ // video_get_fps(&fps_data, fps);
+ // switch_core_timer_init(&timer, "soft", (int)(1000 / fps) , fps_data.samples, switch_core_session_get_pool(session));
+ //}
if (smh->video_write_fh && !switch_test_flag(smh->video_write_fh, SWITCH_FILE_FLAG_VIDEO_EOF)) {
wstatus = switch_core_file_read_video(smh->video_write_fh, &fr, read_flags);
// context->decoder_init = 0;
//}
- cfg.threads = 1;//(switch_core_cpu_count() > 1) ? 2 : 1;
+ //cfg.threads = 1;//(switch_core_cpu_count() > 1) ? 2 : 1;
+
+ cfg.threads = switch_core_cpu_count() / 2;
+ if (cfg.threads > 4) cfg.threads = 4;
+ if (cfg.threads < 1) cfg.threads = 1;
if (!context->is_vp9) { // vp8 only
// dec_flags = VPX_CODEC_USE_POSTPROC;
}
- sane = switch_calc_bitrate(1920, 1080, 2, 30);
+ sane = switch_calc_bitrate(1920, 1080, 5, 60);
if (context->bandwidth > sane) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "BITRATE TRUNCATED FROM %d TO %d\n", context->bandwidth, sane);
config->g_lag_in_frames = 0;
config->kf_max_dist = 360;//2000;
threads = cpus / 2;
+ if (threads > 4) threads = 4;
if (threads < 1) threads = 1;
config->g_threads = threads;