protected override void DoDisable()
    {
        if (sensorDevice_ != null)
        {
            sensorDevice_.Stop();
        }
        if (cameraDevice_ != null)
        {
            cameraDevice_.Stop();
        }
        if (cameraImageDrawer_ != null)
        {
            cameraImageDrawer_.Stop();
        }
        if (self_ != IntPtr.Zero)
        {
            sarSmartar_SarSmartARController_sarDoDisable(self_);
        }
        if (cameraDevice_ != null)
        {
            cameraDevice_.Dispose();
            cameraDevice_ = null;
        }

        base.DoDisable();
    }
    protected override void DoEnable()
    {
        if (enabled_)
        {
            return;
        }

        if (smartInitFailed_)
        {
            return;
        }
        if (self_ == IntPtr.Zero)
        {
            return;
        }

        // Create CameraDevice
        cameraDevice_ = new smartar.CameraDevice(smart_, cameraDeviceSettings.cameraId, forceOldAndroidCameraAPI_);

        cameraDevice_.GetRotation(out cameraRotation_);
        int frontCameraId;

        smartar.CameraDevice.GetDefaultCameraId(smart_, smartar.Facing.FACING_FRONT, out frontCameraId, forceOldAndroidCameraAPI_);
        isFront_ = frontCameraId != smartar.CameraDevice.INVALID_CAMERA_ID && cameraDeviceSettings.cameraId == frontCameraId;

#if UNITY_ANDROID && !UNITY_EDITOR
        // get camera hw support
        int apiLevel = 0;
        int feature  = -1;
        androidCameraFeature.androidCanUseNewAPI_ = cameraDevice_.IsAndroidCamera2Available(smart_, isFront_, out apiLevel, out feature);
        cameraDevice_.GetAndroidCameraAPIFeature(out apiLevel, out feature);
        androidCameraFeature.androidCameraApiLevel_  = apiLevel;
        androidCameraFeature.androidCameraHwFeature_ = feature;
#endif

        if (cameraDeviceSettings.videoImageSize.x != 0 && cameraDeviceSettings.videoImageSize.y != 0)
        {
            cameraDevice_.SetVideoImageSize((int)cameraDeviceSettings.videoImageSize.x, (int)cameraDeviceSettings.videoImageSize.y);
        }
        ConfigCameraDevice(cameraDeviceSettings, true);

        isFlipX_ = false;
        isFlipY_ = false;
        if (isFront_)
        {
#if UNITY_IOS && !UNITY_EDITOR
            isFlipY_ = true;
#elif UNITY_EDITOR || UNITY_STANDALONE_WIN
            // NOOP
#else
            if (cameraRotation_ == smartar.Rotation.ROTATION_0 || cameraRotation_ == smartar.Rotation.ROTATION_90)
            {
                isFlipX_ = true;
            }
            else
            {
                isFlipY_ = true;
            }
#endif
        }
        cameraImageDrawer_.SetFlipX(isFlipX_);
        cameraImageDrawer_.SetFlipY(isFlipY_);

        // Setup Recognizer
        smartar.CameraDeviceInfo cameraInfo = new smartar.CameraDeviceInfo();
        cameraDevice_.GetDeviceInfo(cameraInfo);
        recognizer_.SetCameraDeviceInfo(cameraInfo);

        // Enable native instance
        sarSmartar_SarSmartARController_sarDoEnable(self_, cameraDevice_.self_);

        // set listener
        cameraDevice_.SetStillImageListener(new StillImageListener(createCaptureImagePath(), smart_));
        cameraDevice_.SetAutoFocusListener(new AutoFocusListener());
        cameraDevice_.SetAutoExposureListener(new AutoExposureListener());
        cameraDevice_.SetAutoWhiteBalanceListener(new AutoWhiteBalanceListener());

        // Start components
        cameraImageDrawer_.Start();
        landmarkDrawer_.Start();
        cameraDevice_.Start();
        sensorDevice_.Start();

        if (GetComponent <Camera>().clearFlags != CameraClearFlags.Depth && GetComponent <Camera>().clearFlags != CameraClearFlags.Nothing)
        {
            GetComponent <Camera>().clearFlags = CameraClearFlags.Depth;
        }

        enabled_ = true;
    }