Igor Murashkin | 7072550 | 2013-06-25 20:27:06 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2013 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 com.android.mediaframeworktest.integration; |
| 18 | |
| 19 | import android.graphics.SurfaceTexture; |
| 20 | import android.hardware.photography.CameraMetadata; |
Igor Murashkin | d7bf177 | 2013-07-12 18:01:31 -0700 | [diff] [blame] | 21 | import android.hardware.photography.CameraPropertiesKeys; |
Igor Murashkin | 7072550 | 2013-06-25 20:27:06 +0000 | [diff] [blame] | 22 | import android.hardware.photography.CaptureRequest; |
| 23 | import android.hardware.photography.ICameraDeviceCallbacks; |
| 24 | import android.hardware.photography.ICameraDeviceUser; |
| 25 | import android.os.RemoteException; |
| 26 | import android.test.AndroidTestCase; |
| 27 | import android.test.suitebuilder.annotation.SmallTest; |
| 28 | import android.util.Log; |
| 29 | import android.view.Surface; |
| 30 | |
| 31 | import static android.hardware.photography.CameraDevice.TEMPLATE_PREVIEW; |
| 32 | |
| 33 | import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner; |
| 34 | import com.android.mediaframeworktest.integration.CameraBinderTest.DummyBase; |
| 35 | |
| 36 | public class CameraDeviceBinderTest extends AndroidTestCase { |
| 37 | private static String TAG = "CameraDeviceBinderTest"; |
| 38 | |
| 39 | private int mCameraId; |
| 40 | private ICameraDeviceUser mCameraUser; |
| 41 | private CameraBinderTestUtils mUtils; |
| 42 | |
| 43 | public CameraDeviceBinderTest() { |
| 44 | } |
| 45 | |
| 46 | static class DummyCameraDeviceCallbacks extends DummyBase implements ICameraDeviceCallbacks { |
| 47 | |
| 48 | @Override |
| 49 | public void notifyCallback(int msgType, int ext1, int ext2) throws RemoteException { |
| 50 | } |
| 51 | |
| 52 | @Override |
| 53 | public void onResultReceived(int frameId, CameraMetadata result) throws RemoteException { |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | @Override |
| 58 | protected void setUp() throws Exception { |
| 59 | super.setUp(); |
| 60 | |
| 61 | mUtils = new CameraBinderTestUtils(getContext()); |
| 62 | |
| 63 | // This cannot be set in the constructor, since the onCreate isn't |
| 64 | // called yet |
| 65 | mCameraId = MediaFrameworkIntegrationTestRunner.mCameraId; |
| 66 | |
| 67 | ICameraDeviceCallbacks dummyCallbacks = new DummyCameraDeviceCallbacks(); |
| 68 | |
| 69 | String clientPackageName = getContext().getPackageName(); |
| 70 | |
| 71 | mCameraUser = mUtils.getCameraService().connectDevice(dummyCallbacks, mCameraId, |
| 72 | clientPackageName, CameraBinderTestUtils.USE_CALLING_UID); |
| 73 | assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser); |
| 74 | |
| 75 | Log.v(TAG, String.format("Camera %s connected", mCameraId)); |
| 76 | } |
| 77 | |
| 78 | @Override |
| 79 | protected void tearDown() throws Exception { |
| 80 | mCameraUser.disconnect(); |
| 81 | mCameraUser = null; |
| 82 | } |
| 83 | |
| 84 | @SmallTest |
| 85 | public void testCreateDefaultRequest() throws Exception { |
| 86 | CameraMetadata metadata = new CameraMetadata(); |
| 87 | assertTrue(metadata.isEmpty()); |
| 88 | |
| 89 | int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); |
| 90 | assertEquals(CameraBinderTestUtils.NO_ERROR, status); |
| 91 | assertFalse(metadata.isEmpty()); |
| 92 | |
| 93 | metadata.close(); |
| 94 | } |
| 95 | |
| 96 | @SmallTest |
| 97 | public void testCreateStream() throws Exception { |
| 98 | SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); |
| 99 | surfaceTexture.setDefaultBufferSize(640, 480); |
| 100 | Surface surface = new Surface(surfaceTexture); |
| 101 | |
| 102 | int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, |
| 103 | surface); |
| 104 | |
| 105 | assertEquals(0, streamId); |
| 106 | |
| 107 | assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, |
| 108 | mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); |
| 109 | |
| 110 | assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); |
| 111 | } |
| 112 | |
| 113 | @SmallTest |
| 114 | public void testDeleteInvalidStream() throws Exception { |
| 115 | assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(-1)); |
| 116 | assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0)); |
| 117 | assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(1)); |
| 118 | assertEquals(CameraBinderTestUtils.BAD_VALUE, mCameraUser.deleteStream(0xC0FFEE)); |
| 119 | } |
| 120 | |
| 121 | @SmallTest |
| 122 | public void testCreateStreamTwo() throws Exception { |
| 123 | |
| 124 | // Create first stream |
| 125 | |
| 126 | SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); |
| 127 | surfaceTexture.setDefaultBufferSize(640, 480); |
| 128 | Surface surface = new Surface(surfaceTexture); |
| 129 | |
| 130 | int streamId = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, |
| 131 | surface); |
| 132 | |
| 133 | assertEquals(0, streamId); |
| 134 | |
| 135 | assertEquals(CameraBinderTestUtils.ALREADY_EXISTS, |
| 136 | mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, surface)); |
| 137 | |
| 138 | // Create second stream. |
| 139 | |
| 140 | SurfaceTexture surfaceTexture2 = new SurfaceTexture(/* ignored */0); |
| 141 | surfaceTexture2.setDefaultBufferSize(640, 480); |
| 142 | Surface surface2 = new Surface(surfaceTexture2); |
| 143 | |
| 144 | int streamId2 = mCameraUser.createStream(/* ignored */0, /* ignored */0, /* ignored */0, |
| 145 | surface2); |
| 146 | |
| 147 | assertEquals(1, streamId2); |
| 148 | |
| 149 | // Clean up streams |
| 150 | |
| 151 | assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId)); |
| 152 | assertEquals(CameraBinderTestUtils.NO_ERROR, mCameraUser.deleteStream(streamId2)); |
| 153 | } |
| 154 | |
| 155 | @SmallTest |
| 156 | public void testSubmitBadRequest() throws Exception { |
| 157 | |
| 158 | CameraMetadata metadata = new CameraMetadata(); |
| 159 | assertTrue(metadata.isEmpty()); |
| 160 | |
| 161 | CaptureRequest request = new CaptureRequest(); |
| 162 | assertTrue(request.isEmpty()); |
| 163 | |
| 164 | int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); |
| 165 | assertEquals(CameraBinderTestUtils.NO_ERROR, status); |
| 166 | assertFalse(metadata.isEmpty()); |
| 167 | |
| 168 | request.swap(metadata); |
| 169 | assertFalse(request.isEmpty()); |
| 170 | assertTrue(metadata.isEmpty()); |
| 171 | |
| 172 | status = mCameraUser.submitRequest(request, /* streaming */false); |
| 173 | assertEquals("Expected submitRequest to return BAD_VALUE " + |
| 174 | "since we had 0 surface targets set.", CameraBinderTestUtils.BAD_VALUE, status); |
| 175 | |
| 176 | SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); |
| 177 | surfaceTexture.setDefaultBufferSize(640, 480); |
| 178 | Surface surface = new Surface(surfaceTexture); |
| 179 | request.addTarget(surface); |
| 180 | |
| 181 | status = mCameraUser.submitRequest(request, /* streaming */false); |
| 182 | assertEquals("Expected submitRequest to return BAD_VALUE since " + |
| 183 | "the target surface wasn't registered with createStream.", |
| 184 | CameraBinderTestUtils.BAD_VALUE, status); |
| 185 | |
| 186 | request.close(); |
| 187 | metadata.close(); |
| 188 | surface.release(); |
| 189 | } |
| 190 | |
| 191 | @SmallTest |
| 192 | public void testSubmitGoodRequest() throws Exception { |
| 193 | |
| 194 | CameraMetadata metadata = new CameraMetadata(); |
| 195 | assertTrue(metadata.isEmpty()); |
| 196 | |
| 197 | CaptureRequest request = new CaptureRequest(); |
| 198 | assertTrue(request.isEmpty()); |
| 199 | |
| 200 | // Create default request from template. |
| 201 | |
| 202 | int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); |
| 203 | assertEquals(CameraBinderTestUtils.NO_ERROR, status); |
| 204 | assertFalse(metadata.isEmpty()); |
| 205 | |
| 206 | request.swap(metadata); |
| 207 | assertFalse(request.isEmpty()); |
| 208 | assertTrue(metadata.isEmpty()); |
| 209 | |
| 210 | SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); |
| 211 | surfaceTexture.setDefaultBufferSize(640, 480); |
| 212 | Surface surface = new Surface(surfaceTexture); |
| 213 | |
| 214 | // Create stream first. Pre-requisite to submitting a request using that |
| 215 | // stream. |
| 216 | |
| 217 | int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, |
| 218 | surface); |
| 219 | assertEquals(0, streamId); |
| 220 | |
| 221 | request.addTarget(surface); |
| 222 | |
| 223 | // Submit valid request twice. |
| 224 | |
| 225 | int requestId1; |
| 226 | requestId1 = mCameraUser.submitRequest(request, /* streaming */false); |
| 227 | assertTrue("Request IDs should be non-negative", requestId1 >= 0); |
| 228 | |
| 229 | int requestId2 = mCameraUser.submitRequest(request, /* streaming */false); |
| 230 | assertTrue("Request IDs should be non-negative", requestId2 >= 0); |
| 231 | assertNotSame("Request IDs should be unique for multiple requests", requestId1, requestId2); |
| 232 | |
| 233 | surface.release(); |
| 234 | request.close(); |
| 235 | metadata.close(); |
| 236 | } |
| 237 | |
| 238 | @SmallTest |
| 239 | public void testSubmitStreamingRequest() throws Exception { |
| 240 | |
| 241 | CameraMetadata metadata = new CameraMetadata(); |
| 242 | assertTrue(metadata.isEmpty()); |
| 243 | |
| 244 | CaptureRequest request = new CaptureRequest(); |
| 245 | assertTrue(request.isEmpty()); |
| 246 | |
| 247 | // Create default request from template. |
| 248 | |
| 249 | int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata); |
| 250 | assertEquals(CameraBinderTestUtils.NO_ERROR, status); |
| 251 | assertFalse(metadata.isEmpty()); |
| 252 | |
| 253 | request.swap(metadata); |
| 254 | assertFalse(request.isEmpty()); |
| 255 | assertTrue(metadata.isEmpty()); |
| 256 | |
| 257 | SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0); |
| 258 | surfaceTexture.setDefaultBufferSize(640, 480); |
| 259 | Surface surface = new Surface(surfaceTexture); |
| 260 | |
| 261 | // Create stream first. Pre-requisite to submitting a request using that |
| 262 | // stream. |
| 263 | |
| 264 | int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30, |
| 265 | surface); |
| 266 | assertEquals(0, streamId); |
| 267 | |
| 268 | request.addTarget(surface); |
| 269 | |
| 270 | // Submit valid request once (non-streaming), and another time |
| 271 | // (streaming) |
| 272 | |
| 273 | int requestId1; |
| 274 | requestId1 = mCameraUser.submitRequest(request, /* streaming */true); |
| 275 | assertTrue("Request IDs should be non-negative", requestId1 >= 0); |
| 276 | |
| 277 | int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */false); |
| 278 | assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0); |
| 279 | assertNotSame("Request IDs should be unique for multiple requests", requestId1, |
| 280 | requestIdStreaming); |
| 281 | |
| 282 | status = mCameraUser.cancelRequest(-1); |
| 283 | assertEquals("Invalid request IDs should not be cancellable", |
| 284 | CameraBinderTestUtils.BAD_VALUE, status); |
| 285 | |
| 286 | status = mCameraUser.cancelRequest(requestId1); |
| 287 | assertEquals("Non-streaming request IDs should not be cancellable", |
| 288 | CameraBinderTestUtils.BAD_VALUE, status); |
| 289 | |
| 290 | status = mCameraUser.cancelRequest(requestIdStreaming); |
| 291 | assertEquals("Streaming request IDs should be cancellable", CameraBinderTestUtils.NO_ERROR, |
| 292 | status); |
| 293 | |
| 294 | surface.release(); |
| 295 | request.close(); |
| 296 | metadata.close(); |
| 297 | } |
Igor Murashkin | d7bf177 | 2013-07-12 18:01:31 -0700 | [diff] [blame] | 298 | |
| 299 | @SmallTest |
| 300 | public void testCameraInfo() throws RemoteException { |
| 301 | CameraMetadata info = new CameraMetadata(); |
| 302 | |
| 303 | int status = mCameraUser.getCameraInfo(/*out*/info); |
| 304 | assertEquals(CameraBinderTestUtils.NO_ERROR, status); |
| 305 | |
| 306 | assertFalse(info.isEmpty()); |
| 307 | assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS)); |
| 308 | } |
| 309 | |
Igor Murashkin | 7072550 | 2013-06-25 20:27:06 +0000 | [diff] [blame] | 310 | } |