diff -r 000000000000 -r 6474c204b198 dom/camera/ICameraControl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/camera/ICameraControl.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,220 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef DOM_CAMERA_ICAMERACONTROL_H +#define DOM_CAMERA_ICAMERACONTROL_H + +#include "nsCOMPtr.h" +#include "nsString.h" +#include "nsAutoPtr.h" +#include "nsISupportsImpl.h" + +struct DeviceStorageFileDescriptor; + +class nsIFile; + +namespace mozilla { + +class CameraControlListener; +class RecorderProfileManager; + +// XXXmikeh - In some future patch this should move into the ICameraControl +// class as well, and the names updated to the 'k'-style; +// e.g. kParamPreviewSize, etc. +enum { + // current settings + CAMERA_PARAM_PREVIEWSIZE, + CAMERA_PARAM_PREVIEWFORMAT, + CAMERA_PARAM_PREVIEWFRAMERATE, + CAMERA_PARAM_VIDEOSIZE, + CAMERA_PARAM_PICTURE_SIZE, + CAMERA_PARAM_PICTURE_FILEFORMAT, + CAMERA_PARAM_PICTURE_ROTATION, + CAMERA_PARAM_PICTURE_LOCATION, + CAMERA_PARAM_PICTURE_DATETIME, + CAMERA_PARAM_EFFECT, + CAMERA_PARAM_WHITEBALANCE, + CAMERA_PARAM_SCENEMODE, + CAMERA_PARAM_FLASHMODE, + CAMERA_PARAM_FOCUSMODE, + CAMERA_PARAM_ZOOM, + CAMERA_PARAM_METERINGAREAS, + CAMERA_PARAM_FOCUSAREAS, + CAMERA_PARAM_FOCALLENGTH, + CAMERA_PARAM_FOCUSDISTANCENEAR, + CAMERA_PARAM_FOCUSDISTANCEOPTIMUM, + CAMERA_PARAM_FOCUSDISTANCEFAR, + CAMERA_PARAM_EXPOSURECOMPENSATION, + CAMERA_PARAM_THUMBNAILSIZE, + CAMERA_PARAM_THUMBNAILQUALITY, + CAMERA_PARAM_SENSORANGLE, + CAMERA_PARAM_ISOMODE, + CAMERA_PARAM_LUMINANCE, + CAMERA_PARAM_SCENEMODE_HDR_RETURNNORMALPICTURE, + + // supported features + CAMERA_PARAM_SUPPORTED_PREVIEWSIZES, + CAMERA_PARAM_SUPPORTED_PICTURESIZES, + CAMERA_PARAM_SUPPORTED_VIDEOSIZES, + CAMERA_PARAM_SUPPORTED_PICTUREFORMATS, + CAMERA_PARAM_SUPPORTED_WHITEBALANCES, + CAMERA_PARAM_SUPPORTED_SCENEMODES, + CAMERA_PARAM_SUPPORTED_EFFECTS, + CAMERA_PARAM_SUPPORTED_FLASHMODES, + CAMERA_PARAM_SUPPORTED_FOCUSMODES, + CAMERA_PARAM_SUPPORTED_MAXFOCUSAREAS, + CAMERA_PARAM_SUPPORTED_MAXMETERINGAREAS, + CAMERA_PARAM_SUPPORTED_MINEXPOSURECOMPENSATION, + CAMERA_PARAM_SUPPORTED_MAXEXPOSURECOMPENSATION, + CAMERA_PARAM_SUPPORTED_EXPOSURECOMPENSATIONSTEP, + CAMERA_PARAM_SUPPORTED_ZOOM, + CAMERA_PARAM_SUPPORTED_ZOOMRATIOS, + CAMERA_PARAM_SUPPORTED_MAXDETECTEDFACES, + CAMERA_PARAM_SUPPORTED_JPEG_THUMBNAIL_SIZES, + CAMERA_PARAM_SUPPORTED_ISOMODES +}; + +class ICameraControl +{ +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ICameraControl) + + static nsresult GetNumberOfCameras(int32_t& aDeviceCount); + static nsresult GetCameraName(uint32_t aDeviceNum, nsCString& aDeviceName); + static nsresult GetListOfCameras(nsTArray& aList); + + enum Mode { + kUnspecifiedMode, + kPictureMode, + kVideoMode, + }; + + struct Size { + uint32_t width; + uint32_t height; + }; + + struct Region { + int32_t top; + int32_t left; + int32_t bottom; + int32_t right; + uint32_t weight; + }; + + struct Position { + double latitude; + double longitude; + double altitude; + double timestamp; + }; + + struct StartRecordingOptions { + uint32_t rotation; + uint32_t maxFileSizeBytes; + uint32_t maxVideoLengthMs; + bool autoEnableLowLightTorch; + }; + + struct Configuration { + Mode mMode; + Size mPreviewSize; + nsString mRecorderProfile; + }; + + struct Point + { + int32_t x; + int32_t y; + }; + + struct Face { + uint32_t id; + uint32_t score; + Region bound; + bool hasLeftEye; + Point leftEye; + bool hasRightEye; + Point rightEye; + bool hasMouth; + Point mouth; + }; + + static already_AddRefed Create(uint32_t aCameraId); + + virtual nsresult Start(const Configuration* aInitialConfig = nullptr) = 0; + virtual nsresult Stop() = 0; + + virtual nsresult SetConfiguration(const Configuration& aConfig) = 0; + + virtual void AddListener(CameraControlListener* aListener) = 0; + virtual void RemoveListener(CameraControlListener* aListener) = 0; + + virtual nsresult StartPreview() = 0; + virtual nsresult StopPreview() = 0; + virtual nsresult AutoFocus() = 0; + virtual nsresult TakePicture() = 0; + virtual nsresult StartRecording(DeviceStorageFileDescriptor *aFileDescriptor, + const StartRecordingOptions* aOptions = nullptr) = 0; + virtual nsresult StopRecording() = 0; + virtual nsresult StartFaceDetection() = 0; + virtual nsresult StopFaceDetection() = 0; + virtual nsresult ResumeContinuousFocus() = 0; + + virtual nsresult Set(uint32_t aKey, const nsAString& aValue) = 0; + virtual nsresult Get(uint32_t aKey, nsAString& aValue) = 0; + virtual nsresult Set(uint32_t aKey, double aValue) = 0; + virtual nsresult Get(uint32_t aKey, double& aValue) = 0; + virtual nsresult Set(uint32_t aKey, int32_t aValue) = 0; + virtual nsresult Get(uint32_t aKey, int32_t& aValue) = 0; + virtual nsresult Set(uint32_t aKey, int64_t aValue) = 0; + virtual nsresult Get(uint32_t aKey, int64_t& aValue) = 0; + virtual nsresult Set(uint32_t aKey, const Size& aValue) = 0; + virtual nsresult Get(uint32_t aKey, Size& aValue) = 0; + virtual nsresult Set(uint32_t aKey, const nsTArray& aRegions) = 0; + virtual nsresult Get(uint32_t aKey, nsTArray& aRegions) = 0; + + virtual nsresult SetLocation(const Position& aLocation) = 0; + + virtual nsresult Get(uint32_t aKey, nsTArray& aSizes) = 0; + virtual nsresult Get(uint32_t aKey, nsTArray& aValues) = 0; + virtual nsresult Get(uint32_t aKey, nsTArray& aValues) = 0; + + virtual already_AddRefed GetRecorderProfileManager() = 0; + virtual uint32_t GetCameraId() = 0; + + virtual void Shutdown() = 0; + +protected: + virtual ~ICameraControl() { } + + friend class ICameraControlParameterSetAutoEnter; + + virtual void BeginBatchParameterSet() = 0; + virtual void EndBatchParameterSet() = 0; +}; + +// Helper class to make it easy to update a batch of camera parameters; +// the parameters are applied atomically when this object goes out of +// scope. +class ICameraControlParameterSetAutoEnter +{ +public: + ICameraControlParameterSetAutoEnter(ICameraControl* aCameraControl) + : mCameraControl(aCameraControl) + { + mCameraControl->BeginBatchParameterSet(); + } + virtual ~ICameraControlParameterSetAutoEnter() + { + mCameraControl->EndBatchParameterSet(); + } + +protected: + nsRefPtr mCameraControl; +}; + +} // namespace mozilla + +#endif // DOM_CAMERA_ICAMERACONTROL_H