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