Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <gtest/gtest.h>
     18 #include <iostream>
     19 
     20 #include <binder/IPCThreadState.h>
     21 #include <utils/Thread.h>
     22 
     23 #include "Camera.h"
     24 #include "ProCamera.h"
     25 #include <utils/Vector.h>
     26 #include <utils/Mutex.h>
     27 #include <utils/Condition.h>
     28 
     29 #include <gui/SurfaceComposerClient.h>
     30 #include <gui/Surface.h>
     31 
     32 #include <system/camera_metadata.h>
     33 #include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only
     34 #include <camera/CameraMetadata.h>
     35 
     36 #include <camera/ICameraServiceListener.h>
     37 
     38 namespace android {
     39 namespace camera2 {
     40 namespace tests {
     41 namespace client {
     42 
     43 #define CAMERA_ID 0
     44 #define TEST_DEBUGGING 0
     45 
     46 #define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout
     47 #define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead
     48 
     49 #define TEST_FORMAT_MAIN HAL_PIXEL_FORMAT_Y8
     50 #define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16
     51 
     52 // defaults for display "test"
     53 #define TEST_DISPLAY_FORMAT HAL_PIXEL_FORMAT_Y8
     54 #define TEST_DISPLAY_WIDTH 320
     55 #define TEST_DISPLAY_HEIGHT 240
     56 
     57 #define TEST_CPU_FRAME_COUNT 2
     58 #define TEST_CPU_HEAP_COUNT 5
     59 
     60 #define TEST_FRAME_PROCESSING_DELAY_US 200000 // 200 ms
     61 
     62 #if TEST_DEBUGGING
     63 #define dout std::cerr
     64 #else
     65 #define dout if (0) std::cerr
     66 #endif
     67 
     68 #define EXPECT_OK(x) EXPECT_EQ(OK, (x))
     69 #define ASSERT_OK(x) ASSERT_EQ(OK, (x))
     70 
     71 class ProCameraTest;
     72 
     73 struct ServiceListener : public BnCameraServiceListener {
     74 
     75     ServiceListener() :
     76         mLatestStatus(STATUS_UNKNOWN),
     77         mPrevStatus(STATUS_UNKNOWN)
     78     {
     79     }
     80 
     81     void onStatusChanged(Status status, int32_t cameraId) {
     82         dout << "On status changed: 0x" << std::hex
     83              << (unsigned int) status << " cameraId " << cameraId
     84              << std::endl;
     85 
     86         Mutex::Autolock al(mMutex);
     87 
     88         mLatestStatus = status;
     89         mCondition.broadcast();
     90     }
     91 
     92     status_t waitForStatusChange(Status& newStatus) {
     93         Mutex::Autolock al(mMutex);
     94 
     95         if (mLatestStatus != mPrevStatus) {
     96             newStatus = mLatestStatus;
     97             mPrevStatus = mLatestStatus;
     98             return OK;
     99         }
    100 
    101         status_t stat = mCondition.waitRelative(mMutex,
    102                                                TEST_LISTENER_TIMEOUT);
    103 
    104         if (stat == OK) {
    105             newStatus = mLatestStatus;
    106             mPrevStatus = mLatestStatus;
    107         }
    108 
    109         return stat;
    110     }
    111 
    112     Condition mCondition;
    113     Mutex mMutex;
    114 
    115     Status mLatestStatus;
    116     Status mPrevStatus;
    117 };
    118 
    119 enum ProEvent {
    120     UNKNOWN,
    121     ACQUIRED,
    122     RELEASED,
    123     STOLEN,
    124     FRAME_RECEIVED,
    125     RESULT_RECEIVED,
    126 };
    127 
    128 inline int ProEvent_Mask(ProEvent e) {
    129     return (1 << static_cast<int>(e));
    130 }
    131 
    132 typedef Vector<ProEvent> EventList;
    133 
    134 class ProCameraTestThread : public Thread
    135 {
    136 public:
    137     ProCameraTestThread() {
    138     }
    139 
    140     virtual bool threadLoop() {
    141         mProc = ProcessState::self();
    142         mProc->startThreadPool();
    143 
    144         IPCThreadState *ptr = IPCThreadState::self();
    145 
    146         ptr->joinThreadPool();
    147 
    148         return false;
    149     }
    150 
    151     sp<ProcessState> mProc;
    152 };
    153 
    154 class ProCameraTestListener : public ProCameraListener {
    155 
    156 public:
    157     static const int EVENT_MASK_ALL = 0xFFFFFFFF;
    158 
    159     ProCameraTestListener() {
    160         mEventMask = EVENT_MASK_ALL;
    161         mDropFrames = false;
    162     }
    163 
    164     status_t WaitForEvent() {
    165         Mutex::Autolock cal(mConditionMutex);
    166 
    167         {
    168             Mutex::Autolock al(mListenerMutex);
    169 
    170             if (mProEventList.size() > 0) {
    171                 return OK;
    172             }
    173         }
    174 
    175         return mListenerCondition.waitRelative(mConditionMutex,
    176                                                TEST_LISTENER_TIMEOUT);
    177     }
    178 
    179     /* Read events into out. Existing queue is flushed */
    180     void ReadEvents(EventList& out) {
    181         Mutex::Autolock al(mListenerMutex);
    182 
    183         for (size_t i = 0; i < mProEventList.size(); ++i) {
    184             out.push(mProEventList[i]);
    185         }
    186 
    187         mProEventList.clear();
    188     }
    189 
    190     /**
    191       * Dequeue 1 event from the event queue.
    192       * Returns UNKNOWN if queue is empty
    193       */
    194     ProEvent ReadEvent() {
    195         Mutex::Autolock al(mListenerMutex);
    196 
    197         if (mProEventList.size() == 0) {
    198             return UNKNOWN;
    199         }
    200 
    201         ProEvent ev = mProEventList[0];
    202         mProEventList.removeAt(0);
    203 
    204         return ev;
    205     }
    206 
    207     void SetEventMask(int eventMask) {
    208         Mutex::Autolock al(mListenerMutex);
    209         mEventMask = eventMask;
    210     }
    211 
    212     // Automatically acquire/release frames as they are available
    213     void SetDropFrames(bool dropFrames) {
    214         Mutex::Autolock al(mListenerMutex);
    215         mDropFrames = dropFrames;
    216     }
    217 
    218 private:
    219     void QueueEvent(ProEvent ev) {
    220         bool eventAdded = false;
    221         {
    222             Mutex::Autolock al(mListenerMutex);
    223 
    224             // Drop events not part of mask
    225             if (ProEvent_Mask(ev) & mEventMask) {
    226                 mProEventList.push(ev);
    227                 eventAdded = true;
    228             }
    229         }
    230 
    231         if (eventAdded) {
    232             mListenerCondition.broadcast();
    233         }
    234     }
    235 
    236 protected:
    237 
    238     //////////////////////////////////////////////////
    239     ///////// ProCameraListener //////////////////////
    240     //////////////////////////////////////////////////
    241 
    242 
    243     // Lock has been acquired. Write operations now available.
    244     virtual void onLockAcquired() {
    245         QueueEvent(ACQUIRED);
    246     }
    247     // Lock has been released with exclusiveUnlock
    248     virtual void onLockReleased() {
    249         QueueEvent(RELEASED);
    250     }
    251 
    252     // Lock has been stolen by another client.
    253     virtual void onLockStolen() {
    254         QueueEvent(STOLEN);
    255     }
    256 
    257     // Lock free.
    258     virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) {
    259 
    260         dout << "Trigger notify: " << ext1 << " " << ext2
    261              << " " << ext3 << std::endl;
    262     }
    263 
    264     virtual void onFrameAvailable(int streamId,
    265                                   const sp<CpuConsumer>& consumer) {
    266 
    267         QueueEvent(FRAME_RECEIVED);
    268 
    269         Mutex::Autolock al(mListenerMutex);
    270         if (mDropFrames) {
    271             CpuConsumer::LockedBuffer buf;
    272             status_t ret;
    273 
    274             if (OK == (ret = consumer->lockNextBuffer(&buf))) {
    275 
    276                 dout << "Frame received on streamId = " << streamId <<
    277                         ", dataPtr = " << (void*)buf.data <<
    278                         ", timestamp = " << buf.timestamp << std::endl;
    279 
    280                 EXPECT_OK(consumer->unlockBuffer(buf));
    281             }
    282         } else {
    283             dout << "Frame received on streamId = " << streamId << std::endl;
    284         }
    285     }
    286 
    287     virtual void onResultReceived(int32_t requestId,
    288                                   camera_metadata* request) {
    289         dout << "Result received requestId = " << requestId
    290              << ", requestPtr = " << (void*)request << std::endl;
    291         QueueEvent(RESULT_RECEIVED);
    292         free_camera_metadata(request);
    293     }
    294 
    295     virtual void notify(int32_t msg, int32_t ext1, int32_t ext2) {
    296         dout << "Notify received: msg " << std::hex << msg
    297              << ", ext1: " << std::hex << ext1 << ", ext2: " << std::hex << ext2
    298              << std::endl;
    299     }
    300 
    301     Vector<ProEvent> mProEventList;
    302     Mutex             mListenerMutex;
    303     Mutex             mConditionMutex;
    304     Condition         mListenerCondition;
    305     int               mEventMask;
    306     bool              mDropFrames;
    307 };
    308 
    309 class ProCameraTest : public ::testing::Test {
    310 
    311 public:
    312     ProCameraTest() {
    313         char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
    314         if (displaySecsEnv != NULL) {
    315             mDisplaySecs = atoi(displaySecsEnv);
    316             if (mDisplaySecs < 0) {
    317                 mDisplaySecs = 0;
    318             }
    319         } else {
    320             mDisplaySecs = 0;
    321         }
    322 
    323         char* displayFmtEnv = getenv("TEST_DISPLAY_FORMAT");
    324         if (displayFmtEnv != NULL) {
    325             mDisplayFmt = FormatFromString(displayFmtEnv);
    326         } else {
    327             mDisplayFmt = TEST_DISPLAY_FORMAT;
    328         }
    329 
    330         char* displayWidthEnv = getenv("TEST_DISPLAY_WIDTH");
    331         if (displayWidthEnv != NULL) {
    332             mDisplayW = atoi(displayWidthEnv);
    333             if (mDisplayW < 0) {
    334                 mDisplayW = 0;
    335             }
    336         } else {
    337             mDisplayW = TEST_DISPLAY_WIDTH;
    338         }
    339 
    340         char* displayHeightEnv = getenv("TEST_DISPLAY_HEIGHT");
    341         if (displayHeightEnv != NULL) {
    342             mDisplayH = atoi(displayHeightEnv);
    343             if (mDisplayH < 0) {
    344                 mDisplayH = 0;
    345             }
    346         } else {
    347             mDisplayH = TEST_DISPLAY_HEIGHT;
    348         }
    349     }
    350 
    351     static void SetUpTestCase() {
    352         // Binder Thread Pool Initialization
    353         mTestThread = new ProCameraTestThread();
    354         mTestThread->run("ProCameraTestThread");
    355     }
    356 
    357     virtual void SetUp() {
    358         mCamera = ProCamera::connect(CAMERA_ID);
    359         ASSERT_NE((void*)NULL, mCamera.get());
    360 
    361         mListener = new ProCameraTestListener();
    362         mCamera->setListener(mListener);
    363     }
    364 
    365     virtual void TearDown() {
    366         ASSERT_NE((void*)NULL, mCamera.get());
    367         mCamera->disconnect();
    368     }
    369 
    370 protected:
    371     sp<ProCamera> mCamera;
    372     sp<ProCameraTestListener> mListener;
    373 
    374     static sp<Thread> mTestThread;
    375 
    376     int mDisplaySecs;
    377     int mDisplayFmt;
    378     int mDisplayW;
    379     int mDisplayH;
    380 
    381     sp<SurfaceComposerClient> mComposerClient;
    382     sp<SurfaceControl> mSurfaceControl;
    383 
    384     sp<SurfaceComposerClient> mDepthComposerClient;
    385     sp<SurfaceControl> mDepthSurfaceControl;
    386 
    387     int getSurfaceWidth() {
    388         return 512;
    389     }
    390     int getSurfaceHeight() {
    391         return 512;
    392     }
    393 
    394     void createOnScreenSurface(sp<Surface>& surface) {
    395         mComposerClient = new SurfaceComposerClient;
    396         ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
    397 
    398         mSurfaceControl = mComposerClient->createSurface(
    399                 String8("ProCameraTest StreamingImage Surface"),
    400                 getSurfaceWidth(), getSurfaceHeight(),
    401                 PIXEL_FORMAT_RGB_888, 0);
    402 
    403         mSurfaceControl->setPosition(0, 0);
    404 
    405         ASSERT_TRUE(mSurfaceControl != NULL);
    406         ASSERT_TRUE(mSurfaceControl->isValid());
    407 
    408         SurfaceComposerClient::openGlobalTransaction();
    409         ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
    410         ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
    411         SurfaceComposerClient::closeGlobalTransaction();
    412 
    413         sp<ANativeWindow> window = mSurfaceControl->getSurface();
    414         surface = mSurfaceControl->getSurface();
    415 
    416         ASSERT_NE((void*)NULL, surface.get());
    417     }
    418 
    419     void createDepthOnScreenSurface(sp<Surface>& surface) {
    420         mDepthComposerClient = new SurfaceComposerClient;
    421         ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck());
    422 
    423         mDepthSurfaceControl = mDepthComposerClient->createSurface(
    424                 String8("ProCameraTest StreamingImage Surface"),
    425                 getSurfaceWidth(), getSurfaceHeight(),
    426                 PIXEL_FORMAT_RGB_888, 0);
    427 
    428         mDepthSurfaceControl->setPosition(640, 0);
    429 
    430         ASSERT_TRUE(mDepthSurfaceControl != NULL);
    431         ASSERT_TRUE(mDepthSurfaceControl->isValid());
    432 
    433         SurfaceComposerClient::openGlobalTransaction();
    434         ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF));
    435         ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show());
    436         SurfaceComposerClient::closeGlobalTransaction();
    437 
    438         sp<ANativeWindow> window = mDepthSurfaceControl->getSurface();
    439         surface = mDepthSurfaceControl->getSurface();
    440 
    441         ASSERT_NE((void*)NULL, surface.get());
    442     }
    443 
    444     template <typename T>
    445     static bool ExistsItem(T needle, T* array, size_t count) {
    446         if (!array) {
    447             return false;
    448         }
    449 
    450         for (size_t i = 0; i < count; ++i) {
    451             if (array[i] == needle) {
    452                 return true;
    453             }
    454         }
    455         return false;
    456     }
    457 
    458 
    459     static int FormatFromString(const char* str) {
    460         std::string s(str);
    461 
    462 #define CMP_STR(x, y)                               \
    463         if (s == #x) return HAL_PIXEL_FORMAT_ ## y;
    464 #define CMP_STR_SAME(x) CMP_STR(x, x)
    465 
    466         CMP_STR_SAME( Y16);
    467         CMP_STR_SAME( Y8);
    468         CMP_STR_SAME( YV12);
    469         CMP_STR(NV16, YCbCr_422_SP);
    470         CMP_STR(NV21, YCrCb_420_SP);
    471         CMP_STR(YUY2, YCbCr_422_I);
    472         CMP_STR(RAW,  RAW_SENSOR);
    473         CMP_STR(RGBA, RGBA_8888);
    474 
    475         std::cerr << "Unknown format string " << str << std::endl;
    476         return -1;
    477 
    478     }
    479 
    480     /**
    481      * Creating a streaming request for these output streams from a template,
    482      *  and submit it
    483      */
    484     void createSubmitRequestForStreams(int32_t* streamIds, size_t count, int requestCount=-1) {
    485 
    486         ASSERT_NE((void*)NULL, streamIds);
    487         ASSERT_LT(0u, count);
    488 
    489         camera_metadata_t *requestTmp = NULL;
    490         EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    491                                                 /*out*/&requestTmp));
    492         ASSERT_NE((void*)NULL, requestTmp);
    493         CameraMetadata request(requestTmp);
    494 
    495         // set the output streams. default is empty
    496 
    497         uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    498         request.update(tag, streamIds, count);
    499 
    500         requestTmp = request.release();
    501 
    502         if (requestCount < 0) {
    503             EXPECT_OK(mCamera->submitRequest(requestTmp, /*streaming*/true));
    504         } else {
    505             for (int i = 0; i < requestCount; ++i) {
    506                 EXPECT_OK(mCamera->submitRequest(requestTmp,
    507                                                  /*streaming*/false));
    508             }
    509         }
    510         request.acquire(requestTmp);
    511     }
    512 };
    513 
    514 sp<Thread> ProCameraTest::mTestThread;
    515 
    516 TEST_F(ProCameraTest, AvailableFormats) {
    517     if (HasFatalFailure()) {
    518         return;
    519     }
    520 
    521     CameraMetadata staticInfo = mCamera->getCameraInfo(CAMERA_ID);
    522     ASSERT_FALSE(staticInfo.isEmpty());
    523 
    524     uint32_t tag = static_cast<uint32_t>(ANDROID_SCALER_AVAILABLE_FORMATS);
    525     EXPECT_TRUE(staticInfo.exists(tag));
    526     camera_metadata_entry_t entry = staticInfo.find(tag);
    527 
    528     EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YV12,
    529                                                   entry.data.i32, entry.count));
    530     EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP,
    531                                                   entry.data.i32, entry.count));
    532 }
    533 
    534 // test around exclusiveTryLock (immediate locking)
    535 TEST_F(ProCameraTest, LockingImmediate) {
    536 
    537     if (HasFatalFailure()) {
    538         return;
    539     }
    540 
    541     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    542                             ProEvent_Mask(STOLEN)   |
    543                             ProEvent_Mask(RELEASED));
    544 
    545     EXPECT_FALSE(mCamera->hasExclusiveLock());
    546     EXPECT_EQ(OK, mCamera->exclusiveTryLock());
    547     // at this point we definitely have the lock
    548 
    549     EXPECT_EQ(OK, mListener->WaitForEvent());
    550     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    551 
    552     EXPECT_TRUE(mCamera->hasExclusiveLock());
    553     EXPECT_EQ(OK, mCamera->exclusiveUnlock());
    554 
    555     EXPECT_EQ(OK, mListener->WaitForEvent());
    556     EXPECT_EQ(RELEASED, mListener->ReadEvent());
    557 
    558     EXPECT_FALSE(mCamera->hasExclusiveLock());
    559 }
    560 
    561 // test around exclusiveLock (locking at some future point in time)
    562 TEST_F(ProCameraTest, LockingAsynchronous) {
    563 
    564     if (HasFatalFailure()) {
    565         return;
    566     }
    567 
    568 
    569     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    570                             ProEvent_Mask(STOLEN)   |
    571                             ProEvent_Mask(RELEASED));
    572 
    573     // TODO: Add another procamera that has a lock here.
    574     // then we can be test that the lock wont immediately be acquired
    575 
    576     EXPECT_FALSE(mCamera->hasExclusiveLock());
    577     EXPECT_EQ(OK, mCamera->exclusiveTryLock());
    578     // at this point we definitely have the lock
    579 
    580     EXPECT_EQ(OK, mListener->WaitForEvent());
    581     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    582 
    583     EXPECT_TRUE(mCamera->hasExclusiveLock());
    584     EXPECT_EQ(OK, mCamera->exclusiveUnlock());
    585 
    586     EXPECT_EQ(OK, mListener->WaitForEvent());
    587     EXPECT_EQ(RELEASED, mListener->ReadEvent());
    588 
    589     EXPECT_FALSE(mCamera->hasExclusiveLock());
    590 }
    591 
    592 // Stream directly to the screen.
    593 TEST_F(ProCameraTest, DISABLED_StreamingImageSingle) {
    594     if (HasFatalFailure()) {
    595         return;
    596     }
    597 
    598     sp<Surface> surface;
    599     if (mDisplaySecs > 0) {
    600         createOnScreenSurface(/*out*/surface);
    601     }
    602     else {
    603         dout << "Skipping, will not render to screen" << std::endl;
    604         return;
    605     }
    606 
    607     int depthStreamId = -1;
    608 
    609     sp<ServiceListener> listener = new ServiceListener();
    610     EXPECT_OK(ProCamera::addServiceListener(listener));
    611 
    612     ServiceListener::Status currentStatus;
    613 
    614     // when subscribing a new listener,
    615     // we immediately get a callback to the current status
    616     while (listener->waitForStatusChange(/*out*/currentStatus) != OK);
    617     EXPECT_EQ(ServiceListener::STATUS_PRESENT, currentStatus);
    618 
    619     dout << "Will now stream and resume infinitely..." << std::endl;
    620     while (true) {
    621 
    622         if (currentStatus == ServiceListener::STATUS_PRESENT) {
    623 
    624             ASSERT_OK(mCamera->createStream(mDisplayW, mDisplayH, mDisplayFmt,
    625                                             surface,
    626                                             &depthStreamId));
    627             EXPECT_NE(-1, depthStreamId);
    628 
    629             EXPECT_OK(mCamera->exclusiveTryLock());
    630 
    631             int32_t streams[] = { depthStreamId };
    632             ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(
    633                                                  streams,
    634                                                  /*count*/1));
    635         }
    636 
    637         ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
    638 
    639         // TODO: maybe check for getch every once in a while?
    640         while (listener->waitForStatusChange(/*out*/stat) != OK);
    641 
    642         if (currentStatus != stat) {
    643             if (stat == ServiceListener::STATUS_PRESENT) {
    644                 dout << "Reconnecting to camera" << std::endl;
    645                 mCamera = ProCamera::connect(CAMERA_ID);
    646             } else if (stat == ServiceListener::STATUS_NOT_AVAILABLE) {
    647                 dout << "Disconnecting from camera" << std::endl;
    648                 mCamera->disconnect();
    649             } else if (stat == ServiceListener::STATUS_NOT_PRESENT) {
    650                 dout << "Camera unplugged" << std::endl;
    651                 mCamera = NULL;
    652             } else {
    653                 dout << "Unknown status change "
    654                      << std::hex << stat << std::endl;
    655             }
    656 
    657             currentStatus = stat;
    658         }
    659     }
    660 
    661     EXPECT_OK(ProCamera::removeServiceListener(listener));
    662     EXPECT_OK(mCamera->deleteStream(depthStreamId));
    663     EXPECT_OK(mCamera->exclusiveUnlock());
    664 }
    665 
    666 // Stream directly to the screen.
    667 TEST_F(ProCameraTest, DISABLED_StreamingImageDual) {
    668     if (HasFatalFailure()) {
    669         return;
    670     }
    671     sp<Surface> surface;
    672     sp<Surface> depthSurface;
    673     if (mDisplaySecs > 0) {
    674         createOnScreenSurface(/*out*/surface);
    675         createDepthOnScreenSurface(/*out*/depthSurface);
    676     }
    677 
    678     int streamId = -1;
    679     EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960,
    680               TEST_FORMAT_MAIN, surface, &streamId));
    681     EXPECT_NE(-1, streamId);
    682 
    683     int depthStreamId = -1;
    684     EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
    685               TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
    686     EXPECT_NE(-1, depthStreamId);
    687 
    688     EXPECT_OK(mCamera->exclusiveTryLock());
    689     /*
    690     */
    691     /* iterate in a loop submitting requests every frame.
    692      *  what kind of requests doesnt really matter, just whatever.
    693      */
    694 
    695     // it would probably be better to use CameraMetadata from camera service.
    696     camera_metadata_t *request = NULL;
    697     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    698               /*out*/&request));
    699     EXPECT_NE((void*)NULL, request);
    700 
    701     /*FIXME: dont need this later, at which point the above should become an
    702              ASSERT_NE*/
    703     if(request == NULL) request = allocate_camera_metadata(10, 100);
    704 
    705     // set the output streams to just this stream ID
    706 
    707     // wow what a verbose API.
    708     int32_t allStreams[] = { streamId, depthStreamId };
    709     // IMPORTANT. bad things will happen if its not a uint8.
    710     size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
    711     camera_metadata_entry_t entry;
    712     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    713     int find = find_camera_metadata_entry(request, tag, &entry);
    714     if (find == -ENOENT) {
    715         if (add_camera_metadata_entry(request, tag, &allStreams,
    716                                       /*data_count*/streamCount) != OK) {
    717             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    718             ASSERT_OK(append_camera_metadata(tmp, request));
    719             free_camera_metadata(request);
    720             request = tmp;
    721 
    722             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    723                                                 /*data_count*/streamCount));
    724         }
    725     } else {
    726         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    727                   &allStreams, /*data_count*/streamCount, &entry));
    728     }
    729 
    730     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    731 
    732     dout << "will sleep now for " << mDisplaySecs << std::endl;
    733     sleep(mDisplaySecs);
    734 
    735     free_camera_metadata(request);
    736 
    737     for (size_t i = 0; i < streamCount; ++i) {
    738         EXPECT_OK(mCamera->deleteStream(allStreams[i]));
    739     }
    740     EXPECT_OK(mCamera->exclusiveUnlock());
    741 }
    742 
    743 TEST_F(ProCameraTest, CpuConsumerSingle) {
    744     if (HasFatalFailure()) {
    745         return;
    746     }
    747 
    748     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    749                             ProEvent_Mask(STOLEN)   |
    750                             ProEvent_Mask(RELEASED) |
    751                             ProEvent_Mask(FRAME_RECEIVED));
    752     mListener->SetDropFrames(true);
    753 
    754     int streamId = -1;
    755     sp<CpuConsumer> consumer;
    756     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
    757                 TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    758     EXPECT_NE(-1, streamId);
    759 
    760     EXPECT_OK(mCamera->exclusiveTryLock());
    761     EXPECT_EQ(OK, mListener->WaitForEvent());
    762     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    763     /* iterate in a loop submitting requests every frame.
    764      *  what kind of requests doesnt really matter, just whatever.
    765      */
    766 
    767     // it would probably be better to use CameraMetadata from camera service.
    768     camera_metadata_t *request = NULL;
    769     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    770         /*out*/&request));
    771     EXPECT_NE((void*)NULL, request);
    772 
    773     /*FIXME: dont need this later, at which point the above should become an
    774       ASSERT_NE*/
    775     if(request == NULL) request = allocate_camera_metadata(10, 100);
    776 
    777     // set the output streams to just this stream ID
    778 
    779     int32_t allStreams[] = { streamId };
    780     camera_metadata_entry_t entry;
    781     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    782     int find = find_camera_metadata_entry(request, tag, &entry);
    783     if (find == -ENOENT) {
    784         if (add_camera_metadata_entry(request, tag, &allStreams,
    785                 /*data_count*/1) != OK) {
    786             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    787             ASSERT_OK(append_camera_metadata(tmp, request));
    788             free_camera_metadata(request);
    789             request = tmp;
    790 
    791             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    792                 /*data_count*/1));
    793         }
    794     } else {
    795         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    796             &allStreams, /*data_count*/1, &entry));
    797     }
    798 
    799     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    800 
    801     // Consume a couple of frames
    802     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    803         EXPECT_EQ(OK, mListener->WaitForEvent());
    804         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    805     }
    806 
    807     // Done: clean up
    808     free_camera_metadata(request);
    809     EXPECT_OK(mCamera->deleteStream(streamId));
    810     EXPECT_OK(mCamera->exclusiveUnlock());
    811 }
    812 
    813 TEST_F(ProCameraTest, CpuConsumerDual) {
    814     if (HasFatalFailure()) {
    815         return;
    816     }
    817 
    818     mListener->SetEventMask(ProEvent_Mask(FRAME_RECEIVED));
    819     mListener->SetDropFrames(true);
    820 
    821     int streamId = -1;
    822     sp<CpuConsumer> consumer;
    823     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    824                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    825     EXPECT_NE(-1, streamId);
    826 
    827     int depthStreamId = -1;
    828     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
    829             TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &depthStreamId));
    830     EXPECT_NE(-1, depthStreamId);
    831 
    832     EXPECT_OK(mCamera->exclusiveTryLock());
    833     /*
    834     */
    835     /* iterate in a loop submitting requests every frame.
    836      *  what kind of requests doesnt really matter, just whatever.
    837      */
    838 
    839     // it would probably be better to use CameraMetadata from camera service.
    840     camera_metadata_t *request = NULL;
    841     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    842                                             /*out*/&request));
    843     EXPECT_NE((void*)NULL, request);
    844 
    845     if(request == NULL) request = allocate_camera_metadata(10, 100);
    846 
    847     // set the output streams to just this stream ID
    848 
    849     // wow what a verbose API.
    850     int32_t allStreams[] = { streamId, depthStreamId };
    851     size_t streamCount = 2;
    852     camera_metadata_entry_t entry;
    853     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    854     int find = find_camera_metadata_entry(request, tag, &entry);
    855     if (find == -ENOENT) {
    856         if (add_camera_metadata_entry(request, tag, &allStreams,
    857                                       /*data_count*/streamCount) != OK) {
    858             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    859             ASSERT_OK(append_camera_metadata(tmp, request));
    860             free_camera_metadata(request);
    861             request = tmp;
    862 
    863             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    864                                                    /*data_count*/streamCount));
    865         }
    866     } else {
    867         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    868                               &allStreams, /*data_count*/streamCount, &entry));
    869     }
    870 
    871     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    872 
    873     // Consume a couple of frames
    874     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    875         // stream id 1
    876         EXPECT_EQ(OK, mListener->WaitForEvent());
    877         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    878 
    879         // stream id 2
    880         EXPECT_EQ(OK, mListener->WaitForEvent());
    881         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    882 
    883         //TODO: events should be a struct with some data like the stream id
    884     }
    885 
    886     // Done: clean up
    887     free_camera_metadata(request);
    888     EXPECT_OK(mCamera->deleteStream(streamId));
    889     EXPECT_OK(mCamera->exclusiveUnlock());
    890 }
    891 
    892 TEST_F(ProCameraTest, ResultReceiver) {
    893     if (HasFatalFailure()) {
    894         return;
    895     }
    896 
    897     mListener->SetEventMask(ProEvent_Mask(RESULT_RECEIVED));
    898     mListener->SetDropFrames(true);
    899     //FIXME: if this is run right after the previous test we get FRAME_RECEIVED
    900     // need to filter out events at read time
    901 
    902     int streamId = -1;
    903     sp<CpuConsumer> consumer;
    904     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    905                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    906     EXPECT_NE(-1, streamId);
    907 
    908     EXPECT_OK(mCamera->exclusiveTryLock());
    909     /*
    910     */
    911     /* iterate in a loop submitting requests every frame.
    912      *  what kind of requests doesnt really matter, just whatever.
    913      */
    914 
    915     camera_metadata_t *request = NULL;
    916     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    917                                             /*out*/&request));
    918     EXPECT_NE((void*)NULL, request);
    919 
    920     /*FIXME*/
    921     if(request == NULL) request = allocate_camera_metadata(10, 100);
    922 
    923     // set the output streams to just this stream ID
    924 
    925     int32_t allStreams[] = { streamId };
    926     size_t streamCount = 1;
    927     camera_metadata_entry_t entry;
    928     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    929     int find = find_camera_metadata_entry(request, tag, &entry);
    930     if (find == -ENOENT) {
    931         if (add_camera_metadata_entry(request, tag, &allStreams,
    932                                       /*data_count*/streamCount) != OK) {
    933             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    934             ASSERT_OK(append_camera_metadata(tmp, request));
    935             free_camera_metadata(request);
    936             request = tmp;
    937 
    938             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    939                                                 /*data_count*/streamCount));
    940         }
    941     } else {
    942         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    943                                &allStreams, /*data_count*/streamCount, &entry));
    944     }
    945 
    946     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    947 
    948     // Consume a couple of results
    949     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    950         EXPECT_EQ(OK, mListener->WaitForEvent());
    951         EXPECT_EQ(RESULT_RECEIVED, mListener->ReadEvent());
    952     }
    953 
    954     // Done: clean up
    955     free_camera_metadata(request);
    956     EXPECT_OK(mCamera->deleteStream(streamId));
    957     EXPECT_OK(mCamera->exclusiveUnlock());
    958 }
    959 
    960 // FIXME: This is racy and sometimes fails on waitForFrameMetadata
    961 TEST_F(ProCameraTest, DISABLED_WaitForResult) {
    962     if (HasFatalFailure()) {
    963         return;
    964     }
    965 
    966     mListener->SetDropFrames(true);
    967 
    968     int streamId = -1;
    969     sp<CpuConsumer> consumer;
    970     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    971                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    972     EXPECT_NE(-1, streamId);
    973 
    974     EXPECT_OK(mCamera->exclusiveTryLock());
    975 
    976     int32_t streams[] = { streamId };
    977     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1));
    978 
    979     // Consume a couple of results
    980     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    981         EXPECT_OK(mCamera->waitForFrameMetadata());
    982         CameraMetadata meta = mCamera->consumeFrameMetadata();
    983         EXPECT_FALSE(meta.isEmpty());
    984     }
    985 
    986     // Done: clean up
    987     EXPECT_OK(mCamera->deleteStream(streamId));
    988     EXPECT_OK(mCamera->exclusiveUnlock());
    989 }
    990 
    991 TEST_F(ProCameraTest, WaitForSingleStreamBuffer) {
    992     if (HasFatalFailure()) {
    993         return;
    994     }
    995 
    996     int streamId = -1;
    997     sp<CpuConsumer> consumer;
    998     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    999                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
   1000     EXPECT_NE(-1, streamId);
   1001 
   1002     EXPECT_OK(mCamera->exclusiveTryLock());
   1003 
   1004     int32_t streams[] = { streamId };
   1005     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1006                                             /*requests*/TEST_CPU_FRAME_COUNT));
   1007 
   1008     // Consume a couple of results
   1009     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
   1010         EXPECT_EQ(1, mCamera->waitForFrameBuffer(streamId));
   1011 
   1012         CpuConsumer::LockedBuffer buf;
   1013         EXPECT_OK(consumer->lockNextBuffer(&buf));
   1014 
   1015         dout << "Buffer synchronously received on streamId = " << streamId <<
   1016                 ", dataPtr = " << (void*)buf.data <<
   1017                 ", timestamp = " << buf.timestamp << std::endl;
   1018 
   1019         EXPECT_OK(consumer->unlockBuffer(buf));
   1020     }
   1021 
   1022     // Done: clean up
   1023     EXPECT_OK(mCamera->deleteStream(streamId));
   1024     EXPECT_OK(mCamera->exclusiveUnlock());
   1025 }
   1026 
   1027 // FIXME: This is racy and sometimes fails on waitForFrameMetadata
   1028 TEST_F(ProCameraTest, DISABLED_WaitForDualStreamBuffer) {
   1029     if (HasFatalFailure()) {
   1030         return;
   1031     }
   1032 
   1033     const int REQUEST_COUNT = TEST_CPU_FRAME_COUNT * 10;
   1034 
   1035     // 15 fps
   1036     int streamId = -1;
   1037     sp<CpuConsumer> consumer;
   1038     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1039                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
   1040     EXPECT_NE(-1, streamId);
   1041 
   1042     // 30 fps
   1043     int depthStreamId = -1;
   1044     sp<CpuConsumer> depthConsumer;
   1045     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
   1046        TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthConsumer, &depthStreamId));
   1047     EXPECT_NE(-1, depthStreamId);
   1048 
   1049     EXPECT_OK(mCamera->exclusiveTryLock());
   1050 
   1051     int32_t streams[] = { streamId, depthStreamId };
   1052     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/2,
   1053                                                     /*requests*/REQUEST_COUNT));
   1054 
   1055     int depthFrames = 0;
   1056     int greyFrames = 0;
   1057 
   1058     // Consume two frames simultaneously. Unsynchronized by timestamps.
   1059     for (int i = 0; i < REQUEST_COUNT; ++i) {
   1060 
   1061         // Exhaust event queue so it doesn't keep growing
   1062         while (mListener->ReadEvent() != UNKNOWN);
   1063 
   1064         // Get the metadata
   1065         EXPECT_OK(mCamera->waitForFrameMetadata());
   1066         CameraMetadata meta = mCamera->consumeFrameMetadata();
   1067         EXPECT_FALSE(meta.isEmpty());
   1068 
   1069         // Get the buffers
   1070 
   1071         EXPECT_EQ(1, mCamera->waitForFrameBuffer(depthStreamId));
   1072 
   1073         /**
   1074           * Guaranteed to be able to consume the depth frame,
   1075           * since we waited on it.
   1076           */
   1077         CpuConsumer::LockedBuffer depthBuffer;
   1078         EXPECT_OK(depthConsumer->lockNextBuffer(&depthBuffer));
   1079 
   1080         dout << "Depth Buffer synchronously received on streamId = " <<
   1081                 streamId <<
   1082                 ", dataPtr = " << (void*)depthBuffer.data <<
   1083                 ", timestamp = " << depthBuffer.timestamp << std::endl;
   1084 
   1085         EXPECT_OK(depthConsumer->unlockBuffer(depthBuffer));
   1086 
   1087         depthFrames++;
   1088 
   1089 
   1090         /** Consume Greyscale frames if there are any.
   1091           * There may not be since it runs at half FPS */
   1092         CpuConsumer::LockedBuffer greyBuffer;
   1093         while (consumer->lockNextBuffer(&greyBuffer) == OK) {
   1094 
   1095             dout << "GRAY Buffer synchronously received on streamId = " <<
   1096                 streamId <<
   1097                 ", dataPtr = " << (void*)greyBuffer.data <<
   1098                 ", timestamp = " << greyBuffer.timestamp << std::endl;
   1099 
   1100             EXPECT_OK(consumer->unlockBuffer(greyBuffer));
   1101 
   1102             greyFrames++;
   1103         }
   1104     }
   1105 
   1106     dout << "Done, summary: depth frames " << std::dec << depthFrames
   1107          << ", grey frames " << std::dec << greyFrames << std::endl;
   1108 
   1109     // Done: clean up
   1110     EXPECT_OK(mCamera->deleteStream(streamId));
   1111     EXPECT_OK(mCamera->exclusiveUnlock());
   1112 }
   1113 
   1114 TEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesSync) {
   1115     if (HasFatalFailure()) {
   1116         return;
   1117     }
   1118 
   1119     const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
   1120 
   1121     int streamId = -1;
   1122     sp<CpuConsumer> consumer;
   1123     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1124                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
   1125                   /*synchronousMode*/true, &consumer, &streamId));
   1126     EXPECT_NE(-1, streamId);
   1127 
   1128     EXPECT_OK(mCamera->exclusiveTryLock());
   1129 
   1130     int32_t streams[] = { streamId };
   1131     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1132                                                      /*requests*/NUM_REQUESTS));
   1133 
   1134     // Consume a couple of results
   1135     for (int i = 0; i < NUM_REQUESTS; ++i) {
   1136         int numFrames;
   1137         EXPECT_TRUE((numFrames = mCamera->waitForFrameBuffer(streamId)) > 0);
   1138 
   1139         // Drop all but the newest framebuffer
   1140         EXPECT_EQ(numFrames-1, mCamera->dropFrameBuffer(streamId, numFrames-1));
   1141 
   1142         dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
   1143 
   1144         // Skip the counter ahead, don't try to consume these frames again
   1145         i += numFrames-1;
   1146 
   1147         // "Consume" the buffer
   1148         CpuConsumer::LockedBuffer buf;
   1149         EXPECT_OK(consumer->lockNextBuffer(&buf));
   1150 
   1151         dout << "Buffer synchronously received on streamId = " << streamId <<
   1152                 ", dataPtr = " << (void*)buf.data <<
   1153                 ", timestamp = " << buf.timestamp << std::endl;
   1154 
   1155         // Process at 10fps, stream is at 15fps.
   1156         // This means we will definitely fill up the buffer queue with
   1157         // extra buffers and need to drop them.
   1158         usleep(TEST_FRAME_PROCESSING_DELAY_US);
   1159 
   1160         EXPECT_OK(consumer->unlockBuffer(buf));
   1161     }
   1162 
   1163     // Done: clean up
   1164     EXPECT_OK(mCamera->deleteStream(streamId));
   1165     EXPECT_OK(mCamera->exclusiveUnlock());
   1166 }
   1167 
   1168 TEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesAsync) {
   1169     if (HasFatalFailure()) {
   1170         return;
   1171     }
   1172 
   1173     const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
   1174 
   1175     int streamId = -1;
   1176     sp<CpuConsumer> consumer;
   1177     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1178                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
   1179                   /*synchronousMode*/false, &consumer, &streamId));
   1180     EXPECT_NE(-1, streamId);
   1181 
   1182     EXPECT_OK(mCamera->exclusiveTryLock());
   1183 
   1184     int32_t streams[] = { streamId };
   1185     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1186                                                      /*requests*/NUM_REQUESTS));
   1187 
   1188     uint64_t lastFrameNumber = 0;
   1189     int numFrames;
   1190 
   1191     // Consume a couple of results
   1192     int i;
   1193     for (i = 0; i < NUM_REQUESTS && lastFrameNumber < NUM_REQUESTS; ++i) {
   1194         EXPECT_LT(0, (numFrames = mCamera->waitForFrameBuffer(streamId)));
   1195 
   1196         dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
   1197 
   1198         // Skip the counter ahead, don't try to consume these frames again
   1199         i += numFrames-1;
   1200 
   1201         // "Consume" the buffer
   1202         CpuConsumer::LockedBuffer buf;
   1203 
   1204         EXPECT_EQ(OK, consumer->lockNextBuffer(&buf));
   1205 
   1206         lastFrameNumber = buf.frameNumber;
   1207 
   1208         dout << "Buffer asynchronously received on streamId = " << streamId <<
   1209                 ", dataPtr = " << (void*)buf.data <<
   1210                 ", timestamp = " << buf.timestamp <<
   1211                 ", framenumber = " << buf.frameNumber << std::endl;
   1212 
   1213         // Process at 10fps, stream is at 15fps.
   1214         // This means we will definitely fill up the buffer queue with
   1215         // extra buffers and need to drop them.
   1216         usleep(TEST_FRAME_PROCESSING_DELAY_US);
   1217 
   1218         EXPECT_OK(consumer->unlockBuffer(buf));
   1219     }
   1220 
   1221     dout << "Done after " << i << " iterations " << std::endl;
   1222 
   1223     // Done: clean up
   1224     EXPECT_OK(mCamera->deleteStream(streamId));
   1225     EXPECT_OK(mCamera->exclusiveUnlock());
   1226 }
   1227 
   1228 
   1229 
   1230 //TODO: refactor into separate file
   1231 TEST_F(ProCameraTest, ServiceListenersSubscribe) {
   1232 
   1233     ASSERT_EQ(4u, sizeof(ServiceListener::Status));
   1234 
   1235     sp<ServiceListener> listener = new ServiceListener();
   1236 
   1237     EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
   1238     EXPECT_OK(ProCamera::addServiceListener(listener));
   1239 
   1240     EXPECT_EQ(ALREADY_EXISTS, ProCamera::addServiceListener(listener));
   1241     EXPECT_OK(ProCamera::removeServiceListener(listener));
   1242 
   1243     EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
   1244 }
   1245 
   1246 //TODO: refactor into separate file
   1247 TEST_F(ProCameraTest, ServiceListenersFunctional) {
   1248 
   1249     sp<ServiceListener> listener = new ServiceListener();
   1250 
   1251     EXPECT_OK(ProCamera::addServiceListener(listener));
   1252 
   1253     sp<Camera> cam = Camera::connect(CAMERA_ID,
   1254                                      /*clientPackageName*/String16(),
   1255                                      -1);
   1256     EXPECT_NE((void*)NULL, cam.get());
   1257 
   1258     ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
   1259     EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
   1260 
   1261     EXPECT_EQ(ServiceListener::STATUS_NOT_AVAILABLE, stat);
   1262 
   1263     if (cam.get()) {
   1264         cam->disconnect();
   1265     }
   1266 
   1267     EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
   1268     EXPECT_EQ(ServiceListener::STATUS_PRESENT, stat);
   1269 
   1270     EXPECT_OK(ProCamera::removeServiceListener(listener));
   1271 }
   1272 
   1273 
   1274 
   1275 }
   1276 }
   1277 }
   1278 }
   1279