[MediaVision] Refactoring
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia / MediaVision / ImageTrackingModel.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using System.IO;
19 using InteropModel = Interop.MediaVision.ImageTrackingModel;
20
21 namespace Tizen.Multimedia
22 {
23     /// <summary>
24     /// Represents the image tracking model interface.
25     /// </summary>
26     public class ImageTrackingModel : IDisposable
27     {
28         private IntPtr _handle = IntPtr.Zero;
29         private bool _disposed = false;
30
31         /// <summary>
32         /// Initializes a new instance of the <see cref="ImageTrackingModel"/> class.
33         /// </summary>
34         /// <exception cref="NotSupportedException">The feature is not supported.</exception>
35         public ImageTrackingModel()
36         {
37             InteropModel.Create(out _handle).Validate("Failed to create FaceTrackingModel");
38         }
39
40         /// <summary>
41         /// Initializes a new instance of the <see cref="ImageTrackingModel"/> class with the specified path.
42         /// </summary>
43         /// <remarks>
44         /// Model have been saved by <see cref="Save()"/> can be loaded.
45         /// </remarks>
46         /// <param name="modelPath">Path to the model to load.</param>
47         /// <exception cref="ArgumentNullException"><paramref name="modelPath"/> is null.</exception>
48         /// <exception cref="System.IO.FileNotFoundException"><paramref name="modelPath"/> is invalid.</exception>
49         /// <exception cref="NotSupportedException">
50         ///     The feature is not supported.\n
51         ///     - or -\n
52         ///     <paramref name="modelPath"/> is not supported format.
53         /// </exception>
54         /// <exception cref="UnauthorizedAccessException">No permission to access the specified file.</exception>
55         /// <seealso cref="Save()"/>
56         public ImageTrackingModel(string modelPath)
57         {
58             if (modelPath == null)
59             {
60                 throw new ArgumentNullException(nameof(modelPath));
61             }
62             InteropModel.Load(modelPath, out _handle).Validate("Failed to load ImageTrackingModel from file");
63         }
64
65         ~ImageTrackingModel()
66         {
67             Dispose(false);
68         }
69
70         /// <summary>
71         /// Sets target of image tracking model.\n
72         /// Sets image object which will be tracked by using tracking functionality with this tracking model.
73         /// </summary>
74         /// <param name="imageObject">Image object which will be set as the target for tracking.</param>
75         /// <exception cref="ArgumentNullException"><paramref name="imageObject"/> is null.</exception>
76         /// <exception cref="ObjectDisposedException">
77         ///     The <see cref="ImageTrackingModel"/> has already been disposed of.\n
78         ///     - or -\n
79         ///     <paramref name="imageObject"/> has already been disposed of.
80         /// </exception>
81         public void SetTarget(ImageObject imageObject)
82         {
83             if (imageObject == null)
84             {
85                 throw new ArgumentNullException(nameof(imageObject));
86             }
87
88             InteropModel.SetTarget(imageObject.Handle, Handle).
89                 Validate("Failed to set target of image tracking model");
90         }
91
92         /// <summary>
93         /// Refreshes the state of image tracking model.\n
94         /// Clears moving history and change state to undetected. It is usually called each time before tracking is started
95         /// for the new sequence of sources which is not the direct continuation of the sequence for which tracking has been performed before.
96         /// Tracking algorithm will try to find image by itself.
97         /// </summary>
98         /// <exception cref="ObjectDisposedException">The <see cref="ImageTrackingModel"/> has already been disposed of.</exception>
99         public void Refresh()
100         {
101             InteropModel.Refresh(Handle, IntPtr.Zero).Validate("Failed to refresh state");
102         }
103
104         /// <summary>
105         /// Saves tracking model to the file.
106         /// </summary>
107         /// <param name="path">Path to the file to save the model.</param>
108         /// <exception cref="ArgumentNullException"><paramref name="path"/> is null.</exception>
109         /// <exception cref="UnauthorizedAccessException">No permission to write to the specified path.</exception>
110         /// <exception cref="ObjectDisposedException">The <see cref="ImageTrackingModel"/> has already been disposed of.</exception>
111         /// <exception cref="DirectoryNotFoundException">The directory for <paramref name="path"/> does not exist.</exception>
112         public void Save(string path)
113         {
114             if (path == null)
115             {
116                 throw new ArgumentNullException(path);
117             }
118
119             var ret = InteropModel.Save(path, Handle);
120
121             if (ret == MediaVisionError.InvalidPath)
122             {
123                 throw new DirectoryNotFoundException($"The directory for the path({path}) does not exist.");
124             }
125
126             ret.Validate("Failed to save tracking model to file");
127         }
128
129         public void Dispose()
130         {
131             Dispose(true);
132             GC.SuppressFinalize(this);
133         }
134
135         protected virtual void Dispose(bool disposing)
136         {
137             if (_disposed)
138             {
139                 return;
140             }
141
142             InteropModel.Destroy(_handle);
143             _disposed = true;
144         }
145
146         internal IntPtr Handle
147         {
148             get
149             {
150                 if (_disposed)
151                 {
152                     throw new ObjectDisposedException(nameof(ImageTrackingModel));
153                 }
154                 return _handle;
155             }
156         }
157     }
158 }