Пример #1
0
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;
}
Пример #2
0
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
}