зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1003006: Move b2g camera rotation checks to MainThread r=mikeh
This commit is contained in:
Родитель
1e30627356
Коммит
b24cc8f363
|
@ -170,6 +170,7 @@ public:
|
|||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
void OnHardwareStateChange(HardwareState aState);
|
||||
void GetRotation();
|
||||
bool OnNewPreviewFrame(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight);
|
||||
void OnUserError(UserContext aContext, nsresult aError);
|
||||
void OnTakePictureComplete(uint8_t* aData, uint32_t aLength, const nsAString& aMimeType);
|
||||
|
@ -212,9 +213,12 @@ private:
|
|||
|
||||
// Engine variables.
|
||||
#ifdef MOZ_B2G_CAMERA
|
||||
nsRefPtr<ICameraControl> mCameraControl;
|
||||
mozilla::ReentrantMonitor mCallbackMonitor; // Monitor for camera callback handling
|
||||
// This is only modified on MainThread (AllocImpl and DeallocImpl)
|
||||
nsRefPtr<ICameraControl> mCameraControl;
|
||||
nsRefPtr<nsIDOMFile> mLastCapture;
|
||||
|
||||
// These are protected by mMonitor below
|
||||
int mRotation;
|
||||
int mCameraAngle; // See dom/base/ScreenOrientation.h
|
||||
bool mBackCamera;
|
||||
|
|
|
@ -415,7 +415,7 @@ MediaEngineWebRTCVideoSource::Allocate(const VideoTrackConstraintsN &aConstraint
|
|||
ReentrantMonitorAutoEnter sync(mCallbackMonitor);
|
||||
if (mState == kReleased && mInitDone) {
|
||||
ChooseCapability(aConstraints, aPrefs);
|
||||
NS_DispatchToMainThread(WrapRunnable(this,
|
||||
NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
|
||||
&MediaEngineWebRTCVideoSource::AllocImpl));
|
||||
mCallbackMonitor.Wait();
|
||||
if (mState != kAllocated) {
|
||||
|
@ -459,7 +459,7 @@ MediaEngineWebRTCVideoSource::Deallocate()
|
|||
#ifdef MOZ_B2G_CAMERA
|
||||
// We do not register success callback here
|
||||
|
||||
NS_DispatchToMainThread(WrapRunnable(this,
|
||||
NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
|
||||
&MediaEngineWebRTCVideoSource::DeallocImpl));
|
||||
mCallbackMonitor.Wait();
|
||||
if (mState != kReleased) {
|
||||
|
@ -519,7 +519,7 @@ MediaEngineWebRTCVideoSource::Start(SourceMediaStream* aStream, TrackID aID)
|
|||
mImageContainer = layers::LayerManager::CreateImageContainer();
|
||||
|
||||
#ifdef MOZ_B2G_CAMERA
|
||||
NS_DispatchToMainThread(WrapRunnable(this,
|
||||
NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
|
||||
&MediaEngineWebRTCVideoSource::StartImpl,
|
||||
mCapability));
|
||||
mCallbackMonitor.Wait();
|
||||
|
@ -573,7 +573,7 @@ MediaEngineWebRTCVideoSource::Stop(SourceMediaStream *aSource, TrackID aID)
|
|||
mImage = nullptr;
|
||||
}
|
||||
#ifdef MOZ_B2G_CAMERA
|
||||
NS_DispatchToMainThread(WrapRunnable(this,
|
||||
NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
|
||||
&MediaEngineWebRTCVideoSource::StopImpl));
|
||||
#else
|
||||
mViERender->StopRender(mCaptureIndex);
|
||||
|
@ -789,26 +789,37 @@ MediaEngineWebRTCVideoSource::OnHardwareStateChange(HardwareState aState)
|
|||
mCallbackMonitor.Notify();
|
||||
}
|
||||
} else {
|
||||
mCameraControl->Get(CAMERA_PARAM_SENSORANGLE, mCameraAngle);
|
||||
MOZ_ASSERT(mCameraAngle == 0 || mCameraAngle == 90 || mCameraAngle == 180 ||
|
||||
mCameraAngle == 270);
|
||||
hal::ScreenConfiguration aConfig;
|
||||
hal::GetCurrentScreenConfiguration(&aConfig);
|
||||
|
||||
nsCString deviceName;
|
||||
ICameraControl::GetCameraName(mCaptureIndex, deviceName);
|
||||
if (deviceName.EqualsASCII("back")) {
|
||||
mBackCamera = true;
|
||||
}
|
||||
|
||||
mRotation = GetRotateAmount(aConfig.orientation(), mCameraAngle, mBackCamera);
|
||||
LOG(("*** Initial orientation: %d (Camera %d Back %d MountAngle: %d)",
|
||||
mRotation, mCaptureIndex, mBackCamera, mCameraAngle));
|
||||
// Can't read this except on MainThread (ugh)
|
||||
NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
|
||||
&MediaEngineWebRTCVideoSource::GetRotation));
|
||||
mState = kStarted;
|
||||
mCallbackMonitor.Notify();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaEngineWebRTCVideoSource::GetRotation()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
MonitorAutoLock enter(mMonitor);
|
||||
|
||||
mCameraControl->Get(CAMERA_PARAM_SENSORANGLE, mCameraAngle);
|
||||
MOZ_ASSERT(mCameraAngle == 0 || mCameraAngle == 90 || mCameraAngle == 180 ||
|
||||
mCameraAngle == 270);
|
||||
hal::ScreenConfiguration config;
|
||||
hal::GetCurrentScreenConfiguration(&config);
|
||||
|
||||
nsCString deviceName;
|
||||
ICameraControl::GetCameraName(mCaptureIndex, deviceName);
|
||||
if (deviceName.EqualsASCII("back")) {
|
||||
mBackCamera = true;
|
||||
}
|
||||
|
||||
mRotation = GetRotateAmount(config.orientation(), mCameraAngle, mBackCamera);
|
||||
LOG(("*** Initial orientation: %d (Camera %d Back %d MountAngle: %d)",
|
||||
mRotation, mCaptureIndex, mBackCamera, mCameraAngle));
|
||||
}
|
||||
|
||||
void
|
||||
MediaEngineWebRTCVideoSource::OnUserError(UserContext aContext, nsresult aError)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче