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             EXPECT_OK(ret);
    275             if (OK == (ret = consumer->lockNextBuffer(&buf))) {
    276 
    277                 dout << "Frame received on streamId = " << streamId <<
    278                         ", dataPtr = " << (void*)buf.data <<
    279                         ", timestamp = " << buf.timestamp << std::endl;
    280 
    281                 EXPECT_OK(consumer->unlockBuffer(buf));
    282             }
    283         } else {
    284             dout << "Frame received on streamId = " << streamId << std::endl;
    285         }
    286     }
    287 
    288     virtual void onResultReceived(int32_t frameId,
    289                                   camera_metadata* request) {
    290         dout << "Result received frameId = " << frameId
    291              << ", requestPtr = " << (void*)request << std::endl;
    292         QueueEvent(RESULT_RECEIVED);
    293         free_camera_metadata(request);
    294     }
    295 
    296     virtual void notify(int32_t msg, int32_t ext1, int32_t ext2) {
    297         dout << "Notify received: msg " << std::hex << msg
    298              << ", ext1: " << std::hex << ext1 << ", ext2: " << std::hex << ext2
    299              << std::endl;
    300     }
    301 
    302     Vector<ProEvent> mProEventList;
    303     Mutex             mListenerMutex;
    304     Mutex             mConditionMutex;
    305     Condition         mListenerCondition;
    306     int               mEventMask;
    307     bool              mDropFrames;
    308 };
    309 
    310 class ProCameraTest : public ::testing::Test {
    311 
    312 public:
    313     ProCameraTest() {
    314         char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
    315         if (displaySecsEnv != NULL) {
    316             mDisplaySecs = atoi(displaySecsEnv);
    317             if (mDisplaySecs < 0) {
    318                 mDisplaySecs = 0;
    319             }
    320         } else {
    321             mDisplaySecs = 0;
    322         }
    323 
    324         char* displayFmtEnv = getenv("TEST_DISPLAY_FORMAT");
    325         if (displayFmtEnv != NULL) {
    326             mDisplayFmt = FormatFromString(displayFmtEnv);
    327         } else {
    328             mDisplayFmt = TEST_DISPLAY_FORMAT;
    329         }
    330 
    331         char* displayWidthEnv = getenv("TEST_DISPLAY_WIDTH");
    332         if (displayWidthEnv != NULL) {
    333             mDisplayW = atoi(displayWidthEnv);
    334             if (mDisplayW < 0) {
    335                 mDisplayW = 0;
    336             }
    337         } else {
    338             mDisplayW = TEST_DISPLAY_WIDTH;
    339         }
    340 
    341         char* displayHeightEnv = getenv("TEST_DISPLAY_HEIGHT");
    342         if (displayHeightEnv != NULL) {
    343             mDisplayH = atoi(displayHeightEnv);
    344             if (mDisplayH < 0) {
    345                 mDisplayH = 0;
    346             }
    347         } else {
    348             mDisplayH = TEST_DISPLAY_HEIGHT;
    349         }
    350     }
    351 
    352     static void SetUpTestCase() {
    353         // Binder Thread Pool Initialization
    354         mTestThread = new ProCameraTestThread();
    355         mTestThread->run("ProCameraTestThread");
    356     }
    357 
    358     virtual void SetUp() {
    359         mCamera = ProCamera::connect(CAMERA_ID);
    360         ASSERT_NE((void*)NULL, mCamera.get());
    361 
    362         mListener = new ProCameraTestListener();
    363         mCamera->setListener(mListener);
    364     }
    365 
    366     virtual void TearDown() {
    367         ASSERT_NE((void*)NULL, mCamera.get());
    368         mCamera->disconnect();
    369     }
    370 
    371 protected:
    372     sp<ProCamera> mCamera;
    373     sp<ProCameraTestListener> mListener;
    374 
    375     static sp<Thread> mTestThread;
    376 
    377     int mDisplaySecs;
    378     int mDisplayFmt;
    379     int mDisplayW;
    380     int mDisplayH;
    381 
    382     sp<SurfaceComposerClient> mComposerClient;
    383     sp<SurfaceControl> mSurfaceControl;
    384 
    385     sp<SurfaceComposerClient> mDepthComposerClient;
    386     sp<SurfaceControl> mDepthSurfaceControl;
    387 
    388     int getSurfaceWidth() {
    389         return 512;
    390     }
    391     int getSurfaceHeight() {
    392         return 512;
    393     }
    394 
    395     void createOnScreenSurface(sp<Surface>& surface) {
    396         mComposerClient = new SurfaceComposerClient;
    397         ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
    398 
    399         mSurfaceControl = mComposerClient->createSurface(
    400                 String8("ProCameraTest StreamingImage Surface"),
    401                 getSurfaceWidth(), getSurfaceHeight(),
    402                 PIXEL_FORMAT_RGB_888, 0);
    403 
    404         mSurfaceControl->setPosition(0, 0);
    405 
    406         ASSERT_TRUE(mSurfaceControl != NULL);
    407         ASSERT_TRUE(mSurfaceControl->isValid());
    408 
    409         SurfaceComposerClient::openGlobalTransaction();
    410         ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
    411         ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
    412         SurfaceComposerClient::closeGlobalTransaction();
    413 
    414         sp<ANativeWindow> window = mSurfaceControl->getSurface();
    415         surface = mSurfaceControl->getSurface();
    416 
    417         ASSERT_NE((void*)NULL, surface.get());
    418     }
    419 
    420     void createDepthOnScreenSurface(sp<Surface>& surface) {
    421         mDepthComposerClient = new SurfaceComposerClient;
    422         ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck());
    423 
    424         mDepthSurfaceControl = mDepthComposerClient->createSurface(
    425                 String8("ProCameraTest StreamingImage Surface"),
    426                 getSurfaceWidth(), getSurfaceHeight(),
    427                 PIXEL_FORMAT_RGB_888, 0);
    428 
    429         mDepthSurfaceControl->setPosition(640, 0);
    430 
    431         ASSERT_TRUE(mDepthSurfaceControl != NULL);
    432         ASSERT_TRUE(mDepthSurfaceControl->isValid());
    433 
    434         SurfaceComposerClient::openGlobalTransaction();
    435         ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF));
    436         ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show());
    437         SurfaceComposerClient::closeGlobalTransaction();
    438 
    439         sp<ANativeWindow> window = mDepthSurfaceControl->getSurface();
    440         surface = mDepthSurfaceControl->getSurface();
    441 
    442         ASSERT_NE((void*)NULL, surface.get());
    443     }
    444 
    445     template <typename T>
    446     static bool ExistsItem(T needle, T* array, size_t count) {
    447         if (!array) {
    448             return false;
    449         }
    450 
    451         for (size_t i = 0; i < count; ++i) {
    452             if (array[i] == needle) {
    453                 return true;
    454             }
    455         }
    456         return false;
    457     }
    458 
    459 
    460     static int FormatFromString(const char* str) {
    461         std::string s(str);
    462 
    463 #define CMP_STR(x, y)                               \
    464         if (s == #x) return HAL_PIXEL_FORMAT_ ## y;
    465 #define CMP_STR_SAME(x) CMP_STR(x, x)
    466 
    467         CMP_STR_SAME( Y16);
    468         CMP_STR_SAME( Y8);
    469         CMP_STR_SAME( YV12);
    470         CMP_STR(NV16, YCbCr_422_SP);
    471         CMP_STR(NV21, YCrCb_420_SP);
    472         CMP_STR(YUY2, YCbCr_422_I);
    473         CMP_STR(RAW,  RAW_SENSOR);
    474         CMP_STR(RGBA, RGBA_8888);
    475 
    476         std::cerr << "Unknown format string " << str << std::endl;
    477         return -1;
    478 
    479     }
    480 
    481     /**
    482      * Creating a streaming request for these output streams from a template,
    483      *  and submit it
    484      */
    485     void createSubmitRequestForStreams(uint8_t* streamIds, size_t count, int requestCount=-1) {
    486 
    487         ASSERT_NE((void*)NULL, streamIds);
    488         ASSERT_LT(0u, count);
    489 
    490         camera_metadata_t *requestTmp = NULL;
    491         EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    492                                                 /*out*/&requestTmp));
    493         ASSERT_NE((void*)NULL, requestTmp);
    494         CameraMetadata request(requestTmp);
    495 
    496         // set the output streams. default is empty
    497 
    498         uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    499         request.update(tag, streamIds, count);
    500 
    501         requestTmp = request.release();
    502 
    503         if (requestCount < 0) {
    504             EXPECT_OK(mCamera->submitRequest(requestTmp, /*streaming*/true));
    505         } else {
    506             for (int i = 0; i < requestCount; ++i) {
    507                 EXPECT_OK(mCamera->submitRequest(requestTmp,
    508                                                  /*streaming*/false));
    509             }
    510         }
    511         request.acquire(requestTmp);
    512     }
    513 };
    514 
    515 sp<Thread> ProCameraTest::mTestThread;
    516 
    517 TEST_F(ProCameraTest, AvailableFormats) {
    518     if (HasFatalFailure()) {
    519         return;
    520     }
    521 
    522     CameraMetadata staticInfo = mCamera->getCameraInfo(CAMERA_ID);
    523     ASSERT_FALSE(staticInfo.isEmpty());
    524 
    525     uint32_t tag = static_cast<uint32_t>(ANDROID_SCALER_AVAILABLE_FORMATS);
    526     EXPECT_TRUE(staticInfo.exists(tag));
    527     camera_metadata_entry_t entry = staticInfo.find(tag);
    528 
    529     EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YV12,
    530                                                   entry.data.i32, entry.count));
    531     EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP,
    532                                                   entry.data.i32, entry.count));
    533 }
    534 
    535 // test around exclusiveTryLock (immediate locking)
    536 TEST_F(ProCameraTest, LockingImmediate) {
    537 
    538     if (HasFatalFailure()) {
    539         return;
    540     }
    541 
    542     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    543                             ProEvent_Mask(STOLEN)   |
    544                             ProEvent_Mask(RELEASED));
    545 
    546     EXPECT_FALSE(mCamera->hasExclusiveLock());
    547     EXPECT_EQ(OK, mCamera->exclusiveTryLock());
    548     // at this point we definitely have the lock
    549 
    550     EXPECT_EQ(OK, mListener->WaitForEvent());
    551     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    552 
    553     EXPECT_TRUE(mCamera->hasExclusiveLock());
    554     EXPECT_EQ(OK, mCamera->exclusiveUnlock());
    555 
    556     EXPECT_EQ(OK, mListener->WaitForEvent());
    557     EXPECT_EQ(RELEASED, mListener->ReadEvent());
    558 
    559     EXPECT_FALSE(mCamera->hasExclusiveLock());
    560 }
    561 
    562 // test around exclusiveLock (locking at some future point in time)
    563 TEST_F(ProCameraTest, LockingAsynchronous) {
    564 
    565     if (HasFatalFailure()) {
    566         return;
    567     }
    568 
    569 
    570     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    571                             ProEvent_Mask(STOLEN)   |
    572                             ProEvent_Mask(RELEASED));
    573 
    574     // TODO: Add another procamera that has a lock here.
    575     // then we can be test that the lock wont immediately be acquired
    576 
    577     EXPECT_FALSE(mCamera->hasExclusiveLock());
    578     EXPECT_EQ(OK, mCamera->exclusiveTryLock());
    579     // at this point we definitely have the lock
    580 
    581     EXPECT_EQ(OK, mListener->WaitForEvent());
    582     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    583 
    584     EXPECT_TRUE(mCamera->hasExclusiveLock());
    585     EXPECT_EQ(OK, mCamera->exclusiveUnlock());
    586 
    587     EXPECT_EQ(OK, mListener->WaitForEvent());
    588     EXPECT_EQ(RELEASED, mListener->ReadEvent());
    589 
    590     EXPECT_FALSE(mCamera->hasExclusiveLock());
    591 }
    592 
    593 // Stream directly to the screen.
    594 TEST_F(ProCameraTest, DISABLED_StreamingImageSingle) {
    595     if (HasFatalFailure()) {
    596         return;
    597     }
    598 
    599     sp<Surface> surface;
    600     if (mDisplaySecs > 0) {
    601         createOnScreenSurface(/*out*/surface);
    602     }
    603     else {
    604         dout << "Skipping, will not render to screen" << std::endl;
    605         return;
    606     }
    607 
    608     int depthStreamId = -1;
    609 
    610     sp<ServiceListener> listener = new ServiceListener();
    611     EXPECT_OK(ProCamera::addServiceListener(listener));
    612 
    613     ServiceListener::Status currentStatus;
    614 
    615     // when subscribing a new listener,
    616     // we immediately get a callback to the current status
    617     while (listener->waitForStatusChange(/*out*/currentStatus) != OK);
    618     EXPECT_EQ(ServiceListener::STATUS_PRESENT, currentStatus);
    619 
    620     dout << "Will now stream and resume infinitely..." << std::endl;
    621     while (true) {
    622 
    623         if (currentStatus == ServiceListener::STATUS_PRESENT) {
    624 
    625             ASSERT_OK(mCamera->createStream(mDisplayW, mDisplayH, mDisplayFmt,
    626                                             surface,
    627                                             &depthStreamId));
    628             EXPECT_NE(-1, depthStreamId);
    629 
    630             EXPECT_OK(mCamera->exclusiveTryLock());
    631 
    632             uint8_t streams[] = { depthStreamId };
    633             ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(
    634                                                  streams,
    635                                                  /*count*/1));
    636         }
    637 
    638         ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
    639 
    640         // TODO: maybe check for getch every once in a while?
    641         while (listener->waitForStatusChange(/*out*/stat) != OK);
    642 
    643         if (currentStatus != stat) {
    644             if (stat == ServiceListener::STATUS_PRESENT) {
    645                 dout << "Reconnecting to camera" << std::endl;
    646                 mCamera = ProCamera::connect(CAMERA_ID);
    647             } else if (stat == ServiceListener::STATUS_NOT_AVAILABLE) {
    648                 dout << "Disconnecting from camera" << std::endl;
    649                 mCamera->disconnect();
    650             } else if (stat == ServiceListener::STATUS_NOT_PRESENT) {
    651                 dout << "Camera unplugged" << std::endl;
    652                 mCamera = NULL;
    653             } else {
    654                 dout << "Unknown status change "
    655                      << std::hex << stat << std::endl;
    656             }
    657 
    658             currentStatus = stat;
    659         }
    660     }
    661 
    662     EXPECT_OK(ProCamera::removeServiceListener(listener));
    663     EXPECT_OK(mCamera->deleteStream(depthStreamId));
    664     EXPECT_OK(mCamera->exclusiveUnlock());
    665 }
    666 
    667 // Stream directly to the screen.
    668 TEST_F(ProCameraTest, DISABLED_StreamingImageDual) {
    669     if (HasFatalFailure()) {
    670         return;
    671     }
    672     sp<Surface> surface;
    673     sp<Surface> depthSurface;
    674     if (mDisplaySecs > 0) {
    675         createOnScreenSurface(/*out*/surface);
    676         createDepthOnScreenSurface(/*out*/depthSurface);
    677     }
    678 
    679     int streamId = -1;
    680     EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960,
    681               TEST_FORMAT_MAIN, surface, &streamId));
    682     EXPECT_NE(-1, streamId);
    683 
    684     int depthStreamId = -1;
    685     EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
    686               TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
    687     EXPECT_NE(-1, depthStreamId);
    688 
    689     EXPECT_OK(mCamera->exclusiveTryLock());
    690     /*
    691     */
    692     /* iterate in a loop submitting requests every frame.
    693      *  what kind of requests doesnt really matter, just whatever.
    694      */
    695 
    696     // it would probably be better to use CameraMetadata from camera service.
    697     camera_metadata_t *request = NULL;
    698     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    699               /*out*/&request));
    700     EXPECT_NE((void*)NULL, request);
    701 
    702     /*FIXME: dont need this later, at which point the above should become an
    703              ASSERT_NE*/
    704     if(request == NULL) request = allocate_camera_metadata(10, 100);
    705 
    706     // set the output streams to just this stream ID
    707 
    708     // wow what a verbose API.
    709     uint8_t allStreams[] = { streamId, depthStreamId };
    710     // IMPORTANT. bad things will happen if its not a uint8.
    711     size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
    712     camera_metadata_entry_t entry;
    713     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    714     int find = find_camera_metadata_entry(request, tag, &entry);
    715     if (find == -ENOENT) {
    716         if (add_camera_metadata_entry(request, tag, &allStreams,
    717                                       /*data_count*/streamCount) != OK) {
    718             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    719             ASSERT_OK(append_camera_metadata(tmp, request));
    720             free_camera_metadata(request);
    721             request = tmp;
    722 
    723             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    724                                                 /*data_count*/streamCount));
    725         }
    726     } else {
    727         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    728                   &allStreams, /*data_count*/streamCount, &entry));
    729     }
    730 
    731     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    732 
    733     dout << "will sleep now for " << mDisplaySecs << std::endl;
    734     sleep(mDisplaySecs);
    735 
    736     free_camera_metadata(request);
    737 
    738     for (int i = 0; i < streamCount; ++i) {
    739         EXPECT_OK(mCamera->deleteStream(allStreams[i]));
    740     }
    741     EXPECT_OK(mCamera->exclusiveUnlock());
    742 }
    743 
    744 TEST_F(ProCameraTest, CpuConsumerSingle) {
    745     if (HasFatalFailure()) {
    746         return;
    747     }
    748 
    749     mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
    750                             ProEvent_Mask(STOLEN)   |
    751                             ProEvent_Mask(RELEASED) |
    752                             ProEvent_Mask(FRAME_RECEIVED));
    753     mListener->SetDropFrames(true);
    754 
    755     int streamId = -1;
    756     sp<CpuConsumer> consumer;
    757     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
    758                 TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    759     EXPECT_NE(-1, streamId);
    760 
    761     EXPECT_OK(mCamera->exclusiveTryLock());
    762     EXPECT_EQ(OK, mListener->WaitForEvent());
    763     EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
    764     /* iterate in a loop submitting requests every frame.
    765      *  what kind of requests doesnt really matter, just whatever.
    766      */
    767 
    768     // it would probably be better to use CameraMetadata from camera service.
    769     camera_metadata_t *request = NULL;
    770     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    771         /*out*/&request));
    772     EXPECT_NE((void*)NULL, request);
    773 
    774     /*FIXME: dont need this later, at which point the above should become an
    775       ASSERT_NE*/
    776     if(request == NULL) request = allocate_camera_metadata(10, 100);
    777 
    778     // set the output streams to just this stream ID
    779 
    780     uint8_t allStreams[] = { streamId };
    781     camera_metadata_entry_t entry;
    782     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    783     int find = find_camera_metadata_entry(request, tag, &entry);
    784     if (find == -ENOENT) {
    785         if (add_camera_metadata_entry(request, tag, &allStreams,
    786                 /*data_count*/1) != OK) {
    787             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    788             ASSERT_OK(append_camera_metadata(tmp, request));
    789             free_camera_metadata(request);
    790             request = tmp;
    791 
    792             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    793                 /*data_count*/1));
    794         }
    795     } else {
    796         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    797             &allStreams, /*data_count*/1, &entry));
    798     }
    799 
    800     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    801 
    802     // Consume a couple of frames
    803     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    804         EXPECT_EQ(OK, mListener->WaitForEvent());
    805         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    806     }
    807 
    808     // Done: clean up
    809     free_camera_metadata(request);
    810     EXPECT_OK(mCamera->deleteStream(streamId));
    811     EXPECT_OK(mCamera->exclusiveUnlock());
    812 }
    813 
    814 TEST_F(ProCameraTest, CpuConsumerDual) {
    815     if (HasFatalFailure()) {
    816         return;
    817     }
    818 
    819     mListener->SetEventMask(ProEvent_Mask(FRAME_RECEIVED));
    820     mListener->SetDropFrames(true);
    821 
    822     int streamId = -1;
    823     sp<CpuConsumer> consumer;
    824     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    825                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    826     EXPECT_NE(-1, streamId);
    827 
    828     int depthStreamId = -1;
    829     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
    830             TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &depthStreamId));
    831     EXPECT_NE(-1, depthStreamId);
    832 
    833     EXPECT_OK(mCamera->exclusiveTryLock());
    834     /*
    835     */
    836     /* iterate in a loop submitting requests every frame.
    837      *  what kind of requests doesnt really matter, just whatever.
    838      */
    839 
    840     // it would probably be better to use CameraMetadata from camera service.
    841     camera_metadata_t *request = NULL;
    842     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    843                                             /*out*/&request));
    844     EXPECT_NE((void*)NULL, request);
    845 
    846     if(request == NULL) request = allocate_camera_metadata(10, 100);
    847 
    848     // set the output streams to just this stream ID
    849 
    850     // wow what a verbose API.
    851     uint8_t allStreams[] = { streamId, depthStreamId };
    852     size_t streamCount = 2;
    853     camera_metadata_entry_t entry;
    854     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    855     int find = find_camera_metadata_entry(request, tag, &entry);
    856     if (find == -ENOENT) {
    857         if (add_camera_metadata_entry(request, tag, &allStreams,
    858                                       /*data_count*/streamCount) != OK) {
    859             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    860             ASSERT_OK(append_camera_metadata(tmp, request));
    861             free_camera_metadata(request);
    862             request = tmp;
    863 
    864             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    865                                                    /*data_count*/streamCount));
    866         }
    867     } else {
    868         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    869                               &allStreams, /*data_count*/streamCount, &entry));
    870     }
    871 
    872     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    873 
    874     // Consume a couple of frames
    875     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    876         // stream id 1
    877         EXPECT_EQ(OK, mListener->WaitForEvent());
    878         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    879 
    880         // stream id 2
    881         EXPECT_EQ(OK, mListener->WaitForEvent());
    882         EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
    883 
    884         //TODO: events should be a struct with some data like the stream id
    885     }
    886 
    887     // Done: clean up
    888     free_camera_metadata(request);
    889     EXPECT_OK(mCamera->deleteStream(streamId));
    890     EXPECT_OK(mCamera->exclusiveUnlock());
    891 }
    892 
    893 TEST_F(ProCameraTest, ResultReceiver) {
    894     if (HasFatalFailure()) {
    895         return;
    896     }
    897 
    898     mListener->SetEventMask(ProEvent_Mask(RESULT_RECEIVED));
    899     mListener->SetDropFrames(true);
    900     //FIXME: if this is run right after the previous test we get FRAME_RECEIVED
    901     // need to filter out events at read time
    902 
    903     int streamId = -1;
    904     sp<CpuConsumer> consumer;
    905     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    906                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    907     EXPECT_NE(-1, streamId);
    908 
    909     EXPECT_OK(mCamera->exclusiveTryLock());
    910     /*
    911     */
    912     /* iterate in a loop submitting requests every frame.
    913      *  what kind of requests doesnt really matter, just whatever.
    914      */
    915 
    916     camera_metadata_t *request = NULL;
    917     EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
    918                                             /*out*/&request));
    919     EXPECT_NE((void*)NULL, request);
    920 
    921     /*FIXME*/
    922     if(request == NULL) request = allocate_camera_metadata(10, 100);
    923 
    924     // set the output streams to just this stream ID
    925 
    926     uint8_t allStreams[] = { streamId };
    927     size_t streamCount = 1;
    928     camera_metadata_entry_t entry;
    929     uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
    930     int find = find_camera_metadata_entry(request, tag, &entry);
    931     if (find == -ENOENT) {
    932         if (add_camera_metadata_entry(request, tag, &allStreams,
    933                                       /*data_count*/streamCount) != OK) {
    934             camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
    935             ASSERT_OK(append_camera_metadata(tmp, request));
    936             free_camera_metadata(request);
    937             request = tmp;
    938 
    939             ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
    940                                                 /*data_count*/streamCount));
    941         }
    942     } else {
    943         ASSERT_OK(update_camera_metadata_entry(request, entry.index,
    944                                &allStreams, /*data_count*/streamCount, &entry));
    945     }
    946 
    947     EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
    948 
    949     // Consume a couple of results
    950     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    951         EXPECT_EQ(OK, mListener->WaitForEvent());
    952         EXPECT_EQ(RESULT_RECEIVED, mListener->ReadEvent());
    953     }
    954 
    955     // Done: clean up
    956     free_camera_metadata(request);
    957     EXPECT_OK(mCamera->deleteStream(streamId));
    958     EXPECT_OK(mCamera->exclusiveUnlock());
    959 }
    960 
    961 // FIXME: This is racy and sometimes fails on waitForFrameMetadata
    962 TEST_F(ProCameraTest, DISABLED_WaitForResult) {
    963     if (HasFatalFailure()) {
    964         return;
    965     }
    966 
    967     mListener->SetDropFrames(true);
    968 
    969     int streamId = -1;
    970     sp<CpuConsumer> consumer;
    971     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
    972                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
    973     EXPECT_NE(-1, streamId);
    974 
    975     EXPECT_OK(mCamera->exclusiveTryLock());
    976 
    977     uint8_t streams[] = { streamId };
    978     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1));
    979 
    980     // Consume a couple of results
    981     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
    982         EXPECT_OK(mCamera->waitForFrameMetadata());
    983         CameraMetadata meta = mCamera->consumeFrameMetadata();
    984         EXPECT_FALSE(meta.isEmpty());
    985     }
    986 
    987     // Done: clean up
    988     EXPECT_OK(mCamera->deleteStream(streamId));
    989     EXPECT_OK(mCamera->exclusiveUnlock());
    990 }
    991 
    992 TEST_F(ProCameraTest, WaitForSingleStreamBuffer) {
    993     if (HasFatalFailure()) {
    994         return;
    995     }
    996 
    997     int streamId = -1;
    998     sp<CpuConsumer> consumer;
    999     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1000                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
   1001     EXPECT_NE(-1, streamId);
   1002 
   1003     EXPECT_OK(mCamera->exclusiveTryLock());
   1004 
   1005     uint8_t streams[] = { streamId };
   1006     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1007                                             /*requests*/TEST_CPU_FRAME_COUNT));
   1008 
   1009     // Consume a couple of results
   1010     for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
   1011         EXPECT_EQ(1, mCamera->waitForFrameBuffer(streamId));
   1012 
   1013         CpuConsumer::LockedBuffer buf;
   1014         EXPECT_OK(consumer->lockNextBuffer(&buf));
   1015 
   1016         dout << "Buffer synchronously received on streamId = " << streamId <<
   1017                 ", dataPtr = " << (void*)buf.data <<
   1018                 ", timestamp = " << buf.timestamp << std::endl;
   1019 
   1020         EXPECT_OK(consumer->unlockBuffer(buf));
   1021     }
   1022 
   1023     // Done: clean up
   1024     EXPECT_OK(mCamera->deleteStream(streamId));
   1025     EXPECT_OK(mCamera->exclusiveUnlock());
   1026 }
   1027 
   1028 // FIXME: This is racy and sometimes fails on waitForFrameMetadata
   1029 TEST_F(ProCameraTest, DISABLED_WaitForDualStreamBuffer) {
   1030     if (HasFatalFailure()) {
   1031         return;
   1032     }
   1033 
   1034     const int REQUEST_COUNT = TEST_CPU_FRAME_COUNT * 10;
   1035 
   1036     // 15 fps
   1037     int streamId = -1;
   1038     sp<CpuConsumer> consumer;
   1039     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1040                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
   1041     EXPECT_NE(-1, streamId);
   1042 
   1043     // 30 fps
   1044     int depthStreamId = -1;
   1045     sp<CpuConsumer> depthConsumer;
   1046     EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
   1047        TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthConsumer, &depthStreamId));
   1048     EXPECT_NE(-1, depthStreamId);
   1049 
   1050     EXPECT_OK(mCamera->exclusiveTryLock());
   1051 
   1052     uint8_t streams[] = { streamId, depthStreamId };
   1053     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/2,
   1054                                                     /*requests*/REQUEST_COUNT));
   1055 
   1056     int depthFrames = 0;
   1057     int greyFrames = 0;
   1058 
   1059     // Consume two frames simultaneously. Unsynchronized by timestamps.
   1060     for (int i = 0; i < REQUEST_COUNT; ++i) {
   1061 
   1062         // Exhaust event queue so it doesn't keep growing
   1063         while (mListener->ReadEvent() != UNKNOWN);
   1064 
   1065         // Get the metadata
   1066         EXPECT_OK(mCamera->waitForFrameMetadata());
   1067         CameraMetadata meta = mCamera->consumeFrameMetadata();
   1068         EXPECT_FALSE(meta.isEmpty());
   1069 
   1070         // Get the buffers
   1071 
   1072         EXPECT_EQ(1, mCamera->waitForFrameBuffer(depthStreamId));
   1073 
   1074         /**
   1075           * Guaranteed to be able to consume the depth frame,
   1076           * since we waited on it.
   1077           */
   1078         CpuConsumer::LockedBuffer depthBuffer;
   1079         EXPECT_OK(depthConsumer->lockNextBuffer(&depthBuffer));
   1080 
   1081         dout << "Depth Buffer synchronously received on streamId = " <<
   1082                 streamId <<
   1083                 ", dataPtr = " << (void*)depthBuffer.data <<
   1084                 ", timestamp = " << depthBuffer.timestamp << std::endl;
   1085 
   1086         EXPECT_OK(depthConsumer->unlockBuffer(depthBuffer));
   1087 
   1088         depthFrames++;
   1089 
   1090 
   1091         /** Consume Greyscale frames if there are any.
   1092           * There may not be since it runs at half FPS */
   1093         CpuConsumer::LockedBuffer greyBuffer;
   1094         while (consumer->lockNextBuffer(&greyBuffer) == OK) {
   1095 
   1096             dout << "GRAY Buffer synchronously received on streamId = " <<
   1097                 streamId <<
   1098                 ", dataPtr = " << (void*)greyBuffer.data <<
   1099                 ", timestamp = " << greyBuffer.timestamp << std::endl;
   1100 
   1101             EXPECT_OK(consumer->unlockBuffer(greyBuffer));
   1102 
   1103             greyFrames++;
   1104         }
   1105     }
   1106 
   1107     dout << "Done, summary: depth frames " << std::dec << depthFrames
   1108          << ", grey frames " << std::dec << greyFrames << std::endl;
   1109 
   1110     // Done: clean up
   1111     EXPECT_OK(mCamera->deleteStream(streamId));
   1112     EXPECT_OK(mCamera->exclusiveUnlock());
   1113 }
   1114 
   1115 TEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesSync) {
   1116     if (HasFatalFailure()) {
   1117         return;
   1118     }
   1119 
   1120     const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
   1121 
   1122     int streamId = -1;
   1123     sp<CpuConsumer> consumer;
   1124     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1125                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
   1126                   /*synchronousMode*/true, &consumer, &streamId));
   1127     EXPECT_NE(-1, streamId);
   1128 
   1129     EXPECT_OK(mCamera->exclusiveTryLock());
   1130 
   1131     uint8_t streams[] = { streamId };
   1132     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1133                                                      /*requests*/NUM_REQUESTS));
   1134 
   1135     // Consume a couple of results
   1136     for (int i = 0; i < NUM_REQUESTS; ++i) {
   1137         int numFrames;
   1138         EXPECT_TRUE((numFrames = mCamera->waitForFrameBuffer(streamId)) > 0);
   1139 
   1140         // Drop all but the newest framebuffer
   1141         EXPECT_EQ(numFrames-1, mCamera->dropFrameBuffer(streamId, numFrames-1));
   1142 
   1143         dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
   1144 
   1145         // Skip the counter ahead, don't try to consume these frames again
   1146         i += numFrames-1;
   1147 
   1148         // "Consume" the buffer
   1149         CpuConsumer::LockedBuffer buf;
   1150         EXPECT_OK(consumer->lockNextBuffer(&buf));
   1151 
   1152         dout << "Buffer synchronously received on streamId = " << streamId <<
   1153                 ", dataPtr = " << (void*)buf.data <<
   1154                 ", timestamp = " << buf.timestamp << std::endl;
   1155 
   1156         // Process at 10fps, stream is at 15fps.
   1157         // This means we will definitely fill up the buffer queue with
   1158         // extra buffers and need to drop them.
   1159         usleep(TEST_FRAME_PROCESSING_DELAY_US);
   1160 
   1161         EXPECT_OK(consumer->unlockBuffer(buf));
   1162     }
   1163 
   1164     // Done: clean up
   1165     EXPECT_OK(mCamera->deleteStream(streamId));
   1166     EXPECT_OK(mCamera->exclusiveUnlock());
   1167 }
   1168 
   1169 TEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesAsync) {
   1170     if (HasFatalFailure()) {
   1171         return;
   1172     }
   1173 
   1174     const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
   1175     const int CONSECUTIVE_FAILS_ASSUME_TIME_OUT = 5;
   1176 
   1177     int streamId = -1;
   1178     sp<CpuConsumer> consumer;
   1179     EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
   1180                   TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
   1181                   /*synchronousMode*/false, &consumer, &streamId));
   1182     EXPECT_NE(-1, streamId);
   1183 
   1184     EXPECT_OK(mCamera->exclusiveTryLock());
   1185 
   1186     uint8_t streams[] = { streamId };
   1187     ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
   1188                                                      /*requests*/NUM_REQUESTS));
   1189 
   1190     uint64_t lastFrameNumber = 0;
   1191     int numFrames;
   1192 
   1193     // Consume a couple of results
   1194     int i;
   1195     for (i = 0; i < NUM_REQUESTS && lastFrameNumber < NUM_REQUESTS; ++i) {
   1196         EXPECT_LT(0, (numFrames = mCamera->waitForFrameBuffer(streamId)));
   1197 
   1198         dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
   1199 
   1200         // Skip the counter ahead, don't try to consume these frames again
   1201         i += numFrames-1;
   1202 
   1203         // "Consume" the buffer
   1204         CpuConsumer::LockedBuffer buf;
   1205 
   1206         EXPECT_EQ(OK, consumer->lockNextBuffer(&buf));
   1207 
   1208         lastFrameNumber = buf.frameNumber;
   1209 
   1210         dout << "Buffer asynchronously received on streamId = " << streamId <<
   1211                 ", dataPtr = " << (void*)buf.data <<
   1212                 ", timestamp = " << buf.timestamp <<
   1213                 ", framenumber = " << buf.frameNumber << std::endl;
   1214 
   1215         // Process at 10fps, stream is at 15fps.
   1216         // This means we will definitely fill up the buffer queue with
   1217         // extra buffers and need to drop them.
   1218         usleep(TEST_FRAME_PROCESSING_DELAY_US);
   1219 
   1220         EXPECT_OK(consumer->unlockBuffer(buf));
   1221     }
   1222 
   1223     dout << "Done after " << i << " iterations " << std::endl;
   1224 
   1225     // Done: clean up
   1226     EXPECT_OK(mCamera->deleteStream(streamId));
   1227     EXPECT_OK(mCamera->exclusiveUnlock());
   1228 }
   1229 
   1230 
   1231 
   1232 //TODO: refactor into separate file
   1233 TEST_F(ProCameraTest, ServiceListenersSubscribe) {
   1234 
   1235     ASSERT_EQ(4u, sizeof(ServiceListener::Status));
   1236 
   1237     sp<ServiceListener> listener = new ServiceListener();
   1238 
   1239     EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
   1240     EXPECT_OK(ProCamera::addServiceListener(listener));
   1241 
   1242     EXPECT_EQ(ALREADY_EXISTS, ProCamera::addServiceListener(listener));
   1243     EXPECT_OK(ProCamera::removeServiceListener(listener));
   1244 
   1245     EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
   1246 }
   1247 
   1248 //TODO: refactor into separate file
   1249 TEST_F(ProCameraTest, ServiceListenersFunctional) {
   1250 
   1251     sp<ServiceListener> listener = new ServiceListener();
   1252 
   1253     EXPECT_OK(ProCamera::addServiceListener(listener));
   1254 
   1255     sp<Camera> cam = Camera::connect(CAMERA_ID,
   1256                                      /*clientPackageName*/String16(),
   1257                                      -1);
   1258     EXPECT_NE((void*)NULL, cam.get());
   1259 
   1260     ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
   1261     EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
   1262 
   1263     EXPECT_EQ(ServiceListener::STATUS_NOT_AVAILABLE, stat);
   1264 
   1265     if (cam.get()) {
   1266         cam->disconnect();
   1267     }
   1268 
   1269     EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
   1270     EXPECT_EQ(ServiceListener::STATUS_PRESENT, stat);
   1271 
   1272     EXPECT_OK(ProCamera::removeServiceListener(listener));
   1273 }
   1274 
   1275 
   1276 
   1277 }
   1278 }
   1279 }
   1280 }
   1281 
   1282