mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1196330 - Do not restart preview if configuration is unchanged. r=dhylands
This commit is contained in:
parent
f59ac471e2
commit
5c8858b518
@ -139,13 +139,19 @@ nsGonkCameraControl::StartInternal(const Configuration* aInitialConfig)
|
||||
case NS_ERROR_ALREADY_INITIALIZED:
|
||||
case NS_OK:
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (aInitialConfig) {
|
||||
rv = SetConfigurationInternal(*aInitialConfig);
|
||||
Configuration config;
|
||||
rv = ValidateConfiguration(*aInitialConfig, config);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = SetConfigurationInternal(config);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
// The initial configuration failed, close up the hardware
|
||||
StopInternal();
|
||||
@ -183,6 +189,8 @@ nsGonkCameraControl::Initialize()
|
||||
|
||||
DOM_CAMERA_LOGI("Initializing camera %d (this=%p, mCameraHw=%p)\n", mCameraId, this, mCameraHw.get());
|
||||
mCurrentConfiguration.mRecorderProfile.Truncate();
|
||||
mRequestedPreviewSize.width = UINT32_MAX;
|
||||
mRequestedPreviewSize.height = UINT32_MAX;
|
||||
|
||||
// Initialize our camera configuration database.
|
||||
mCameraHw->PullParameters(mParams);
|
||||
@ -278,7 +286,7 @@ nsGonkCameraControl::Initialize()
|
||||
DOM_CAMERA_LOGI(" - metering mode: '%s'\n",
|
||||
NS_ConvertUTF16toUTF8(mode).get());
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -321,9 +329,19 @@ nsGonkCameraControl::ValidateConfiguration(const Configuration& aConfig, Configu
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
if (mCurrentConfiguration.mMode == aConfig.mMode &&
|
||||
mRequestedPreviewSize.width == aConfig.mPreviewSize.width &&
|
||||
mRequestedPreviewSize.height == aConfig.mPreviewSize.height &&
|
||||
mCurrentConfiguration.mRecorderProfile.Equals(profile->GetName()))
|
||||
{
|
||||
DOM_CAMERA_LOGI("Camera configuration is unchanged\n");
|
||||
return NS_ERROR_ALREADY_INITIALIZED;
|
||||
}
|
||||
|
||||
aValidatedConfig.mMode = aConfig.mMode;
|
||||
aValidatedConfig.mPreviewSize = aConfig.mPreviewSize;
|
||||
aValidatedConfig.mRecorderProfile = profile->GetName();
|
||||
mRequestedPreviewSize = aConfig.mPreviewSize;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -332,53 +350,46 @@ nsGonkCameraControl::SetConfigurationInternal(const Configuration& aConfig)
|
||||
{
|
||||
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
|
||||
|
||||
// Ensure sanity of all provided parameters and determine defaults if
|
||||
// none are provided when given a new configuration
|
||||
Configuration config;
|
||||
nsresult rv = ValidateConfiguration(aConfig, config);
|
||||
ICameraControlParameterSetAutoEnter set(this);
|
||||
|
||||
nsresult rv;
|
||||
switch (aConfig.mMode) {
|
||||
case kPictureMode:
|
||||
rv = SetPictureConfiguration(aConfig);
|
||||
break;
|
||||
|
||||
case kVideoMode:
|
||||
rv = SetVideoConfiguration(aConfig);
|
||||
break;
|
||||
|
||||
default:
|
||||
MOZ_ASSERT_UNREACHABLE("Unanticipated camera mode in SetConfigurationInternal()");
|
||||
rv = NS_ERROR_FAILURE;
|
||||
break;
|
||||
}
|
||||
|
||||
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
mRequestedPreviewSize.width = UINT32_MAX;
|
||||
mRequestedPreviewSize.height = UINT32_MAX;
|
||||
return rv;
|
||||
}
|
||||
|
||||
{
|
||||
ICameraControlParameterSetAutoEnter set(this);
|
||||
rv = Set(CAMERA_PARAM_RECORDINGHINT, aConfig.mMode == kVideoMode);
|
||||
if (NS_FAILED(rv)) {
|
||||
DOM_CAMERA_LOGE("Failed to set recording hint (0x%x)\n", rv);
|
||||
}
|
||||
|
||||
switch (config.mMode) {
|
||||
case kPictureMode:
|
||||
rv = SetPictureConfiguration(config);
|
||||
break;
|
||||
mCurrentConfiguration.mMode = aConfig.mMode;
|
||||
mCurrentConfiguration.mRecorderProfile = aConfig.mRecorderProfile;
|
||||
|
||||
case kVideoMode:
|
||||
rv = SetVideoConfiguration(config);
|
||||
break;
|
||||
|
||||
default:
|
||||
MOZ_ASSERT_UNREACHABLE("Unanticipated camera mode in SetConfigurationInternal()");
|
||||
rv = NS_ERROR_FAILURE;
|
||||
break;
|
||||
}
|
||||
|
||||
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = Set(CAMERA_PARAM_RECORDINGHINT, config.mMode == kVideoMode);
|
||||
if (NS_FAILED(rv)) {
|
||||
DOM_CAMERA_LOGE("Failed to set recording hint (0x%x)\n", rv);
|
||||
}
|
||||
|
||||
mCurrentConfiguration.mMode = config.mMode;
|
||||
mCurrentConfiguration.mRecorderProfile = config.mRecorderProfile;
|
||||
|
||||
if (config.mMode == kPictureMode) {
|
||||
mCurrentConfiguration.mPictureSize = config.mPictureSize;
|
||||
} else /* if config.mMode == kVideoMode */ {
|
||||
// The following is best-effort; we don't currently support taking
|
||||
// pictures while in video mode, but we should at least return
|
||||
// sane values to OnConfigurationChange() handlers...
|
||||
SetPictureSizeImpl(config.mPictureSize);
|
||||
}
|
||||
if (aConfig.mMode == kPictureMode) {
|
||||
mCurrentConfiguration.mPictureSize = aConfig.mPictureSize;
|
||||
} else /* if config.mMode == kVideoMode */ {
|
||||
// The following is best-effort; we don't currently support taking
|
||||
// pictures while in video mode, but we should at least return
|
||||
// sane values to OnConfigurationChange() handlers...
|
||||
SetPictureSizeImpl(aConfig.mPictureSize);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
@ -394,8 +405,19 @@ nsGonkCameraControl::SetConfigurationImpl(const Configuration& aConfig)
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
Configuration config;
|
||||
nsresult rv = ValidateConfiguration(aConfig, config);
|
||||
if (rv == NS_ERROR_ALREADY_INITIALIZED) {
|
||||
// Configuration did not change, so no need to stop/start the preview
|
||||
// or push parameters to the camera hardware
|
||||
OnConfigurationChange();
|
||||
return NS_OK;
|
||||
} else if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Stop any currently running preview
|
||||
nsresult rv = PausePreview();
|
||||
rv = PausePreview();
|
||||
if (NS_FAILED(rv)) {
|
||||
DOM_CAMERA_LOGW("PausePreview() in SetConfigurationImpl() failed (0x%x)\n", rv);
|
||||
if (rv == NS_ERROR_NOT_INITIALIZED) {
|
||||
@ -406,7 +428,7 @@ nsGonkCameraControl::SetConfigurationImpl(const Configuration& aConfig)
|
||||
}
|
||||
|
||||
DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
|
||||
rv = SetConfigurationInternal(aConfig);
|
||||
rv = SetConfigurationInternal(config);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
StopPreviewImpl();
|
||||
return rv;
|
||||
|
@ -179,6 +179,7 @@ protected:
|
||||
|
||||
Size mLastThumbnailSize;
|
||||
Size mLastRecorderSize;
|
||||
Size mRequestedPreviewSize;
|
||||
uint32_t mPreviewFps;
|
||||
bool mResumePreviewAfterTakingPicture;
|
||||
bool mFlashSupported;
|
||||
|
Loading…
Reference in New Issue
Block a user