static GstStateChangeReturn gst_imx_blitter_video_transform_change_state(GstElement *element, GstStateChange transition) { GstImxBlitterVideoTransform *blitter_video_transform = GST_IMX_BLITTER_VIDEO_TRANSFORM(element); GstImxBlitterVideoTransformClass *klass = GST_IMX_BLITTER_VIDEO_TRANSFORM_CLASS(G_OBJECT_GET_CLASS(element)); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; g_assert(blitter_video_transform != NULL); g_assert(klass->start != NULL); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: { GST_IMX_BLITTER_VIDEO_TRANSFORM_LOCK(blitter_video_transform); blitter_video_transform->initialized = TRUE; if (!(klass->start(blitter_video_transform))) { GST_ERROR_OBJECT(blitter_video_transform, "start() failed"); blitter_video_transform->initialized = FALSE; GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); return GST_STATE_CHANGE_FAILURE; } /* start() must call gst_imx_blitter_video_transform_set_blitter(), * otherwise the video transform element cannot function properly */ g_assert(blitter_video_transform->blitter != NULL); gst_imx_base_blitter_enable_crop(blitter_video_transform->blitter, blitter_video_transform->input_crop); GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); break; } default: break; } ret = GST_ELEMENT_CLASS(gst_imx_blitter_video_transform_parent_class)->change_state(element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: { GST_IMX_BLITTER_VIDEO_TRANSFORM_LOCK(blitter_video_transform); blitter_video_transform->initialized = FALSE; if ((klass->stop != NULL) && !(klass->stop(blitter_video_transform))) GST_ERROR_OBJECT(blitter_video_transform, "stop() failed"); GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); if (blitter_video_transform->blitter != NULL) { gst_object_unref(GST_OBJECT(blitter_video_transform->blitter)); blitter_video_transform->blitter = NULL; } break; } default: break; } return ret; }
static GstStateChangeReturn gst_imx_blitter_video_transform_change_state(GstElement *element, GstStateChange transition) { GstImxBlitterVideoTransform *blitter_video_transform = GST_IMX_BLITTER_VIDEO_TRANSFORM(element); GstImxBlitterVideoTransformClass *klass = GST_IMX_BLITTER_VIDEO_TRANSFORM_CLASS(G_OBJECT_GET_CLASS(element)); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; g_assert(blitter_video_transform != NULL); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: { GST_IMX_BLITTER_VIDEO_TRANSFORM_LOCK(blitter_video_transform); blitter_video_transform->initialized = TRUE; if ((klass->start != NULL) && !(klass->start(blitter_video_transform))) { GST_ERROR_OBJECT(blitter_video_transform, "start() failed"); blitter_video_transform->initialized = FALSE; GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); return GST_STATE_CHANGE_FAILURE; } if (!gst_imx_blitter_video_transform_acquire_blitter(blitter_video_transform)) { GST_ERROR_OBJECT(blitter_video_transform, "acquiring blitter failed"); GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); return GST_STATE_CHANGE_FAILURE; } GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); break; } default: break; } ret = GST_ELEMENT_CLASS(gst_imx_blitter_video_transform_parent_class)->change_state(element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: { GST_IMX_BLITTER_VIDEO_TRANSFORM_LOCK(blitter_video_transform); blitter_video_transform->last_frame_with_cropdata = FALSE; GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); break; } case GST_STATE_CHANGE_READY_TO_NULL: { GST_IMX_BLITTER_VIDEO_TRANSFORM_LOCK(blitter_video_transform); blitter_video_transform->initialized = FALSE; if ((klass->stop != NULL) && !(klass->stop(blitter_video_transform))) GST_ERROR_OBJECT(blitter_video_transform, "stop() failed"); if (blitter_video_transform->blitter != NULL) { gst_object_unref(GST_OBJECT(blitter_video_transform->blitter)); blitter_video_transform->blitter = NULL; } GST_IMX_BLITTER_VIDEO_TRANSFORM_UNLOCK(blitter_video_transform); break; } default: break; } return ret; }