static gboolean stop (GstBaseSrc *gst_base) { GstOmxBaseSrc *self; self = GST_OMX_BASE_SRC (gst_base); GST_LOG_OBJECT (self, "begin"); g_omx_core_stop (self->gomx); g_omx_core_unload (self->gomx); if (self->gomx->omx_error) return GST_STATE_CHANGE_FAILURE; GST_LOG_OBJECT (self, "end"); return TRUE; }
static GstStateChangeReturn change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstOmxBaseSink *self; self = GST_OMX_BASE_SINK (element); GST_LOG_OBJECT (self, "begin"); GST_INFO_OBJECT (self, "changing state %s - %s", gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!self->initialized) { if (!omx_init (self)) return GST_PAD_LINK_REFUSED; self->initialized = TRUE; } g_omx_core_prepare (self->gomx); break; case GST_STATE_CHANGE_READY_TO_PAUSED: g_omx_core_start (self->gomx); break; case GST_STATE_CHANGE_PAUSED_TO_READY: g_omx_port_finish (self->in_port); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto leave; switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: g_omx_port_pause (self->in_port); break; case GST_STATE_CHANGE_PAUSED_TO_READY: g_omx_core_stop (self->gomx); break; case GST_STATE_CHANGE_READY_TO_NULL: g_omx_core_unload (self->gomx); break; default: break; } leave: GST_LOG_OBJECT (self, "end"); return ret; }
static GstStateChangeReturn change_state (GstElement *element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstOmxBaseFilter *self; GOmxCore *core; self = GST_OMX_BASE_FILTER (element); core = self->gomx; GST_LOG_OBJECT (self, "begin"); GST_INFO_OBJECT (self, "changing state %s - %s", gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: g_omx_core_init (core, self->omx_library, self->omx_component); if (core->omx_state != OMX_StateLoaded) { ret = GST_STATE_CHANGE_FAILURE; goto leave; } break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto leave; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: g_mutex_lock (self->ready_lock); if (self->ready) { /* unlock */ g_omx_port_finish (self->in_port); g_omx_port_finish (self->out_port); g_omx_core_stop (core); g_omx_core_unload (core); self->ready = FALSE; } g_mutex_unlock (self->ready_lock); if (core->omx_state != OMX_StateLoaded && core->omx_state != OMX_StateInvalid) { ret = GST_STATE_CHANGE_FAILURE; goto leave; } break; case GST_STATE_CHANGE_READY_TO_NULL: g_omx_core_deinit (core); break; default: break; } leave: GST_LOG_OBJECT (self, "end"); return ret; }
static GstStateChangeReturn change_state (GstElement *element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstOmxBaseFilter21 *self; GOmxCore *core; int i; self = GST_OMX_BASE_FILTER21(element); core = self->gomx; printf("begin: changing state %s -> %s\n", gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); GST_INFO_OBJECT (self, "begin: changing state %s -> %s", gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: g_omx_core_init (core); if (core->omx_state != OMX_StateLoaded) { ret = GST_STATE_CHANGE_FAILURE; goto leave; } break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_collect_pads_start(self->collectpads); break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_collect_pads_stop(self->collectpads); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) goto leave; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: printf("Paused to ready\n"); g_mutex_lock (self->ready_lock); if (self->ready) { /* unlock */ for (i = 0; i < NUM_INPUTS; i++){ g_omx_port_finish (self->in_port[i]); } g_omx_port_finish (self->out_port); g_omx_core_stop (core); g_omx_core_unload (core); self->ready = FALSE; } g_mutex_unlock (self->ready_lock); if (core->omx_state != OMX_StateLoaded && core->omx_state != OMX_StateInvalid) { ret = GST_STATE_CHANGE_FAILURE; goto leave; } break; case GST_STATE_CHANGE_READY_TO_NULL: g_omx_core_deinit (core); break; default: break; } leave: GST_LOG_OBJECT (self, "end"); return ret; }