Bug 1003006: Move b2g camera rotation checks to MainThread r=mikeh

This commit is contained in:
Randell Jesup 2014-05-15 19:17:40 -04:00
parent a8ec7121f2
commit 5b6c282707
2 changed files with 35 additions and 20 deletions

View File

@ -170,6 +170,7 @@ public:
NS_DECL_ISUPPORTS_INHERITED NS_DECL_ISUPPORTS_INHERITED
void OnHardwareStateChange(HardwareState aState); void OnHardwareStateChange(HardwareState aState);
void GetRotation();
bool OnNewPreviewFrame(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight); bool OnNewPreviewFrame(layers::Image* aImage, uint32_t aWidth, uint32_t aHeight);
void OnUserError(UserContext aContext, nsresult aError); void OnUserError(UserContext aContext, nsresult aError);
void OnTakePictureComplete(uint8_t* aData, uint32_t aLength, const nsAString& aMimeType); void OnTakePictureComplete(uint8_t* aData, uint32_t aLength, const nsAString& aMimeType);
@ -212,9 +213,12 @@ private:
// Engine variables. // Engine variables.
#ifdef MOZ_B2G_CAMERA #ifdef MOZ_B2G_CAMERA
nsRefPtr<ICameraControl> mCameraControl;
mozilla::ReentrantMonitor mCallbackMonitor; // Monitor for camera callback handling mozilla::ReentrantMonitor mCallbackMonitor; // Monitor for camera callback handling
// This is only modified on MainThread (AllocImpl and DeallocImpl)
nsRefPtr<ICameraControl> mCameraControl;
nsRefPtr<nsIDOMFile> mLastCapture; nsRefPtr<nsIDOMFile> mLastCapture;
// These are protected by mMonitor below
int mRotation; int mRotation;
int mCameraAngle; // See dom/base/ScreenOrientation.h int mCameraAngle; // See dom/base/ScreenOrientation.h
bool mBackCamera; bool mBackCamera;

View File

@ -415,7 +415,7 @@ MediaEngineWebRTCVideoSource::Allocate(const VideoTrackConstraintsN &aConstraint
ReentrantMonitorAutoEnter sync(mCallbackMonitor); ReentrantMonitorAutoEnter sync(mCallbackMonitor);
if (mState == kReleased && mInitDone) { if (mState == kReleased && mInitDone) {
ChooseCapability(aConstraints, aPrefs); ChooseCapability(aConstraints, aPrefs);
NS_DispatchToMainThread(WrapRunnable(this, NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
&MediaEngineWebRTCVideoSource::AllocImpl)); &MediaEngineWebRTCVideoSource::AllocImpl));
mCallbackMonitor.Wait(); mCallbackMonitor.Wait();
if (mState != kAllocated) { if (mState != kAllocated) {
@ -459,7 +459,7 @@ MediaEngineWebRTCVideoSource::Deallocate()
#ifdef MOZ_B2G_CAMERA #ifdef MOZ_B2G_CAMERA
// We do not register success callback here // We do not register success callback here
NS_DispatchToMainThread(WrapRunnable(this, NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
&MediaEngineWebRTCVideoSource::DeallocImpl)); &MediaEngineWebRTCVideoSource::DeallocImpl));
mCallbackMonitor.Wait(); mCallbackMonitor.Wait();
if (mState != kReleased) { if (mState != kReleased) {
@ -519,7 +519,7 @@ MediaEngineWebRTCVideoSource::Start(SourceMediaStream* aStream, TrackID aID)
mImageContainer = layers::LayerManager::CreateImageContainer(); mImageContainer = layers::LayerManager::CreateImageContainer();
#ifdef MOZ_B2G_CAMERA #ifdef MOZ_B2G_CAMERA
NS_DispatchToMainThread(WrapRunnable(this, NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
&MediaEngineWebRTCVideoSource::StartImpl, &MediaEngineWebRTCVideoSource::StartImpl,
mCapability)); mCapability));
mCallbackMonitor.Wait(); mCallbackMonitor.Wait();
@ -573,7 +573,7 @@ MediaEngineWebRTCVideoSource::Stop(SourceMediaStream *aSource, TrackID aID)
mImage = nullptr; mImage = nullptr;
} }
#ifdef MOZ_B2G_CAMERA #ifdef MOZ_B2G_CAMERA
NS_DispatchToMainThread(WrapRunnable(this, NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
&MediaEngineWebRTCVideoSource::StopImpl)); &MediaEngineWebRTCVideoSource::StopImpl));
#else #else
mViERender->StopRender(mCaptureIndex); mViERender->StopRender(mCaptureIndex);
@ -789,26 +789,37 @@ MediaEngineWebRTCVideoSource::OnHardwareStateChange(HardwareState aState)
mCallbackMonitor.Notify(); mCallbackMonitor.Notify();
} }
} else { } else {
mCameraControl->Get(CAMERA_PARAM_SENSORANGLE, mCameraAngle); // Can't read this except on MainThread (ugh)
MOZ_ASSERT(mCameraAngle == 0 || mCameraAngle == 90 || mCameraAngle == 180 || NS_DispatchToMainThread(WrapRunnable(nsRefPtr<MediaEngineWebRTCVideoSource>(this),
mCameraAngle == 270); &MediaEngineWebRTCVideoSource::GetRotation));
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));
mState = kStarted; mState = kStarted;
mCallbackMonitor.Notify(); 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 void
MediaEngineWebRTCVideoSource::OnUserError(UserContext aContext, nsresult aError) MediaEngineWebRTCVideoSource::OnUserError(UserContext aContext, nsresult aError)
{ {