commit 156a0014caa6628f12f6743eba91b7245678e9c6
parent 3df72066c4e0ad603ad4d0098790a97561277ff7
Author: Jacki <jacki@thejackimonster.de>
Date: Fri, 9 Aug 2024 14:54:41 +0200
First attempt to unlink video stream widget on dialog destruction
Signed-off-by: Jacki <jacki@thejackimonster.de>
Diffstat:
3 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/src/discourse.c b/src/discourse.c
@@ -83,6 +83,7 @@ _setup_audio_gst_pipelines_of_subscription(MESSENGER_DiscourseSubscriptionInfo *
g_assert(info);
info->audio_stream_source = gst_element_factory_make("appsrc", NULL);
+ info->audio_jitter_buffer = gst_element_factory_make("rtpjitterbuffer", NULL);
info->audio_depay = gst_element_factory_make("rtpL16depay", NULL);
info->audio_converter = gst_element_factory_make("audioconvert", NULL);
@@ -91,6 +92,7 @@ _setup_audio_gst_pipelines_of_subscription(MESSENGER_DiscourseSubscriptionInfo *
gst_bin_add_many(
GST_BIN(info->discourse->audio_mix_pipeline),
info->audio_stream_source,
+ info->audio_jitter_buffer,
info->audio_depay,
info->audio_converter,
NULL
@@ -98,6 +100,7 @@ _setup_audio_gst_pipelines_of_subscription(MESSENGER_DiscourseSubscriptionInfo *
gst_element_link_many(
info->audio_stream_source,
+ info->audio_jitter_buffer,
info->audio_depay,
info->audio_converter,
NULL
@@ -204,6 +207,7 @@ discourse_subscription_create_info(MESSENGER_DiscourseInfo *discourse,
info->contact = contact;
info->audio_stream_source = NULL;
+ info->audio_jitter_buffer = NULL;
info->audio_depay = NULL;
info->audio_converter = NULL;
@@ -252,7 +256,8 @@ discourse_subscription_destroy_info(MESSENGER_DiscourseSubscriptionInfo *info)
if (info->buffers)
g_list_free(info->buffers);
- if ((info->audio_stream_source) || (info->audio_depay) || (info->audio_converter))
+ if ((info->audio_stream_source) || (info->audio_jitter_buffer) ||
+ (info->audio_depay) || (info->audio_converter))
gst_element_set_state(info->discourse->audio_mix_pipeline, GST_STATE_NULL);
if (info->video_stream_pipeline)
@@ -273,10 +278,12 @@ discourse_subscription_destroy_info(MESSENGER_DiscourseSubscriptionInfo *info)
gst_object_unref(GST_OBJECT(info->audio_mix_pad));
}
- if ((info->audio_stream_source) || (info->audio_depay) || (info->audio_converter))
+ if ((info->audio_stream_source) || (info->audio_jitter_buffer) ||
+ (info->audio_depay) || (info->audio_converter))
{
gst_element_unlink_many(
info->audio_stream_source,
+ info->audio_jitter_buffer,
info->audio_depay,
info->audio_converter,
NULL
@@ -285,6 +292,7 @@ discourse_subscription_destroy_info(MESSENGER_DiscourseSubscriptionInfo *info)
gst_bin_remove_many(
GST_BIN(info->discourse->audio_mix_pipeline),
info->audio_stream_source,
+ info->audio_jitter_buffer,
info->audio_depay,
info->audio_converter,
NULL
@@ -451,7 +459,7 @@ static gboolean
discourse_subscription_link_widget(MESSENGER_DiscourseSubscriptionInfo *info,
GtkContainer *container)
{
- g_assert((info) && (container));
+ g_assert(info);
GtkWidget *widget;
if (info->video_stream_sink)
@@ -468,7 +476,10 @@ discourse_subscription_link_widget(MESSENGER_DiscourseSubscriptionInfo *info,
GtkContainer *current = GTK_CONTAINER(parent);
if (current == container)
+ {
+ g_object_unref(widget);
return TRUE;
+ }
gst_element_set_state(info->video_stream_pipeline, GST_STATE_NULL);
@@ -481,20 +492,27 @@ discourse_subscription_link_widget(MESSENGER_DiscourseSubscriptionInfo *info,
);
}
- gtk_box_pack_start(
- GTK_BOX(container),
- widget,
- true,
- true,
- 0
- );
+ if (container)
+ {
+ gtk_box_pack_start(
+ GTK_BOX(container),
+ widget,
+ true,
+ true,
+ 0
+ );
+ }
g_object_unref(widget);
- gtk_widget_realize(widget);
+
+ if (container)
+ {
+ gtk_widget_realize(widget);
+ gtk_widget_show_all(GTK_WIDGET(container));
- gtk_widget_show_all(GTK_WIDGET(container));
+ gst_element_set_state(info->video_stream_pipeline, GST_STATE_PLAYING);
+ }
- gst_element_set_state(info->video_stream_pipeline, GST_STATE_PLAYING);
return TRUE;
}
@@ -983,6 +1001,27 @@ discourse_is_active(const struct GNUNET_CHAT_Discourse *discourse,
if (!sub_info)
goto unlock_info_mutex;
+ GstState state = GST_STATE_NULL;
+
+ if (sub_info->audio_stream_source)
+ gst_element_get_state(
+ sub_info->audio_stream_source,
+ &state,
+ NULL,
+ GST_CLOCK_TIME_NONE
+ );
+
+ if (sub_info->video_stream_source)
+ gst_element_get_state(
+ sub_info->video_stream_source,
+ &state,
+ NULL,
+ GST_CLOCK_TIME_NONE
+ );
+
+ if (GST_STATE_PLAYING != state)
+ goto unlock_info_mutex;
+
pthread_mutex_lock(&(sub_info->mutex));
if (!(sub_info->end_datetime))
diff --git a/src/discourse.h b/src/discourse.h
@@ -82,6 +82,7 @@ typedef struct MESSENGER_DiscourseSubscriptionInfo
struct GNUNET_CHAT_Contact *contact;
GstElement *audio_stream_source;
+ GstElement *audio_jitter_buffer;
GstElement *audio_depay;
GstElement *audio_converter;
@@ -192,13 +193,14 @@ bool
discourse_is_mute(const struct GNUNET_CHAT_Discourse *discourse);
/**
- * Links a widget from the video pipeline of a discourse
+ * Links/Unlinks a widget from the video pipeline of a discourse
* for a given chat contact to a selected container as
* child.
*
* @param discourse Chat discourse
* @param contact Chat contact
* @param container Container
+ * @param linked Linking flag
*/
gboolean
discourse_link_widget(const struct GNUNET_CHAT_Discourse *discourse,
diff --git a/src/ui/discourse.c b/src/ui/discourse.c
@@ -535,10 +535,14 @@ iterate_ui_discourse_update_discourse_video(void *cls,
if (contact != panel->contact)
goto skip_child;
+ GtkContainer *parent = NULL;
+ if (closure->handle->context)
+ parent = GTK_CONTAINER(panel->video_box);
+
const gboolean linked = discourse_link_widget(
discourse,
contact,
- GTK_CONTAINER(panel->video_box)
+ parent
);
if ((linked) && (discourse_is_active(discourse, contact)))