gnome: fix frameUpdate crash
add a missing disconnect from the frameUpdate signal
also prevent potential crash when leaving call view
or hanging up as the video renderer is starting
Refs #68820
Change-Id: I64cab0951a26cb99a077de8a3f5d876314cd8cec
diff --git a/src/video/video_widget.cpp b/src/video/video_widget.cpp
index 06d6d60..9893ed5 100644
--- a/src/video/video_widget.cpp
+++ b/src/video/video_widget.cpp
@@ -357,10 +357,13 @@
renderer_start(VideoWidgetRenderer *renderer)
{
g_return_if_fail(CLUTTER_IS_ACTOR(renderer->actor));
+ QObject::disconnect(renderer->frame_update);
renderer->frame_update = QObject::connect(
renderer->renderer,
&Video::Renderer::frameUpdated,
[=]() {
+ if (!renderer->renderer->isRendering())
+ g_warning("got frame but not rendering!");
/* this callback comes from another thread;
* rendering must be done in the main loop;
@@ -415,27 +418,25 @@
}
void
-video_widget_set_remote_renderer(VideoWidget *self, Video::Renderer *renderer_remote_new)
+video_widget_add_renderer(VideoWidget *self, const VideoRenderer *new_renderer)
{
g_return_if_fail(IS_VIDEO_WIDGET(self));
- if (renderer_remote_new == NULL) return;
+ if (new_renderer == NULL || new_renderer->renderer == NULL)
+ return;
VideoWidgetPrivate *priv = VIDEO_WIDGET_GET_PRIVATE(self);
/* update the renderer */
- priv->remote->renderer = renderer_remote_new;
- video_widget_set_renderer(priv->remote);
-}
-
-void
-video_widget_set_local_renderer(VideoWidget *self, Video::Renderer *renderer_local_new)
-{
- g_return_if_fail(IS_VIDEO_WIDGET(self));
- if (renderer_local_new == NULL) return;
-
- VideoWidgetPrivate *priv = VIDEO_WIDGET_GET_PRIVATE(self);
-
- /* update the renderer */
- priv->local->renderer = renderer_local_new;
- video_widget_set_renderer(priv->local);
+ switch(new_renderer->type) {
+ case VIDEO_RENDERER_REMOTE:
+ priv->remote->renderer = new_renderer->renderer;
+ video_widget_set_renderer(priv->remote);
+ break;
+ case VIDEO_RENDERER_LOCAL:
+ priv->local->renderer = new_renderer->renderer;
+ video_widget_set_renderer(priv->local);
+ break;
+ case VIDEO_RENDERER_COUNT:
+ break;
+ }
}