Files
palemoon27/dom/camera/GonkCameraControl.h
T
roytam1 4ac9bef80d import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 936092, initial DnD support for e10s, r=enndeakin,karlt (3cde556cf)
- Bug 1152066 - Remove ugly dynamic loading code now that we can assume this symbol exists. r=roc (04813dd18)
- Bug 966395 - Correctly propagate the input language's direction on OSX. r=masayuki/mrbkap (14a21fa0c)
- Bug 1158791 - Try harder to avoid Gtk-Critical errors in xpcshell tests. r=karlt (f6cec3b99)
- Bug 1153922 - Add a SandboxOptions option for creating the sandbox in a fresh JS::Zone. r=mrbkap (f99b17726)
- Bug 968520 - Always use fallible allocator with nsTArray_base::ShrinkCapacity. r=froydnj (b7cf63063)
- Bug 1160027 - Move ResourceQueue implementation from header file - r=cpearce (5fabd8c8f)
- Bug 1119277 - Remove the process CPU priority parameter and simplify all the associated code. r=khuey, r=dhylands (32d2b0df2)
- Goanna -> Gecko (2b16bec4c)
- Bug 892371 - Adjust oom_score_adj values for foreground processes according to an LRU policy. r=dhylands, r=khuey (61cdfc3db)
- Bug 892371 - Add mochitests covering LRU priority adjustments for both foreground and background processes. r=khuey (46676e34f)
- Bug 1164297 - tweaks to logging modules of MediaDecoderStateMachine to remove accessing to env vars. r=cpearce. (e9dc910da)
- Bug 1150539: log getUserMedia constraints used in MediaManager:5. r=jesup (161853b66)
- Bug 1139027 - Permit running of camera mochitests on B2G desktop. r=mikeh (8bb265db2)
- Bug 1145403 - Don't open MediaManager on shutdown. r=jesup (9338eef82)
- Bug 1046245 - enumerateDevices w/non-blocking e10s, nsICryptoHMAC, clear cookies, lambdas. r=keeler, florian, billm, jesup (ce9d684a0)
- remove StopWebRtcLoc() to be readded in Bug 1219339 - Part2 (7a0c901fc)
- Bug 1046245 - IO on STS thread + cleanup BackgroundChild on shutdown r=jesup (e85dd7716)
- Bug 579517 follow-up: Remove NSPR types that crept in (35aee15a6)
- Bug 1152443 - Fix broken validation which prevented reading of enumerate_devices.txt. r=jesup (4e135355b)
- Bug 1143562 - use /data/b2g/mozilla/gmp as the gmp storage folder on B2G. r=cpearce. (ddc07f09a)
- Bug 1143562. Part2 - only init |mStorageBaseDir| in the chrome process. r=cpearce (3039a4f44)
- remove specific hack, this code is going away anyway (34aed4d6b)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 0 - Make mozIGeckoMediaPluginService::GetPluginVersionForAPI return whether we even have the plugin. r=cpearce. (e6ac61630)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 1 - split GeckoMediaPluginService into a part for chrome and a part for both content and chrome. r=jwwang. (09f8c4a83)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 2 - support asynchronous GMP API getters. r=jwwang,rjesup. (e33266976)
- Bug 1143532 - Include pid in the log messages of GMPParent. r=edwin (8486ebc50)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 3 - split the GMP IPDL actors in 2 parts (and use opens to open the second in non-e10s). r=billm. (d17fa36ff)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 4 - make GetNodeId asynchronous. r=jwwang. (db7a21e4a)
- Bug 1150049 - tidy up nsImageBoxFrame::Init a little bit; r=dholbert (41c258a71)
- Bug 1150266 - fix IPDL thinko for never-inline method declarations; r=bent (445d3420b)
- Bug 1150207 - Convert a focus() call to use SpecialPowers to avoid out-of-order focusing behaviour. r=mwargers (4d134848c)
- Bug 1148641 - Guard against null parameters to SendSetTargetAPZCNotification. r=botond (8c5f4bb6d)
- Bug 1096172 - Fix position reporting of bad charrefs in RCDATA. r=hsivonen. (77100d26d)
- Bug 1149971 Part 2: Cet rid of kCurrentProcessId as it makes lots of static initializers. r=dvander (3efaefdba)
- remove android widgets (0c2565418)
- Bug 1129991 - Remove QuotaManager::SetCurrentWindow(); r=bent (7ccabf88c)
- Bug 1133748 - Fix ipdl code for bridged protocols that are also opened. r=billm. (402751d09)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Part 5 - use bridging for GMP in e10s. r=billm. (e45a87c5f)
- Bug 1057908 followup: Add missing 'override' annotation on GMPServiceParent::ActorDestroy method decl. rs=ehsan (48f53b28a)
- Bug 1057908 - GeckoMediaPluginService needs to be proxied from Content processes to parent process. Add nsServiceManagerUtils.h include to WMFDecoderModule.cpp. (67cddb4da)
- kill android widgets better (bec243c8d)
2020-05-30 12:49:01 +08:00

