static GstStateChangeReturn gst_base_camera_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstBaseCameraSrc *self = GST_BASE_CAMERA_SRC (element); GST_DEBUG_OBJECT (self, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; if (self->preview_pipeline == NULL) { /* failed to create preview pipeline, fail state change */ return GST_STATE_CHANGE_FAILURE; } if (self->preview_caps) { GST_DEBUG_OBJECT (self, "Setting preview pipeline caps %" GST_PTR_FORMAT, self->preview_caps); gst_camerabin_preview_set_caps (self->preview_pipeline, self->preview_caps); } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; /* without this the preview pipeline will not post buffer * messages on the pipeline */ gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_PLAYING); if (self->auto_start) g_signal_emit_by_name (G_OBJECT (self), "start-capture", NULL); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_READY); if (self->auto_start) g_signal_emit_by_name (G_OBJECT (self), "stop-capture", NULL); break; case GST_STATE_CHANGE_READY_TO_NULL: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_NULL); break; default: break; } return ret; }
static GstStateChangeReturn gst_base_camera_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstBaseCameraBinSrc *self = GST_BASE_CAMERA_SRC (element); GST_DEBUG_OBJECT (self, "%d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; /* recreate the preview pipeline */ if (self->preview_pipeline && self->preview_filter_changed) { gst_camerabin_destroy_preview_pipeline (self->preview_pipeline); self->preview_pipeline = NULL; } if (self->preview_pipeline == NULL) self->preview_pipeline = gst_camerabin_create_preview_pipeline (GST_ELEMENT_CAST (self), self->preview_filter); g_assert (self->preview_pipeline != NULL); self->preview_filter_changed = FALSE; if (self->preview_caps) { GST_DEBUG_OBJECT (self, "Setting preview pipeline caps %" GST_PTR_FORMAT, self->preview_caps); gst_camerabin_preview_set_caps (self->preview_pipeline, self->preview_caps); } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_PLAYING); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_NULL); break; default: break; } return ret; }
/** * gst_base_camera_src_setup_preview: * @self: camerasrc bin * @preview_caps: preview caps to set * * Apply preview caps to preview pipeline and to video source. */ void gst_base_camera_src_setup_preview (GstBaseCameraBinSrc * self, GstCaps * preview_caps) { GstBaseCameraBinSrcClass *bclass = GST_BASE_CAMERA_SRC_GET_CLASS (self); if (self->preview_pipeline) { GST_DEBUG_OBJECT (self, "Setting preview pipeline caps %" GST_PTR_FORMAT, self->preview_caps); gst_camerabin_preview_set_caps (self->preview_pipeline, preview_caps); } if (bclass->set_preview) bclass->set_preview (self, preview_caps); }