1 /*
2 * Copyright 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package androidx.camera.camera2.pipe.testing
18
19 import android.hardware.camera2.CaptureResult
20 import android.hardware.camera2.TotalCaptureResult
21 import androidx.camera.camera2.pipe.CameraId
22 import androidx.camera.camera2.pipe.FrameInfo
23 import androidx.camera.camera2.pipe.FrameMetadata
24 import androidx.camera.camera2.pipe.FrameNumber
25 import androidx.camera.camera2.pipe.Metadata
26 import androidx.camera.camera2.pipe.RequestMetadata
27 import kotlin.reflect.KClass
28 import kotlinx.atomicfu.atomic
29
30 private val fakeFrameNumbers = atomic(0L)
31
nextFakeFrameNumbernull32 internal fun nextFakeFrameNumber(): FrameNumber = FrameNumber(fakeFrameNumbers.incrementAndGet())
33
34 /** Utility class for interacting with objects require specific [CaptureResult] metadata */
35 public class FakeFrameMetadata(
36 private val resultMetadata: Map<CaptureResult.Key<*>, Any?> = emptyMap(),
37 extraResultMetadata: Map<Metadata.Key<*>, Any?> = emptyMap(),
38 override val camera: CameraId = FakeCameraIds.default,
39 override val frameNumber: FrameNumber = nextFakeFrameNumber(),
40 override val extraMetadata: Map<*, Any?> = emptyMap<Any, Any>()
41 ) : FakeMetadata(extraResultMetadata), FrameMetadata {
42
43 @Suppress("UNCHECKED_CAST")
44 override fun <T> get(key: CaptureResult.Key<T>): T? =
45 extraMetadata[key] as T? ?: resultMetadata[key] as T?
46
47 override fun <T> getOrDefault(key: CaptureResult.Key<T>, default: T): T = get(key) ?: default
48
49 override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
50
51 override fun toString(): String =
52 "FakeFrameMetadata(camera: ${camera.value}, frameNumber: ${frameNumber.value})"
53 }
54
55 /** Utility class for interacting with objects require specific [TotalCaptureResult] metadata */
56 public class FakeFrameInfo(
57 override val metadata: FrameMetadata = FakeFrameMetadata(),
58 override val requestMetadata: RequestMetadata = FakeRequestMetadata(),
59 private val physicalMetadata: Map<CameraId, FrameMetadata> = emptyMap()
60 ) : FrameInfo {
getnull61 override fun get(camera: CameraId): FrameMetadata? = physicalMetadata[camera]
62
63 override val camera: CameraId
64 get() = metadata.camera
65
66 override val frameNumber: FrameNumber
67 get() = metadata.frameNumber
68
69 override fun <T : Any> unwrapAs(type: KClass<T>): T? = null
70
71 override fun toString(): String =
72 "FakeFrameInfo(camera: ${camera.value}, frameNumber: ${frameNumber.value})"
73 }
74