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