static GstFlowReturn data_channel_buffer_received_cb (GObject * obj, GstBuffer * buffer, gpointer user_data) { KmsWebRtcDataChannel *channel = KMS_WEBRTC_DATA_CHANNEL (obj); GstMapInfo info = GST_MAP_INFO_INIT; gchar *msg; GST_INFO_OBJECT (channel, "Buffer received"); if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { fail ("Can not read buffer"); return GST_FLOW_ERROR; } fail_if (strlen (TEST_MESSAGE) != info.size); msg = g_strndup ((const gchar *) info.data, info.size); gst_buffer_unmap (buffer, &info); GST_INFO ("Received message: \"%s\"", msg); fail_unless (g_strcmp0 (TEST_MESSAGE, msg) == 0); g_free (msg); g_idle_add (quit_main_loop_idle, user_data); return GST_FLOW_OK; }
KmsWebRtcDataChannel * kms_webrtc_data_channel_new (KmsWebRtcDataChannelBin * channel_bin) { KmsWebRtcDataChannel *obj; obj = KMS_WEBRTC_DATA_CHANNEL (g_object_new (KMS_TYPE_WEBRTC_DATA_CHANNEL, NULL)); obj->priv->channel_bin = KMS_WEBRTC_DATA_CHANNEL_BIN (g_object_ref (channel_bin)); kms_webrtc_data_channel_bin_set_new_buffer_callback (channel_bin, kms_webrtc_data_channel_new_buffer, obj, NULL); return obj; }
static void kms_webrtc_data_channel_bin_finalize (GObject * object) { KmsWebRtcDataChannel *self = KMS_WEBRTC_DATA_CHANNEL (object); GST_DEBUG_OBJECT (self, "finalize"); if (self->priv->notify != NULL) { self->priv->notify (self->priv->user_data); } g_rec_mutex_clear (&self->priv->mutex); g_clear_object (&self->priv->channel_bin); /* chain up */ G_OBJECT_CLASS (parent_class)->finalize (object); }
static GstFlowReturn kms_webrtc_data_channel_new_buffer (GObject * obj, GstBuffer * buffer, gpointer user_data) { KmsWebRtcDataChannel *self = KMS_WEBRTC_DATA_CHANNEL (user_data); DataChannelNewBuffer cb; gpointer data; KMS_WEBRTC_DATA_CHANNEL_LOCK (self); cb = self->priv->cb; data = self->priv->user_data; KMS_WEBRTC_DATA_CHANNEL_UNLOCK (self); if (cb != NULL) { return cb (G_OBJECT (self), buffer, data); } return GST_FLOW_OK; }