michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef DOM_CAMERA_CAMERACONTROLIMPL_H michael@0: #define DOM_CAMERA_CAMERACONTROLIMPL_H michael@0: michael@0: #include "nsTArray.h" michael@0: #include "nsWeakPtr.h" michael@0: #include "mozilla/Attributes.h" michael@0: #include "mozilla/ReentrantMonitor.h" michael@0: #include "nsIFile.h" michael@0: #include "nsProxyRelease.h" michael@0: #include "AutoRwLock.h" michael@0: #include "nsIDOMDeviceStorage.h" michael@0: #include "ICameraControl.h" michael@0: #include "CameraCommon.h" michael@0: #include "DeviceStorage.h" michael@0: #include "DeviceStorageFileDescriptor.h" michael@0: #include "CameraControlListener.h" michael@0: michael@0: namespace mozilla { michael@0: michael@0: namespace layers { michael@0: class Image; michael@0: } michael@0: michael@0: class RecorderProfileManager; michael@0: michael@0: class CameraControlImpl : public ICameraControl michael@0: { michael@0: public: michael@0: CameraControlImpl(uint32_t aCameraId); michael@0: virtual void AddListener(CameraControlListener* aListener) MOZ_OVERRIDE; michael@0: virtual void RemoveListener(CameraControlListener* aListener) MOZ_OVERRIDE; michael@0: michael@0: virtual nsresult Start(const Configuration* aConfig = nullptr) MOZ_OVERRIDE; michael@0: virtual nsresult Stop() MOZ_OVERRIDE; michael@0: michael@0: virtual nsresult SetConfiguration(const Configuration& aConfig) MOZ_OVERRIDE; michael@0: virtual nsresult StartPreview() MOZ_OVERRIDE; michael@0: virtual nsresult StopPreview() MOZ_OVERRIDE; michael@0: virtual nsresult AutoFocus() MOZ_OVERRIDE; michael@0: virtual nsresult StartFaceDetection() MOZ_OVERRIDE; michael@0: virtual nsresult StopFaceDetection() MOZ_OVERRIDE; michael@0: virtual nsresult TakePicture() MOZ_OVERRIDE; michael@0: virtual nsresult StartRecording(DeviceStorageFileDescriptor* aFileDescriptor, michael@0: const StartRecordingOptions* aOptions) MOZ_OVERRIDE; michael@0: virtual nsresult StopRecording() MOZ_OVERRIDE; michael@0: virtual nsresult ResumeContinuousFocus() MOZ_OVERRIDE; michael@0: michael@0: already_AddRefed GetRecorderProfileManager(); michael@0: uint32_t GetCameraId() { return mCameraId; } michael@0: michael@0: virtual void Shutdown() MOZ_OVERRIDE; michael@0: michael@0: // Event handlers called directly from outside this class. michael@0: void OnShutter(); michael@0: void OnClosed(); michael@0: void OnError(CameraControlListener::CameraErrorContext aContext, michael@0: CameraControlListener::CameraError aError); michael@0: void OnAutoFocusMoving(bool aIsMoving); michael@0: michael@0: protected: michael@0: // Event handlers. michael@0: void OnAutoFocusComplete(bool aAutoFocusSucceeded); michael@0: void OnFacesDetected(const nsTArray& aFaces); michael@0: void OnTakePictureComplete(uint8_t* aData, uint32_t aLength, const nsAString& aMimeType); michael@0: michael@0: bool OnNewPreviewFrame(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight); michael@0: void OnRecorderStateChange(CameraControlListener::RecorderState aState, michael@0: int32_t aStatus = -1, int32_t aTrackNumber = -1); michael@0: void OnPreviewStateChange(CameraControlListener::PreviewState aState); michael@0: void OnHardwareStateChange(CameraControlListener::HardwareState aState); michael@0: void OnConfigurationChange(); michael@0: michael@0: // When we create a new CameraThread, we keep a static reference to it so michael@0: // that multiple CameraControl instances can find and reuse it; but we michael@0: // don't want that reference to keep the thread object around unnecessarily, michael@0: // so we make it a weak reference. The strong dynamic references will keep michael@0: // the thread object alive as needed. michael@0: static nsWeakPtr sCameraThread; michael@0: nsCOMPtr mCameraThread; michael@0: michael@0: virtual ~CameraControlImpl(); michael@0: michael@0: virtual void BeginBatchParameterSet() MOZ_OVERRIDE { } michael@0: virtual void EndBatchParameterSet() MOZ_OVERRIDE { } michael@0: michael@0: // Manage camera event listeners. michael@0: void AddListenerImpl(already_AddRefed aListener); michael@0: void RemoveListenerImpl(CameraControlListener* aListener); michael@0: nsTArray > mListeners; michael@0: PRRWLock* mListenerLock; michael@0: michael@0: class ControlMessage; michael@0: class ListenerMessage; michael@0: michael@0: virtual nsresult StartImpl(const Configuration* aConfig = nullptr) = 0; michael@0: virtual nsresult StopImpl() = 0; michael@0: virtual nsresult SetConfigurationImpl(const Configuration& aConfig) = 0; michael@0: virtual nsresult StartPreviewImpl() = 0; michael@0: virtual nsresult StopPreviewImpl() = 0; michael@0: virtual nsresult AutoFocusImpl() = 0; michael@0: virtual nsresult StartFaceDetectionImpl() = 0; michael@0: virtual nsresult StopFaceDetectionImpl() = 0; michael@0: virtual nsresult TakePictureImpl() = 0; michael@0: virtual nsresult StartRecordingImpl(DeviceStorageFileDescriptor* aFileDescriptor, michael@0: const StartRecordingOptions* aOptions) = 0; michael@0: virtual nsresult StopRecordingImpl() = 0; michael@0: virtual nsresult ResumeContinuousFocusImpl() = 0; michael@0: virtual nsresult PushParametersImpl() = 0; michael@0: virtual nsresult PullParametersImpl() = 0; michael@0: virtual already_AddRefed GetRecorderProfileManagerImpl() = 0; michael@0: michael@0: void OnShutterInternal(); michael@0: void OnClosedInternal(); michael@0: michael@0: uint32_t mCameraId; michael@0: michael@0: CameraControlListener::CameraListenerConfiguration mCurrentConfiguration; michael@0: michael@0: CameraControlListener::PreviewState mPreviewState; michael@0: CameraControlListener::HardwareState mHardwareState; michael@0: michael@0: private: michael@0: CameraControlImpl(const CameraControlImpl&) MOZ_DELETE; michael@0: CameraControlImpl& operator=(const CameraControlImpl&) MOZ_DELETE; michael@0: }; michael@0: michael@0: } // namespace mozilla michael@0: michael@0: #endif // DOM_CAMERA_CAMERACONTROLIMPL_H