static void gst_v4l2_transform_close (GstV4l2Transform * self) { GST_DEBUG_OBJECT (self, "Closing"); gst_v4l2_object_close (self->v4l2output); gst_v4l2_object_close (self->v4l2capture); gst_caps_replace (&self->probed_srccaps, NULL); gst_caps_replace (&self->probed_srccaps, NULL); }
static gboolean gst_v4l2_video_dec_open (GstVideoDecoder * decoder) { GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (decoder); GST_DEBUG_OBJECT (self, "Opening"); if (!gst_v4l2_object_open (self->v4l2output)) goto failure; if (!gst_v4l2_object_open_shared (self->v4l2capture, self->v4l2output)) goto failure; self->probed_sinkcaps = gst_v4l2_object_get_caps (self->v4l2output, gst_v4l2_object_get_codec_caps ()); if (gst_caps_is_empty (self->probed_sinkcaps)) goto no_encoded_format; self->probed_srccaps = gst_v4l2_object_get_caps (self->v4l2capture, gst_v4l2_object_get_raw_caps ()); if (gst_caps_is_empty (self->probed_srccaps)) goto no_raw_format; return TRUE; no_encoded_format: GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS, (_("Encoder on device %s has no supported input format"), self->v4l2output->videodev), (NULL)); goto failure; no_raw_format: GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS, (_("Encoder on device %s has no supported output format"), self->v4l2output->videodev), (NULL)); goto failure; failure: if (GST_V4L2_IS_OPEN (self->v4l2output)) gst_v4l2_object_close (self->v4l2output); if (GST_V4L2_IS_OPEN (self->v4l2capture)) gst_v4l2_object_close (self->v4l2capture); gst_caps_replace (&self->probed_srccaps, NULL); gst_caps_replace (&self->probed_sinkcaps, NULL); return FALSE; }
static gboolean gst_v4l2_video_dec_close (GstVideoDecoder * decoder) { GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (decoder); GST_DEBUG_OBJECT (self, "Closing"); gst_v4l2_object_close (self->v4l2output); gst_v4l2_object_close (self->v4l2capture); gst_caps_replace (&self->probed_srccaps, NULL); gst_caps_replace (&self->probed_sinkcaps, NULL); return TRUE; }
static GstStateChangeReturn gst_v4l2src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstV4l2Src *v4l2src = GST_V4L2SRC (element); GstV4l2Object *obj = v4l2src->v4l2object; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /* open the device */ if (!gst_v4l2_object_open (obj)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: /* close the device */ if (!gst_v4l2_object_close (obj)) return GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; }
static GstStateChangeReturn gst_v4l2sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstV4l2Sink *v4l2sink = GST_V4L2SINK (element); GST_DEBUG_OBJECT (v4l2sink, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: /* open the device */ if (!gst_v4l2_object_open (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: if (!gst_v4l2_object_stop (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_READY_TO_NULL: /* we need to call stop here too */ if (!gst_v4l2_object_stop (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; /* close the device */ if (!gst_v4l2_object_close (v4l2sink->v4l2object)) return GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; }