ProCameraTests.cpp revision 5835cc46a2f06dbfa5fbdab70e091896ef2fb438
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/* 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright (C) 2013 The Android Open Source Project 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Licensed under the Apache License, Version 2.0 (the "License"); 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * you may not use this file except in compliance with the License. 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * You may obtain a copy of the License at 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * http://www.apache.org/licenses/LICENSE-2.0 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Unless required by applicable law or agreed to in writing, software 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * distributed under the License is distributed on an "AS IS" BASIS, 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * See the License for the specific language governing permissions and 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * limitations under the License. 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer */ 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <gtest/gtest.h> 189c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek#include <iostream> 19eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner 205d75de0f821023f4ed4815825bf3aea8a0b5e40dChris Lattner#include <binder/IPCThreadState.h> 216137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek#include <utils/Thread.h> 221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner 23adc4eeb08042a35ae914fc557ffec0cef3df2374Chris Lattner#include "Camera.h" 24c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "ProCamera.h" 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <utils/Vector.h> 26cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner#include <utils/Mutex.h> 27caaa7df2c78bbd40197823034c0275f3dcbd63e7Ted Kremenek#include <utils/Condition.h> 28f4d5eb4866a27d497f0bb75b12c2ffd48ad4d9c0Benjamin Kramer 290ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek#include <gui/SurfaceComposerClient.h> 302e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor#include <gui/Surface.h> 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <system/camera_metadata.h> 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace android { 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace camera2 { 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace tests { 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace client { 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 402e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor#define CAMERA_ID 0 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define TEST_DEBUGGING 0 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46e5956bd2730c051835f9acd9e957c5d79f99e7c3Chris Lattner#define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define TEST_CPU_FRAME_COUNT 2 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define TEST_CPU_HEAP_COUNT 5 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#if TEST_DEBUGGING 52836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner#define dout std::cerr 53ba1e898c64048e25cb65afec3807ad463e41914bArgyrios Kyrtzidis#else 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define dout if (0) std::cerr 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define EXPECT_OK(x) EXPECT_EQ(OK, (x)) 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define ASSERT_OK(x) ASSERT_EQ(OK, (x)) 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 606137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenekclass ProCameraTest; 616137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenek 626137dc99ef0c2b14050631367057758b0d596cb3Ted Kremenekenum ProEvent { 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UNKNOWN, 640ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek ACQUIRED, 650ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek RELEASED, 660ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek STOLEN, 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BUFFER_RECEIVED, 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencertypedef Vector<ProEvent> EventList; 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ProCameraTestThread : public Thread 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer{ 74c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattnerpublic: 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ProCameraTestThread() { 76148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump virtual bool threadLoop() { 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mProc = ProcessState::self(); 80c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner mProc->startThreadPool(); 815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IPCThreadState *ptr = IPCThreadState::self(); 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ptr->joinThreadPool(); 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer sp<ProcessState> mProc; 901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass ProCameraTestListener : public ProCameraListener { 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer status_t WaitForEvent() { 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Mutex::Autolock cal(mConditionMutex); 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 9968d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff Mutex::Autolock al(mListenerMutex); 10068d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (mProEventList.size() > 0) { 10268d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff return OK; 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10468d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff } 10568d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff 10629238a0bf7cbf5b396efb451a0adb5fe4aa037caSteve Naroff return mListenerCondition.waitRelative(mConditionMutex, 1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor TEST_LISTENER_TIMEOUT); 1081b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner } 1091b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* Read events into out. Existing queue is flushed */ 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void ReadEvents(EventList& out) { 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Mutex::Autolock al(mListenerMutex); 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (size_t i = 0; i < mProEventList.size(); ++i) { 1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump out.push(mProEventList[i]); 1162e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor } 1172e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mProEventList.clear(); 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1209c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1219c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek /** 122caaa7df2c78bbd40197823034c0275f3dcbd63e7Ted Kremenek * Dequeue 1 event from the event queue. 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Returns UNKNOWN if queue is empty 1249c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek */ 1259c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek ProEvent ReadEvent() { 1269c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek Mutex::Autolock al(mListenerMutex); 1279c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (mProEventList.size() == 0) { 1299c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek return UNKNOWN; 1309c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek } 1319c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1329c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek ProEvent ev = mProEventList[0]; 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mProEventList.removeAt(0); 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ev; 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 1396cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner void QueueEvent(ProEvent ev) { 1406cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner { 141caaa7df2c78bbd40197823034c0275f3dcbd63e7Ted Kremenek Mutex::Autolock al(mListenerMutex); 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mProEventList.push(ev); 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1456cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mListenerCondition.broadcast(); 1479c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek } 1489c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1499c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenekprotected: 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ////////////////////////////////////////////////// 1529c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek ///////// ProCameraListener ////////////////////// 1539c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek ////////////////////////////////////////////////// 1549c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1559c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek 1569c1b750c59d510e6c9eccb1f37bccc46ccfe6844Ted Kremenek // Lock has been acquired. Write operations now available. 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void onLockAcquired() { 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QueueEvent(ACQUIRED); 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Lock has been released with exclusiveUnlock 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void onLockReleased() { 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer QueueEvent(RELEASED); 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 164cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner 165cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner // Lock has been stolen by another client. 166cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner virtual void onLockStolen() { 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QueueEvent(STOLEN); 1680ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek } 1690ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek 1700ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek // Lock free. 1711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) { 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer dout << "Trigger notify: " << ext1 << " " << ext2 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer << " " << ext3 << std::endl; 1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void onBufferReceived(int streamId, 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const CpuConsumer::LockedBuffer& buf) { 1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 180aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner dout << "Buffer received on streamId = " << streamId << 181aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner ", dataPtr = " << (void*)buf.data << std::endl; 182aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QueueEvent(BUFFER_RECEIVED); 1846cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner 1856cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner } 1866cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner virtual void onRequestReceived( 1876cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner camera_metadata* request) { 1889e0ed0bd5a3a7bac73973980ff32132a7724e674Argyrios Kyrtzidis free_camera_metadata(request); 189e671e1bc73615eda155059a772266ed2882d758cChris Lattner } 190f4d5eb4866a27d497f0bb75b12c2ffd48ad4d9c0Benjamin Kramer 19103db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis // TODO: remove 19203db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 19303db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis virtual void notify(int32_t , int32_t , int32_t ) {} 19403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis virtual void postData(int32_t , const sp<IMemory>& , 19503db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis camera_frame_metadata_t *) {} 19603db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis virtual void postDataTimestamp(nsecs_t , int32_t , const sp<IMemory>& ) {} 19703db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 19803db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 19903db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis Vector<ProEvent> mProEventList; 20003db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis Mutex mListenerMutex; 201a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis Mutex mConditionMutex; 202a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis Condition mListenerCondition; 203a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis}; 204a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis 205a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidisclass ProCameraTest : public ::testing::Test { 20603db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ProCameraTest() { 20972b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek } 210148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 21172b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek static void SetUpTestCase() { 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Binder Thread Pool Initialization 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mTestThread = new ProCameraTestThread(); 214836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner mTestThread->run("ProCameraTestThread"); 2157c175fb196a2bc3dbc86ea3865c713e1875f3f6dChris Lattner } 2167c175fb196a2bc3dbc86ea3865c713e1875f3f6dChris Lattner 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void SetUp() { 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mCamera = ProCamera::connect(CAMERA_ID); 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_NE((void*)NULL, mCamera.get()); 2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mListener = new ProCameraTestListener(); 2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mCamera->setListener(mListener); 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 22429238a0bf7cbf5b396efb451a0adb5fe4aa037caSteve Naroff 2251b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner virtual void TearDown() { 22632fca722dd974b8202d0fb9c71b6c185c0767da6Chris Lattner ASSERT_NE((void*)NULL, mCamera.get()); 2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mCamera->disconnect(); 228337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek } 2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 230880dcf21dfdb3ff763c60195b6794bab0d913095Ted Kremenekprotected: 2312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor sp<ProCamera> mCamera; 2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer sp<ProCameraTestListener> mListener; 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static sp<Thread> mTestThread; 2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int mDisplaySecs; 2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer sp<SurfaceComposerClient> mComposerClient; 2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump sp<SurfaceControl> mSurfaceControl; 2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump sp<SurfaceComposerClient> mDepthComposerClient; 2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer sp<SurfaceControl> mDepthSurfaceControl; 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2437062d9e9fc3ed89c4e4ea7055efea6585b7bac8dTed Kremenek int getSurfaceWidth() { 2447062d9e9fc3ed89c4e4ea7055efea6585b7bac8dTed Kremenek return 512; 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int getSurfaceHeight() { 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return 512; 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 25068e48e4a81767997ef0231e47eca4f665102c95eTed Kremenek void createOnScreenSurface(sp<Surface>& surface) { 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mComposerClient = new SurfaceComposerClient; 252eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 253eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner 254eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner mSurfaceControl = mComposerClient->createSurface( 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer String8("ProCameraTest StreamingImage Surface"), 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer getSurfaceWidth(), getSurfaceHeight(), 257e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar PIXEL_FORMAT_RGB_888, 0); 258e5393fb93eb879d9ebbef102ae9311fa77e023ccDaniel Dunbar 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer mSurfaceControl->setPosition(640, 0); 2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ASSERT_TRUE(mSurfaceControl != NULL); 262cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner ASSERT_TRUE(mSurfaceControl->isValid()); 263cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner 264cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner SurfaceComposerClient::openGlobalTransaction(); 265cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF)); 266cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 2671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SurfaceComposerClient::closeGlobalTransaction(); 268cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner 269cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner sp<ANativeWindow> window = mSurfaceControl->getSurface(); 270cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner surface = mSurfaceControl->getSurface(); 2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27209b5c1d08a33ecf5d9c61b922fbe679867336684Chris Lattner ASSERT_NE((void*)NULL, surface.get()); 27309b5c1d08a33ecf5d9c61b922fbe679867336684Chris Lattner } 2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27509b5c1d08a33ecf5d9c61b922fbe679867336684Chris Lattner void createDepthOnScreenSurface(sp<Surface>& surface) { 27609b5c1d08a33ecf5d9c61b922fbe679867336684Chris Lattner mDepthComposerClient = new SurfaceComposerClient; 27709b5c1d08a33ecf5d9c61b922fbe679867336684Chris Lattner ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck()); 2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump mDepthSurfaceControl = mDepthComposerClient->createSurface( 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump String8("ProCameraTest StreamingImage Surface"), 281e3d5e3ae5bd8028774f07d7c3751d4db82118942Chris Lattner getSurfaceWidth(), getSurfaceHeight(), 282aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner PIXEL_FORMAT_RGB_888, 0); 283aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner 284aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner mDepthSurfaceControl->setPosition(640, 0); 285aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ASSERT_TRUE(mDepthSurfaceControl != NULL); 2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_TRUE(mDepthSurfaceControl->isValid()); 2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SurfaceComposerClient::openGlobalTransaction(); 2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF)); 2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show()); 2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SurfaceComposerClient::closeGlobalTransaction(); 2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer sp<ANativeWindow> window = mDepthSurfaceControl->getSurface(); 2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer surface = mDepthSurfaceControl->getSurface(); 2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_NE((void*)NULL, surface.get()); 2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencersp<Thread> ProCameraTest::mTestThread; 3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// test around exclusiveTryLock (immediate locking) 3054095080aff204008eefb26b100906c6ca2bc4bb6Daniel DunbarTEST_F(ProCameraTest, LockingImmediate) { 3064095080aff204008eefb26b100906c6ca2bc4bb6Daniel Dunbar 3074095080aff204008eefb26b100906c6ca2bc4bb6Daniel Dunbar if (HasFatalFailure()) { 3084095080aff204008eefb26b100906c6ca2bc4bb6Daniel Dunbar return; 3094095080aff204008eefb26b100906c6ca2bc4bb6Daniel Dunbar } 3104095080aff204008eefb26b100906c6ca2bc4bb6Daniel Dunbar 3112e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor EXPECT_FALSE(mCamera->hasExclusiveLock()); 3122e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor EXPECT_EQ(OK, mCamera->exclusiveTryLock()); 3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // at this point we definitely have the lock 3142e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 3152e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor EXPECT_EQ(OK, mListener->WaitForEvent()); 3162e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 3172e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EXPECT_TRUE(mCamera->hasExclusiveLock()); 31953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner EXPECT_EQ(OK, mCamera->exclusiveUnlock()); 3207dcc968f17a6ff9088c9651dddccc8d4025a1271Ted Kremenek 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EXPECT_EQ(OK, mListener->WaitForEvent()); 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EXPECT_EQ(RELEASED, mListener->ReadEvent()); 3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EXPECT_FALSE(mCamera->hasExclusiveLock()); 3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3262b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// test around exclusiveLock (locking at some future point in time) 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerTEST_F(ProCameraTest, LockingAsynchronous) { 3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (HasFatalFailure()) { 331e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner return; 332e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 333e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 334e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // TODO: Add another procamera that has a lock here. 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // then we can be test that the lock wont immediately be acquired 3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3376b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_FALSE(mCamera->hasExclusiveLock()); 3386b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(OK, mCamera->exclusiveLock()); 3396b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner // at this point we may or may not have the lock 3406b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner // we cant be sure until we get an ACQUIRED event 3416b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner 3426b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(OK, mListener->WaitForEvent()); 3436b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 3446b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner 3456b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_TRUE(mCamera->hasExclusiveLock()); 3466b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(OK, mCamera->exclusiveUnlock()); 3476b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner 3486b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(OK, mListener->WaitForEvent()); 3496b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_EQ(RELEASED, mListener->ReadEvent()); 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EXPECT_FALSE(mCamera->hasExclusiveLock()); 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stream directly to the screen. 35503db1b31dd926409b7defc1c90b66549464652c0Argyrios KyrtzidisTEST_F(ProCameraTest, StreamingImage) { 35603db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis if (HasFatalFailure()) { 357ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis return; 358ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis } 359ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis char* displaySecsEnv = getenv("TEST_DISPLAY_SECS"); 36003db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis if (displaySecsEnv != NULL) { 361a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis mDisplaySecs = atoi(displaySecsEnv); 362ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis if (mDisplaySecs < 0) { 363ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis mDisplaySecs = 0; 36403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis } 365ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis } else { 366ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis mDisplaySecs = 0; 367ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis } 36803db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 369a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis sp<Surface> depthSurface; 37003db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis if (mDisplaySecs > 0) { 371ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis createDepthOnScreenSurface(/*out*/depthSurface); 372ed5c38682c056c147c8a4abb748b4f285de206ddArgyrios Kyrtzidis } 37303db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 37403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis int depthStreamId = -1; 3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240, 376a9e274c01ebae45629d93aaa07be450fb77dd3cbArgyrios Kyrtzidis TEST_FORMAT_DEPTH, depthSurface, &depthStreamId)); 37703db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis EXPECT_NE(-1, depthStreamId); 37803db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 37903db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis EXPECT_OK(mCamera->exclusiveTryLock()); 380fad03b2b38a3baea4b67e79e676fee15078e3258Argyrios Kyrtzidis /* iterate in a loop submitting requests every frame. 38103db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis * what kind of requests doesnt really matter, just whatever. 3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer */ 3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 384d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner // it would probably be better to use CameraMetadata from camera service. 3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer camera_metadata_t *request = NULL; 3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 387f6452c5421c5db5a7ceff581525f286931d97f1aTed Kremenek /*out*/&request)); 388f6452c5421c5db5a7ceff581525f286931d97f1aTed Kremenek EXPECT_NE((void*)NULL, request); 3899e0ed0bd5a3a7bac73973980ff32132a7724e674Argyrios Kyrtzidis 3906cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner /* FIXME: dont need this later, at which point the above should become an 39103db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis ASSERT_NE*/ 39203db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis if(request == NULL) request = allocate_camera_metadata(10, 100); 3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // set the output streams to just this stream ID 3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // wow what a verbose API. 3975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // i would give a loaf of bread for 398d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner // metadata->updateOrInsert(keys.request.output.streams, streamId); 3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer uint8_t allStreams[] = { depthStreamId }; 4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]); 4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer camera_metadata_entry_t entry; 403d038def6e3f33bebf8c12bb3a95b2492c154a5ddTed Kremenek uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int find = find_camera_metadata_entry(request, tag, &entry); 4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (find == -ENOENT) { 406d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner if (add_camera_metadata_entry(request, tag, &allStreams, 4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /*data_count*/streamCount) != OK) { 4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_OK(append_camera_metadata(tmp, request)); 4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer free_camera_metadata(request); 4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer request = tmp; 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /*data_count*/streamCount)); 4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else { 4176b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner ASSERT_OK(update_camera_metadata_entry(request, entry.index, 4186b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner &allStreams, /*data_count*/streamCount, &entry)); 4196b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner } 4206b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner 4216b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 42203db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 42303db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis dout << "will sleep now for " << mDisplaySecs << std::endl; 42403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis sleep(mDisplaySecs); 42503db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 42603db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis free_camera_metadata(request); 4279e0ed0bd5a3a7bac73973980ff32132a7724e674Argyrios Kyrtzidis 4283604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis for (int i = 0; i < streamCount; ++i) { 42908b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis EXPECT_OK(mCamera->deleteStream(allStreams[i])); 43008b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis } 43108b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis EXPECT_OK(mCamera->exclusiveUnlock()); 43208b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis} 43308b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis 43408b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios KyrtzidisTEST_F(ProCameraTest, CpuConsumer) { 43508b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis if (HasFatalFailure()) { 43608b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis return; 43708b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis } 43808b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis int streamId = -1; 43908b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240, 44008b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &streamId)); 44108b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis EXPECT_NE(-1, streamId); 44208b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis 4433604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis EXPECT_OK(mCamera->exclusiveTryLock()); 4443604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis EXPECT_EQ(OK, mListener->WaitForEvent()); 4453604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis EXPECT_EQ(ACQUIRED, mListener->ReadEvent()); 4463604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis /* iterate in a loop submitting requests every frame. 4473604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis * what kind of requests doesnt really matter, just whatever. 4483604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis */ 4493604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis 4503604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis // it would probably be better to use CameraMetadata from camera service. 4513604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis camera_metadata_t *request = NULL; 4523604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 4533604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis /*out*/&request)); 4543604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis EXPECT_NE((void*)NULL, request); 4553604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis 4563604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis /*FIXME: dont need this later, at which point the above should become an 4573604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis ASSERT_NE*/ 4583604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis if(request == NULL) request = allocate_camera_metadata(10, 100); 4593604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis 46047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner // set the output streams to just this stream ID 46183cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner 4623604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis uint8_t allStreams[] = { streamId }; 4633604e3895ecd850291b518e5a82246c888ce9d0fArgyrios Kyrtzidis camera_metadata_entry_t entry; 46439a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS); 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int find = find_camera_metadata_entry(request, tag, &entry); 46639a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor if (find == -ENOENT) { 46739a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor if (add_camera_metadata_entry(request, tag, &allStreams, 46839a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor /*data_count*/1) != OK) { 46939a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000); 47039a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor ASSERT_OK(append_camera_metadata(tmp, request)); 47139a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor free_camera_metadata(request); 47239a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor request = tmp; 47339a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor 47439a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams, 47539a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor /*data_count*/1)); 47639a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor } 47739a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor } else { 47839a8de10c18365bde7062d8959b7ed525449c561Douglas Gregor ASSERT_OK(update_camera_metadata_entry(request, entry.index, 4795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer &allStreams, /*data_count*/1, &entry)); 480d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner } 4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 482adc4eeb08042a35ae914fc557ffec0cef3df2374Chris Lattner EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true)); 483836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner 484adc4eeb08042a35ae914fc557ffec0cef3df2374Chris Lattner // Consume a couple of frames 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) { 486adc4eeb08042a35ae914fc557ffec0cef3df2374Chris Lattner EXPECT_EQ(OK, mListener->WaitForEvent()); 487836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent()); 488836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner } 489adc4eeb08042a35ae914fc557ffec0cef3df2374Chris Lattner 4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Done: clean up 4915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer free_camera_metadata(request); 4925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EXPECT_OK(mCamera->deleteStream(streamId)); 4935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer EXPECT_OK(mCamera->exclusiveUnlock()); 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 496d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner} 4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 4985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer