[Camera] Add new Camera constructor for camera device internal selection (#5941)
authorHaesu Gwon <haesu.gwon@samsung.com>
Tue, 6 Feb 2024 07:51:51 +0000 (16:51 +0900)
committerGitHub <noreply@github.com>
Tue, 6 Feb 2024 07:51:51 +0000 (16:51 +0900)
src/Tizen.Multimedia.Camera/Camera/Camera.cs
src/Tizen.Multimedia.Camera/Camera/CameraDeviceManager.cs
src/Tizen.Multimedia.Camera/Camera/CameraEnums.cs

index c2b8925..1e73a18 100644 (file)
@@ -46,7 +46,6 @@ namespace Tizen.Multimedia
         private bool _disposed = false;
         private CameraState _state = CameraState.None;
         PinnedPreviewBuffer<byte> _previewBuffer;
-        private CameraDeviceManager _cameraDeviceManager;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="Camera"/> class.
@@ -69,12 +68,20 @@ namespace Tizen.Multimedia
         /// <summary>
         /// Initializes a new instance of the <see cref="Camera"/> class.
         /// </summary>
-        /// <remarks>CameraDevice and Type will be selected internally by CameraDeviceManager.</remarks>
-        /// <exception cref="InvalidOperationException">In case of any invalid operations.</exception>
+        /// <remarks>
+        /// If <see cref="CameraDeviceManager"/> is supported, <see cref="CameraDevice"/> will be selected automatically by internal policy.<br/>
+        /// (User can check whether CameraDeviceManager is supported or not by using <see cref="CameraDeviceManager.IsCameraDeviceManagerSupported"/>.)<br/>
+        /// But, if not, this constructor will try to create Camera instance with <see cref="CameraDevice.CameraDevice0"/> by default.
+        /// </remarks>
+        /// <exception cref="InvalidOperationException">
+        /// There's no available camera device.
+        ///     -or-<br/>
+        /// In case of any invalid operations.
+        /// </exception>
         /// <exception cref="NotSupportedException">The camera feature is not supported.</exception>
-        /// <since_tizen> 9 </since_tizen>
+        /// <since_tizen> 12 </since_tizen>
         /// <feature> http://tizen.org/feature/camera </feature>
-        [EditorBrowsable(EditorBrowsableState.Never)]
+        /// <seealso cref="CameraDeviceManager.IsCameraDeviceManagerSupported"/>
         public Camera() : this(CameraDevice.Default)
         {
         }
@@ -95,31 +102,31 @@ namespace Tizen.Multimedia
             CameraDeviceType cameraDeviceType = CameraDeviceType.BuiltIn;
             CameraDevice cameraDevice = device;
 
-            try
-            {
-                _cameraDeviceManager = new CameraDeviceManager();
-            }
-            catch (NotSupportedException)
-            {
-                Log.Info(CameraLog.Tag,
-                    $"CameraDeviceManager is not supported. Not error.");
-            }
-
-            if (_cameraDeviceManager != null)
+            if (device == CameraDevice.Default)
             {
-                var deviceInfo = _cameraDeviceManager.SupportedDevices;
-
-                // CameraDeviceManager is not used internally anymore.
-                _cameraDeviceManager.Dispose();
+                var deviceInfo = Enumerable.Empty<CameraDeviceInformation>();
 
-                if (!deviceInfo.Any())
+                try
                 {
-                    throw new InvalidOperationException("CameraDeviceManager is supported but, there's no available camera device.");
+                    using (var cameraDeviceManager = new CameraDeviceManager())
+                    {
+                        deviceInfo = cameraDeviceManager.SupportedDevices;
+                    }
+
+                    if (!deviceInfo.Any())
+                    {
+                        throw new InvalidOperationException("CameraDeviceManager is supported but, there's no available camera device.");
+                    }
+
+                    cameraDeviceType = deviceInfo.First().Type;
+                    cameraDevice = deviceInfo.First().Device;
+                    Log.Debug(CameraLog.Tag, $"Type:[{cameraDeviceType}], Auto selected camera device:[{cameraDevice}]");
+                }
+                catch (NotSupportedException)
+                {
+                    Log.Debug(CameraLog.Tag, "CameraDeviceManager is not supported. Try to create Camera instance by CameraDevice0.");
+                    cameraDevice = CameraDevice.CameraDevice0;
                 }
-
-                cameraDeviceType = deviceInfo.First().Type;
-                cameraDevice = deviceInfo.First().Device;
-                Log.Debug(CameraLog.Tag, $"Type:[{cameraDeviceType}], Device:[{cameraDevice}]");
             }
 
             CreateNativeCameraDevice(cameraDeviceType, cameraDevice);
index 535a781..0918110 100644 (file)
@@ -66,6 +66,28 @@ namespace Tizen.Multimedia
                             .Any();
 
         /// <summary>
+        /// Gets the state of Camera Device Manager support.
+        /// </summary>
+        /// <returns>true if camera device manager is supported.</returns>
+        /// <since_tizen> 11 </since_tizen>
+        public static bool IsCameraDeviceManagerSupported
+        {
+            get
+            {
+                try
+                {
+                    using (var cameraDeviceManager = new CameraDeviceManager()) {}
+                }
+                catch (NotSupportedException)
+                {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+
+        /// <summary>
         /// Retrieves all the supported camera devices and returns its information.
         /// </summary>
         /// <returns>
index fecfb36..29c2314 100644 (file)
@@ -26,7 +26,7 @@ namespace Tizen.Multimedia
     public enum CameraDevice
     {
         /// <summary>
-        /// The CameraDevice will be decided internally by target policy.
+        /// The CameraDevice will be decided automatically by internal policy, if CameraDeviceManager is supported.
         /// </summary>
         /// <since_tizen> 9 </since_tizen>
         [EditorBrowsable(EditorBrowsableState.Never)]