ProCameraTests.cpp revision eb72e1796b3af548e87891a6d2b73b0567807f25
124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/* 224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * Copyright (C) 2013 The Android Open Source Project 324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * 40cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Licensed under the Apache License, Version 2.0 (the "License"); 50cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * you may not use this file except in compliance with the License. 60cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * You may obtain a copy of the License at 70cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * 8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * http://www.apache.org/licenses/LICENSE-2.0 924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * 100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Unless required by applicable law or agreed to in writing, software 110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * distributed under the License is distributed on an "AS IS" BASIS, 1224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * See the License for the specific language governing permissions and 1424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * limitations under the License. 1505e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o */ 1605e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o 1705e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#include <gtest/gtest.h> 18a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <iostream> 1905e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o 20a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <binder/IPCThreadState.h> 21a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Thread.h> 22a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 23a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include "Camera.h" 24a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include "ProCamera.h" 25a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Vector.h> 26a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Mutex.h> 27a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Condition.h> 28a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 29a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <gui/SurfaceComposerClient.h> 30a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <gui/Surface.h> 31a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 32a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <system/camera_metadata.h> 33a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only 3405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o 35a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'onamespace android { 3624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'onamespace camera2 { 37b969b1b8a5c13992cadb026114731958644540d8Matthias Andreenamespace tests { 3824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'onamespace client { 39546a1ff18cc912003883ff67ba3e87c69f700fc4Theodore Ts'o 40a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define CAMERA_ID 0 41a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_DEBUGGING 0 42a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 4386acdebd539864908127561034752082c86105e2Theodore Ts'o#define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout 44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead 45a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 46a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_FORMAT_MAIN HAL_PIXEL_FORMAT_Y8 47a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16 48a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 49a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_CPU_FRAME_COUNT 2 509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o#define TEST_CPU_HEAP_COUNT 5 51a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 528a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen#if TEST_DEBUGGING 53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define dout std::cerr 54e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else 55a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define dout if (0) std::cerr 56a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#endif 57a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 58a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define EXPECT_OK(x) EXPECT_EQ(OK, (x)) 59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define ASSERT_OK(x) ASSERT_EQ(OK, (x)) 60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 61a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oclass ProCameraTest; 62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallenum ProEvent { 6465f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall UNKNOWN, 651773c87c7e9ee5c4b8753919320d6d06910ea25bTheodore Ts'o ACQUIRED, 66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall RELEASED, 67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall STOLEN, 68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall BUFFER_RECEIVED, 69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}; 70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgralltypedef Vector<ProEvent> EventList; 72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallclass ProCameraTestThread : public Thread 74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallpublic: 762d8c0c8a4fd99d79caa45afba1462dd5ae0f1e45Theodore Ts'o ProCameraTestThread() { 77a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 78a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 79a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o virtual bool threadLoop() { 80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mProc = ProcessState::self(); 81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mProc->startThreadPool(); 8286acdebd539864908127561034752082c86105e2Theodore Ts'o 8386acdebd539864908127561034752082c86105e2Theodore Ts'o IPCThreadState *ptr = IPCThreadState::self(); 84a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 85a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ptr->joinThreadPool(); 86a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return false; 8896cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o } 89a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 90a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o sp<ProcessState> mProc; 91a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o}; 92c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o 93a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oclass ProCameraTestListener : public ProCameraListener { 94a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 9565f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrallpublic: 96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall status_t WaitForEvent() { 977f9c96ee74315388d758675f69a930b9990e0789Theodore Ts'o Mutex::Autolock cal(mConditionMutex); 98a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 99a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o { 100a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o Mutex::Autolock al(mListenerMutex); 101a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (mProEventList.size() > 0) { 103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return OK; 104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return mListenerCondition.waitRelative(mConditionMutex, 108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall TEST_LISTENER_TIMEOUT); 109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Read events into out. Existing queue is flushed */ 112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall void ReadEvents(EventList& out) { 113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall Mutex::Autolock al(mListenerMutex); 114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (size_t i = 0; i < mProEventList.size(); ++i) { 116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall out.push(mProEventList[i]); 117a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 118a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 119a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mProEventList.clear(); 120a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 121e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 122116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o /** 123a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o * Dequeue 1 event from the event queue. 124a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o * Returns UNKNOWN if queue is empty 125e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ProEvent ReadEvent() { 1271eb31c4885156b595e6ceb4516cb1e1fb2d251fdTheodore Ts'o Mutex::Autolock al(mListenerMutex); 128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 12986acdebd539864908127561034752082c86105e2Theodore Ts'o if (mProEventList.size() == 0) { 130e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return UNKNOWN; 13186acdebd539864908127561034752082c86105e2Theodore Ts'o } 132e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 133e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ProEvent ev = mProEventList[0]; 13486acdebd539864908127561034752082c86105e2Theodore Ts'o mProEventList.removeAt(0); 135e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 136116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o return ev; 137e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 138a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 139a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oprivate: 140a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o void QueueEvent(ProEvent ev) { 141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall { 142a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o Mutex::Autolock al(mListenerMutex); 143a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mProEventList.push(ev); 144a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 146e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 147e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mListenerCondition.broadcast(); 148a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 149a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 150efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oprotected: 151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 152a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ////////////////////////////////////////////////// 153a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ///////// ProCameraListener ////////////////////// 154a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ////////////////////////////////////////////////// 155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 156a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Lock has been acquired. Write operations now available. 158a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o virtual void onLockAcquired() { 159a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o QueueEvent(ACQUIRED); 160a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Lock has been released with exclusiveUnlock 162a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o virtual void onLockReleased() { 163e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall QueueEvent(RELEASED); 164a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 165a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 166a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o // Lock has been stolen by another client. 167e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall virtual void onLockStolen() { 168a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o QueueEvent(STOLEN); 169e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 170a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 171a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o // Lock free. 172a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) { 173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 174a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o dout << "Trigger notify: " << ext1 << " " << ext2 175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall << " " << ext3 << std::endl; 17664ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o } 17764ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o 17864ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o virtual void onBufferReceived(int streamId, 179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const CpuConsumer::LockedBuffer& buf) { 180efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 181e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dout << "Buffer received on streamId = " << streamId << 1829213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o ", dataPtr = " << (void*)buf.data << std::endl; 1839213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o 1849213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o QueueEvent(BUFFER_RECEIVED); 185e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1869213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o } 187e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall virtual void onRequestReceived( 1888a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen camera_metadata* request) { 1898a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen free_camera_metadata(request); 1908a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen } 191e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1928a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen // TODO: remove 19396cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o 194efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o virtual void notify(int32_t , int32_t , int32_t ) {} 195e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall virtual void postData(int32_t , const sp<IMemory>& , 196e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall camera_frame_metadata_t *) {} 197a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o virtual void postDataTimestamp(nsecs_t , int32_t , const sp<IMemory>& ) {} 198a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 199a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 200a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o Vector<ProEvent> mProEventList; 201a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o Mutex mListenerMutex; 202efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o Mutex mConditionMutex; 203a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o Condition mListenerCondition; 204a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o}; 205c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o 206e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'oclass ProCameraTest : public ::testing::Test { 207e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'o 208e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'opublic: 209e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'o ProCameraTest() { 210c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o } 211efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 212a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o static void SetUpTestCase() { 213a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o // Binder Thread Pool Initialization 214a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mTestThread = new ProCameraTestThread(); 215a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mTestThread->run("ProCameraTestThread"); 216a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 217a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 218c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o virtual void SetUp() { 219c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o mCamera = ProCamera::connect(CAMERA_ID); 220a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ASSERT_NE((void*)NULL, mCamera.get()); 221a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 222a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mListener = new ProCameraTestListener(); 22386acdebd539864908127561034752082c86105e2Theodore Ts'o mCamera->setListener(mListener); 22486acdebd539864908127561034752082c86105e2Theodore Ts'o } 22586acdebd539864908127561034752082c86105e2Theodore Ts'o 22686acdebd539864908127561034752082c86105e2Theodore Ts'o virtual void TearDown() { 22786acdebd539864908127561034752082c86105e2Theodore Ts'o ASSERT_NE((void*)NULL, mCamera.get()); 228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mCamera->disconnect(); 22986acdebd539864908127561034752082c86105e2Theodore Ts'o } 230e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 23186acdebd539864908127561034752082c86105e2Theodore Ts'oprotected: 23286acdebd539864908127561034752082c86105e2Theodore Ts'o sp<ProCamera> mCamera; 23386acdebd539864908127561034752082c86105e2Theodore Ts'o sp<ProCameraTestListener> mListener; 23486acdebd539864908127561034752082c86105e2Theodore Ts'o 23586acdebd539864908127561034752082c86105e2Theodore Ts'o static sp<Thread> mTestThread; 23686acdebd539864908127561034752082c86105e2Theodore Ts'o 237e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int mDisplaySecs; 23886acdebd539864908127561034752082c86105e2Theodore Ts'o sp<SurfaceComposerClient> mComposerClient; 23986acdebd539864908127561034752082c86105e2Theodore Ts'o sp<SurfaceControl> mSurfaceControl; 240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall sp<SurfaceComposerClient> mDepthComposerClient; 242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall sp<SurfaceControl> mDepthSurfaceControl; 243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int getSurfaceWidth() { 245e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return 512; 246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int getSurfaceHeight() { 248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return 512; 249e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 250e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 251e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall void createOnScreenSurface(sp<Surface>& surface) { 252e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mComposerClient = new SurfaceComposerClient; 253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 25486acdebd539864908127561034752082c86105e2Theodore Ts'o 25586acdebd539864908127561034752082c86105e2Theodore Ts'o mSurfaceControl = mComposerClient->createSurface( 25686acdebd539864908127561034752082c86105e2Theodore Ts'o String8("ProCameraTest StreamingImage Surface"), 257a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o getSurfaceWidth(), getSurfaceHeight(), 258a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o PIXEL_FORMAT_RGB_888, 0); 259a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 260a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o mSurfaceControl->setPosition(640, 0); 261a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 262a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ASSERT_TRUE(mSurfaceControl != NULL); 263a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ASSERT_TRUE(mSurfaceControl->isValid()); 264a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 265a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o SurfaceComposerClient::openGlobalTransaction(); 266a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF)); 267a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 26824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o SurfaceComposerClient::closeGlobalTransaction(); 2699227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 270c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o sp<ANativeWindow> window = mSurfaceControl->getSurface(); 271c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o surface = mSurfaceControl->getSurface(); 2729227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 273c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o ASSERT_NE((void*)NULL, surface.get()); 274c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o } 275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall void createDepthOnScreenSurface(sp<Surface>& surface) { 2779227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o mDepthComposerClient = new SurfaceComposerClient; 278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck()); 2799227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 2809227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o mDepthSurfaceControl = mDepthComposerClient->createSurface( 281e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall String8("ProCameraTest StreamingImage Surface"), 282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall getSurfaceWidth(), getSurfaceHeight(), 283e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall PIXEL_FORMAT_RGB_888, 0); 284e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 285e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mDepthSurfaceControl->setPosition(640, 0); 286c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o 2879227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o ASSERT_TRUE(mDepthSurfaceControl != NULL); 288e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_TRUE(mDepthSurfaceControl->isValid()); 289e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 290e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall SurfaceComposerClient::openGlobalTransaction(); 291e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF)); 292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show()); 293c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o SurfaceComposerClient::closeGlobalTransaction(); 2949227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall sp<ANativeWindow> window = mDepthSurfaceControl->getSurface(); 296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall surface = mDepthSurfaceControl->getSurface(); 297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2989227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o ASSERT_NE((void*)NULL, surface.get()); 2999227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o } 300e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 3019227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o}; 302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 3039227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'osp<Thread> ProCameraTest::mTestThread; 304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall// test around exclusiveTryLock (immediate locking) 3069227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'oTEST_F(ProCameraTest, LockingImmediate) { 3079227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 3089227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o if (HasFatalFailure()) { 3099227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o return; 310bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 311bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 31224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_FALSE(mCamera->hasExclusiveLock()); 313c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o EXPECT_EQ(OK, mCamera->exclusiveTryLock()); 314e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // at this point we definitely have the lock 31524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 31624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 318e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_TRUE(mCamera->hasExclusiveLock()); 320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(OK, mCamera->exclusiveUnlock()); 321e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(OK, mListener->WaitForEvent()); 323544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o EXPECT_EQ(RELEASED, mListener->ReadEvent()); 32474128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o 325de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger EXPECT_FALSE(mCamera->hasExclusiveLock()); 3269ff8ece57d46a9419fc60057547810824881bb45Theodore Ts'o} 327bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall// test around exclusiveLock (locking at some future point in time) 32924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'oTEST_F(ProCameraTest, LockingAsynchronous) { 33024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (HasFatalFailure()) { 33269022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o return; 33369022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o } 33424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 33524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o // TODO: Add another procamera that has a lock here. 336efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o // then we can be test that the lock wont immediately be acquired 33769022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o 33824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_FALSE(mCamera->hasExclusiveLock()); 33924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_EQ(OK, mCamera->exclusiveLock()); 34024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o // at this point we may or may not have the lock 34124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o // we cant be sure until we get an ACQUIRED event 34224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 34324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 34424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 3459213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o 3469213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_TRUE(mCamera->hasExclusiveLock()); 3479213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_EQ(OK, mCamera->exclusiveUnlock()); 348efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3499213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 3509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_EQ(RELEASED, mListener->ReadEvent()); 35124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 35224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_FALSE(mCamera->hasExclusiveLock()); 35324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o} 35424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 35524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o// Stream directly to the screen. 356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, StreamingImageSingle) { 35724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (HasFatalFailure()) { 35824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o return; 35924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 360e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char* displaySecsEnv = getenv("TEST_DISPLAY_SECS"); 361e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (displaySecsEnv != NULL) { 362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mDisplaySecs = atoi(displaySecsEnv); 36324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (mDisplaySecs < 0) { 36424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o mDisplaySecs = 0; 36524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 36624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } else { 36724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o mDisplaySecs = 0; 368de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger } 369f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen 370f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen sp<Surface> depthSurface; 371f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen if (mDisplaySecs > 0) { 372f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen createDepthOnScreenSurface(/*out*/depthSurface); 373f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen } 37424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 37524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o int depthStreamId = -1; 37624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240, 37724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o TEST_FORMAT_DEPTH, depthSurface, &depthStreamId)); 37824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_NE(-1, depthStreamId); 37924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 380e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->exclusiveTryLock()); 381e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* iterate in a loop submitting requests every frame. 382e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * what kind of requests doesnt really matter, just whatever. 383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 384e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 38524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o // it would probably be better to use CameraMetadata from camera service. 386e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall camera_metadata_t *request = NULL; 387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 388e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /*out*/&request)); 38924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_NE((void*)NULL, request); 39024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 391c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o /* FIXME: dont need this later, at which point the above should become an 392c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ASSERT_NE*/ 393e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if(request == NULL) request = allocate_camera_metadata(10, 100); 394e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 395e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // set the output streams to just this stream ID 396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // wow what a verbose API. 398c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o // i would give a loaf of bread for 399c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o // metadata->updateOrInsert(keys.request.output.streams, streamId); 40024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o uint8_t allStreams[] = { depthStreamId }; 40124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]); 402e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 40324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o camera_metadata_entry_t entry; 40424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 405c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o int find = find_camera_metadata_entry(request, tag, &entry); 406efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (find == -ENOENT) { 407e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (add_camera_metadata_entry(request, tag, &allStreams, 408e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /*data_count*/streamCount) != OK) { 409e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_OK(append_camera_metadata(tmp, request)); 411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free_camera_metadata(request); 41265f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall request = tmp; 413f026f1a37061a021f7188c9e45d0fbff1bde9e60Theodore Ts'o 414f026f1a37061a021f7188c9e45d0fbff1bde9e60Theodore Ts'o ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 415e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /*data_count*/streamCount)); 416e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 417e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else { 418e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_OK(update_camera_metadata_entry(request, entry.index, 419e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall &allStreams, /*data_count*/streamCount, &entry)); 420e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 422e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 423e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 424e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dout << "will sleep now for " << mDisplaySecs << std::endl; 42524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o sleep(mDisplaySecs); 42624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 427bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o free_camera_metadata(request); 428bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 42976f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o for (int i = 0; i < streamCount; ++i) { 43076f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o EXPECT_OK(mCamera->deleteStream(allStreams[i])); 431c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o } 432ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o EXPECT_OK(mCamera->exclusiveUnlock()); 433a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o} 434efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 435efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o// Stream directly to the screen. 436bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'oTEST_F(ProCameraTest, StreamingImageDual) { 437bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (HasFatalFailure()) { 4382787276ec59e1d52087d307bc30446d088ec65bcTheodore Ts'o return; 43924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 4401e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o char* displaySecsEnv = getenv("TEST_DISPLAY_SECS"); 4411e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o if (displaySecsEnv != NULL) { 4429213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o mDisplaySecs = atoi(displaySecsEnv); 4439213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o if (mDisplaySecs < 0) { 4449213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o mDisplaySecs = 0; 4459213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o } 4469213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o } else { 447efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o mDisplaySecs = 0; 4489213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o } 449bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 4509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o sp<Surface> surface; 4519213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o sp<Surface> depthSurface; 452efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (mDisplaySecs > 0) { 453bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o createOnScreenSurface(/*out*/surface); 4549213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o createDepthOnScreenSurface(/*out*/depthSurface); 4559213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o } 456de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger 4579213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o int streamId = -1; 4589213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960, 4599213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o TEST_FORMAT_MAIN, surface, &streamId)); 4609213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o EXPECT_NE(-1, streamId); 4619213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o 462c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o int depthStreamId = -1; 463c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240, 4641e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o TEST_FORMAT_DEPTH, depthSurface, &depthStreamId)); 465bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_NE(-1, depthStreamId); 4669227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o 4679227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o EXPECT_OK(mCamera->exclusiveTryLock()); 4689227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o /* 4699227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o */ 4709227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o /* iterate in a loop submitting requests every frame. 471e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * what kind of requests doesnt really matter, just whatever. 472e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 473c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 474c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o // it would probably be better to use CameraMetadata from camera service. 475c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o camera_metadata_t *request = NULL; 476bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 477a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o /*out*/&request)); 478a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o EXPECT_NE((void*)NULL, request); 479a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 480e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /*FIXME: dont need this later, at which point the above should become an 481bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ASSERT_NE*/ 482bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if(request == NULL) request = allocate_camera_metadata(10, 100); 4831e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o 484bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // set the output streams to just this stream ID 485bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 486e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // wow what a verbose API. 487bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o uint8_t allStreams[] = { streamId, depthStreamId }; 488bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // IMPORTANT. bad things will happen if its not a uint8. 4891e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]); 490bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o camera_metadata_entry_t entry; 4911e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 492bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o int find = find_camera_metadata_entry(request, tag, &entry); 493bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (find == -ENOENT) { 494e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (add_camera_metadata_entry(request, tag, &allStreams, 495236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos /*data_count*/streamCount) != OK) { 496236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 4971e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o ASSERT_OK(append_camera_metadata(tmp, request)); 498a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o free_camera_metadata(request); 499a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o request = tmp; 500a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 5011e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 502bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o /*data_count*/streamCount)); 503c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 504c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } else { 505c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ASSERT_OK(update_camera_metadata_entry(request, entry.index, 506bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o &allStreams, /*data_count*/streamCount, &entry)); 507a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o } 508a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o 509a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 510e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 511e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dout << "will sleep now for " << mDisplaySecs << std::endl; 51274128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o sleep(mDisplaySecs); 51374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o 514e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free_camera_metadata(request); 515e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 51676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o for (int i = 0; i < streamCount; ++i) { 51776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o EXPECT_OK(mCamera->deleteStream(allStreams[i])); 51876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o } 519efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o EXPECT_OK(mCamera->exclusiveUnlock()); 5209213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o} 521e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 522e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, CpuConsumerSingle) { 523e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (HasFatalFailure()) { 524e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 525e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 526e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int streamId = -1; 527e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240, 528e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &streamId)); 529e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_NE(-1, streamId); 530bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 5311e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o EXPECT_OK(mCamera->exclusiveTryLock()); 532e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(OK, mListener->WaitForEvent()); 5331e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 5341e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o /* iterate in a loop submitting requests every frame. 5351e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o * what kind of requests doesnt really matter, just whatever. 536e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 537e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 538e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // it would probably be better to use CameraMetadata from camera service. 539e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall camera_metadata_t *request = NULL; 540e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 541e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /*out*/&request)); 542e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_NE((void*)NULL, request); 543e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 5442d8c0c8a4fd99d79caa45afba1462dd5ae0f1e45Theodore Ts'o /*FIXME: dont need this later, at which point the above should become an 54598f4547198b369bef7e41eb7ce4a16855726c393Eric Sandeen ASSERT_NE*/ 546e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if(request == NULL) request = allocate_camera_metadata(10, 100); 547e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 548e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // set the output streams to just this stream ID 549e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 55076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o uint8_t allStreams[] = { streamId }; 55176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o camera_metadata_entry_t entry; 552e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 55376dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o int find = find_camera_metadata_entry(request, tag, &entry); 55476dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o if (find == -ENOENT) { 555f2de1d38d0819b17895977fabc52d81d0ea6ec00Valerie Clement if (add_camera_metadata_entry(request, tag, &allStreams, 55676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o /*data_count*/1) != OK) { 55776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 55876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o ASSERT_OK(append_camera_metadata(tmp, request)); 55976dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o free_camera_metadata(request); 56076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o request = tmp; 56176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o 562e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 56374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o /*data_count*/1)); 56476dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o } 56576dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o } else { 56676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o ASSERT_OK(update_camera_metadata_entry(request, entry.index, 56776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o &allStreams, /*data_count*/1, &entry)); 56876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o } 56976dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o 57076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 57176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o 572e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Consume a couple of frames 57374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) { 57424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 575efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent()); 5761e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o } 577efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 5781e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o // Done: clean up 579e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free_camera_metadata(request); 580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->deleteStream(streamId)); 5811e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o EXPECT_OK(mCamera->exclusiveUnlock()); 5821e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o} 583e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 584e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, CpuConsumerDual) { 585e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (HasFatalFailure()) { 586e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 587236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos } 58824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o int streamId = -1; 5891e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960, 590c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &streamId)); 59124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o EXPECT_NE(-1, streamId); 592bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 593bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o int depthStreamId = -1; 594bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240, 595bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthStreamId)); 596e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_NE(-1, depthStreamId); 597e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 598e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_OK(mCamera->exclusiveTryLock()); 599e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(OK, mListener->WaitForEvent()); 600e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 601e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 602e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 603e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* iterate in a loop submitting requests every frame. 604e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * what kind of requests doesnt really matter, just whatever. 605e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 606e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 607bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // it would probably be better to use CameraMetadata from camera service. 608bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o camera_metadata_t *request = NULL; 609bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 610bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o /*out*/&request)); 611bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_NE((void*)NULL, request); 612bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 613bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if(request == NULL) request = allocate_camera_metadata(10, 100); 614bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 615e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // set the output streams to just this stream ID 616bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 617bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // wow what a verbose API. 618bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o uint8_t allStreams[] = { streamId, depthStreamId }; 619bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o size_t streamCount = 2; 620e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall camera_metadata_entry_t entry; 621bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 622bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o int find = find_camera_metadata_entry(request, tag, &entry); 623efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (find == -ENOENT) { 624bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (add_camera_metadata_entry(request, tag, &allStreams, 625bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o /*data_count*/streamCount) != OK) { 626bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 627bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ASSERT_OK(append_camera_metadata(tmp, request)); 628bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o free_camera_metadata(request); 629c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o request = tmp; 630c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o 631c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 632c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o /*data_count*/streamCount)); 633c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o } 634c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o } else { 635bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ASSERT_OK(update_camera_metadata_entry(request, entry.index, 636bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o &allStreams, /*data_count*/streamCount, &entry)); 637bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 638bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 639bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 640bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 641bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // Consume a couple of frames 642bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) { 643bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // stream id 1 644bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 645bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent()); 646bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 647bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // stream id 2 648bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_EQ(OK, mListener->WaitForEvent()); 649bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent()); 650bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 651bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o //TODO: events should be a struct with some data like the stream id 652bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 653bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 654bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o // Done: clean up 655bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o free_camera_metadata(request); 656bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->deleteStream(streamId)); 657bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o EXPECT_OK(mCamera->exclusiveUnlock()); 658bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o} 659bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 660bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o} 661bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o} 662bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o} 663bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o} 664bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o 665bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o