summaryrefslogtreecommitdiff
path: root/gst-libs/gst/transcoder
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@igalia.com>2021-02-26 15:31:29 -0300
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-03-01 12:37:44 +0000
commit8c2fd4fff7ea08f750f8139fc0616c476077d0ba (patch)
tree7a15e8739f4cb0deced531b4bbc5fb9d3e4c534a /gst-libs/gst/transcoder
parentb6038523c1c5c019f93aed5966f01cbaf70aa15e (diff)
downloadgstreamer-plugins-bad-8c2fd4fff7ea08f750f8139fc0616c476077d0ba.tar.gz
transcoder: Rework the API to create/get SignalAdapter
We can only have 1 single GstTranscoderSignalAdapter object for a given GstTranscoder object, this enforces that by avoiding to expose a constructor and instead add a method to GstTranscoder to get the signal adapter (internally creating it when needed). We can still cleanly ensure that the signal adapter is running for the requested GMainContext and return NULL if it is not the case. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2044>
Diffstat (limited to 'gst-libs/gst/transcoder')
-rw-r--r--gst-libs/gst/transcoder/gsttranscoder-private.h (renamed from gst-libs/gst/transcoder/gsttranscoder-message-private.h)13
-rw-r--r--gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c23
-rw-r--r--gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h6
-rw-r--r--gst-libs/gst/transcoder/gsttranscoder.c83
-rw-r--r--gst-libs/gst/transcoder/gsttranscoder.h8
5 files changed, 107 insertions, 26 deletions
diff --git a/gst-libs/gst/transcoder/gsttranscoder-message-private.h b/gst-libs/gst/transcoder/gsttranscoder-private.h
index 2c2ba213d..edf8daf9c 100644
--- a/gst-libs/gst/transcoder/gsttranscoder-message-private.h
+++ b/gst-libs/gst/transcoder/gsttranscoder-private.h
@@ -28,3 +28,16 @@
#define GST_TRANSCODER_MESSAGE_DATA_ERROR "error"
#define GST_TRANSCODER_MESSAGE_DATA_WARNING "warning"
#define GST_TRANSCODER_MESSAGE_DATA_ISSUE_DETAILS "issue-details"
+
+struct _GstTranscoderSignalAdapter
+{
+ GObject parent;
+ GstBus *bus;
+ GSource *source;
+
+ GWeakRef transcoder;
+};
+
+
+GstTranscoderSignalAdapter * gst_transcoder_signal_adapter_new_sync_emit (GstTranscoder * transcoder);
+GstTranscoderSignalAdapter * gst_transcoder_signal_adapter_new (GstTranscoder * transcoder, GMainContext * context); \ No newline at end of file
diff --git a/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c b/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c
index ac4127598..9cad67c0d 100644
--- a/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c
+++ b/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.c
@@ -26,7 +26,7 @@
#include "gsttranscoder.h"
#include "gsttranscoder-signal-adapter.h"
-#include "gsttranscoder-message-private.h"
+#include "gsttranscoder-private.h"
#include <gst/gst.h>
@@ -52,15 +52,6 @@ enum
static GParamSpec *param_specs[PROP_LAST] = { NULL, };
-struct _GstTranscoderSignalAdapter
-{
- GObject parent;
- GstBus *bus;
- GSource *source;
-
- GstTranscoder *transcoder;
-};
-
struct _GstTranscoderSignalAdapterClass
{
GObjectClass parent_class;
@@ -189,10 +180,6 @@ gst_transcoder_signal_adapter_new (GstTranscoder * transcoder,
g_return_val_if_fail (GST_IS_TRANSCODER (transcoder), NULL);
- if (!context) {
- context = g_main_context_get_thread_default ();
- }
-
self = g_object_new (GST_TYPE_TRANSCODER_SIGNAL_ADAPTER, NULL);
self->bus = gst_transcoder_get_message_bus (transcoder);
self->source = gst_bus_create_watch (self->bus);
@@ -205,6 +192,7 @@ gst_transcoder_signal_adapter_new (GstTranscoder * transcoder,
return NULL;
}
+ g_weak_ref_set (&self->transcoder, transcoder);
g_source_attach (self->source, context);
g_source_set_callback (self->source,
(GSourceFunc) gst_transcoder_signal_adapter_on_message, self, NULL);
@@ -256,7 +244,6 @@ gst_transcoder_signal_adapter_dispose (GObject * object)
}
gst_clear_object (&self->bus);
- gst_clear_object (&self->transcoder);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@@ -269,7 +256,7 @@ gst_transcoder_signal_adapter_get_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_TRANSCODER:
- g_value_set_object (value, self->transcoder);
+ g_value_take_object (value, g_weak_ref_get (&self->transcoder));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -331,12 +318,12 @@ gst_transcoder_signal_adapter_class_init (GstTranscoderSignalAdapterClass *
* gst_transcoder_signal_adapter_get_transcoder:
* @self: The #GstTranscoderSignalAdapter
*
- * Returns: (transfer full): The #GstTranscoder @self is tracking
+ * Returns: (transfer full)(nullable): The #GstTranscoder @self is tracking
*
* Since: 1.20
*/
GstTranscoder *
gst_transcoder_signal_adapter_get_transcoder (GstTranscoderSignalAdapter * self)
{
- return gst_object_ref (self->transcoder);
+ return g_weak_ref_get (&self->transcoder);
}
diff --git a/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h b/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h
index 6dda12437..198efe073 100644
--- a/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h
+++ b/gst-libs/gst/transcoder/gsttranscoder-signal-adapter.h
@@ -49,12 +49,6 @@ GST_TRANSCODER_API
G_DECLARE_FINAL_TYPE(GstTranscoderSignalAdapter, gst_transcoder_signal_adapter, GST, TRANSCODER_SIGNAL_ADAPTER, GObject)
GST_TRANSCODER_API
-GstTranscoderSignalAdapter * gst_transcoder_signal_adapter_new_sync_emit (GstTranscoder * transcoder);
-
-GST_TRANSCODER_API
-GstTranscoderSignalAdapter * gst_transcoder_signal_adapter_new (GstTranscoder * transcoder, GMainContext * context);
-
-GST_TRANSCODER_API
GstTranscoder * gst_transcoder_signal_adapter_get_transcoder (GstTranscoderSignalAdapter * self);
diff --git a/gst-libs/gst/transcoder/gsttranscoder.c b/gst-libs/gst/transcoder/gsttranscoder.c
index 850129a83..c87cb8d04 100644
--- a/gst-libs/gst/transcoder/gsttranscoder.c
+++ b/gst-libs/gst/transcoder/gsttranscoder.c
@@ -28,7 +28,7 @@
*/
#include "gsttranscoder.h"
-#include "gsttranscoder-message-private.h"
+#include "gsttranscoder-private.h"
GST_DEBUG_CATEGORY_STATIC (gst_transcoder_debug);
#define GST_CAT_DEFAULT gst_transcoder_debug
@@ -89,6 +89,8 @@ struct _GstTranscoder
GstClockTime last_duration;
GstBus *api_bus;
+ GstTranscoderSignalAdapter *signal_adapter;
+ GstTranscoderSignalAdapter *sync_signal_adapter;
};
struct _GstTranscoderClass
@@ -220,10 +222,14 @@ gst_transcoder_dispose (GObject * object)
GST_TRACE_OBJECT (self, "Stopping main thread");
+ GST_OBJECT_LOCK (self);
if (self->loop) {
g_main_loop_quit (self->loop);
+ GST_OBJECT_UNLOCK (self);
g_thread_join (self->thread);
+
+ GST_OBJECT_LOCK (self);
self->thread = NULL;
g_main_loop_unref (self->loop);
@@ -232,6 +238,9 @@ gst_transcoder_dispose (GObject * object)
g_main_context_unref (self->context);
self->context = NULL;
+ gst_clear_object (&self->signal_adapter);
+ gst_clear_object (&self->sync_signal_adapter);
+ GST_OBJECT_UNLOCK (self);
}
G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -927,7 +936,7 @@ gst_transcoder_run (GstTranscoder * self, GError ** error)
{
RunSyncData data = { 0, };
GstTranscoderSignalAdapter *signal_adapter =
- gst_transcoder_signal_adapter_new (self, NULL);
+ gst_transcoder_get_signal_adapter (self, NULL);
data.loop = g_main_loop_new (NULL, FALSE);
g_signal_connect_swapped (signal_adapter, "error", G_CALLBACK (_error_cb),
@@ -1234,6 +1243,76 @@ gst_transcoder_get_message_bus (GstTranscoder * self)
}
/**
+ * gst_transcoder_get_sync_signal_adapter:
+ * @self: (transfer none): #GstTranscoder instance to emit signals synchronously
+ * for.
+ *
+ * Gets the #GstTranscoderSignalAdapter attached to @self to emit signals from
+ * its thread of emission.
+ *
+ * Returns: (transfer full): The #GstTranscoderSignalAdapter to connect signal
+ * handlers to.
+ *
+ * Since: 1.20
+ */
+GstTranscoderSignalAdapter *
+gst_transcoder_get_sync_signal_adapter (GstTranscoder * self)
+{
+ g_return_val_if_fail (GST_IS_TRANSCODER (self), NULL);
+
+ GST_OBJECT_LOCK (self);
+ if (!self->sync_signal_adapter)
+ self->sync_signal_adapter =
+ gst_transcoder_signal_adapter_new_sync_emit (self);
+ GST_OBJECT_UNLOCK (self);
+
+ return g_object_ref (self->sync_signal_adapter);
+}
+
+/**
+ * gst_transcoder_get_signal_adapter:
+ * @self: (transfer none): #GstTranscoder instance to emit signals for.
+ * @context: (nullable): A #GMainContext on which the main-loop will process
+ * transcoder bus messages on. Can be NULL (thread-default
+ * context will be used then).
+ *
+ * Gets the #GstTranscoderSignalAdapter attached to @self if it is attached to
+ * the right #GMainContext. If no #GstTranscoderSignalAdapter has been created
+ * yet, it will be created and returned, other calls will return that same
+ * adapter until it is destroyed, at which point, a new one can be attached the
+ * same way.
+ *
+ * Returns: (transfer full)(nullable): The #GstTranscoderSignalAdapter to
+ * connect signal handlers to.
+ *
+ * Since: 1.20
+ */
+GstTranscoderSignalAdapter *
+gst_transcoder_get_signal_adapter (GstTranscoder * self, GMainContext * context)
+{
+ g_return_val_if_fail (GST_IS_TRANSCODER (self), NULL);
+
+ if (!context)
+ context = g_main_context_get_thread_default ();
+ if (!context)
+ context = g_main_context_default ();
+
+ GST_OBJECT_LOCK (self);
+ if (!self->signal_adapter) {
+ self->signal_adapter = gst_transcoder_signal_adapter_new (self, context);
+ } else if (g_source_get_context (self->signal_adapter->source) != context) {
+ GST_WARNING_OBJECT (self, "Trying to get an adapter for a different "
+ "GMainContext than the one attached, this is not possible");
+ GST_OBJECT_UNLOCK (self);
+
+ return NULL;
+ }
+ GST_OBJECT_UNLOCK (self);
+
+ return g_object_ref (self->signal_adapter);
+}
+
+/**
* gst_transcoder_message_get_name:
* @message: a #GstTranscoderMessage
*
diff --git a/gst-libs/gst/transcoder/gsttranscoder.h b/gst-libs/gst/transcoder/gsttranscoder.h
index dcd22860d..5f890c638 100644
--- a/gst-libs/gst/transcoder/gsttranscoder.h
+++ b/gst-libs/gst/transcoder/gsttranscoder.h
@@ -138,6 +138,14 @@ void gst_transcoder_set_avoid_reencoding (GstTranscoder * self,
#include "gsttranscoder-signal-adapter.h"
+GST_TRANSCODER_API
+GstTranscoderSignalAdapter*
+gst_transcoder_get_signal_adapter (GstTranscoder * self,
+ GMainContext *context);
+GST_TRANSCODER_API
+GstTranscoderSignalAdapter*
+gst_transcoder_get_sync_signal_adapter (GstTranscoder * self);
+
G_END_DECLS
#endif