blob: f0b520c62b70e0ee9de60cc49a1396b8346b88f8 [file] [log] [blame]
/*
* Copyright 2022 The Android Open Source Project
*
* 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.
*/
package androidx.camera.camera2.pipe.integration.testing
import android.graphics.Rect
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.params.StreamConfigurationMap
import android.util.Range
import android.util.Size
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.integration.adapter.CameraControlStateAdapter
import androidx.camera.camera2.pipe.integration.adapter.CameraInfoAdapter
import androidx.camera.camera2.pipe.integration.adapter.CameraStateAdapter
import androidx.camera.camera2.pipe.integration.adapter.EncoderProfilesProviderAdapter
import androidx.camera.camera2.pipe.integration.compat.StreamConfigurationMapCompat
import androidx.camera.camera2.pipe.integration.compat.quirk.CameraQuirks
import androidx.camera.camera2.pipe.integration.compat.workaround.MeteringRegionCorrection
import androidx.camera.camera2.pipe.integration.compat.workaround.NoOpAutoFlashAEModeDisabler
import androidx.camera.camera2.pipe.integration.compat.workaround.OutputSizesCorrector
import androidx.camera.camera2.pipe.integration.config.CameraConfig
import androidx.camera.camera2.pipe.integration.impl.CameraCallbackMap
import androidx.camera.camera2.pipe.integration.impl.CameraProperties
import androidx.camera.camera2.pipe.integration.impl.EvCompControl
import androidx.camera.camera2.pipe.integration.impl.FocusMeteringControl
import androidx.camera.camera2.pipe.integration.impl.State3AControl
import androidx.camera.camera2.pipe.integration.impl.TorchControl
import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
import androidx.camera.camera2.pipe.integration.impl.ZoomControl
import androidx.camera.camera2.pipe.testing.FakeCameraMetadata
import androidx.camera.core.impl.ImageFormatConstants
import com.google.common.util.concurrent.MoreExecutors
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher
import org.robolectric.shadows.StreamConfigurationMapBuilder
object FakeCameraInfoAdapterCreator {
private val CAMERA_ID_0 = CameraId("0")
val useCaseThreads by lazy {
val executor = MoreExecutors.directExecutor()
val dispatcher = executor.asCoroutineDispatcher()
val cameraScope = CoroutineScope(
SupervisorJob() + dispatcher + CoroutineName("CameraInfoAdapterUtil")
)
UseCaseThreads(cameraScope, executor, dispatcher)
}
private const val formatPrivate = ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
private val streamConfigurationMap: StreamConfigurationMap =
StreamConfigurationMapBuilder.newBuilder()
.addOutputSize(formatPrivate, Size(1920, 1080))
.addOutputSize(formatPrivate, Size(1280, 720))
.addOutputSize(formatPrivate, Size(640, 480))
.build()
private val cameraCharacteristics = mapOf(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP to streamConfigurationMap,
CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE to Rect(0, 0, 640, 480),
CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES to arrayOf(
Range(12, 30),
Range(24, 24),
Range(30, 30),
Range(60, 60)
)
)
private val zoomControl = ZoomControl(useCaseThreads, FakeZoomCompat())
fun createCameraInfoAdapter(
cameraId: CameraId = CAMERA_ID_0,
cameraProperties: CameraProperties = FakeCameraProperties(
FakeCameraMetadata(
cameraId = cameraId,
characteristics = cameraCharacteristics
),
cameraId
),
zoomControl: ZoomControl = this.zoomControl,
): CameraInfoAdapter {
val fakeUseCaseCamera = FakeUseCaseCamera()
val state3AControl = State3AControl(cameraProperties, NoOpAutoFlashAEModeDisabler).apply {
useCaseCamera = fakeUseCaseCamera
}
val fakeStreamConfigurationMap = StreamConfigurationMapCompat(
streamConfigurationMap,
OutputSizesCorrector(cameraProperties.metadata, streamConfigurationMap)
)
val fakeCameraQuirks = CameraQuirks(
cameraProperties.metadata,
fakeStreamConfigurationMap,
)
return CameraInfoAdapter(
cameraProperties,
CameraConfig(cameraId),
CameraStateAdapter(),
CameraControlStateAdapter(
zoomControl,
EvCompControl(FakeEvCompCompat()),
TorchControl(cameraProperties, state3AControl, useCaseThreads),
),
CameraCallbackMap(),
FocusMeteringControl(
cameraProperties,
MeteringRegionCorrection.Bindings.provideMeteringRegionCorrection(
fakeCameraQuirks
),
state3AControl,
useCaseThreads,
FakeZoomCompat(),
).apply {
useCaseCamera = fakeUseCaseCamera
},
fakeCameraQuirks,
EncoderProfilesProviderAdapter(cameraId.value),
fakeStreamConfigurationMap,
)
}
}