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