Parameterize camera-extensions tests
This CL parameterizes camera-extensions tests, allowing them to be run
on both the camera-camera2 backend and the camera-camera2-pipe backend.
Bug: 320485616
Test: Run tests on supported devices
Change-Id: If3d239c717ac409f414893edcfe8fc6e6b62c44f
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 1cc83d2..95a8346 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -60,6 +60,7 @@
androidTestImplementation(libs.truth)
androidTestImplementation(libs.multidex)
androidTestImplementation(project(":camera:camera-camera2"))
+ androidTestImplementation(project(":camera:camera-camera2-pipe-integration"))
androidTestImplementation(project(":camera:camera-lifecycle"))
androidTestImplementation(project(":camera:camera-testing")) {
// Ensure camera-testing does not pull in androidx.test dependencies
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
index 5eafbc8..18e7195 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
@@ -24,6 +24,7 @@
import androidx.camera.core.Camera
import androidx.camera.core.CameraInfo
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.SurfaceRequest
import androidx.camera.core.impl.CameraInfoInternal
import androidx.camera.core.impl.MutableStateObservable
@@ -34,7 +35,9 @@
import androidx.camera.extensions.internal.VendorExtender
import androidx.camera.extensions.internal.Version
import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
import androidx.camera.testing.impl.CameraUtil
import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
import androidx.camera.testing.impl.fakes.FakeUseCase
@@ -55,6 +58,7 @@
import org.junit.Assume.assumeFalse
import org.junit.Assume.assumeTrue
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
@@ -63,10 +67,16 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class ExtensionsManagerTest(
+ private val implName: String,
+ private val cameraXConfig: CameraXConfig,
private val implType: ExtensionsTestlibControl.ImplementationType,
@field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
) {
+ @get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+ )
private val context = InstrumentationRegistry.getInstrumentation().context
@@ -86,6 +96,7 @@
)
)
+ ProcessCameraProvider.configureInstance(cameraXConfig)
cameraProvider =
ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
@@ -112,10 +123,14 @@
companion object {
val context: Context = ApplicationProvider.getApplicationContext()
+
@JvmStatic
- @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
- val parameters: Collection<Array<Any>>
- get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, false)
+ @Parameterized.Parameters(
+ name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+ )
+ fun data(): Collection<Array<Any>> {
+ return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, false)
+ }
}
@Test
@@ -302,7 +317,7 @@
return true
}
- override fun getEstimatedCaptureLatencyRange(size: Size?): Range<Long>? {
+ override fun getEstimatedCaptureLatencyRange(size: Size?): Range<Long> {
return estimatedCaptureLatency
}
}
@@ -310,9 +325,11 @@
fakeVendorExtender
}
- assertThat(extensionsManager.getEstimatedCaptureLatencyRange(
- baseCameraSelector,
- extensionMode)
+ assertThat(
+ extensionsManager.getEstimatedCaptureLatencyRange(
+ baseCameraSelector,
+ extensionMode
+ )
).isEqualTo(estimatedCaptureLatency)
}
@@ -329,9 +346,11 @@
!= ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
)
- assertThat(extensionsManager.getEstimatedCaptureLatencyRange(
+ assertThat(
+ extensionsManager.getEstimatedCaptureLatencyRange(
baseCameraSelector,
- extensionMode)
+ extensionMode
+ )
).isNull()
}
@@ -483,9 +502,11 @@
== ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
)
- assertThat(extensionsManager.isImageAnalysisSupported(
- baseCameraSelector,
- extensionMode)
+ assertThat(
+ extensionsManager.isImageAnalysisSupported(
+ baseCameraSelector,
+ extensionMode
+ )
).isFalse()
}
@@ -517,11 +538,14 @@
== ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
)
- assertThat(extensionsManager.isImageAnalysisSupported(
- baseCameraSelector,
- extensionMode)
+ assertThat(
+ extensionsManager.isImageAnalysisSupported(
+ baseCameraSelector,
+ extensionMode
+ )
).isTrue()
}
+
@Test
fun isImageAnalysisSupportedIsFalse_whenExtensionAvailabilityIsNotAvailable() {
extensionsManager = ExtensionsManager.getInstanceAsync(
@@ -535,9 +559,11 @@
!= ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
)
- assertThat(extensionsManager.isImageAnalysisSupported(
- baseCameraSelector,
- extensionMode)
+ assertThat(
+ extensionsManager.isImageAnalysisSupported(
+ baseCameraSelector,
+ extensionMode
+ )
).isFalse()
}
@@ -569,7 +595,7 @@
}
override fun isPostviewAvailable(): Boolean {
- return true;
+ return true
}
}
extensionsManager.setVendorExtenderFactory {
@@ -598,7 +624,7 @@
}
override fun isCaptureProcessProgressAvailable(): Boolean {
- return true;
+ return true
}
}
extensionsManager.setVendorExtenderFactory {
@@ -637,8 +663,10 @@
var vendorExtender = ExtensionsTestUtil.createVendorExtender(extensionMode)
val cameraId = (cameraInfo as CameraInfoInternal).cameraId
- return vendorExtender.isExtensionAvailable(cameraId,
- ExtensionsUtils.getCameraCharacteristicsMap(cameraInfo))
+ return vendorExtender.isExtensionAvailable(
+ cameraId,
+ ExtensionsUtils.getCameraCharacteristicsMap(cameraInfo)
+ )
}
private fun createVideoCapture(): VideoCapture<TestVideoOutput> {
@@ -658,6 +686,7 @@
override fun onSurfaceRequested(@NonNull request: SurfaceRequest) {
surfaceRequest = request
}
+
override fun getMediaSpec() = mediaSpecObservable
override fun onSourceStateChanged(@NonNull sourceState: VideoOutput.SourceState) {
this.sourceState = sourceState
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
index db5d883..8ebfd99 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
@@ -21,9 +21,9 @@
import android.hardware.camera2.CameraCharacteristics
import android.util.Pair
import android.util.Size
-import androidx.camera.camera2.Camera2Config
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
@@ -33,7 +33,9 @@
import androidx.camera.extensions.impl.ExtensionsTestlibControl
import androidx.camera.extensions.internal.VendorExtender
import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
import androidx.camera.testing.impl.CameraUtil
import androidx.camera.testing.impl.SurfaceTextureProvider
import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
@@ -59,21 +61,32 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class ImageAnalysisTest(
+ private val implName: String,
+ private val cameraXConfig: CameraXConfig,
private val implType: ExtensionsTestlibControl.ImplementationType,
@ExtensionMode.Mode private val extensionMode: Int,
@CameraSelector.LensFacing private val lensFacing: Int
) {
companion object {
val context: Context = ApplicationProvider.getApplicationContext()
+
@JvmStatic
- @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
- val parameters: Collection<Array<Any>>
- get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ @Parameterized.Parameters(
+ name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+ )
+ fun data(): Collection<Array<Any>> {
+ return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ }
}
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraXConfig)
)
private lateinit var cameraProvider: ProcessCameraProvider
@@ -92,6 +105,7 @@
)
)
+ ProcessCameraProvider.configureInstance(cameraXConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
ExtensionsTestlibControl.getInstance().setImplementationType(implType)
baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -128,8 +142,9 @@
baseCameraSelector,
extensionMode
)
- Assume.assumeTrue(extensionsManager
- .isImageAnalysisSupported(extensionsCameraSelector, extensionMode))
+ Assume.assumeTrue(
+ extensionsManager.isImageAnalysisSupported(extensionsCameraSelector, extensionMode)
+ )
val analysisLatch = CountDownLatch(2)
withContext(Dispatchers.Main) {
@@ -185,16 +200,21 @@
override fun getSupportedPreviewOutputResolutions(): List<Pair<Int, Array<Size>>> {
return listOf(
- Pair(ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
+ Pair(
+ ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
getOutputSizes(
- ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE))
+ ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+ )
+ )
)
}
override fun getSupportedCaptureOutputResolutions(): List<Pair<Int, Array<Size>>> {
return listOf(
- Pair(ImageFormat.JPEG,
- getOutputSizes(ImageFormat.JPEG))
+ Pair(
+ ImageFormat.JPEG,
+ getOutputSizes(ImageFormat.JPEG)
+ )
)
}
}
@@ -204,8 +224,10 @@
baseCameraSelector,
extensionMode
)
- assertThat(extensionsManager
- .isImageAnalysisSupported(baseCameraSelector, extensionMode)).isTrue()
+ assertThat(
+ extensionsManager
+ .isImageAnalysisSupported(baseCameraSelector, extensionMode)
+ ).isTrue()
withContext(Dispatchers.Main) {
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
@@ -213,9 +235,9 @@
// 2. Act
cameraProvider.bindToLifecycle(
- fakeLifecycleOwner,
- extensionsCameraSelector,
- preview, imageCapture, imageAnalysis
+ fakeLifecycleOwner,
+ extensionsCameraSelector,
+ preview, imageCapture, imageAnalysis
)
// 3. Assert
@@ -241,16 +263,21 @@
override fun getSupportedPreviewOutputResolutions(): List<Pair<Int, Array<Size>>> {
return listOf(
- Pair(ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
+ Pair(
+ ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
getOutputSizes(
- ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE))
+ ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+ )
+ )
)
}
override fun getSupportedCaptureOutputResolutions(): List<Pair<Int, Array<Size>>> {
return listOf(
- Pair(ImageFormat.JPEG,
- getOutputSizes(ImageFormat.JPEG))
+ Pair(
+ ImageFormat.JPEG,
+ getOutputSizes(ImageFormat.JPEG)
+ )
)
}
}
@@ -260,8 +287,10 @@
baseCameraSelector,
extensionMode
)
- assertThat(extensionsManager
- .isImageAnalysisSupported(baseCameraSelector, extensionMode)).isFalse()
+ assertThat(
+ extensionsManager
+ .isImageAnalysisSupported(baseCameraSelector, extensionMode)
+ ).isFalse()
withContext(Dispatchers.Main) {
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
index 40550df..96f066b 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
@@ -23,9 +23,9 @@
import android.util.Log
import android.util.Size
import android.view.Surface
-import androidx.camera.camera2.Camera2Config
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import androidx.camera.core.ImageProxy
@@ -34,7 +34,9 @@
import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability
import androidx.camera.extensions.impl.ExtensionsTestlibControl
import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
import androidx.camera.testing.impl.CameraUtil
import androidx.camera.testing.impl.CameraUtil.PreTestCameraIdList
import androidx.camera.testing.impl.ExifUtil
@@ -70,14 +72,21 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class ImageCaptureTest(
+ private val implName: String,
+ private val cameraXConfig: CameraXConfig,
private val implType: ExtensionsTestlibControl.ImplementationType,
@field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
) {
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- PreTestCameraIdList(Camera2Config.defaultConfig())
+ PreTestCameraIdList(cameraXConfig)
)
@get:Rule
@@ -102,6 +111,7 @@
)
)
+ ProcessCameraProvider.configureInstance(cameraXConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
ExtensionsTestlibControl.getInstance().setImplementationType(implType)
@@ -136,10 +146,14 @@
companion object {
val TAG = "ImageCaptureTest"
val context: Context = ApplicationProvider.getApplicationContext()
+
@JvmStatic
- @get:Parameterized.Parameters(name = "impl= {0}, mode = {1}, facing = {2}")
- val parameters: Collection<Array<Any>>
- get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ @Parameterized.Parameters(
+ name = "cameraXConfig = {0}, impl = {2}, mode = {3}, facing = {4}"
+ )
+ fun data(): Collection<Array<Any>> {
+ return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ }
}
@Test
@@ -186,8 +200,10 @@
// TODO(b/322416654): Enable test after it can pass on most devices
fun canInterruptTakePictureAndResume_forLongCapture(): Unit = runBlocking {
- val latency = extensionsManager.getEstimatedCaptureLatencyRange(extensionsCameraSelector,
- extensionMode)
+ val latency = extensionsManager.getEstimatedCaptureLatencyRange(
+ extensionsCameraSelector,
+ extensionMode
+ )
assumeTrue(latency != null && latency.lower >= 2000)
canInterruptTakePictureAndResumeInternal(
delayForStopLifecycle = latency!!.lower,
@@ -207,7 +223,7 @@
delayForStopLifecycle: Long
): Unit = runBlocking {
if (enablePostview) {
- assumeTrue(isPostviewSupported());
+ assumeTrue(isPostviewSupported())
}
val imageCapturedCallback = FakeOnImageCaptureCallback()
val imageCapture = ImageCapture.Builder()
@@ -265,8 +281,9 @@
Bitmap::class.java
)
Mockito.verify(mockOnImageCapturedCallback, Mockito.timeout(10000))
- .onPostviewBitmapAvailable(bitmap.capture()
- )
+ .onPostviewBitmapAvailable(
+ bitmap.capture()
+ )
assertThat(bitmap).isNotNull()
}
@@ -555,12 +572,15 @@
override fun onError(exception: ImageCaptureException) {
hasError = true
}
+
override fun onCaptureStarted() {
captureStartedDeferred.complete(true)
}
+
override fun onCaptureSuccess(image: ImageProxy) {
captureSuccessDeferred.complete(image)
}
+
override fun onPostviewBitmapAvailable(bitmap: Bitmap) {
PostviewDeferred.complete(bitmap)
}
@@ -605,6 +625,7 @@
override fun onError(exception: ImageCaptureException) {
hasError = true
}
+
override fun onCaptureStarted() {
captureStartedDeferred.complete(true)
}
@@ -612,6 +633,7 @@
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
imageSavedDeferred.complete(outputFileResults)
}
+
override fun onPostviewBitmapAvailable(bitmap: Bitmap) {
PostviewDeferred.complete(bitmap)
}
@@ -643,7 +665,8 @@
cameraProvider.bindToLifecycle(
fakeLifecycleOwner,
extensionsCameraSelector,
- imageCapture)
+ imageCapture
+ )
}
assertThat(imageCapture.currentConfig.isHigResolutionDisabled(false)).isTrue()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
index 3d527c9..cea52da 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
@@ -21,12 +21,14 @@
import android.os.Handler
import android.os.HandlerThread
import android.util.Size
-import androidx.camera.camera2.Camera2Config
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.Preview
import androidx.camera.extensions.impl.ExtensionsTestlibControl
import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
import androidx.camera.testing.impl.CameraUtil
import androidx.camera.testing.impl.CameraUtil.PreTestCameraIdList
import androidx.camera.testing.impl.GLUtil
@@ -54,14 +56,20 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class PreviewTest(
+ private val implName: String,
+ private val cameraXConfig: CameraXConfig,
private val implType: ExtensionsTestlibControl.ImplementationType,
@field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
) {
+ @get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+ )
@get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- PreTestCameraIdList(Camera2Config.defaultConfig())
+ PreTestCameraIdList(cameraXConfig)
)
private lateinit var cameraProvider: ProcessCameraProvider
@@ -118,6 +126,7 @@
)
)
+ ProcessCameraProvider.configureInstance(cameraXConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
ExtensionsTestlibControl.getInstance().setImplementationType(implType)
baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -151,10 +160,14 @@
companion object {
val context: Context = ApplicationProvider.getApplicationContext()
+
@JvmStatic
- @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
- val parameters: Collection<Array<Any>>
- get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ @Parameterized.Parameters(
+ name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+ )
+ fun data(): Collection<Array<Any>> {
+ return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ }
}
@UiThreadTest
@@ -186,10 +199,15 @@
val preview = Preview.Builder().build()
withContext(Dispatchers.Main) {
+ preview.setSurfaceProvider(
+ SurfaceTextureProvider.createSurfaceTextureProvider(createSurfaceTextureCallback())
+ )
+
cameraProvider.bindToLifecycle(
fakeLifecycleOwner,
extensionsCameraSelector,
- preview)
+ preview
+ )
}
assertThat(preview.currentConfig.isHigResolutionDisabled(false)).isTrue()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
index 81cfe97..6661554 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
@@ -23,16 +23,18 @@
import android.net.Uri
import android.util.Log
import android.util.Size
-import androidx.camera.camera2.Camera2Config
import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
import androidx.camera.core.Preview.SurfaceProvider
import androidx.camera.core.impl.utils.executor.CameraXExecutors
import androidx.camera.extensions.impl.ExtensionsTestlibControl
import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.testing.impl.AndroidUtil.skipVideoRecordingTestIfNotSupportedByEmulator
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
import androidx.camera.testing.impl.CameraUtil
import androidx.camera.testing.impl.SurfaceTextureProvider
import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
@@ -67,13 +69,20 @@
@RunWith(Parameterized::class)
@SdkSuppress(minSdkVersion = 21)
class VideoCaptureTest(
+ private val implName: String,
+ private val cameraXConfig: CameraXConfig,
private val implType: ExtensionsTestlibControl.ImplementationType,
@field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
) {
@get:Rule
+ val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+ active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+ )
+
+ @get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
- CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+ CameraUtil.PreTestCameraIdList(cameraXConfig)
)
@get:Rule
@@ -102,19 +111,23 @@
Log.d(TAG, "Recording start")
latchForVideoStarted.countDown()
}
+
is VideoRecordEvent.Finalize -> {
Log.d(TAG, "Recording finalize")
finalize = it
latchForVideoSaved.countDown()
}
+
is VideoRecordEvent.Status -> {
Log.d(TAG, "Recording Status")
latchForVideoRecording.countDown()
}
+
is VideoRecordEvent.Pause,
is VideoRecordEvent.Resume -> {
// Do nothing.
}
+
else -> {
throw IllegalStateException()
}
@@ -131,6 +144,7 @@
)
skipVideoRecordingTestIfNotSupportedByEmulator()
+ ProcessCameraProvider.configureInstance(cameraXConfig)
cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
ExtensionsTestlibControl.getInstance().setImplementationType(implType)
baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -282,9 +296,13 @@
private const val VIDEO_TIMEOUT_SEC = 10L
private const val TAG = "VideoCaptureTest"
val context: Context = ApplicationProvider.getApplicationContext()
+
@JvmStatic
- @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
- val parameters: Collection<Array<Any>>
- get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ @Parameterized.Parameters(
+ name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+ )
+ fun data(): Collection<Array<Any>> {
+ return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+ }
}
}
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index 56b3bac..24baeae 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -32,7 +32,10 @@
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
+import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig;
import androidx.camera.core.CameraSelector;
+import androidx.camera.core.CameraXConfig;
import androidx.camera.core.ExtendableBuilder;
import androidx.camera.core.impl.Config;
import androidx.camera.extensions.ExtensionMode;
@@ -62,14 +65,18 @@
SESSION_CAPTURE_CALLBACK_OPTION =
Config.Option.create("camera2.cameraCaptureSession.captureCallback",
CameraCaptureSession.CaptureCallback.class);
+ public static final String CAMERA2_IMPLEMENTATION_OPTION = "camera2";
+ public static final String CAMERA_PIPE_IMPLEMENTATION_OPTION = "camera_pipe";
/**
- * Returns the parameters which contains the combination of implementationType, extensions
- * mode and lens facing.
+ * Returns the parameters which contains the combination of CameraXConfig
+ * name, CameraXConfig, implementationType, extensions mode and lens facing.
*/
@NonNull
public static Collection<Object[]> getAllImplExtensionsLensFacingCombinations(
- @NonNull Context context, boolean excludeUnavailableModes) {
+ @NonNull Context context,
+ boolean excludeUnavailableModes
+ ) {
ExtensionsTestlibControl.ImplementationType implType =
ExtensionsTestlibControl.getInstance().getImplementationType();
@@ -92,8 +99,9 @@
});
if (implType == OEM_IMPL) {
- return excludeUnavailableModes ? filterOutUnavailableMode(context, basicOrOemImplList)
- : basicOrOemImplList;
+ List<Object[]> allList = excludeUnavailableModes ? filterOutUnavailableMode(context,
+ basicOrOemImplList) : basicOrOemImplList;
+ return getConfigPrependedCombinations(allList);
}
List<Object[]> advancedList = Arrays.asList(new Object[][]{
@@ -119,7 +127,8 @@
// Reset to basic in case advanced is used accidentally.
ExtensionsTestlibControl.getInstance().setImplementationType(TESTLIB_BASIC);
- return allList;
+
+ return getConfigPrependedCombinations(allList);
}
private static List<Object[]> filterOutUnavailableMode(Context context,
@@ -158,6 +167,24 @@
}
}
+ private static List<Object[]> getConfigPrependedCombinations(List<Object[]> combinations) {
+ CameraXConfig camera2Config = Camera2Config.defaultConfig();
+ CameraXConfig cameraPipeConfig = CameraPipeConfig.defaultConfig();
+ List<Object[]> combinationsWithConfig = new ArrayList<Object[]>();
+ for (Object[] combination: combinations) {
+ List<Object> combinationCamera2 = new ArrayList<Object>(
+ Arrays.asList(CAMERA2_IMPLEMENTATION_OPTION, camera2Config));
+ combinationCamera2.addAll(Arrays.asList(combination));
+ combinationsWithConfig.add(combinationCamera2.toArray());
+
+ List<Object> combinationCameraPipe = new ArrayList<Object>(
+ Arrays.asList(CAMERA_PIPE_IMPLEMENTATION_OPTION, cameraPipeConfig));
+ combinationCameraPipe.addAll(Arrays.asList(combination));
+ combinationsWithConfig.add(combinationCameraPipe.toArray());
+ }
+ return combinationsWithConfig;
+ }
+
/**
* Returns whether the target camera device can support the test for a specific extension mode.
*/