1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "DOMCameraCapabilities.h"
8 #include "nsPIDOMWindow.h"
9 #include "nsContentUtils.h"
10 #include "mozilla/dom/CameraManagerBinding.h"
11 #include "mozilla/dom/CameraCapabilitiesBinding.h"
12 #include "Navigator.h"
13 #include "CameraCommon.h"
14 #include "ICameraControl.h"
15 #include "CameraRecorderProfiles.h"
20 NS_IMPL_CYCLE_COLLECTION_CLASS(CameraCapabilities
)
22 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CameraCapabilities
)
23 NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow
)
24 tmp
->mRecorderProfiles
= JS::UndefinedValue();
25 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
26 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
28 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CameraCapabilities
)
29 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow
)
30 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
31 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
33 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(CameraCapabilities
)
34 NS_IMPL_CYCLE_COLLECTION_TRACE_JSVAL_MEMBER_CALLBACK(mRecorderProfiles
)
35 NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
36 NS_IMPL_CYCLE_COLLECTION_TRACE_END
38 NS_IMPL_CYCLE_COLLECTING_ADDREF(CameraCapabilities
)
39 NS_IMPL_CYCLE_COLLECTING_RELEASE(CameraCapabilities
)
41 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CameraCapabilities
)
42 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
43 NS_INTERFACE_MAP_ENTRY(nsISupports
)
48 CameraCapabilities::HasSupport(JSContext
* aCx
, JSObject
* aGlobal
)
50 return Navigator::HasCameraSupport(aCx
, aGlobal
);
53 CameraCapabilities::CameraCapabilities(nsPIDOMWindow
* aWindow
)
54 : mRecorderProfiles(JS::UndefinedValue())
57 DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__
, __LINE__
, this);
58 MOZ_COUNT_CTOR(CameraCapabilities
);
59 mozilla::HoldJSObjects(this);
63 CameraCapabilities::~CameraCapabilities()
65 DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__
, __LINE__
, this);
66 mRecorderProfiles
= JS::UndefinedValue();
67 mozilla::DropJSObjects(this);
68 MOZ_COUNT_DTOR(CameraCapabilities
);
72 CameraCapabilities::WrapObject(JSContext
* aCx
)
74 return CameraCapabilitiesBinding::Wrap(aCx
, this);
77 #define LOG_IF_ERROR(rv, param) \
79 if (NS_FAILED(rv)) { \
80 DOM_CAMERA_LOGW("Error %x trying to get " #param "\n", \
86 CameraCapabilities::TranslateToDictionary(ICameraControl
* aCameraControl
,
87 uint32_t aKey
, nsTArray
<CameraSize
>& aSizes
)
90 nsTArray
<ICameraControl::Size
> sizes
;
92 rv
= aCameraControl
->Get(aKey
, sizes
);
98 aSizes
.SetCapacity(sizes
.Length());
99 for (uint32_t i
= 0; i
< sizes
.Length(); ++i
) {
100 CameraSize
* s
= aSizes
.AppendElement();
101 s
->mWidth
= sizes
[i
].width
;
102 s
->mHeight
= sizes
[i
].height
;
109 CameraCapabilities::Populate(ICameraControl
* aCameraControl
)
111 NS_ENSURE_TRUE(aCameraControl
, NS_ERROR_INVALID_ARG
);
115 rv
= TranslateToDictionary(aCameraControl
, CAMERA_PARAM_SUPPORTED_PREVIEWSIZES
, mPreviewSizes
);
116 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_PREVIEWSIZES
);
118 rv
= TranslateToDictionary(aCameraControl
, CAMERA_PARAM_SUPPORTED_PICTURESIZES
, mPictureSizes
);
119 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_PICTURESIZES
);
121 rv
= TranslateToDictionary(aCameraControl
, CAMERA_PARAM_SUPPORTED_JPEG_THUMBNAIL_SIZES
, mThumbnailSizes
);
122 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_JPEG_THUMBNAIL_SIZES
);
124 rv
= TranslateToDictionary(aCameraControl
, CAMERA_PARAM_SUPPORTED_VIDEOSIZES
, mVideoSizes
);
125 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_VIDEOSIZES
);
127 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_PICTUREFORMATS
, mFileFormats
);
128 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_PICTUREFORMATS
);
130 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_WHITEBALANCES
, mWhiteBalanceModes
);
131 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_WHITEBALANCES
);
133 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_SCENEMODES
, mSceneModes
);
134 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_SCENEMODES
);
136 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_EFFECTS
, mEffects
);
137 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_EFFECTS
);
139 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_FLASHMODES
, mFlashModes
);
140 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_FLASHMODES
);
142 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_FOCUSMODES
, mFocusModes
);
143 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_FOCUSMODES
);
145 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_ISOMODES
, mIsoModes
);
146 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_ISOMODES
);
148 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_ZOOMRATIOS
, mZoomRatios
);
149 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_ZOOMRATIOS
);
152 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_MAXFOCUSAREAS
, areas
);
153 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_MAXFOCUSAREAS
);
154 mMaxFocusAreas
= areas
< 0 ? 0 : areas
;
156 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_MAXMETERINGAREAS
, areas
);
157 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_MAXMETERINGAREAS
);
158 mMaxMeteringAreas
= areas
< 0 ? 0 : areas
;
161 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_MAXDETECTEDFACES
, faces
);
162 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_MAXDETECTEDFACES
);
163 mMaxDetectedFaces
= faces
< 0 ? 0 : faces
;
165 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_MINEXPOSURECOMPENSATION
, mMinExposureCompensation
);
166 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_MINEXPOSURECOMPENSATION
);
168 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_MAXEXPOSURECOMPENSATION
, mMaxExposureCompensation
);
169 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_MAXEXPOSURECOMPENSATION
);
171 rv
= aCameraControl
->Get(CAMERA_PARAM_SUPPORTED_EXPOSURECOMPENSATIONSTEP
, mExposureCompensationStep
);
172 LOG_IF_ERROR(rv
, CAMERA_PARAM_SUPPORTED_EXPOSURECOMPENSATIONSTEP
);
174 mRecorderProfileManager
= aCameraControl
->GetRecorderProfileManager();
175 if (!mRecorderProfileManager
) {
176 DOM_CAMERA_LOGW("Unable to get recorder profile manager\n");
180 JS::Rooted
<JSObject
*> o(js
);
181 nsresult rv
= mRecorderProfileManager
->GetJsObject(js
, o
.address());
183 DOM_CAMERA_LOGE("Failed to JS-objectify profile manager (0x%x)\n", rv
);
185 mRecorderProfiles
= JS::ObjectValue(*o
);
189 // For now, always return success, since the presence or absence of capabilities
190 // indicates whether or not they are supported.
195 CameraCapabilities::GetPreviewSizes(nsTArray
<dom::CameraSize
>& retval
) const
197 retval
= mPreviewSizes
;
201 CameraCapabilities::GetPictureSizes(nsTArray
<dom::CameraSize
>& retval
) const
203 retval
= mPictureSizes
;
207 CameraCapabilities::GetThumbnailSizes(nsTArray
<dom::CameraSize
>& retval
) const
209 retval
= mThumbnailSizes
;
213 CameraCapabilities::GetVideoSizes(nsTArray
<dom::CameraSize
>& retval
) const
215 retval
= mVideoSizes
;
219 CameraCapabilities::GetFileFormats(nsTArray
<nsString
>& retval
) const
221 retval
= mFileFormats
;
225 CameraCapabilities::GetWhiteBalanceModes(nsTArray
<nsString
>& retval
) const
227 retval
= mWhiteBalanceModes
;
231 CameraCapabilities::GetSceneModes(nsTArray
<nsString
>& retval
) const
233 retval
= mSceneModes
;
237 CameraCapabilities::GetEffects(nsTArray
<nsString
>& retval
) const
243 CameraCapabilities::GetFlashModes(nsTArray
<nsString
>& retval
) const
245 retval
= mFlashModes
;
249 CameraCapabilities::GetFocusModes(nsTArray
<nsString
>& retval
) const
251 retval
= mFocusModes
;
255 CameraCapabilities::GetZoomRatios(nsTArray
<double>& retval
) const
257 retval
= mZoomRatios
;
261 CameraCapabilities::MaxFocusAreas() const
263 return mMaxFocusAreas
;
267 CameraCapabilities::MaxMeteringAreas() const
269 return mMaxMeteringAreas
;
273 CameraCapabilities::MaxDetectedFaces() const
275 return mMaxDetectedFaces
;
279 CameraCapabilities::MinExposureCompensation() const
281 return mMinExposureCompensation
;
285 CameraCapabilities::MaxExposureCompensation() const
287 return mMaxExposureCompensation
;
291 CameraCapabilities::ExposureCompensationStep() const
293 return mExposureCompensationStep
;
297 CameraCapabilities::GetRecorderProfiles(JSContext
* aCx
,
298 JS::MutableHandle
<JS::Value
> aRetval
) const
300 JS::ExposeValueToActiveJS(mRecorderProfiles
);
301 aRetval
.set(mRecorderProfiles
);
305 CameraCapabilities::GetIsoModes(nsTArray
<nsString
>& retval
) const
311 } // namespace mozilla