226 lines
8.6 KiB
C++

/*
* Copyright (C) 2012-2014 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef DOM_CAMERA_GONKCAMERACONTROL_H
#define DOM_CAMERA_GONKCAMERACONTROL_H
#include "base/basictypes.h"
#include "nsRefPtrHashtable.h"
#include "mozilla/ReentrantMonitor.h"
#include "DeviceStorage.h"
#include "CameraControlImpl.h"
#include "CameraCommon.h"
#include "GonkCameraHwMgr.h"
#include "GonkCameraParameters.h"
#ifdef MOZ_WIDGET_GONK
#include <media/MediaProfiles.h>
#include <camera/Camera.h>
#include "GonkRecorder.h"
#else
#include "FallbackCameraPlatform.h"
#endif
namespace android {
class GonkCameraHardware;
class GonkRecorder;
class GonkCameraSource;
}
namespace mozilla {
namespace layers {
class TextureClient;
class ImageContainer;
}
class GonkRecorderProfile;
class GonkRecorderProfileManager;
class nsGonkCameraControl : public CameraControlImpl
{
public:
nsGonkCameraControl(uint32_t aCameraId);
void OnAutoFocusComplete(bool aSuccess);
void OnFacesDetected(camera_frame_metadata_t* aMetaData);
void OnTakePictureComplete(uint8_t* aData, uint32_t aLength);
void OnTakePictureError();
void OnRateLimitPreview(bool aLimit);
void OnNewPreviewFrame(layers::TextureClient* aBuffer);
#ifdef MOZ_WIDGET_GONK
void OnRecorderEvent(int msg, int ext1, int ext2);
#endif
void OnSystemError(CameraControlListener::SystemContext aWhere, nsresult aError);
// See ICameraControl.h for getter/setter return values.
virtual nsresult Set(uint32_t aKey, const nsAString& aValue) override;
virtual nsresult Get(uint32_t aKey, nsAString& aValue) override;
virtual nsresult Set(uint32_t aKey, double aValue) override;
virtual nsresult Get(uint32_t aKey, double& aValue) override;
virtual nsresult Set(uint32_t aKey, int32_t aValue) override;
virtual nsresult Get(uint32_t aKey, int32_t& aValue) override;
virtual nsresult Set(uint32_t aKey, int64_t aValue) override;
virtual nsresult Get(uint32_t aKey, int64_t& aValue) override;
virtual nsresult Set(uint32_t aKey, bool aValue) override;
virtual nsresult Get(uint32_t aKey, bool& aValue) override;
virtual nsresult Set(uint32_t aKey, const Size& aValue) override;
virtual nsresult Get(uint32_t aKey, Size& aValue) override;
virtual nsresult Set(uint32_t aKey, const nsTArray<Region>& aRegions) override;
virtual nsresult Get(uint32_t aKey, nsTArray<Region>& aRegions) override;
virtual nsresult SetLocation(const Position& aLocation) override;
virtual nsresult Get(uint32_t aKey, nsTArray<Size>& aSizes) override;
virtual nsresult Get(uint32_t aKey, nsTArray<nsString>& aValues) override;
virtual nsresult Get(uint32_t aKey, nsTArray<double>& aValues) override;
virtual nsresult GetRecorderProfiles(nsTArray<nsString>& aProfiles) override;
virtual ICameraControl::RecorderProfile*
GetProfileInfo(const nsAString& aProfile) override;
nsresult PushParameters();
nsresult PullParameters();
protected:
~nsGonkCameraControl();
using CameraControlImpl::OnRateLimitPreview;
using CameraControlImpl::OnNewPreviewFrame;
using CameraControlImpl::OnAutoFocusComplete;
using CameraControlImpl::OnFacesDetected;
using CameraControlImpl::OnTakePictureComplete;
using CameraControlImpl::OnConfigurationChange;
using CameraControlImpl::OnUserError;
typedef nsTArray<Size>::index_type SizeIndex;
virtual void BeginBatchParameterSet() override;
virtual void EndBatchParameterSet() override;
nsresult Initialize();
nsresult ValidateConfiguration(const Configuration& aConfig, Configuration& aValidatedConfig);
nsresult SetConfigurationInternal(const Configuration& aConfig);
nsresult SetPictureConfiguration(const Configuration& aConfig);
nsresult SetVideoConfiguration(const Configuration& aConfig);
nsresult StartInternal(const Configuration* aInitialConfig);
nsresult StartPreviewInternal();
nsresult StopInternal();
template<class T> nsresult SetAndPush(uint32_t aKey, const T& aValue);
// See CameraControlImpl.h for these methods' return values.
virtual nsresult StartImpl(const Configuration* aInitialConfig = nullptr) override;
virtual nsresult SetConfigurationImpl(const Configuration& aConfig) override;
virtual nsresult StopImpl() override;
virtual nsresult StartPreviewImpl() override;
virtual nsresult StopPreviewImpl() override;
virtual nsresult AutoFocusImpl() override;
virtual nsresult StartFaceDetectionImpl() override;
virtual nsresult StopFaceDetectionImpl() override;
virtual nsresult TakePictureImpl() override;
virtual nsresult StartRecordingImpl(DeviceStorageFileDescriptor* aFileDescriptor,
const StartRecordingOptions* aOptions = nullptr) override;
virtual nsresult StopRecordingImpl() override;
virtual nsresult ResumeContinuousFocusImpl() override;
virtual nsresult PushParametersImpl() override;
virtual nsresult PullParametersImpl() override;
nsresult SetupRecording(int aFd, int aRotation, uint64_t aMaxFileSizeBytes,
uint64_t aMaxVideoLengthMs);
nsresult SetupRecordingFlash(bool aAutoEnableLowLightTorch);
nsresult SelectCaptureAndPreviewSize(const Size& aPreviewSize, const Size& aCaptureSize,
const Size& aMaxSize, uint32_t aCaptureSizeKey);
nsresult MaybeAdjustVideoSize();
nsresult PausePreview();
nsresult GetSupportedSize(const Size& aSize, const nsTArray<Size>& supportedSizes, Size& best);
nsresult LoadRecorderProfiles();
static PLDHashOperator Enumerate(const nsAString& aProfileName,
RecorderProfile* aProfile,
void* aUserArg);
friend class SetPictureSize;
friend class SetThumbnailSize;
nsresult SetPictureSize(const Size& aSize);
nsresult SetPictureSizeImpl(const Size& aSize);
nsresult SetThumbnailSize(const Size& aSize);
nsresult UpdateThumbnailSize();
nsresult SetThumbnailSizeImpl(const Size& aSize);
friend class android::GonkCameraSource;
android::sp<android::GonkCameraHardware> GetCameraHw();
int32_t RationalizeRotation(int32_t aRotation);
uint32_t mCameraId;
android::sp<android::GonkCameraHardware> mCameraHw;
Size mLastThumbnailSize;
Size mLastRecorderSize;
uint32_t mPreviewFps;
bool mResumePreviewAfterTakingPicture;
bool mFlashSupported;
bool mLuminanceSupported;
bool mAutoFlashModeOverridden;
bool mSeparateVideoAndPreviewSizesSupported;
Atomic<uint32_t> mDeferConfigUpdate;
GonkCameraParameters mParams;
nsRefPtr<mozilla::layers::ImageContainer> mImageContainer;
#ifdef MOZ_WIDGET_GONK
nsRefPtr<android::GonkRecorder> mRecorder;
#endif
// Touching mRecorder happens inside this monitor because the destructor
// can run on any thread, and we need to be able to clean up properly if
// GonkCameraControl goes away.
ReentrantMonitor mRecorderMonitor;
// Supported recorder profiles
nsRefPtrHashtable<nsStringHashKey, RecorderProfile> mRecorderProfiles;
nsRefPtr<DeviceStorageFile> mVideoFile;
nsString mFileFormat;
// Guards against calling StartPreviewImpl() while in OnTakePictureComplete().
ReentrantMonitor mReentrantMonitor;
private:
nsGonkCameraControl(const nsGonkCameraControl&) = delete;
nsGonkCameraControl& operator=(const nsGonkCameraControl&) = delete;
};
// camera driver callbacks
void OnRateLimitPreview(nsGonkCameraControl* gc, bool aLimit);
void OnTakePictureComplete(nsGonkCameraControl* gc, uint8_t* aData, uint32_t aLength);
void OnTakePictureError(nsGonkCameraControl* gc);
void OnAutoFocusComplete(nsGonkCameraControl* gc, bool aSuccess);
void OnAutoFocusMoving(nsGonkCameraControl* gc, bool aIsMoving);
void OnFacesDetected(nsGonkCameraControl* gc, camera_frame_metadata_t* aMetaData);
void OnNewPreviewFrame(nsGonkCameraControl* gc, layers::TextureClient* aBuffer);
void OnShutter(nsGonkCameraControl* gc);
void OnSystemError(nsGonkCameraControl* gc,
CameraControlListener::SystemContext aWhere,
int32_t aArg1, int32_t aArg2);
} // namespace mozilla
#endif // DOM_CAMERA_GONKCAMERACONTROL_H