dom/camera/DOMCameraControlListener.cpp

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.

michael@0 1 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
michael@0 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 4
michael@0 5 #include "DOMCameraControlListener.h"
michael@0 6 #include "nsThreadUtils.h"
michael@0 7 #include "nsDOMFile.h"
michael@0 8 #include "CameraCommon.h"
michael@0 9 #include "DOMCameraControl.h"
michael@0 10 #include "CameraPreviewMediaStream.h"
michael@0 11 #include "mozilla/dom/CameraManagerBinding.h"
michael@0 12
michael@0 13 using namespace mozilla;
michael@0 14 using namespace mozilla::dom;
michael@0 15
michael@0 16 DOMCameraControlListener::DOMCameraControlListener(nsDOMCameraControl* aDOMCameraControl,
michael@0 17 CameraPreviewMediaStream* aStream)
michael@0 18 : mDOMCameraControl(new nsMainThreadPtrHolder<nsDOMCameraControl>(aDOMCameraControl))
michael@0 19 , mStream(aStream)
michael@0 20 {
michael@0 21 DOM_CAMERA_LOGT("%s:%d : this=%p, camera=%p, stream=%p\n",
michael@0 22 __func__, __LINE__, this, aDOMCameraControl, aStream);
michael@0 23 }
michael@0 24
michael@0 25 DOMCameraControlListener::~DOMCameraControlListener()
michael@0 26 {
michael@0 27 DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
michael@0 28 }
michael@0 29
michael@0 30 // Boilerplate callback runnable
michael@0 31 class DOMCameraControlListener::DOMCallback : public nsRunnable
michael@0 32 {
michael@0 33 public:
michael@0 34 DOMCallback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl)
michael@0 35 : mDOMCameraControl(aDOMCameraControl)
michael@0 36 {
michael@0 37 MOZ_COUNT_CTOR(DOMCameraControlListener::DOMCallback);
michael@0 38 }
michael@0 39 virtual ~DOMCallback()
michael@0 40 {
michael@0 41 MOZ_COUNT_DTOR(DOMCameraControlListener::DOMCallback);
michael@0 42 }
michael@0 43
michael@0 44 virtual void RunCallback(nsDOMCameraControl* aDOMCameraControl) = 0;
michael@0 45
michael@0 46 NS_IMETHOD
michael@0 47 Run() MOZ_OVERRIDE
michael@0 48 {
michael@0 49 MOZ_ASSERT(NS_IsMainThread());
michael@0 50
michael@0 51 nsRefPtr<nsDOMCameraControl> camera = mDOMCameraControl.get();
michael@0 52 if (camera) {
michael@0 53 RunCallback(camera);
michael@0 54 }
michael@0 55 return NS_OK;
michael@0 56 }
michael@0 57
michael@0 58 protected:
michael@0 59 nsMainThreadPtrHandle<nsDOMCameraControl> mDOMCameraControl;
michael@0 60 };
michael@0 61
michael@0 62 // Specific callback handlers
michael@0 63 void
michael@0 64 DOMCameraControlListener::OnHardwareStateChange(HardwareState aState)
michael@0 65 {
michael@0 66 class Callback : public DOMCallback
michael@0 67 {
michael@0 68 public:
michael@0 69 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 70 HardwareState aState)
michael@0 71 : DOMCallback(aDOMCameraControl)
michael@0 72 , mState(aState)
michael@0 73 { }
michael@0 74
michael@0 75 void
michael@0 76 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 77 {
michael@0 78 aDOMCameraControl->OnHardwareStateChange(mState);
michael@0 79 }
michael@0 80
michael@0 81 protected:
michael@0 82 HardwareState mState;
michael@0 83 };
michael@0 84
michael@0 85 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aState));
michael@0 86 }
michael@0 87
michael@0 88 void
michael@0 89 DOMCameraControlListener::OnPreviewStateChange(PreviewState aState)
michael@0 90 {
michael@0 91 class Callback : public DOMCallback
michael@0 92 {
michael@0 93 public:
michael@0 94 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 95 PreviewState aState)
michael@0 96 : DOMCallback(aDOMCameraControl)
michael@0 97 , mState(aState)
michael@0 98 { }
michael@0 99
michael@0 100 void
michael@0 101 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 102 {
michael@0 103 aDOMCameraControl->OnPreviewStateChange(mState);
michael@0 104 }
michael@0 105
michael@0 106 protected:
michael@0 107 PreviewState mState;
michael@0 108 };
michael@0 109
michael@0 110 switch (aState) {
michael@0 111 case kPreviewStopped:
michael@0 112 // Clear the current frame right away, without dispatching a
michael@0 113 // runnable. This is an ugly coupling between the camera's
michael@0 114 // SurfaceTextureClient and the MediaStream/ImageContainer,
michael@0 115 // but without it, the preview can fail to start.
michael@0 116 DOM_CAMERA_LOGI("Preview stopped, clearing current frame\n");
michael@0 117 mStream->ClearCurrentFrame();
michael@0 118 break;
michael@0 119
michael@0 120 case kPreviewPaused:
michael@0 121 // In the paused state, we still want to reflect the change
michael@0 122 // in preview state, but we don't want to clear the current
michael@0 123 // frame as above, since doing so seems to cause genlock
michael@0 124 // problems when we restart the preview. See bug 957749.
michael@0 125 DOM_CAMERA_LOGI("Preview paused\n");
michael@0 126 break;
michael@0 127
michael@0 128 case kPreviewStarted:
michael@0 129 DOM_CAMERA_LOGI("Preview started\n");
michael@0 130 break;
michael@0 131
michael@0 132 default:
michael@0 133 DOM_CAMERA_LOGE("Unknown preview state %d\n", aState);
michael@0 134 MOZ_ASSUME_UNREACHABLE("Invalid preview state");
michael@0 135 return;
michael@0 136 }
michael@0 137 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aState));
michael@0 138 }
michael@0 139
michael@0 140 void
michael@0 141 DOMCameraControlListener::OnRecorderStateChange(RecorderState aState,
michael@0 142 int32_t aStatus, int32_t aTrackNum)
michael@0 143 {
michael@0 144 class Callback : public DOMCallback
michael@0 145 {
michael@0 146 public:
michael@0 147 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 148 RecorderState aState,
michael@0 149 int32_t aStatus,
michael@0 150 int32_t aTrackNum)
michael@0 151 : DOMCallback(aDOMCameraControl)
michael@0 152 , mState(aState)
michael@0 153 , mStatus(aStatus)
michael@0 154 , mTrackNum(aTrackNum)
michael@0 155 { }
michael@0 156
michael@0 157 void
michael@0 158 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 159 {
michael@0 160 aDOMCameraControl->OnRecorderStateChange(mState, mStatus, mTrackNum);
michael@0 161 }
michael@0 162
michael@0 163 protected:
michael@0 164 RecorderState mState;
michael@0 165 int32_t mStatus;
michael@0 166 int32_t mTrackNum;
michael@0 167 };
michael@0 168
michael@0 169 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aState, aStatus, aTrackNum));
michael@0 170 }
michael@0 171
michael@0 172 void
michael@0 173 DOMCameraControlListener::OnConfigurationChange(const CameraListenerConfiguration& aConfiguration)
michael@0 174 {
michael@0 175 class Callback : public DOMCallback
michael@0 176 {
michael@0 177 public:
michael@0 178 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 179 const CameraListenerConfiguration& aConfiguration)
michael@0 180 : DOMCallback(aDOMCameraControl)
michael@0 181 , mConfiguration(aConfiguration)
michael@0 182 { }
michael@0 183
michael@0 184 void
michael@0 185 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 186 {
michael@0 187 nsRefPtr<nsDOMCameraControl::DOMCameraConfiguration> config =
michael@0 188 new nsDOMCameraControl::DOMCameraConfiguration();
michael@0 189
michael@0 190 switch (mConfiguration.mMode) {
michael@0 191 case ICameraControl::kVideoMode:
michael@0 192 config->mMode = CameraMode::Video;
michael@0 193 break;
michael@0 194
michael@0 195 case ICameraControl::kPictureMode:
michael@0 196 config->mMode = CameraMode::Picture;
michael@0 197 break;
michael@0 198
michael@0 199 default:
michael@0 200 DOM_CAMERA_LOGI("Camera mode still unspecified, nothing to do\n");
michael@0 201 return;
michael@0 202 }
michael@0 203
michael@0 204 // Map CameraControl parameters to their DOM-facing equivalents
michael@0 205 config->mRecorderProfile = mConfiguration.mRecorderProfile;
michael@0 206 config->mPreviewSize.mWidth = mConfiguration.mPreviewSize.width;
michael@0 207 config->mPreviewSize.mHeight = mConfiguration.mPreviewSize.height;
michael@0 208 config->mMaxMeteringAreas = mConfiguration.mMaxMeteringAreas;
michael@0 209 config->mMaxFocusAreas = mConfiguration.mMaxFocusAreas;
michael@0 210
michael@0 211 aDOMCameraControl->OnConfigurationChange(config);
michael@0 212 }
michael@0 213
michael@0 214 protected:
michael@0 215 const CameraListenerConfiguration mConfiguration;
michael@0 216 };
michael@0 217
michael@0 218 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aConfiguration));
michael@0 219 }
michael@0 220
michael@0 221 void
michael@0 222 DOMCameraControlListener::OnAutoFocusMoving(bool aIsMoving)
michael@0 223 {
michael@0 224 class Callback : public DOMCallback
michael@0 225 {
michael@0 226 public:
michael@0 227 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl, bool aIsMoving)
michael@0 228 : DOMCallback(aDOMCameraControl)
michael@0 229 , mIsMoving(aIsMoving)
michael@0 230 { }
michael@0 231
michael@0 232 void
michael@0 233 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 234 {
michael@0 235 aDOMCameraControl->OnAutoFocusMoving(mIsMoving);
michael@0 236 }
michael@0 237
michael@0 238 protected:
michael@0 239 bool mIsMoving;
michael@0 240 };
michael@0 241
michael@0 242 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aIsMoving));
michael@0 243 }
michael@0 244
michael@0 245 void
michael@0 246 DOMCameraControlListener::OnFacesDetected(const nsTArray<ICameraControl::Face>& aFaces)
michael@0 247 {
michael@0 248 class Callback : public DOMCallback
michael@0 249 {
michael@0 250 public:
michael@0 251 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 252 const nsTArray<ICameraControl::Face>& aFaces)
michael@0 253 : DOMCallback(aDOMCameraControl)
michael@0 254 , mFaces(aFaces)
michael@0 255 { }
michael@0 256
michael@0 257 void
michael@0 258 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 259 {
michael@0 260 aDOMCameraControl->OnFacesDetected(mFaces);
michael@0 261 }
michael@0 262
michael@0 263 protected:
michael@0 264 const nsTArray<ICameraControl::Face> mFaces;
michael@0 265 };
michael@0 266
michael@0 267 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aFaces));
michael@0 268 }
michael@0 269
michael@0 270 void
michael@0 271 DOMCameraControlListener::OnShutter()
michael@0 272 {
michael@0 273 class Callback : public DOMCallback
michael@0 274 {
michael@0 275 public:
michael@0 276 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl)
michael@0 277 : DOMCallback(aDOMCameraControl)
michael@0 278 { }
michael@0 279
michael@0 280 void
michael@0 281 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 282 {
michael@0 283 aDOMCameraControl->OnShutter();
michael@0 284 }
michael@0 285 };
michael@0 286
michael@0 287 NS_DispatchToMainThread(new Callback(mDOMCameraControl));
michael@0 288 }
michael@0 289
michael@0 290 bool
michael@0 291 DOMCameraControlListener::OnNewPreviewFrame(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight)
michael@0 292 {
michael@0 293 DOM_CAMERA_LOGI("OnNewPreviewFrame: got %d x %d frame\n", aWidth, aHeight);
michael@0 294
michael@0 295 mStream->SetCurrentFrame(gfxIntSize(aWidth, aHeight), aImage);
michael@0 296 return true;
michael@0 297 }
michael@0 298
michael@0 299 void
michael@0 300 DOMCameraControlListener::OnAutoFocusComplete(bool aAutoFocusSucceeded)
michael@0 301 {
michael@0 302 class Callback : public DOMCallback
michael@0 303 {
michael@0 304 public:
michael@0 305 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 306 bool aAutoFocusSucceeded)
michael@0 307 : DOMCallback(aDOMCameraControl)
michael@0 308 , mAutoFocusSucceeded(aAutoFocusSucceeded)
michael@0 309 { }
michael@0 310
michael@0 311 void
michael@0 312 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 313 {
michael@0 314 aDOMCameraControl->OnAutoFocusComplete(mAutoFocusSucceeded);
michael@0 315 }
michael@0 316
michael@0 317 protected:
michael@0 318 bool mAutoFocusSucceeded;
michael@0 319 };
michael@0 320
michael@0 321 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aAutoFocusSucceeded));
michael@0 322 }
michael@0 323
michael@0 324 void
michael@0 325 DOMCameraControlListener::OnTakePictureComplete(uint8_t* aData, uint32_t aLength, const nsAString& aMimeType)
michael@0 326 {
michael@0 327 class Callback : public DOMCallback
michael@0 328 {
michael@0 329 public:
michael@0 330 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 331 uint8_t* aData, uint32_t aLength, const nsAString& aMimeType)
michael@0 332 : DOMCallback(aDOMCameraControl)
michael@0 333 , mData(aData)
michael@0 334 , mLength(aLength)
michael@0 335 , mMimeType(aMimeType)
michael@0 336 { }
michael@0 337
michael@0 338 void
michael@0 339 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 340 {
michael@0 341 nsCOMPtr<nsIDOMBlob> picture = new nsDOMMemoryFile(static_cast<void*>(mData),
michael@0 342 static_cast<uint64_t>(mLength),
michael@0 343 mMimeType);
michael@0 344 aDOMCameraControl->OnTakePictureComplete(picture);
michael@0 345 }
michael@0 346
michael@0 347 protected:
michael@0 348 uint8_t* mData;
michael@0 349 uint32_t mLength;
michael@0 350 nsString mMimeType;
michael@0 351 };
michael@0 352
michael@0 353 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aData, aLength, aMimeType));
michael@0 354 }
michael@0 355
michael@0 356 void
michael@0 357 DOMCameraControlListener::OnError(CameraErrorContext aContext, CameraError aError)
michael@0 358 {
michael@0 359 class Callback : public DOMCallback
michael@0 360 {
michael@0 361 public:
michael@0 362 Callback(nsMainThreadPtrHandle<nsDOMCameraControl> aDOMCameraControl,
michael@0 363 CameraErrorContext aContext,
michael@0 364 CameraError aError)
michael@0 365 : DOMCallback(aDOMCameraControl)
michael@0 366 , mContext(aContext)
michael@0 367 , mError(aError)
michael@0 368 { }
michael@0 369
michael@0 370 virtual void
michael@0 371 RunCallback(nsDOMCameraControl* aDOMCameraControl) MOZ_OVERRIDE
michael@0 372 {
michael@0 373 nsString error;
michael@0 374
michael@0 375 switch (mError) {
michael@0 376 case kErrorServiceFailed:
michael@0 377 error = NS_LITERAL_STRING("ErrorServiceFailed");
michael@0 378 break;
michael@0 379
michael@0 380 case kErrorSetPictureSizeFailed:
michael@0 381 error = NS_LITERAL_STRING("ErrorSetPictureSizeFailed");
michael@0 382 break;
michael@0 383
michael@0 384 case kErrorSetThumbnailSizeFailed:
michael@0 385 error = NS_LITERAL_STRING("ErrorSetThumbnailSizeFailed");
michael@0 386 break;
michael@0 387
michael@0 388 case kErrorApiFailed:
michael@0 389 // XXXmikeh legacy error placeholder
michael@0 390 error = NS_LITERAL_STRING("FAILURE");
michael@0 391 break;
michael@0 392
michael@0 393 default:
michael@0 394 error = NS_LITERAL_STRING("ErrorUnknown");
michael@0 395 break;
michael@0 396 }
michael@0 397 aDOMCameraControl->OnError(mContext, error);
michael@0 398 }
michael@0 399
michael@0 400 protected:
michael@0 401 CameraErrorContext mContext;
michael@0 402 CameraError mError;
michael@0 403 };
michael@0 404
michael@0 405 NS_DispatchToMainThread(new Callback(mDOMCameraControl, aContext, aError));
michael@0 406 }

mercurial