static GstFlowReturn gst_shm_src_create (GstPushSrc * psrc, GstBuffer ** outbuf) { GstShmSrc *self = GST_SHM_SRC (psrc); gchar *buf = NULL; int rv = 0; struct GstShmBuffer *gsb; do { if (gst_poll_wait (self->poll, GST_CLOCK_TIME_NONE) < 0) { if (errno == EBUSY) return GST_FLOW_FLUSHING; GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Failed to read from shmsrc"), ("Poll failed on fd: %s", strerror (errno))); return GST_FLOW_ERROR; } if (self->unlocked) return GST_FLOW_FLUSHING; if (gst_poll_fd_has_closed (self->poll, &self->pollfd)) { GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Failed to read from shmsrc"), ("Control socket has closed")); return GST_FLOW_ERROR; } if (gst_poll_fd_has_error (self->poll, &self->pollfd)) { GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Failed to read from shmsrc"), ("Control socket has error")); return GST_FLOW_ERROR; } if (gst_poll_fd_can_read (self->poll, &self->pollfd)) { buf = NULL; GST_LOG_OBJECT (self, "Reading from pipe"); GST_OBJECT_LOCK (self); rv = sp_client_recv (self->pipe->pipe, &buf); GST_OBJECT_UNLOCK (self); if (rv < 0) { GST_ELEMENT_ERROR (self, RESOURCE, READ, ("Failed to read from shmsrc"), ("Error reading control data: %d", rv)); return GST_FLOW_ERROR; } } } while (buf == NULL); GST_LOG_OBJECT (self, "Got buffer %p of size %d", buf, rv); gsb = g_slice_new0 (struct GstShmBuffer); gsb->buf = buf; gsb->pipe = self->pipe; gst_shm_pipe_inc (self->pipe); *outbuf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, buf, rv, 0, rv, gsb, free_buffer); return GST_FLOW_OK; }
static gboolean shm_reader_fd_cb (GIOChannel *source, GIOCondition condition, gpointer data) { ShmReaderPrivate *priv = SHM_READER (data)->priv; if (condition & G_IO_IN) { gchar *buf; gulong ret; ret = sp_client_recv (priv->client, &buf); if (ret == -1) { goto error; } else if (ret > 0) { g_signal_emit (data, signals[SIGNAL_GOT_DATA], 0, ret, buf); if (sp_client_recv_finish (priv->client, buf) == 0) goto error; } /* else: it was a system message and already handled */ } else if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) { goto error; } return TRUE; error: shm_reader_disconnect (data); return FALSE; }