diff --git a/dom/camera/CameraCommon.h b/dom/camera/CameraCommon.h index f5a3428d3bf5..e615a3c750f6 100644 --- a/dom/camera/CameraCommon.h +++ b/dom/camera/CameraCommon.h @@ -79,6 +79,7 @@ enum { CAMERA_PARAM_PICTURESIZE, CAMERA_PARAM_THUMBNAILSIZE, CAMERA_PARAM_THUMBNAILQUALITY, + CAMERA_PARAM_SENSORANGLE, CAMERA_PARAM_SUPPORTED_PREVIEWSIZES, CAMERA_PARAM_SUPPORTED_VIDEOSIZES, diff --git a/dom/camera/CameraControlImpl.cpp b/dom/camera/CameraControlImpl.cpp index 20bd6b337643..108ba85553c6 100644 --- a/dom/camera/CameraControlImpl.cpp +++ b/dom/camera/CameraControlImpl.cpp @@ -268,6 +268,14 @@ CameraControlImpl::Get(uint32_t aKey, idl::CameraSize& aSize) return NS_OK; } +nsresult +CameraControlImpl::Get(uint32_t aKey, int32_t* aValue) +{ + MOZ_ASSERT(aValue); + *aValue = GetParameterInt32(aKey); + return NS_OK; +} + already_AddRefed CameraControlImpl::GetRecorderProfileManager() { diff --git a/dom/camera/CameraControlImpl.h b/dom/camera/CameraControlImpl.h index c3ac6dca3b1d..e3e1618a8a15 100644 --- a/dom/camera/CameraControlImpl.h +++ b/dom/camera/CameraControlImpl.h @@ -75,6 +75,7 @@ public: nsresult Get(nsICameraPreviewStateChange** aOnPreviewStateChange); nsresult Set(uint32_t aKey, const idl::CameraSize& aSize); nsresult Get(uint32_t aKey, idl::CameraSize& aSize); + nsresult Get(uint32_t aKey, int32_t* aValue); nsresult SetFocusAreas(JSContext* aCx, const JS::Value& aValue) { @@ -92,6 +93,7 @@ public: virtual const char* GetParameter(const char* aKey) = 0; virtual const char* GetParameterConstChar(uint32_t aKey) = 0; virtual double GetParameterDouble(uint32_t aKey) = 0; + virtual int32_t GetParameterInt32(uint32_t aKey) = 0; virtual void GetParameter(uint32_t aKey, nsTArray& aRegions) = 0; virtual void GetParameter(uint32_t aKey, idl::CameraSize& aSize) = 0; virtual void SetParameter(const char* aKey, const char* aValue) = 0; diff --git a/dom/camera/DOMCameraControl.cpp b/dom/camera/DOMCameraControl.cpp index ffba5ddf73c4..90acafeefc57 100644 --- a/dom/camera/DOMCameraControl.cpp +++ b/dom/camera/DOMCameraControl.cpp @@ -285,6 +285,14 @@ nsDOMCameraControl::GetExposureCompensation(ErrorResult& aRv) return compensation; } +int32_t +nsDOMCameraControl::SensorAngle() +{ + int32_t angle; + mCameraControl->Get(CAMERA_PARAM_SENSORANGLE, &angle); + return angle; +} + already_AddRefed nsDOMCameraControl::GetOnShutter(ErrorResult& aRv) { diff --git a/dom/camera/DOMCameraControl.h b/dom/camera/DOMCameraControl.h index 961d59c74db5..013b367774bf 100644 --- a/dom/camera/DOMCameraControl.h +++ b/dom/camera/DOMCameraControl.h @@ -76,6 +76,7 @@ public: double GetFocusDistanceFar(ErrorResult& aRv); void SetExposureCompensation(const dom::Optional& aCompensation, ErrorResult& aRv); double GetExposureCompensation(ErrorResult& aRv); + int32_t SensorAngle(); already_AddRefed GetOnShutter(ErrorResult& aRv); void SetOnShutter(nsICameraShutterCallback* aCb, ErrorResult& aRv); already_AddRefed GetOnClosed(ErrorResult& aRv); diff --git a/dom/camera/FallbackCameraControl.cpp b/dom/camera/FallbackCameraControl.cpp index 1da6e6effd28..4a74d071c0ba 100644 --- a/dom/camera/FallbackCameraControl.cpp +++ b/dom/camera/FallbackCameraControl.cpp @@ -24,6 +24,7 @@ public: const char* GetParameter(const char* aKey); const char* GetParameterConstChar(uint32_t aKey); double GetParameterDouble(uint32_t aKey); + int32_t GetParameterInt32(uint32_t aKey); void GetParameter(uint32_t aKey, nsTArray& aRegions); void GetParameter(uint32_t aKey, idl::CameraSize& aSize); void SetParameter(const char* aKey, const char* aValue); @@ -101,6 +102,12 @@ nsFallbackCameraControl::GetParameterDouble(uint32_t aKey) return NAN; } +int32_t +nsFallbackCameraControl::GetParameterInt32(uint32_t aKey) +{ + return 0; +} + void nsFallbackCameraControl::GetParameter(uint32_t aKey, nsTArray& aRegions) { diff --git a/dom/camera/GonkCameraControl.cpp b/dom/camera/GonkCameraControl.cpp index 0579f0b3c771..6cf112cf43ea 100644 --- a/dom/camera/GonkCameraControl.cpp +++ b/dom/camera/GonkCameraControl.cpp @@ -434,6 +434,25 @@ nsGonkCameraControl::GetParameterDouble(uint32_t aKey) } } +int32_t +nsGonkCameraControl::GetParameterInt32(uint32_t aKey) +{ + if (aKey == CAMERA_PARAM_SENSORANGLE) { + if (!mCameraHw.get()) { + return 0; + } + return mCameraHw->GetSensorOrientation(); + } + + const char* key = getKeyText(aKey); + if (!key) { + return 0; + } + + RwAutoLockRead lock(mRwLock); + return mParams.getInt(key); +} + void nsGonkCameraControl::GetParameter(uint32_t aKey, nsTArray& aRegions) diff --git a/dom/camera/GonkCameraControl.h b/dom/camera/GonkCameraControl.h index de1ad78e6019..bb3579a9db7a 100644 --- a/dom/camera/GonkCameraControl.h +++ b/dom/camera/GonkCameraControl.h @@ -53,6 +53,7 @@ public: const char* GetParameter(const char* aKey); const char* GetParameterConstChar(uint32_t aKey); double GetParameterDouble(uint32_t aKey); + int32_t GetParameterInt32(uint32_t aKey); void GetParameter(uint32_t aKey, nsTArray& aRegions); void GetParameter(uint32_t aKey, nsTArray& aSizes); void GetParameter(uint32_t aKey, idl::CameraSize& aSize); diff --git a/dom/camera/ICameraControl.h b/dom/camera/ICameraControl.h index 99eeb358f1ea..dca4eb5885fa 100644 --- a/dom/camera/ICameraControl.h +++ b/dom/camera/ICameraControl.h @@ -46,6 +46,7 @@ public: virtual nsresult Get(nsICameraPreviewStateChange** aOnPreviewStateChange) = 0; virtual nsresult Set(uint32_t aKey, const idl::CameraSize& aSize) = 0; virtual nsresult Get(uint32_t aKey, idl::CameraSize& aSize) = 0; + virtual nsresult Get(uint32_t aKey, int32_t* aValue) = 0; virtual nsresult SetFocusAreas(JSContext* aCx, const JS::Value& aValue) = 0; virtual nsresult SetMeteringAreas(JSContext* aCx, const JS::Value& aValue) = 0; virtual nsresult GetVideoSizes(nsTArray& aVideoSizes) = 0; diff --git a/dom/webidl/CameraControl.webidl b/dom/webidl/CameraControl.webidl index a831c59cb648..5a8d4e5b83a1 100644 --- a/dom/webidl/CameraControl.webidl +++ b/dom/webidl/CameraControl.webidl @@ -152,6 +152,12 @@ interface CameraControl { [Throws] attribute any thumbnailSize; + /* the angle, in degrees, that the image sensor is mounted relative + to the display; e.g. if 'sensorAngle' is 270 degrees (or -90 degrees), + then the preview stream needs to be rotated +90 degrees to have the + same orientation as the real world. */ + readonly attribute long sensorAngle; + /* tell the camera to attempt to focus the image */ [Throws] void autoFocus(CameraAutoFocusCallback onSuccess, optional CameraErrorCallback onError);