KmsSCTPResult kms_sctp_connection_send (KmsSCTPConnection * conn, guint32 stream_id, guint32 timetolive, const KmsSCTPMessage * message, GCancellable * cancellable, GError ** err) { gsize written = 0; gssize rret; g_return_val_if_fail (g_socket_is_connected (conn->socket), KMS_SCTP_EOF); /* write buffer data */ while (written < message->used) { rret = sctp_socket_send (conn->socket, stream_id, timetolive, message->buf + written, message->used - written, cancellable, err); if (rret < 0) return KMS_SCTP_ERROR; written += rret; } return KMS_SCTP_OK; }
KmsSCTPResult kms_sctp_connection_connect (KmsSCTPConnection * conn, GCancellable * cancellable, GError ** err) { g_return_val_if_fail (conn != NULL, KMS_SCTP_ERROR); g_return_val_if_fail (conn->socket != NULL, KMS_SCTP_ERROR); g_return_val_if_fail (conn->saddr != NULL, KMS_SCTP_ERROR); if (g_socket_is_connected (conn->socket)) return KMS_SCTP_OK; /* connect to server */ if (!g_socket_connect (conn->socket, conn->saddr, cancellable, err)) return KMS_SCTP_ERROR; if (G_UNLIKELY (GST_LEVEL_DEBUG <= _gst_debug_min)) { #if defined (SCTP_INITMSG) struct sctp_initmsg initmsg; socklen_t optlen; if (getsockopt (g_socket_get_fd (conn->socket), IPPROTO_SCTP, SCTP_INITMSG, &initmsg, &optlen) < 0) GST_WARNING ("Could not get SCTP configuration: %s (%d)", g_strerror (errno), errno); else GST_DEBUG ("SCTP client socket: ostreams %u, instreams %u", initmsg.sinit_num_ostreams, initmsg.sinit_num_ostreams); #else GST_WARNING ("don't know how to get the configuration of the " "SCTP initiation structure on this OS."); #endif } GST_DEBUG ("connected sctp socket"); return KMS_SCTP_OK; }
static GstFlowReturn gst_sctp_client_sink_render (GstBaseSink * bsink, GstBuffer * buf) { GstSCTPClientSink *self = GST_SCTP_CLIENT_SINK (bsink); GST_OBJECT_LOCK (self); if (!self->priv->connected) { GST_OBJECT_UNLOCK (self); return GST_FLOW_NOT_LINKED; } GST_OBJECT_UNLOCK (self); /* Ignore buffers so far. Let's focus on events and caps negotiation */ return GST_FLOW_OK; #if 0 GstSCTPClientSink *self = GST_SCTP_CLIENT_SINK (bsink); GstMapInfo map; gsize written = 0; gssize rret; GError *err = NULL; g_return_val_if_fail (g_socket_is_connected (self->priv->socket), GST_FLOW_FLUSHING); gst_buffer_map (buf, &map, GST_MAP_READ); GST_LOG_OBJECT (self, "writing %" G_GSIZE_FORMAT " bytes for buffer data", map.size); /* write buffer data */ while (written < map.size) { rret = sctp_socket_send (self->priv->socket, SCTP_DEFAULT_STREAM, self->priv->timetolive, (gchar *) map.data + written, map.size - written, self->priv->cancellable, &err); if (rret < 0) goto write_error; written += rret; } gst_buffer_unmap (buf, &map); return GST_FLOW_OK; /* ERRORS */ write_error: { GstFlowReturn ret; if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { ret = GST_FLOW_FLUSHING; GST_DEBUG_OBJECT (self, "Cancelled reading from socket"); } else { GST_ELEMENT_ERROR (self, RESOURCE, WRITE, (("Error while sending data to \"%s:%d\"."), self->priv->host, self->priv->port), ("Only %" G_GSIZE_FORMAT " of %" G_GSIZE_FORMAT " bytes written: %s", written, map.size, err->message)); ret = GST_FLOW_ERROR; } gst_buffer_unmap (buf, &map); g_clear_error (&err); return ret; } #endif }