static void gst_shm_src_stop_reading (GstShmSrc * self) { GST_DEBUG_OBJECT (self, "Stopping %p", self); if (self->pipe) { gst_shm_pipe_dec (self->pipe); self->pipe = NULL; } gst_poll_remove_fd (self->poll, &self->pollfd); gst_poll_fd_init (&self->pollfd); gst_poll_set_flushing (self->poll, TRUE); }
static void free_buffer (gpointer data) { struct GstShmBuffer *gsb = data; g_return_if_fail (gsb->pipe != NULL); g_return_if_fail (gsb->pipe->src != NULL); GST_LOG ("Freeing buffer %p", gsb->buf); GST_OBJECT_LOCK (gsb->pipe->src); sp_client_recv_finish (gsb->pipe->pipe, gsb->buf); GST_OBJECT_UNLOCK (gsb->pipe->src); gst_shm_pipe_dec (gsb->pipe); g_slice_free (struct GstShmBuffer, gsb); }
static gboolean gst_shm_src_stop (GstBaseSrc * bsrc) { GstShmSrc *self = GST_SHM_SRC (bsrc); GST_DEBUG_OBJECT (self, "Stopping %p", self); if (self->pipe) { gst_shm_pipe_dec (self->pipe); self->pipe = NULL; } gst_poll_free (self->poll); self->poll = NULL; return TRUE; }
static gboolean gst_shm_src_start_reading (GstShmSrc * self) { GstShmPipe *gstpipe; if (!self->socket_path) { GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("No path specified for socket."), (NULL)); return FALSE; } gstpipe = g_slice_new0 (GstShmPipe); gstpipe->use_count = 1; gstpipe->src = gst_object_ref (self); GST_DEBUG_OBJECT (self, "Opening socket %s", self->socket_path); GST_OBJECT_LOCK (self); gstpipe->pipe = sp_client_open (self->socket_path); GST_OBJECT_UNLOCK (self); if (!gstpipe->pipe) { GST_ELEMENT_ERROR (self, RESOURCE, OPEN_READ_WRITE, ("Could not open socket %s: %d %s", self->socket_path, errno, strerror (errno)), (NULL)); gst_shm_pipe_dec (gstpipe); return FALSE; } self->pipe = gstpipe; gst_poll_set_flushing (self->poll, FALSE); gst_poll_fd_init (&self->pollfd); self->pollfd.fd = sp_get_fd (self->pipe->pipe); gst_poll_add_fd (self->poll, &self->pollfd); gst_poll_fd_ctl_read (self->poll, &self->pollfd, TRUE); return TRUE; }