1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/camera/DOMCameraControl.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,238 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#ifndef DOM_CAMERA_DOMCAMERACONTROL_H 1.9 +#define DOM_CAMERA_DOMCAMERACONTROL_H 1.10 + 1.11 +#include "nsCOMPtr.h" 1.12 +#include "nsAutoPtr.h" 1.13 +#include "nsCycleCollectionParticipant.h" 1.14 +#include "mozilla/dom/CameraControlBinding.h" 1.15 +#include "ICameraControl.h" 1.16 +#include "CameraCommon.h" 1.17 +#include "DOMMediaStream.h" 1.18 +#include "AudioChannelAgent.h" 1.19 +#include "nsProxyRelease.h" 1.20 +#include "nsHashPropertyBag.h" 1.21 +#include "DeviceStorage.h" 1.22 +#include "DOMCameraControlListener.h" 1.23 + 1.24 +class nsDOMDeviceStorage; 1.25 +class nsPIDOMWindow; 1.26 +class nsIDOMBlob; 1.27 + 1.28 +namespace mozilla { 1.29 + 1.30 +namespace dom { 1.31 + class CameraCapabilities; 1.32 + class CameraPictureOptions; 1.33 + class CameraStartRecordingOptions; 1.34 + template<typename T> class Optional; 1.35 +} 1.36 +class ErrorResult; 1.37 +class StartRecordingHelper; 1.38 + 1.39 +// Main camera control. 1.40 +class nsDOMCameraControl MOZ_FINAL : public DOMMediaStream 1.41 +{ 1.42 +public: 1.43 + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMCameraControl, DOMMediaStream) 1.44 + NS_DECL_ISUPPORTS_INHERITED 1.45 + 1.46 + // Because this header's filename doesn't match its C++ or DOM-facing 1.47 + // classname, we can't rely on the [Func="..."] WebIDL tag to implicitly 1.48 + // include the right header for us; instead we must explicitly include a 1.49 + // HasSupport() method in each header. We can get rid of these with the 1.50 + // Great Renaming proposed in bug 983177. 1.51 + static bool HasSupport(JSContext* aCx, JSObject* aGlobal); 1.52 + 1.53 + nsDOMCameraControl(uint32_t aCameraId, 1.54 + const dom::CameraConfiguration& aInitialConfig, 1.55 + dom::GetCameraCallback* aOnSuccess, 1.56 + dom::CameraErrorCallback* aOnError, 1.57 + nsPIDOMWindow* aWindow); 1.58 + 1.59 + void Shutdown(); 1.60 + 1.61 + nsPIDOMWindow* GetParentObject() const { return mWindow; } 1.62 + 1.63 + // Attributes. 1.64 + void GetEffect(nsString& aEffect, ErrorResult& aRv); 1.65 + void SetEffect(const nsAString& aEffect, ErrorResult& aRv); 1.66 + void GetWhiteBalanceMode(nsString& aMode, ErrorResult& aRv); 1.67 + void SetWhiteBalanceMode(const nsAString& aMode, ErrorResult& aRv); 1.68 + void GetSceneMode(nsString& aMode, ErrorResult& aRv); 1.69 + void SetSceneMode(const nsAString& aMode, ErrorResult& aRv); 1.70 + void GetFlashMode(nsString& aMode, ErrorResult& aRv); 1.71 + void SetFlashMode(const nsAString& aMode, ErrorResult& aRv); 1.72 + void GetFocusMode(nsString& aMode, ErrorResult& aRv); 1.73 + void SetFocusMode(const nsAString& aMode, ErrorResult& aRv); 1.74 + double GetZoom(ErrorResult& aRv); 1.75 + void SetZoom(double aZoom, ErrorResult& aRv); 1.76 + void GetMeteringAreas(JSContext* aCx, 1.77 + JS::MutableHandle<JS::Value> aMeteringAreas, 1.78 + ErrorResult& aRv); 1.79 + void SetMeteringAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv); 1.80 + void GetFocusAreas(JSContext* aCx, 1.81 + JS::MutableHandle<JS::Value> aFocusAreas, 1.82 + ErrorResult& aRv); 1.83 + void SetFocusAreas(JSContext* aCx, JS::Handle<JS::Value> aAreas, ErrorResult& aRv); 1.84 + void GetPictureSize(JSContext* aCx, 1.85 + JS::MutableHandle<JS::Value> aSize, 1.86 + ErrorResult& aRv); 1.87 + void SetPictureSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv); 1.88 + void GetThumbnailSize(JSContext* aCx, 1.89 + JS::MutableHandle<JS::Value> aSize, 1.90 + ErrorResult& aRv); 1.91 + void SetThumbnailSize(JSContext* aCx, JS::Handle<JS::Value> aSize, ErrorResult& aRv); 1.92 + double GetFocalLength(ErrorResult& aRv); 1.93 + double GetFocusDistanceNear(ErrorResult& aRv); 1.94 + double GetFocusDistanceOptimum(ErrorResult& aRv); 1.95 + double GetFocusDistanceFar(ErrorResult& aRv); 1.96 + void SetExposureCompensation(const dom::Optional<double>& aCompensation, ErrorResult& aRv); 1.97 + double GetExposureCompensation(ErrorResult& aRv); 1.98 + int32_t SensorAngle(); 1.99 + already_AddRefed<dom::CameraCapabilities> Capabilities(); 1.100 + void GetIsoMode(nsString& aMode, ErrorResult& aRv); 1.101 + void SetIsoMode(const nsAString& aMode, ErrorResult& aRv); 1.102 + 1.103 + // Unsolicited event handlers. 1.104 + dom::CameraShutterCallback* GetOnShutter(); 1.105 + void SetOnShutter(dom::CameraShutterCallback* aCb); 1.106 + dom::CameraClosedCallback* GetOnClosed(); 1.107 + void SetOnClosed(dom::CameraClosedCallback* aCb); 1.108 + dom::CameraRecorderStateChange* GetOnRecorderStateChange(); 1.109 + void SetOnRecorderStateChange(dom::CameraRecorderStateChange* aCb); 1.110 + dom::CameraPreviewStateChange* GetOnPreviewStateChange(); 1.111 + void SetOnPreviewStateChange(dom::CameraPreviewStateChange* aCb); 1.112 + dom::CameraAutoFocusMovingCallback* GetOnAutoFocusMoving(); 1.113 + void SetOnAutoFocusMoving(dom::CameraAutoFocusMovingCallback* aCb); 1.114 + dom::CameraFaceDetectionCallback* GetOnFacesDetected(); 1.115 + void SetOnFacesDetected(dom::CameraFaceDetectionCallback* aCb); 1.116 + 1.117 + // Methods. 1.118 + void SetConfiguration(const dom::CameraConfiguration& aConfiguration, 1.119 + const dom::Optional<dom::OwningNonNull<dom::CameraSetConfigurationCallback> >& aOnSuccess, 1.120 + const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, 1.121 + ErrorResult& aRv); 1.122 + void AutoFocus(dom::CameraAutoFocusCallback& aOnSuccess, 1.123 + const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, 1.124 + ErrorResult& aRv); 1.125 + void StartFaceDetection(ErrorResult& aRv); 1.126 + void StopFaceDetection(ErrorResult& aRv); 1.127 + void TakePicture(const dom::CameraPictureOptions& aOptions, 1.128 + dom::CameraTakePictureCallback& aOnSuccess, 1.129 + const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, 1.130 + ErrorResult& aRv); 1.131 + void StartRecording(const dom::CameraStartRecordingOptions& aOptions, 1.132 + nsDOMDeviceStorage& storageArea, 1.133 + const nsAString& filename, 1.134 + dom::CameraStartRecordingCallback& aOnSuccess, 1.135 + const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, 1.136 + ErrorResult& aRv); 1.137 + void StopRecording(ErrorResult& aRv); 1.138 + void ResumePreview(ErrorResult& aRv); 1.139 + void ReleaseHardware(const dom::Optional<dom::OwningNonNull<dom::CameraReleaseCallback> >& aOnSuccess, 1.140 + const dom::Optional<dom::OwningNonNull<dom::CameraErrorCallback> >& aOnError, 1.141 + ErrorResult& aRv); 1.142 + void ResumeContinuousFocus(ErrorResult& aRv); 1.143 + 1.144 + virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; 1.145 + 1.146 +protected: 1.147 + virtual ~nsDOMCameraControl(); 1.148 + 1.149 + class DOMCameraConfiguration MOZ_FINAL : public dom::CameraConfiguration 1.150 + { 1.151 + public: 1.152 + NS_INLINE_DECL_REFCOUNTING(DOMCameraConfiguration) 1.153 + 1.154 + DOMCameraConfiguration(); 1.155 + DOMCameraConfiguration(const dom::CameraConfiguration& aConfiguration); 1.156 + 1.157 + // Additional configuration options that aren't exposed to the DOM 1.158 + uint32_t mMaxFocusAreas; 1.159 + uint32_t mMaxMeteringAreas; 1.160 + 1.161 + private: 1.162 + // Private destructor, to discourage deletion outside of Release(): 1.163 + ~DOMCameraConfiguration(); 1.164 + }; 1.165 + 1.166 + friend class DOMCameraControlListener; 1.167 + friend class mozilla::StartRecordingHelper; 1.168 + 1.169 + void OnCreatedFileDescriptor(bool aSucceeded); 1.170 + 1.171 + void OnAutoFocusComplete(bool aAutoFocusSucceeded); 1.172 + void OnAutoFocusMoving(bool aIsMoving); 1.173 + void OnTakePictureComplete(nsIDOMBlob* aPicture); 1.174 + void OnFacesDetected(const nsTArray<ICameraControl::Face>& aFaces); 1.175 + 1.176 + void OnHardwareStateChange(DOMCameraControlListener::HardwareState aState); 1.177 + void OnPreviewStateChange(DOMCameraControlListener::PreviewState aState); 1.178 + void OnRecorderStateChange(CameraControlListener::RecorderState aState, int32_t aStatus, int32_t aTrackNum); 1.179 + void OnConfigurationChange(DOMCameraConfiguration* aConfiguration); 1.180 + void OnShutter(); 1.181 + void OnError(CameraControlListener::CameraErrorContext aContext, const nsAString& mError); 1.182 + 1.183 + bool IsWindowStillActive(); 1.184 + 1.185 + nsresult NotifyRecordingStatusChange(const nsString& aMsg); 1.186 + 1.187 + nsRefPtr<ICameraControl> mCameraControl; // non-DOM camera control 1.188 + 1.189 + // An agent used to join audio channel service. 1.190 + nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent; 1.191 + 1.192 + nsresult Set(JSContext* aCx, uint32_t aKey, const JS::Value& aValue, uint32_t aLimit); 1.193 + nsresult Get(JSContext* aCx, uint32_t aKey, JS::Value* aValue); 1.194 + 1.195 + nsRefPtr<DOMCameraConfiguration> mCurrentConfiguration; 1.196 + nsRefPtr<dom::CameraCapabilities> mCapabilities; 1.197 + 1.198 + // solicited camera control event handlers 1.199 + nsRefPtr<dom::GetCameraCallback> mGetCameraOnSuccessCb; 1.200 + nsRefPtr<dom::CameraErrorCallback> mGetCameraOnErrorCb; 1.201 + nsRefPtr<dom::CameraAutoFocusCallback> mAutoFocusOnSuccessCb; 1.202 + nsRefPtr<dom::CameraErrorCallback> mAutoFocusOnErrorCb; 1.203 + nsRefPtr<dom::CameraTakePictureCallback> mTakePictureOnSuccessCb; 1.204 + nsRefPtr<dom::CameraErrorCallback> mTakePictureOnErrorCb; 1.205 + nsRefPtr<dom::CameraStartRecordingCallback> mStartRecordingOnSuccessCb; 1.206 + nsRefPtr<dom::CameraErrorCallback> mStartRecordingOnErrorCb; 1.207 + nsRefPtr<dom::CameraReleaseCallback> mReleaseOnSuccessCb; 1.208 + nsRefPtr<dom::CameraErrorCallback> mReleaseOnErrorCb; 1.209 + nsRefPtr<dom::CameraSetConfigurationCallback> mSetConfigurationOnSuccessCb; 1.210 + nsRefPtr<dom::CameraErrorCallback> mSetConfigurationOnErrorCb; 1.211 + 1.212 + // unsolicited event handlers 1.213 + nsRefPtr<dom::CameraShutterCallback> mOnShutterCb; 1.214 + nsRefPtr<dom::CameraClosedCallback> mOnClosedCb; 1.215 + nsRefPtr<dom::CameraRecorderStateChange> mOnRecorderStateChangeCb; 1.216 + nsRefPtr<dom::CameraPreviewStateChange> mOnPreviewStateChangeCb; 1.217 + nsRefPtr<dom::CameraAutoFocusMovingCallback> mOnAutoFocusMovingCb; 1.218 + nsRefPtr<dom::CameraFaceDetectionCallback> mOnFacesDetectedCb; 1.219 + 1.220 + // Camera event listener; we only need this weak reference so that 1.221 + // we can remove the listener from the camera when we're done 1.222 + // with it. 1.223 + DOMCameraControlListener* mListener; 1.224 + 1.225 + // our viewfinder stream 1.226 + CameraPreviewMediaStream* mInput; 1.227 + 1.228 + // set once when this object is created 1.229 + nsCOMPtr<nsPIDOMWindow> mWindow; 1.230 + 1.231 + dom::CameraStartRecordingOptions mOptions; 1.232 + nsRefPtr<DeviceStorageFileDescriptor> mDSFileDescriptor; 1.233 + 1.234 +private: 1.235 + nsDOMCameraControl(const nsDOMCameraControl&) MOZ_DELETE; 1.236 + nsDOMCameraControl& operator=(const nsDOMCameraControl&) MOZ_DELETE; 1.237 +}; 1.238 + 1.239 +} // namespace mozilla 1.240 + 1.241 +#endif // DOM_CAMERA_DOMCAMERACONTROL_H