From 58ba3860cdce58a396ab8ec81b36c8fa24d312fe Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 29 Sep 2015 14:48:24 -0500 Subject: [PATCH] FS-8241 #resolve [Conference stops playing video when local_stream changes source] --- .../mod_conference/conference_file.c | 2 +- .../mod_conference/conference_video.c | 29 ++++++++++++------- .../mod_conference/mod_conference.c | 2 +- .../mod_conference/mod_conference.h | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/mod/applications/mod_conference/conference_file.c b/src/mod/applications/mod_conference/conference_file.c index e720d46d8e..4dedff6fcb 100644 --- a/src/mod/applications/mod_conference/conference_file.c +++ b/src/mod/applications/mod_conference/conference_file.c @@ -299,7 +299,7 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u fnode->file = switch_core_strdup(fnode->pool, file); if (!conference->fnode || (async && !conference->async_fnode)) { - conference_video_fnode_check(fnode); + conference_video_fnode_check(fnode, -1); } /* Queue the node */ diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index 4e6e00db53..7f40371006 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -1661,18 +1661,27 @@ void conference_video_patch_fnode(mcu_canvas_t *canvas, conference_file_node_t * } else if (status == SWITCH_STATUS_IGNORE) { if (canvas && fnode->layer_id > -1 ) { conference_video_canvas_del_fnode_layer(canvas->conference, fnode); + fnode->canvas_id = canvas->canvas_id; } } } } -void conference_video_fnode_check(conference_file_node_t *fnode) { - mcu_canvas_t *canvas = fnode->conference->canvases[fnode->canvas_id]; - +void conference_video_fnode_check(conference_file_node_t *fnode, int canvas_id) { + mcu_canvas_t *canvas = NULL; + if (switch_core_file_has_video(&fnode->fh) && switch_core_file_read_video(&fnode->fh, NULL, SVR_CHECK) == SWITCH_STATUS_BREAK) { int full_screen = 0; char *res_id = NULL; + if (fnode->canvas_id == -1) { + if (canvas_id == -1) { + return; + } + fnode->canvas_id = canvas_id; + } + + canvas = fnode->conference->canvases[fnode->canvas_id]; if (fnode->fh.params && fnode->conference->canvas_count == 1) { full_screen = switch_true(switch_event_get_header(fnode->fh.params, "full-screen")); } @@ -2298,7 +2307,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr } if (check_async_file) { - if (switch_core_file_read_video(&conference->async_fnode->fh, &file_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + if (switch_core_file_read_video(&conference->async_fnode->fh, &file_frame, SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { if ((async_file_img = file_frame.img)) { file_imgs[j++] = async_file_img; } @@ -2306,7 +2315,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr } if (check_file) { - if (switch_core_file_read_video(&conference->fnode->fh, &file_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + if (switch_core_file_read_video(&conference->fnode->fh, &file_frame, SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { if ((normal_file_img = file_frame.img)) { file_imgs[j++] = normal_file_img; } @@ -2458,19 +2467,19 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr switch_mutex_unlock(conference->member_mutex); } else { - if (conference->async_fnode && conference->async_fnode->canvas_id == canvas->canvas_id) { + if (conference->async_fnode && (conference->async_fnode->canvas_id == canvas->canvas_id || conference->async_fnode->canvas_id == -1)) { if (conference->async_fnode->layer_id > -1) { conference_video_patch_fnode(canvas, conference->async_fnode); } else { - conference_video_fnode_check(conference->async_fnode); + conference_video_fnode_check(conference->async_fnode, canvas->canvas_id); } } - if (conference->fnode && conference->fnode->canvas_id == canvas->canvas_id) { + if (conference->fnode && (conference->fnode->canvas_id == canvas->canvas_id || conference->fnode->canvas_id == -1)) { if (conference->fnode->layer_id > -1) { conference_video_patch_fnode(canvas, conference->fnode); } else { - conference_video_fnode_check(conference->fnode); + conference_video_fnode_check(conference->fnode, canvas->canvas_id); } } @@ -2542,7 +2551,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr timestamp = canvas->timer.samplecount; if (conference->playing_video_file) { - if (switch_core_file_read_video(&conference->fnode->fh, &write_frame, SVR_BLOCK | SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { + if (switch_core_file_read_video(&conference->fnode->fh, &write_frame, SVR_FLUSH) == SWITCH_STATUS_SUCCESS) { switch_img_free(&file_img); if (canvas->play_file) { diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 0802b95987..7ae047ad36 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -667,7 +667,7 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob conference->fnode = conference->fnode->next; if (conference->fnode) { - conference_video_fnode_check(conference->fnode); + conference_video_fnode_check(conference->fnode, -1); } diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index ff19ff44f5..3adb7f49a2 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -930,7 +930,7 @@ video_layout_t *conference_video_get_layout(conference_obj_t *conference, const void conference_video_check_avatar(conference_member_t *member, switch_bool_t force); void conference_video_find_floor(conference_member_t *member, switch_bool_t entering); void conference_video_destroy_canvas(mcu_canvas_t **canvasP); -void conference_video_fnode_check(conference_file_node_t *fnode); +void conference_video_fnode_check(conference_file_node_t *fnode, int canvas_id); switch_status_t conference_video_set_canvas_bgimg(mcu_canvas_t *canvas, const char *img_path); switch_status_t conference_al_parse_position(al_handle_t *al, const char *data); switch_status_t conference_video_thread_callback(switch_core_session_t *session, switch_frame_t *frame, void *user_data);