diff --git a/src/video/video_widget.cpp b/src/video/video_widget.cpp index f8fc821642cc6a8fa45848148eaeda235fbf6ac6..ac0080d0fd24dbb37562cda966e3cd701c87a72c 100644 --- a/src/video/video_widget.cpp +++ b/src/video/video_widget.cpp @@ -415,9 +415,42 @@ clutter_render_image(VideoWidgetRenderer* wg_renderer) /* render a black frame set the bool back to false, this is likely done * when the renderer is stopped so we ignore whether or not it is running */ - auto image_empty = clutter_image_new(); - clutter_actor_set_content(actor, image_empty); - g_object_unref (image_empty); + if (auto image_old = clutter_actor_get_content(actor)) { + gfloat width; + gfloat height; + if (clutter_content_get_preferred_size(image_old, &width, &height)) { + /* NOTE: this is a workaround for #72531, a crash which occurs + * in cogl < 1.18. We allocate a black frame of the same size + * as the previous image, instead of simply setting an empty or + * a NULL ClutterImage. + */ + auto image_empty = clutter_image_new(); + if (auto empty_data = (guint8 *)g_try_malloc0((gsize)width * height * 4)) { + GError* error = NULL; + clutter_image_set_data( + CLUTTER_IMAGE(image_empty), + empty_data, + COGL_PIXEL_FORMAT_BGRA_8888, + (guint)width, + (guint)height, + (guint)width*4, + &error); + if (error) { + g_warning("error rendering empty image to clutter: %s", error->message); + g_clear_error(&error); + g_object_unref(image_empty); + return; + } + clutter_actor_set_content(actor, image_empty); + g_object_unref(image_empty); + g_free(empty_data); + } else { + clutter_actor_set_content(actor, NULL); + } + } else { + clutter_actor_set_content(actor, NULL); + } + } wg_renderer->show_black_frame = false; return; }