dom/camera/DOMCameraControl.h

changeset 0
6474c204b198
     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

mercurial