]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8241 #resolve [Conference stops playing video when local_stream changes source]
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 29 Sep 2015 19:48:24 +0000 (14:48 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 29 Sep 2015 19:48:24 +0000 (14:48 -0500)
src/mod/applications/mod_conference/conference_file.c
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index e720d46d8ef35bc31d8bbff595722b25339a5c1b..4dedff6fcb6fc19299b3b6495bd28175e286620b 100644 (file)
@@ -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 */
index 4e6e00db53bd0f48f02812620ff422a62619a8ba..7f40371006f232e04a5423b4f63502fe7fdb8d60 100644 (file)
@@ -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) {
index 0802b95987cd9a3c1fae35c226569e86d9f45252..7ae047ad36e2c8070fedfbf0a4d929e96a74a3c3 100644 (file)
@@ -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);
                        }
 
 
index ff19ff44f5a902912506fb545b2f23b0c5fdc48a..3adb7f49a25e6b7c74f8b2762547e0af7e2c75bf 100644 (file)
@@ -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);