dom/camera/DOMCameraControl.h

Thu, 15 Jan 2015 15:55:04 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:55:04 +0100
branch
TOR_BUG_9701
changeset 9
a63d609f5ebe
permissions
-rw-r--r--

Back out 97036ab72558 which inappropriately compared turds to third parties.

     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/. */
     5 #ifndef DOM_CAMERA_DOMCAMERACONTROL_H
     6 #define DOM_CAMERA_DOMCAMERACONTROL_H
     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"
    21 class nsDOMDeviceStorage;
    22 class nsPIDOMWindow;
    23 class nsIDOMBlob;
    25 namespace mozilla {
    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;
    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
    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);
    50   nsDOMCameraControl(uint32_t aCameraId,
    51                      const dom::CameraConfiguration& aInitialConfig,
    52                      dom::GetCameraCallback* aOnSuccess,
    53                      dom::CameraErrorCallback* aOnError,
    54                      nsPIDOMWindow* aWindow);
    56   void Shutdown();
    58   nsPIDOMWindow* GetParentObject() const { return mWindow; }
    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);
   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);
   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);
   141   virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
   143 protected:
   144   virtual ~nsDOMCameraControl();
   146   class DOMCameraConfiguration MOZ_FINAL : public dom::CameraConfiguration
   147   {
   148   public:
   149     NS_INLINE_DECL_REFCOUNTING(DOMCameraConfiguration)
   151     DOMCameraConfiguration();
   152     DOMCameraConfiguration(const dom::CameraConfiguration& aConfiguration);
   154     // Additional configuration options that aren't exposed to the DOM
   155     uint32_t mMaxFocusAreas;
   156     uint32_t mMaxMeteringAreas;
   158   private:
   159     // Private destructor, to discourage deletion outside of Release():
   160     ~DOMCameraConfiguration();
   161   };
   163   friend class DOMCameraControlListener;
   164   friend class mozilla::StartRecordingHelper;
   166   void OnCreatedFileDescriptor(bool aSucceeded);
   168   void OnAutoFocusComplete(bool aAutoFocusSucceeded);
   169   void OnAutoFocusMoving(bool aIsMoving);
   170   void OnTakePictureComplete(nsIDOMBlob* aPicture);
   171   void OnFacesDetected(const nsTArray<ICameraControl::Face>& aFaces);
   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);
   180   bool IsWindowStillActive();
   182   nsresult NotifyRecordingStatusChange(const nsString& aMsg);
   184   nsRefPtr<ICameraControl> mCameraControl; // non-DOM camera control
   186   // An agent used to join audio channel service.
   187   nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
   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);
   192   nsRefPtr<DOMCameraConfiguration>              mCurrentConfiguration;
   193   nsRefPtr<dom::CameraCapabilities>             mCapabilities;
   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;
   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;
   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;
   222   // our viewfinder stream
   223   CameraPreviewMediaStream* mInput;
   225   // set once when this object is created
   226   nsCOMPtr<nsPIDOMWindow>   mWindow;
   228   dom::CameraStartRecordingOptions mOptions;
   229   nsRefPtr<DeviceStorageFileDescriptor> mDSFileDescriptor;
   231 private:
   232   nsDOMCameraControl(const nsDOMCameraControl&) MOZ_DELETE;
   233   nsDOMCameraControl& operator=(const nsDOMCameraControl&) MOZ_DELETE;
   234 };
   236 } // namespace mozilla
   238 #endif // DOM_CAMERA_DOMCAMERACONTROL_H

mercurial