• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 android.hardware.camera2.cts;
18 
19 import static android.hardware.camera2.cts.CameraTestUtils.*;
20 
21 import android.hardware.camera2.CameraExtensionCharacteristics;
22 import android.hardware.camera2.CameraExtensionSession;
23 import android.hardware.camera2.params.ExtensionSessionConfiguration;
24 
25 import com.android.ex.camera2.blocking.BlockingExtensionSessionCallback;
26 
27 import android.hardware.camera2.CaptureRequest;
28 import android.hardware.camera2.TotalCaptureResult;
29 import android.util.Size;
30 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
31 import android.hardware.camera2.params.OutputConfiguration;
32 import android.util.Log;
33 import android.view.SurfaceView;
34 
35 import static org.mockito.Mockito.*;
36 
37 import java.util.ArrayList;
38 import java.util.List;
39 
40 import org.junit.runners.Parameterized;
41 import org.junit.runner.RunWith;
42 import org.junit.Test;
43 
44 /**
45  * Camera extension preview test by using SurfaceView.
46  */
47 
48 @RunWith(Parameterized.class)
49 public class SurfaceViewExtensionPreviewTest extends Camera2SurfaceViewTestCase {
50     private static final String TAG = "SurfaceViewExtensionPreviewTest";
51     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
52     private static final int FRAME_TIMEOUT_MS = 1000;
53 
54     @Test
testExtensionPreview()55     public void testExtensionPreview() throws Exception {
56         for (String id : mCameraIdsUnderTest) {
57             if (!mAllStaticInfo.get(id).isColorOutputSupported()) {
58                 Log.i(TAG, "Camera " + id +
59                         " does not support color outputs, skipping");
60                 continue;
61             }
62 
63             CameraExtensionCharacteristics extensionChars =
64                     mCameraManager.getCameraExtensionCharacteristics(id);
65             List<Integer> supportedExtensions = extensionChars.getSupportedExtensions();
66             for (Integer extension : supportedExtensions) {
67                 List<Size> extensionSizes = extensionChars.getExtensionSupportedSizes(extension,
68                         SurfaceView.class);
69                 Size maxSize = CameraTestUtils.getMaxSize(extensionSizes.toArray(new Size[0]));
70                 updatePreviewSurface(maxSize);
71 
72                 List<OutputConfiguration> outputConfigs = new ArrayList<>();
73                 outputConfigs.add(new OutputConfiguration(mPreviewSurface));
74 
75                 BlockingExtensionSessionCallback sessionListener =
76                         new BlockingExtensionSessionCallback(mock(
77                                 CameraExtensionSession.StateCallback.class));
78                 ExtensionSessionConfiguration configuration =
79                         new ExtensionSessionConfiguration(extension, outputConfigs,
80                                 new HandlerExecutor(mHandler), sessionListener);
81 
82                 boolean captureResultsSupported =
83                         !extensionChars.getAvailableCaptureResultKeys(extension).isEmpty();
84 
85                 try {
86                     openDevice(id);
87                     mCamera.createExtensionSession(configuration);
88                     CameraExtensionSession extensionSession =
89                             sessionListener.waitAndGetSession(
90                                     SESSION_CONFIGURE_TIMEOUT_MS);
91                     assertNotNull(extensionSession);
92 
93                     CaptureRequest.Builder captureBuilder = mCamera.createCaptureRequest(
94                             android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW);
95                     captureBuilder.addTarget(mPreviewSurface);
96                     CameraExtensionSession.ExtensionCaptureCallback captureCallbackMock =
97                             mock(CameraExtensionSession.ExtensionCaptureCallback.class);
98                     CaptureRequest request = captureBuilder.build();
99                     int sequenceId = extensionSession.setRepeatingRequest(request,
100                             new HandlerExecutor(mHandler), captureCallbackMock);
101 
102                     verify(captureCallbackMock,
103                             timeout(FRAME_TIMEOUT_MS).atLeastOnce())
104                             .onCaptureStarted(eq(extensionSession), eq(request), anyLong());
105                     verify(captureCallbackMock,
106                             timeout(FRAME_TIMEOUT_MS).atLeastOnce())
107                             .onCaptureProcessStarted(extensionSession, request);
108                     if (captureResultsSupported) {
109                         verify(captureCallbackMock,
110                                 timeout(FRAME_TIMEOUT_MS).atLeastOnce())
111                                 .onCaptureResultAvailable(eq(extensionSession), eq(request),
112                                         any(TotalCaptureResult.class));
113                     }
114 
115                     extensionSession.stopRepeating();
116 
117                     verify(captureCallbackMock,
118                             timeout(FRAME_TIMEOUT_MS).times(1))
119                             .onCaptureSequenceCompleted(extensionSession, sequenceId);
120 
121                     verify(captureCallbackMock, times(0))
122                             .onCaptureSequenceAborted(any(CameraExtensionSession.class),
123                                     anyInt());
124 
125                     extensionSession.close();
126 
127                     sessionListener.getStateWaiter().waitForState(
128                             BlockingExtensionSessionCallback.SESSION_CLOSED,
129                             SESSION_CLOSE_TIMEOUT_MS);
130                 } finally {
131                     closeDevice();
132                 }
133             }
134         }
135     }
136 }
137