|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #ifndef DOM_CAMERA_DOMCAMERACONTROL_H |
|
6 #define DOM_CAMERA_DOMCAMERACONTROL_H |
|
7 |
|
8 #include "nsCOMPtr.h" |
|
9 #include "nsAutoPtr.h" |
|
10 #include "nsCycleCollectionParticipant.h" |
|
11 #include "mozilla/dom/CameraControlBinding.h" |
|
12 #include "ICameraControl.h" |
|
13 #include "CameraCommon.h" |
|
14 #include "DOMMediaStream.h" |
|
15 #include "AudioChannelAgent.h" |
|
16 #include "nsProxyRelease.h" |
|
17 #include "nsHashPropertyBag.h" |
|
18 #include "DeviceStorage.h" |
|
19 #include "DOMCameraControlListener.h" |
|
20 |
|
21 class nsDOMDeviceStorage; |
|
22 class nsPIDOMWindow; |
|
23 class nsIDOMBlob; |
|
24 |
|
25 namespace mozilla { |
|
26 |
|
27 namespace dom { |
|
28 class CameraCapabilities; |
|
29 class CameraPictureOptions; |
|
30 class CameraStartRecordingOptions; |
|
31 template<typename T> class Optional; |
|
32 } |
|
33 class ErrorResult; |
|
34 class StartRecordingHelper; |
|
35 |
|
36 // Main camera control. |
|
37 class nsDOMCameraControl MOZ_FINAL : public DOMMediaStream |
|
38 { |
|
39 public: |
|
40 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMCameraControl, DOMMediaStream) |
|
41 NS_DECL_ISUPPORTS_INHERITED |
|
42 |
|
43 // Because this header's filename doesn't match its C++ or DOM-facing |
|
44 // classname, we can't rely on the [Func="..."] WebIDL tag to implicitly |
|
45 // include the right header for us; instead we must explicitly include a |
|
46 // HasSupport() method in each header. We can get rid of these with the |
|
47 // Great Renaming proposed in bug 983177. |
|
48 static bool HasSupport(JSContext* aCx, JSObject* aGlobal); |
|
49 |
|
50 nsDOMCameraControl(uint32_t aCameraId, |
|
51 const dom::CameraConfiguration& aInitialConfig, |
|
52 dom::GetCameraCallback* aOnSuccess, |
|
53 dom::CameraErrorCallback* aOnError, |
|
54 nsPIDOMWindow* aWindow); |
|
55 |
|
56 void Shutdown(); |
|
57 |
|
58 nsPIDOMWindow* GetParentObject() const { return mWindow; } |
|
59 |
|
60 // Attributes. |
|
61 void GetEffect(nsString& aEffect, ErrorResult& aRv); |
|
62 void SetEffect(const nsAString& aEffect, ErrorResult& aRv); |
|
63 void GetWhiteBalanceMode(nsString& aMode, ErrorResult& aRv); |
|
64 void SetWhiteBalanceMode(const nsAString& aMode, ErrorResult& aRv); |
|
65 void GetSceneMode(nsString& aMode, ErrorResult& aRv); |
|
66 void SetSceneMode(const nsAString& aMode, ErrorResult& aRv); |
|
67 void GetFlashMode(nsString& aMode, ErrorResult& aRv); |
|
68 void SetFlashMode(const nsAString& aMode, ErrorResult& aRv); |
|
69 void GetFocusMode(nsString& aMode, ErrorResult& aRv); |
|
70 void SetFocusMode(const nsAString& aMode, ErrorResult& aRv); |
|
71 double GetZoom(ErrorResult& aRv); |
|
72 void SetZoom(double aZoom, ErrorResult& aRv); |
|
73 void GetMeteringAreas(JSContext* aCx, |
|
74 JS::MutableHandle<JS::Value> aMeteringAreas, |
|
75 ErrorResult& aRv); |
|
76 void SetMeteringAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv); |
|
77 void GetFocusAreas(JSContext* aCx, |
|
78 JS::MutableHandle<JS::Value> aFocusAreas, |
|
79 ErrorResult& aRv); |
|
80 void SetFocusAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv); |
|
81 void GetPictureSize(JSContext* aCx, |
|
82 JS::MutableHandle<JS::Value> aSize, |
|
83 ErrorResult& aRv); |
|
84 void SetPictureSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv); |
|
85 void GetThumbnailSize(JSContext* aCx, |
|
86 JS::MutableHandle<JS::Value> aSize, |
|
87 ErrorResult& aRv); |
|
88 void SetThumbnailSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv); |
|
89 double GetFocalLength(ErrorResult& aRv); |
|
90 double GetFocusDistanceNear(ErrorResult& aRv); |
|
91 double GetFocusDistanceOptimum(ErrorResult& aRv); |
|
92 double GetFocusDistanceFar(ErrorResult& aRv); |
|
93 void SetExposureCompensation(const dom::Optional<double>& aCompensation, ErrorResult& aRv); |
|
94 double GetExposureCompensation(ErrorResult& aRv); |
|
95 int32_t SensorAngle(); |
|
96 already_AddRefed<dom::CameraCapabilities> Capabilities(); |
|
97 void GetIsoMode(nsString& aMode, ErrorResult& aRv); |
|
98 void SetIsoMode(const nsAString& aMode, ErrorResult& aRv); |
|
99 |
|
100 // Unsolicited event handlers. |
|
101 dom::CameraShutterCallback* GetOnShutter(); |
|
102 void SetOnShutter(dom::CameraShutterCallback* aCb); |
|
103 dom::CameraClosedCallback* GetOnClosed(); |
|
104 void SetOnClosed(dom::CameraClosedCallback* aCb); |
|
105 dom::CameraRecorderStateChange* GetOnRecorderStateChange(); |
|
106 void SetOnRecorderStateChange(dom::CameraRecorderStateChange* aCb); |
|
107 dom::CameraPreviewStateChange* GetOnPreviewStateChange(); |
|
108 void SetOnPreviewStateChange(dom::CameraPreviewStateChange* aCb); |
|
109 dom::CameraAutoFocusMovingCallback* GetOnAutoFocusMoving(); |
|
110 void SetOnAutoFocusMoving(dom::CameraAutoFocusMovingCallback* aCb); |
|
111 dom::CameraFaceDetectionCallback* GetOnFacesDetected(); |
|
112 void SetOnFacesDetected(dom::CameraFaceDetectionCallback* aCb); |
|
113 |
|
114 // Methods. |
|
115 void SetConfiguration(const dom::CameraConfiguration& aConfiguration, |
|
116 const dom::Optional<dom::OwningNonNull<dom::CameraSetConfigurationCallback> >& aOnSuccess, |
|
117 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, |
|
118 ErrorResult& aRv); |
|
119 void AutoFocus(dom::CameraAutoFocusCallback& aOnSuccess, |
|
120 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, |
|
121 ErrorResult& aRv); |
|
122 void StartFaceDetection(ErrorResult& aRv); |
|
123 void StopFaceDetection(ErrorResult& aRv); |
|
124 void TakePicture(const dom::CameraPictureOptions& aOptions, |
|
125 dom::CameraTakePictureCallback& aOnSuccess, |
|
126 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, |
|
127 ErrorResult& aRv); |
|
128 void StartRecording(const dom::CameraStartRecordingOptions& aOptions, |
|
129 nsDOMDeviceStorage& storageArea, |
|
130 const nsAString& filename, |
|
131 dom::CameraStartRecordingCallback& aOnSuccess, |
|
132 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, |
|
133 ErrorResult& aRv); |
|
134 void StopRecording(ErrorResult& aRv); |
|
135 void ResumePreview(ErrorResult& aRv); |
|
136 void ReleaseHardware(const dom::Optional<dom::OwningNonNull<dom::CameraReleaseCallback> >& aOnSuccess, |
|
137 const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, |
|
138 ErrorResult& aRv); |
|
139 void ResumeContinuousFocus(ErrorResult& aRv); |
|
140 |
|
141 virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; |
|
142 |
|
143 protected: |
|
144 virtual ~nsDOMCameraControl(); |
|
145 |
|
146 class DOMCameraConfiguration MOZ_FINAL : public dom::CameraConfiguration |
|
147 { |
|
148 public: |
|
149 NS_INLINE_DECL_REFCOUNTING(DOMCameraConfiguration) |
|
150 |
|
151 DOMCameraConfiguration(); |
|
152 DOMCameraConfiguration(const dom::CameraConfiguration& aConfiguration); |
|
153 |
|
154 // Additional configuration options that aren't exposed to the DOM |
|
155 uint32_t mMaxFocusAreas; |
|
156 uint32_t mMaxMeteringAreas; |
|
157 |
|
158 private: |
|
159 // Private destructor, to discourage deletion outside of Release(): |
|
160 ~DOMCameraConfiguration(); |
|
161 }; |
|
162 |
|
163 friend class DOMCameraControlListener; |
|
164 friend class mozilla::StartRecordingHelper; |
|
165 |
|
166 void OnCreatedFileDescriptor(bool aSucceeded); |
|
167 |
|
168 void OnAutoFocusComplete(bool aAutoFocusSucceeded); |
|
169 void OnAutoFocusMoving(bool aIsMoving); |
|
170 void OnTakePictureComplete(nsIDOMBlob* aPicture); |
|
171 void OnFacesDetected(const nsTArray<ICameraControl::Face>& aFaces); |
|
172 |
|
173 void OnHardwareStateChange(DOMCameraControlListener::HardwareState aState); |
|
174 void OnPreviewStateChange(DOMCameraControlListener::PreviewState aState); |
|
175 void OnRecorderStateChange(CameraControlListener::RecorderState aState, int32_t aStatus, int32_t aTrackNum); |
|
176 void OnConfigurationChange(DOMCameraConfiguration* aConfiguration); |
|
177 void OnShutter(); |
|
178 void OnError(CameraControlListener::CameraErrorContext aContext, const nsAString& mError); |
|
179 |
|
180 bool IsWindowStillActive(); |
|
181 |
|
182 nsresult NotifyRecordingStatusChange(const nsString& aMsg); |
|
183 |
|
184 nsRefPtr<ICameraControl> mCameraControl; // non-DOM camera control |
|
185 |
|
186 // An agent used to join audio channel service. |
|
187 nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent; |
|
188 |
|
189 nsresult Set(JSContext* aCx, uint32_t aKey, const JS::Value& aValue, uint32_t aLimit); |
|
190 nsresult Get(JSContext* aCx, uint32_t aKey, JS::Value* aValue); |
|
191 |
|
192 nsRefPtr<DOMCameraConfiguration> mCurrentConfiguration; |
|
193 nsRefPtr<dom::CameraCapabilities> mCapabilities; |
|
194 |
|
195 // solicited camera control event handlers |
|
196 nsRefPtr<dom::GetCameraCallback> mGetCameraOnSuccessCb; |
|
197 nsRefPtr<dom::CameraErrorCallback> mGetCameraOnErrorCb; |
|
198 nsRefPtr<dom::CameraAutoFocusCallback> mAutoFocusOnSuccessCb; |
|
199 nsRefPtr<dom::CameraErrorCallback> mAutoFocusOnErrorCb; |
|
200 nsRefPtr<dom::CameraTakePictureCallback> mTakePictureOnSuccessCb; |
|
201 nsRefPtr<dom::CameraErrorCallback> mTakePictureOnErrorCb; |
|
202 nsRefPtr<dom::CameraStartRecordingCallback> mStartRecordingOnSuccessCb; |
|
203 nsRefPtr<dom::CameraErrorCallback> mStartRecordingOnErrorCb; |
|
204 nsRefPtr<dom::CameraReleaseCallback> mReleaseOnSuccessCb; |
|
205 nsRefPtr<dom::CameraErrorCallback> mReleaseOnErrorCb; |
|
206 nsRefPtr<dom::CameraSetConfigurationCallback> mSetConfigurationOnSuccessCb; |
|
207 nsRefPtr<dom::CameraErrorCallback> mSetConfigurationOnErrorCb; |
|
208 |
|
209 // unsolicited event handlers |
|
210 nsRefPtr<dom::CameraShutterCallback> mOnShutterCb; |
|
211 nsRefPtr<dom::CameraClosedCallback> mOnClosedCb; |
|
212 nsRefPtr<dom::CameraRecorderStateChange> mOnRecorderStateChangeCb; |
|
213 nsRefPtr<dom::CameraPreviewStateChange> mOnPreviewStateChangeCb; |
|
214 nsRefPtr<dom::CameraAutoFocusMovingCallback> mOnAutoFocusMovingCb; |
|
215 nsRefPtr<dom::CameraFaceDetectionCallback> mOnFacesDetectedCb; |
|
216 |
|
217 // Camera event listener; we only need this weak reference so that |
|
218 // we can remove the listener from the camera when we're done |
|
219 // with it. |
|
220 DOMCameraControlListener* mListener; |
|
221 |
|
222 // our viewfinder stream |
|
223 CameraPreviewMediaStream* mInput; |
|
224 |
|
225 // set once when this object is created |
|
226 nsCOMPtr<nsPIDOMWindow> mWindow; |
|
227 |
|
228 dom::CameraStartRecordingOptions mOptions; |
|
229 nsRefPtr<DeviceStorageFileDescriptor> mDSFileDescriptor; |
|
230 |
|
231 private: |
|
232 nsDOMCameraControl(const nsDOMCameraControl&) MOZ_DELETE; |
|
233 nsDOMCameraControl& operator=(const nsDOMCameraControl&) MOZ_DELETE; |
|
234 }; |
|
235 |
|
236 } // namespace mozilla |
|
237 |
|
238 #endif // DOM_CAMERA_DOMCAMERACONTROL_H |