[Multimedia] Added feature tags and fixed errors in doc-comments of MediaVision.
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia.Vision / MediaVision / MovementDetector.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 static Interop.MediaVision.Surveillance;
19
20 namespace Tizen.Multimedia.Vision
21 {
22     /// <summary>
23     /// Provides the ability to detect movement on image sources.
24     /// </summary>
25     /// <feature>http://tizen.org/feature/vision.face_recognition</feature>
26     /// <feature>http://tizen.org/feature/vision.image_recognition</feature>
27     /// <seealso cref="MovementDetectionConfiguration"/>
28     /// <since_tizen> 3 </since_tizen>
29     public class MovementDetector : SurveillanceEngine
30     {
31         private const string KeyNumberOfRegions = "NUMBER_OF_MOVEMENT_REGIONS";
32         private const string KeyRegions = "MOVEMENT_REGIONS";
33
34         private const string MovementDetectedEventType = "MV_SURVEILLANCE_EVENT_MOVEMENT_DETECTED";
35
36         /// <summary>
37         /// Initializes a new instance of the <see cref="MovementDetector"/> class.
38         /// </summary>
39         /// <exception cref="NotSupportedException">The required features are not supported.</exception>
40         /// <since_tizen> 3 </since_tizen>
41         public MovementDetector() : base(MovementDetectedEventType)
42         {
43         }
44
45         /// <summary>
46         /// Occurs when the movement detected.
47         /// </summary>
48         /// <remarks>The event handler will be executed on an internal thread.</remarks>
49         /// <since_tizen> 3 </since_tizen>
50         public event EventHandler<MovementDetectedEventArgs> Detected;
51
52         internal override void OnEventDetected(IntPtr trigger, IntPtr source, int streamId,
53             IntPtr result, IntPtr _)
54         {
55             try
56             {
57                 Detected?.Invoke(this, CreateMovementDetectedEventArgs(result));
58             }
59             catch (Exception e)
60             {
61                 MultimediaLog.Error(MediaVisionLog.Tag, "Failed to invoke Recognized event.", e);
62             }
63         }
64
65         private static Rectangle[] RetrieveAreas(IntPtr result)
66         {
67             int count = 0;
68             GetResultValue(result, KeyNumberOfRegions, out count).Validate("Failed to get result count");
69
70             if (count == 0)
71             {
72                 return new Rectangle[0];
73             }
74
75             var rects = new global::Interop.MediaVision.Rectangle[count];
76
77             GetResultValue(result, KeyRegions, rects).Validate("Failed to get regions");
78
79             return global::Interop.ToApiStruct(rects);
80         }
81
82         private static MovementDetectedEventArgs CreateMovementDetectedEventArgs(IntPtr result)
83         {
84             return new MovementDetectedEventArgs(RetrieveAreas(result));
85         }
86
87
88         /// <summary>
89         /// Adds <see cref="SurveillanceSource"/>.
90         /// </summary>
91         /// <param name="source">The source used for recognition.</param>
92         /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception>
93         /// <exception cref="ObjectDisposedException">The <see cref="MovementDetector"/> has already been disposed of.</exception>
94         /// <see cref="SurveillanceSource.Push(MediaVisionSource)"/>
95         /// <since_tizen> 3 </since_tizen>
96         public void AddSource(SurveillanceSource source)
97         {
98             AddSource(source, null);
99         }
100
101         /// <summary>
102         /// Adds <see cref="SurveillanceSource"/> with the provided <see cref="MovementDetectionConfiguration"/>.
103         /// </summary>
104         /// <param name="source">The source used for recognition.</param>
105         /// <param name="config">The config for the <paramref name="source"/>. This value can be null.</param>
106         /// <exception cref="ArgumentNullException"><paramref name="source"/> is null.</exception>
107         /// <exception cref="ObjectDisposedException">
108         ///     The <see cref="MovementDetector"/> has already been disposed of.<br/>
109         ///     -or-<br/>
110         ///     <paramref name="config"/> has already been disposed of.
111         /// </exception>
112         /// <see cref="SurveillanceSource.Push(MediaVisionSource)"/>
113         /// <since_tizen> 3 </since_tizen>
114         public void AddSource(SurveillanceSource source, MovementDetectionConfiguration config)
115         {
116             InvokeAddSource(source, config);
117         }
118
119     }
120 }