]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10472: [mod_conference] Crash due to hangup race in conference personal canvas...
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Jul 2017 07:51:36 +0000 (02:51 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Jul 2017 07:56:51 +0000 (02:56 -0500)
src/mod/applications/mod_conference/conference_video.c

index 8cf80a99b3674c5e6cdf07602b5e7522046690a4..791cce38e732931f13401219fa6b838f6bfc4f6f 100644 (file)
@@ -3002,7 +3002,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                }
                                        }
 
-                                       if (layer) {
+                                       if (layer && !file_count) {
                                                personal_attach(layer, omember);
                                        }
 
@@ -3022,7 +3022,9 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                        layer->avatar_patched = 0;
                                                } else {
                                                        if (!layer->avatar_patched) {
-                                                               conference_video_scale_and_patch(layer, omember->avatar_png_img, SWITCH_FALSE);
+                                                               if (omember->avatar_png_img) {
+                                                                       switch_img_copy(omember->avatar_png_img, &layer->cur_img);
+                                                               }
                                                                layer->avatar_patched = 1;
                                                        }
                                                        use_img = NULL;
@@ -3043,7 +3045,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                                                switch_img_fit(&tmp, layer->screen_w, layer->screen_h, SWITCH_FIT_SIZE);
                                                                                //conference_video_member_video_mute_banner(imember->canvas, layer, imember);
                                                                                conference_video_member_video_mute_banner(tmp, omember);
-                                                                               conference_video_scale_and_patch(layer, tmp, SWITCH_FALSE);
+                                                                               switch_img_copy(tmp, &layer->cur_img);
                                                                        }
                                                                        
                                                                        layer->mute_patched = 1;
@@ -3069,6 +3071,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                        switch_image_t *img = file_imgs[j];
                                        layer = NULL;
 
+                                       if (!img) continue;
+
                                        if (j == 0 && imember->canvas->layout_floor_id > -1) {
                                                layer = &imember->canvas->layers[imember->canvas->layout_floor_id];
                                        } else if (i < imember->canvas->total_layers) {
@@ -3079,7 +3083,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                switch_img_free(&layer->banner_img);
                                                switch_img_free(&layer->logo_img);
                                                layer->member_id = -1;
-                                               conference_video_scale_and_patch(layer, img, SWITCH_FALSE);
+                                               switch_img_copy(img, &layer->cur_img);
+                                               conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
                                        }
                                }