ProCameraTests.cpp revision d1d6467d3bcbc1305eeba0176a2edf04925c368e
1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org/*
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2013 The Android Open Source Project
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Licensed under the Apache License, Version 2.0 (the "License");
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * you may not use this file except in compliance with the License.
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * You may obtain a copy of the License at
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *      http://www.apache.org/licenses/LICENSE-2.0
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Unless required by applicable law or agreed to in writing, software
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * distributed under the License is distributed on an "AS IS" BASIS,
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See the License for the specific language governing permissions and
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * limitations under the License.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <gtest/gtest.h>
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <iostream>
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <binder/IPCThreadState.h>
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Thread.h>
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "Camera.h"
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "ProCamera.h"
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Vector.h>
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Mutex.h>
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <utils/Condition.h>
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <gui/SurfaceComposerClient.h>
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <gui/Surface.h>
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org#include <system/camera_metadata.h>
33d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only
34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include <camera/CameraMetadata.h>
3501beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <camera/ICameraServiceListener.h>
37f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org
381456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgnamespace android {
39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace camera2 {
40f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgnamespace tests {
417c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgnamespace client {
42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define CAMERA_ID 0
4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#define TEST_DEBUGGING 0
4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_FORMAT_MAIN HAL_PIXEL_FORMAT_Y8
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// defaults for display "test"
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_DISPLAY_FORMAT HAL_PIXEL_FORMAT_Y8
54ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define TEST_DISPLAY_WIDTH 320
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_DISPLAY_HEIGHT 240
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_CPU_FRAME_COUNT 2
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TEST_CPU_HEAP_COUNT 5
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#define TEST_FRAME_PROCESSING_DELAY_US 200000 // 200 ms
61245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
62245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#if TEST_DEBUGGING
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define dout std::cerr
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define dout if (0) std::cerr
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define EXPECT_OK(x) EXPECT_EQ(OK, (x))
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ASSERT_OK(x) ASSERT_EQ(OK, (x))
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ProCameraTest;
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct ServiceListener : public BnCameraServiceListener {
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ServiceListener() :
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        mLatestStatus(STATUS_UNKNOWN),
7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        mPrevStatus(STATUS_UNKNOWN)
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    {
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void onStatusChanged(Status status, int32_t cameraId) {
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        dout << "On status changed: 0x" << std::hex
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             << (unsigned int) status << " cameraId " << cameraId
84245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org             << std::endl;
85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
86ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        Mutex::Autolock al(mMutex);
87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
88245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        mLatestStatus = status;
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        mCondition.broadcast();
9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    status_t waitForStatusChange(Status& newStatus) {
936d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org        Mutex::Autolock al(mMutex);
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        if (mLatestStatus != mPrevStatus) {
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            newStatus = mLatestStatus;
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            mPrevStatus = mLatestStatus;
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            return OK;
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        status_t stat = mCondition.waitRelative(mMutex,
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               TEST_LISTENER_TIMEOUT);
1033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
1043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        if (stat == OK) {
1053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org            newStatus = mLatestStatus;
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            mPrevStatus = mLatestStatus;
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
108245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
109245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        return stat;
110ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Condition mCondition;
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Mutex mMutex;
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    Status mLatestStatus;
116061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    Status mPrevStatus;
11746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org};
118ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
119ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgenum ProEvent {
120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    UNKNOWN,
12125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org    ACQUIRED,
1227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    RELEASED,
123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    STOLEN,
124ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FRAME_RECEIVED,
125e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org    RESULT_RECEIVED,
126e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org};
127e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
128e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orginline int ProEvent_Mask(ProEvent e) {
129e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org    return (1 << static_cast<int>(e));
130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
132ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgtypedef Vector<ProEvent> EventList;
133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass ProCameraTestThread : public Thread
135ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
136ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgpublic:
137ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ProCameraTestThread() {
138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
13901beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org
14001beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    virtual bool threadLoop() {
141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        mProc = ProcessState::self();
142ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        mProc->startThreadPool();
143b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
144ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        IPCThreadState *ptr = IPCThreadState::self();
145bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        ptr->joinThreadPool();
147bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
148061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        return false;
149bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    }
150061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
151061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    sp<ProcessState> mProc;
152061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org};
153061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ProCameraTestListener : public ProCameraListener {
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenpublic:
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    static const int EVENT_MASK_ALL = 0xFFFFFFFF;
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org    ProCameraTestListener() {
160ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        mEventMask = EVENT_MASK_ALL;
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        mDropFrames = false;
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    status_t WaitForEvent() {
1654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org        Mutex::Autolock cal(mConditionMutex);
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        {
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            Mutex::Autolock al(mListenerMutex);
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org            if (mProEventList.size() > 0) {
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                return OK;
172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org            }
17371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org        }
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return mListenerCondition.waitRelative(mConditionMutex,
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                               TEST_LISTENER_TIMEOUT);
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1795323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org    /* Read events into out. Existing queue is flushed */
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void ReadEvents(EventList& out) {
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        Mutex::Autolock al(mListenerMutex);
182beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
183beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        for (size_t i = 0; i < mProEventList.size(); ++i) {
184ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org            out.push(mProEventList[i]);
185beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
186beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        mProEventList.clear();
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    /**
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      * Dequeue 1 event from the event queue.
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      * Returns UNKNOWN if queue is empty
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      */
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ProEvent ReadEvent() {
195ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        Mutex::Autolock al(mListenerMutex);
1966d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
1976d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org        if (mProEventList.size() == 0) {
1985d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            return UNKNOWN;
1993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        }
2003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
2013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        ProEvent ev = mProEventList[0];
2023811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        mProEventList.removeAt(0);
203ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
204ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return ev;
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void SetEventMask(int eventMask) {
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        Mutex::Autolock al(mListenerMutex);
2093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        mEventMask = eventMask;
2103811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    }
2113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
212068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    // Automatically acquire/release frames as they are available
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    void SetDropFrames(bool dropFrames) {
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        Mutex::Autolock al(mListenerMutex);
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        mDropFrames = dropFrames;
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenprivate:
219ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    void QueueEvent(ProEvent ev) {
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        bool eventAdded = false;
221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        {
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            Mutex::Autolock al(mListenerMutex);
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            // Drop events not part of mask
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            if (ProEvent_Mask(ev) & mEventMask) {
2263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org                mProEventList.push(ev);
2273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org                eventAdded = true;
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            }
229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        }
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        if (eventAdded) {
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            mListenerCondition.broadcast();
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgprotected:
23771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    //////////////////////////////////////////////////
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ///////// ProCameraListener //////////////////////
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    //////////////////////////////////////////////////
241ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Lock has been acquired. Write operations now available.
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual void onLockAcquired() {
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        QueueEvent(ACQUIRED);
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
24740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org    // Lock has been released with exclusiveUnlock
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual void onLockReleased() {
2496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org        QueueEvent(RELEASED);
25040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org    }
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Lock has been stolen by another client.
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    virtual void onLockStolen() {
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        QueueEvent(STOLEN);
2558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
2568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Lock free.
2588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) {
2598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        dout << "Trigger notify: " << ext1 << " " << ext2
2618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org             << " " << ext3 << std::endl;
2628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
2638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    virtual void onFrameAvailable(int streamId,
2658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                                  const sp<CpuConsumer>& consumer) {
2668e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        QueueEvent(FRAME_RECEIVED);
2688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        Mutex::Autolock al(mListenerMutex);
2708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (mDropFrames) {
2718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            CpuConsumer::LockedBuffer buf;
2728e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            status_t ret;
2738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            if (OK == (ret = consumer->lockNextBuffer(&buf))) {
2758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                dout << "Frame received on streamId = " << streamId <<
2778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                        ", dataPtr = " << (void*)buf.data <<
2788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                        ", timestamp = " << buf.timestamp << std::endl;
2798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2808e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                EXPECT_OK(consumer->unlockBuffer(buf));
2818e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            }
2828e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        } else {
2838e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            dout << "Frame received on streamId = " << streamId << std::endl;
2848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        }
2858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
2868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    virtual void onResultReceived(int32_t frameId,
2888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                                  camera_metadata* request) {
2898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        dout << "Result received frameId = " << frameId
2908e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org             << ", requestPtr = " << (void*)request << std::endl;
2918e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        QueueEvent(RESULT_RECEIVED);
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        free_camera_metadata(request);
29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
295ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    virtual void notify(int32_t msg, int32_t ext1, int32_t ext2) {
2968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        dout << "Notify received: msg " << std::hex << msg
2978e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org             << ", ext1: " << std::hex << ext1 << ", ext2: " << std::hex << ext2
2988e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org             << std::endl;
2998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
3008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    Vector<ProEvent> mProEventList;
3028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    Mutex             mListenerMutex;
3038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    Mutex             mConditionMutex;
3048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    Condition         mListenerCondition;
3058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int               mEventMask;
3068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    bool              mDropFrames;
3078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org};
3088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgclass ProCameraTest : public ::testing::Test {
3108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgpublic:
3128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    ProCameraTest() {
3138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
3148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (displaySecsEnv != NULL) {
3158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplaySecs = atoi(displaySecsEnv);
3168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            if (mDisplaySecs < 0) {
3178e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                mDisplaySecs = 0;
3188e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            }
3198e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        } else {
32004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org            mDisplaySecs = 0;
32104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org        }
32204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
32304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org        char* displayFmtEnv = getenv("TEST_DISPLAY_FORMAT");
3248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (displayFmtEnv != NULL) {
3258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayFmt = FormatFromString(displayFmtEnv);
3268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        } else {
3278e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayFmt = TEST_DISPLAY_FORMAT;
3288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        }
3298e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3308e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        char* displayWidthEnv = getenv("TEST_DISPLAY_WIDTH");
3318e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (displayWidthEnv != NULL) {
3328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayW = atoi(displayWidthEnv);
3338e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            if (mDisplayW < 0) {
3348e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                mDisplayW = 0;
3358e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            }
3368e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        } else {
3378e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayW = TEST_DISPLAY_WIDTH;
3388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        }
3398e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3408e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        char* displayHeightEnv = getenv("TEST_DISPLAY_HEIGHT");
3418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (displayHeightEnv != NULL) {
3428e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayH = atoi(displayHeightEnv);
3438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            if (mDisplayH < 0) {
3448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                mDisplayH = 0;
3458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            }
3468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        } else {
3478e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            mDisplayH = TEST_DISPLAY_HEIGHT;
3488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        }
3498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
3508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3518e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    static void SetUpTestCase() {
3528e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        // Binder Thread Pool Initialization
3538e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mTestThread = new ProCameraTestThread();
3548e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mTestThread->run("ProCameraTestThread");
3558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
3568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    virtual void SetUp() {
3588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mCamera = ProCamera::connect(CAMERA_ID);
3598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_NE((void*)NULL, mCamera.get());
3608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mListener = new ProCameraTestListener();
3628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mCamera->setListener(mListener);
3638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
3648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    virtual void TearDown() {
3668e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_NE((void*)NULL, mCamera.get());
3678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mCamera->disconnect();
3688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
3698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3708e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgprotected:
3718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<ProCamera> mCamera;
3728e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<ProCameraTestListener> mListener;
3738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    static sp<Thread> mTestThread;
3758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int mDisplaySecs;
3778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int mDisplayFmt;
3788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int mDisplayW;
3798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int mDisplayH;
3808e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3818e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<SurfaceComposerClient> mComposerClient;
3828e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<SurfaceControl> mSurfaceControl;
38359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
38459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    sp<SurfaceComposerClient> mDepthComposerClient;
38559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    sp<SurfaceControl> mDepthSurfaceControl;
38659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
3878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int getSurfaceWidth() {
3888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        return 512;
3898e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
390154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    int getSurfaceHeight() {
391154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org        return 512;
392154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    }
3938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
394154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    void createOnScreenSurface(sp<Surface>& surface) {
39559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        mComposerClient = new SurfaceComposerClient;
3968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
3978e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
398154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org        mSurfaceControl = mComposerClient->createSurface(
3998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                String8("ProCameraTest StreamingImage Surface"),
400154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org                getSurfaceWidth(), getSurfaceHeight(),
4018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                PIXEL_FORMAT_RGB_888, 0);
4028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
403154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org        mSurfaceControl->setPosition(0, 0);
4048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_TRUE(mSurfaceControl != NULL);
4068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_TRUE(mSurfaceControl->isValid());
4078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        SurfaceComposerClient::openGlobalTransaction();
4098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
4108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
4118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        SurfaceComposerClient::closeGlobalTransaction();
4128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        sp<ANativeWindow> window = mSurfaceControl->getSurface();
4148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        surface = mSurfaceControl->getSurface();
4158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_NE((void*)NULL, surface.get());
4178e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
4188e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4198e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    void createDepthOnScreenSurface(sp<Surface>& surface) {
4208e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mDepthComposerClient = new SurfaceComposerClient;
4218e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck());
4228e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4238e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mDepthSurfaceControl = mDepthComposerClient->createSurface(
4248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                String8("ProCameraTest StreamingImage Surface"),
4258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                getSurfaceWidth(), getSurfaceHeight(),
4268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                PIXEL_FORMAT_RGB_888, 0);
4278e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        mDepthSurfaceControl->setPosition(640, 0);
4298e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
430750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        ASSERT_TRUE(mDepthSurfaceControl != NULL);
431750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        ASSERT_TRUE(mDepthSurfaceControl->isValid());
432750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
433750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        SurfaceComposerClient::openGlobalTransaction();
434750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF));
435750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show());
436750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        SurfaceComposerClient::closeGlobalTransaction();
437750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
4388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        sp<ANativeWindow> window = mDepthSurfaceControl->getSurface();
4398e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        surface = mDepthSurfaceControl->getSurface();
4408e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        ASSERT_NE((void*)NULL, surface.get());
4428e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
443154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
4448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    template <typename T>
4458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    static bool ExistsItem(T needle, T* array, size_t count) {
4468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        if (!array) {
447154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org            return false;
4488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        }
4498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
4508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        for (size_t i = 0; i < count; ++i) {
451c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org            if (array[i] == needle) {
452c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                return true;
453c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org            }
454ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        }
455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return false;
456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    static int FormatFromString(const char* str) {
4608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        std::string s(str);
461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
462355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org#define CMP_STR(x, y)                               \
463ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        if (s == #x) return HAL_PIXEL_FORMAT_ ## y;
464ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define CMP_STR_SAME(x) CMP_STR(x, x)
465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        CMP_STR_SAME( Y16);
4678e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org        CMP_STR_SAME( Y8);
4688e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org        CMP_STR_SAME( YV12);
469ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        CMP_STR(NV16, YCbCr_422_SP);
470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        CMP_STR(NV21, YCrCb_420_SP);
4718e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        CMP_STR(YUY2, YCbCr_422_I);
472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        CMP_STR(RAW,  RAW_SENSOR);
4738e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        CMP_STR(RGBA, RGBA_8888);
4748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        std::cerr << "Unknown format string " << str << std::endl;
476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return -1;
477eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
4788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
479355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
480c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    /**
481355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org     * Creating a streaming request for these output streams from a template,
482355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org     *  and submit it
483355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org     */
484c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    void createSubmitRequestForStreams(int32_t* streamIds, size_t count, int requestCount=-1) {
485355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
486355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        ASSERT_NE((void*)NULL, streamIds);
487355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        ASSERT_LT(0u, count);
488c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
489c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        camera_metadata_t *requestTmp = NULL;
490c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
491355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                                                /*out*/&requestTmp));
492355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        ASSERT_NE((void*)NULL, requestTmp);
493355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        CameraMetadata request(requestTmp);
494355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
495355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        // set the output streams. default is empty
496355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
497355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
498355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        request.update(tag, streamIds, count);
499355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
500355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        requestTmp = request.release();
501355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
502355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        if (requestCount < 0) {
503355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            EXPECT_OK(mCamera->submitRequest(requestTmp, /*streaming*/true));
504355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        } else {
505355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            for (int i = 0; i < requestCount; ++i) {
506355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                EXPECT_OK(mCamera->submitRequest(requestTmp,
507355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                                                 /*streaming*/false));
508355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            }
509355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        }
510355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        request.acquire(requestTmp);
511355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    }
512355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
513355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
514355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgsp<Thread> ProCameraTest::mTestThread;
515355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
516355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgTEST_F(ProCameraTest, AvailableFormats) {
517355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    if (HasFatalFailure()) {
518355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        return;
519355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    }
520355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
521355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    CameraMetadata staticInfo = mCamera->getCameraInfo(CAMERA_ID);
522355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    ASSERT_FALSE(staticInfo.isEmpty());
523355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
524355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    uint32_t tag = static_cast<uint32_t>(ANDROID_SCALER_AVAILABLE_FORMATS);
525355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    EXPECT_TRUE(staticInfo.exists(tag));
526355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    camera_metadata_entry_t entry = staticInfo.find(tag);
527355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
528355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YV12,
529c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                  entry.data.i32, entry.count));
530c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP,
531c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                                  entry.data.i32, entry.count));
532c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
533c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
534c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org// test around exclusiveTryLock (immediate locking)
535c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgTEST_F(ProCameraTest, LockingImmediate) {
536c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
537c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    if (HasFatalFailure()) {
538c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        return;
539c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    }
540c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
541c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
542c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                            ProEvent_Mask(STOLEN)   |
543c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                            ProEvent_Mask(RELEASED));
544c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
545c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_FALSE(mCamera->hasExclusiveLock());
546c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(OK, mCamera->exclusiveTryLock());
547c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    // at this point we definitely have the lock
548c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
549c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(OK, mListener->WaitForEvent());
550c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
551c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
552c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_TRUE(mCamera->hasExclusiveLock());
553c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
554c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
555c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(OK, mListener->WaitForEvent());
556c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(RELEASED, mListener->ReadEvent());
557c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
558c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_FALSE(mCamera->hasExclusiveLock());
559c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
560c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
561c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org// test around exclusiveLock (locking at some future point in time)
562c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgTEST_F(ProCameraTest, LockingAsynchronous) {
563355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
5645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    if (HasFatalFailure()) {
565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return;
5665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    }
567eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
5685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
5709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org                            ProEvent_Mask(STOLEN)   |
571755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org                            ProEvent_Mask(RELEASED));
572ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // TODO: Add another procamera that has a lock here.
574755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    // then we can be test that the lock wont immediately be acquired
575755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
576755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    EXPECT_FALSE(mCamera->hasExclusiveLock());
577755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    EXPECT_EQ(OK, mCamera->exclusiveTryLock());
578381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    // at this point we definitely have the lock
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5806f10e41fef1524c70846d970268de222e41c594cager@chromium.org    EXPECT_EQ(OK, mListener->WaitForEvent());
5816f10e41fef1524c70846d970268de222e41c594cager@chromium.org    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
5826f10e41fef1524c70846d970268de222e41c594cager@chromium.org
5836f10e41fef1524c70846d970268de222e41c594cager@chromium.org    EXPECT_TRUE(mCamera->hasExclusiveLock());
5846f10e41fef1524c70846d970268de222e41c594cager@chromium.org    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
585ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    EXPECT_EQ(OK, mListener->WaitForEvent());
587381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    EXPECT_EQ(RELEASED, mListener->ReadEvent());
588381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_FALSE(mCamera->hasExclusiveLock());
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Stream directly to the screen.
593ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgTEST_F(ProCameraTest, DISABLED_StreamingImageSingle) {
594ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    if (HasFatalFailure()) {
595ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org        return;
596ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    }
597f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
598f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    sp<Surface> surface;
599f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    if (mDisplaySecs > 0) {
600f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org        createOnScreenSurface(/*out*/surface);
601f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    }
602ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    else {
603ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        dout << "Skipping, will not render to screen" << std::endl;
604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return;
605381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    }
606381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int depthStreamId = -1;
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    sp<ServiceListener> listener = new ServiceListener();
610f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    EXPECT_OK(ProCamera::addServiceListener(listener));
611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ServiceListener::Status currentStatus;
613f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org
614f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    // when subscribing a new listener,
615f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    // we immediately get a callback to the current status
616f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    while (listener->waitForStatusChange(/*out*/currentStatus) != OK);
617f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    EXPECT_EQ(ServiceListener::STATUS_PRESENT, currentStatus);
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
619ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    dout << "Will now stream and resume infinitely..." << std::endl;
620ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    while (true) {
621b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
622381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        if (currentStatus == ServiceListener::STATUS_PRESENT) {
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            ASSERT_OK(mCamera->createStream(mDisplayW, mDisplayH, mDisplayFmt,
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            surface,
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            &depthStreamId));
6279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org            EXPECT_NE(-1, depthStreamId);
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            EXPECT_OK(mCamera->exclusiveTryLock());
630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
631ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org            int32_t streams[] = { depthStreamId };
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                                 streams,
634eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                                                 /*count*/1));
635381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        }
636381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // TODO: maybe check for getch every once in a while?
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        while (listener->waitForStatusChange(/*out*/stat) != OK);
641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        if (currentStatus != stat) {
64383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org            if (stat == ServiceListener::STATUS_PRESENT) {
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                dout << "Reconnecting to camera" << std::endl;
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                mCamera = ProCamera::connect(CAMERA_ID);
646750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            } else if (stat == ServiceListener::STATUS_NOT_AVAILABLE) {
647750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                dout << "Disconnecting from camera" << std::endl;
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                mCamera->disconnect();
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            } else if (stat == ServiceListener::STATUS_NOT_PRESENT) {
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                dout << "Camera unplugged" << std::endl;
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                mCamera = NULL;
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            } else {
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                dout << "Unknown status change "
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     << std::hex << stat << std::endl;
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            }
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org            currentStatus = stat;
6585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org        }
659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
660ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    EXPECT_OK(ProCamera::removeServiceListener(listener));
6625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    EXPECT_OK(mCamera->deleteStream(depthStreamId));
6635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
6645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org}
665381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Stream directly to the screen.
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenTEST_F(ProCameraTest, DISABLED_StreamingImageDual) {
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (HasFatalFailure()) {
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return;
6705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    }
6715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    sp<Surface> surface;
672ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    sp<Surface> depthSurface;
673ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (mDisplaySecs > 0) {
6745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org        createOnScreenSurface(/*out*/surface);
6755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org        createDepthOnScreenSurface(/*out*/depthSurface);
6765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    }
6775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
678381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    int streamId = -1;
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960,
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              TEST_FORMAT_MAIN, surface, &streamId));
681b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EXPECT_NE(-1, streamId);
682068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
6831f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    int depthStreamId = -1;
68432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
6858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org              TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
686068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    EXPECT_NE(-1, depthStreamId);
687068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
688068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
689068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    /*
6908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    */
6918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    /* iterate in a loop submitting requests every frame.
6928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org     *  what kind of requests doesnt really matter, just whatever.
6938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org     */
69483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
695068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    // it would probably be better to use CameraMetadata from camera service.
69683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    camera_metadata_t *request = NULL;
69783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
69883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org              /*out*/&request));
69983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    EXPECT_NE((void*)NULL, request);
700068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
70183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    /*FIXME: dont need this later, at which point the above should become an
70283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org             ASSERT_NE*/
70383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    if(request == NULL) request = allocate_camera_metadata(10, 100);
704068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
705068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    // set the output streams to just this stream ID
7061f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
7071f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    // wow what a verbose API.
7081f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    int32_t allStreams[] = { streamId, depthStreamId };
7098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    // IMPORTANT. bad things will happen if its not a uint8.
7108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
7118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    camera_metadata_entry_t entry;
7128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
7138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    int find = find_camera_metadata_entry(request, tag, &entry);
7148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    if (find == -ENOENT) {
7158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org        if (add_camera_metadata_entry(request, tag, &allStreams,
716068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                      /*data_count*/streamCount) != OK) {
7178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
7188e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org            ASSERT_OK(append_camera_metadata(tmp, request));
719236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org            free_camera_metadata(request);
720b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org            request = tmp;
721b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
722ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
723b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org                                                /*data_count*/streamCount));
724b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org        }
725b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    } else {
726381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
727b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org                  &allStreams, /*data_count*/streamCount, &entry));
728b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    }
729b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
7309fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
73141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
732381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    dout << "will sleep now for " << mDisplaySecs << std::endl;
73341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    sleep(mDisplaySecs);
73441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
73541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org    free_camera_metadata(request);
73641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
737381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    for (size_t i = 0; i < streamCount; ++i) {
738381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        EXPECT_OK(mCamera->deleteStream(allStreams[i]));
739381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    }
740b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
741b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org}
742b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
743b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgTEST_F(ProCameraTest, CpuConsumerSingle) {
744381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    if (HasFatalFailure()) {
745b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org        return;
746b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    }
747b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
748b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
749381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org                            ProEvent_Mask(STOLEN)   |
750b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org                            ProEvent_Mask(RELEASED) |
751b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org                            ProEvent_Mask(FRAME_RECEIVED));
752b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    mListener->SetDropFrames(true);
753b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
754381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    int streamId = -1;
755b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    sp<CpuConsumer> consumer;
756381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
757381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org                TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
758b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EXPECT_NE(-1, streamId);
759b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
760b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
7619fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org    EXPECT_EQ(OK, mListener->WaitForEvent());
762ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
763ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    /* iterate in a loop submitting requests every frame.
764381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org     *  what kind of requests doesnt really matter, just whatever.
765b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org     */
766381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
767381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    // it would probably be better to use CameraMetadata from camera service.
768b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    camera_metadata_t *request = NULL;
769b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
770b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org        /*out*/&request));
771c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_NE((void*)NULL, request);
772c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
773c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    /*FIXME: dont need this later, at which point the above should become an
774ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      ASSERT_NE*/
775c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    if(request == NULL) request = allocate_camera_metadata(10, 100);
776ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
77737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // set the output streams to just this stream ID
77837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
77937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    int32_t allStreams[] = { streamId };
78037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    camera_metadata_entry_t entry;
78137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
782303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    int find = find_camera_metadata_entry(request, tag, &entry);
783303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    if (find == -ENOENT) {
784303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org        if (add_camera_metadata_entry(request, tag, &allStreams,
785303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org                /*data_count*/1) != OK) {
786303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
787303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org            ASSERT_OK(append_camera_metadata(tmp, request));
78837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            free_camera_metadata(request);
78937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            request = tmp;
79037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
791381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
79237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                /*data_count*/1));
79337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
794381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    } else {
79537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
79637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            &allStreams, /*data_count*/1, &entry));
79737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
79837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
79937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
800381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
80137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Consume a couple of frames
80237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
803381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        EXPECT_EQ(OK, mListener->WaitForEvent());
80437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
80537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
80637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
80737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Done: clean up
80837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    free_camera_metadata(request);
809381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
81037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    EXPECT_OK(mCamera->exclusiveUnlock());
81137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
812381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
813381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST_F(ProCameraTest, CpuConsumerDual) {
814b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    if (HasFatalFailure()) {
815b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org        return;
816b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    }
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
818ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    mListener->SetEventMask(ProEvent_Mask(FRAME_RECEIVED));
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    mListener->SetDropFrames(true);
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int streamId = -1;
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    sp<CpuConsumer> consumer;
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_NE(-1, streamId);
826750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
827ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    int depthStreamId = -1;
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
82983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org            TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &depthStreamId));
83043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_NE(-1, depthStreamId);
831750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
832750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
833750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    /*
834750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    */
835750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    /* iterate in a loop submitting requests every frame.
836750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org     *  what kind of requests doesnt really matter, just whatever.
837750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org     */
838750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // it would probably be better to use CameraMetadata from camera service.
84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    camera_metadata_t *request = NULL;
84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            /*out*/&request));
84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_NE((void*)NULL, request);
844ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
84543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if(request == NULL) request = allocate_camera_metadata(10, 100);
84683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // set the output streams to just this stream ID
8487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // wow what a verbose API.
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int32_t allStreams[] = { streamId, depthStreamId };
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    size_t streamCount = 2;
852ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    camera_metadata_entry_t entry;
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
85483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    int find = find_camera_metadata_entry(request, tag, &entry);
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (find == -ENOENT) {
8567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        if (add_camera_metadata_entry(request, tag, &allStreams,
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      /*data_count*/streamCount) != OK) {
85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            ASSERT_OK(append_camera_metadata(tmp, request));
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            free_camera_metadata(request);
861ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org            request = tmp;
8627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                                   /*data_count*/streamCount));
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
867ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
868ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                              &allStreams, /*data_count*/streamCount, &entry));
869b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
870381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
871381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Consume a couple of frames
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        // stream id 1
876ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        EXPECT_EQ(OK, mListener->WaitForEvent());
877ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
878b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
879381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        // stream id 2
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        EXPECT_EQ(OK, mListener->WaitForEvent());
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
883ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        //TODO: events should be a struct with some data like the stream id
884ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
885ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
886ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Done: clean up
887ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    free_camera_metadata(request);
888ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
889ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
890ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
892750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST_F(ProCameraTest, ResultReceiver) {
893ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    if (HasFatalFailure()) {
894ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return;
895ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
89683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
8975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    mListener->SetEventMask(ProEvent_Mask(RESULT_RECEIVED));
8985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    mListener->SetDropFrames(true);
89901beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    //FIXME: if this is run right after the previous test we get FRAME_RECEIVED
900750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    // need to filter out events at read time
901750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
902750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    int streamId = -1;
903750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    sp<CpuConsumer> consumer;
904750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
905750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
906750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_NE(-1, streamId);
90701beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org
90801beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
909ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    /*
910ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    */
911ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    /* iterate in a loop submitting requests every frame.
912750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org     *  what kind of requests doesnt really matter, just whatever.
913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org     */
914750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
915ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    camera_metadata_t *request = NULL;
916ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
917ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org                                            /*out*/&request));
918750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_NE((void*)NULL, request);
919ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
920750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    /*FIXME*/
921ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    if(request == NULL) request = allocate_camera_metadata(10, 100);
922ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
923ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    // set the output streams to just this stream ID
924750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
925ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    int32_t allStreams[] = { streamId };
926750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    size_t streamCount = 1;
92701beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    camera_metadata_entry_t entry;
92801beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
92901beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org    int find = find_camera_metadata_entry(request, tag, &entry);
930eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (find == -ENOENT) {
931eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        if (add_camera_metadata_entry(request, tag, &allStreams,
932eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                                      /*data_count*/streamCount) != OK) {
933355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
934355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org            ASSERT_OK(append_camera_metadata(tmp, request));
9358e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            free_camera_metadata(request);
9368e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            request = tmp;
9378e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
9398e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                                                /*data_count*/streamCount));
940355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        }
941c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    } else {
942355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
943355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                               &allStreams, /*data_count*/streamCount, &entry));
9448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
9458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9468e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
9478e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9488e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Consume a couple of results
9498e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
9508e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        EXPECT_EQ(OK, mListener->WaitForEvent());
951ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        EXPECT_EQ(RESULT_RECEIVED, mListener->ReadEvent());
95283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    }
9535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
95483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    // Done: clean up
95583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    free_camera_metadata(request);
956eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
9573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
959381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
960381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// FIXME: This is racy and sometimes fails on waitForFrameMetadata
961381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST_F(ProCameraTest, DISABLED_WaitForResult) {
962381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    if (HasFatalFailure()) {
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return;
964381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    }
965381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
966381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    mListener->SetDropFrames(true);
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int streamId = -1;
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    sp<CpuConsumer> consumer;
9703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
9713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
972750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_NE(-1, streamId);
973355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
974355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
9758e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int32_t streams[] = { streamId };
9778e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1));
978750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
979750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    // Consume a couple of results
980750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
981750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_OK(mCamera->waitForFrameMetadata());
982750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        CameraMetadata meta = mCamera->consumeFrameMetadata();
983750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_FALSE(meta.isEmpty());
984750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    }
9858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
986355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // Done: clean up
987c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
988355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
989355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
9908e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9918e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgTEST_F(ProCameraTest, WaitForSingleStreamBuffer) {
9923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    if (HasFatalFailure()) {
9938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        return;
9948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    }
9958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
9968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int streamId = -1;
9978e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<CpuConsumer> consumer;
99883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
9998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
100083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    EXPECT_NE(-1, streamId);
100183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
10028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
1003750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1004750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    int32_t streams[] = { streamId };
1005750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
1006750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                                            /*requests*/TEST_CPU_FRAME_COUNT));
1007750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1008750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    // Consume a couple of results
1009750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
1010750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_EQ(1, mCamera->waitForFrameBuffer(streamId));
10118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
10128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        CpuConsumer::LockedBuffer buf;
10133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        EXPECT_OK(consumer->lockNextBuffer(&buf));
10143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        dout << "Buffer synchronously received on streamId = " << streamId <<
10163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                ", dataPtr = " << (void*)buf.data <<
10173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                ", timestamp = " << buf.timestamp << std::endl;
10183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        EXPECT_OK(consumer->unlockBuffer(buf));
10203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
10213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10223a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    // Done: clean up
10233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
10243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
10253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
10263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// FIXME: This is racy and sometimes fails on waitForFrameMetadata
10283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgTEST_F(ProCameraTest, DISABLED_WaitForDualStreamBuffer) {
1029750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    if (HasFatalFailure()) {
1030355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        return;
1031355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    }
10328e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
10338e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    const int REQUEST_COUNT = TEST_CPU_FRAME_COUNT * 10;
10348e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
1035ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // 15 fps
1036750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    int streamId = -1;
1037750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    sp<CpuConsumer> consumer;
1038750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
1039750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
1040750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    EXPECT_NE(-1, streamId);
1041750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1042750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    // 30 fps
10438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int depthStreamId = -1;
1044355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    sp<CpuConsumer> depthConsumer;
1045c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
1046c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org       TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthConsumer, &depthStreamId));
1047c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_NE(-1, depthStreamId);
1048c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1049c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
1050c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1051355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    int32_t streams[] = { streamId, depthStreamId };
1052355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/2,
10538e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                                                    /*requests*/REQUEST_COUNT));
10548e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
10558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int depthFrames = 0;
10568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int greyFrames = 0;
10578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
10588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Consume two frames simultaneously. Unsynchronized by timestamps.
10598e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    for (int i = 0; i < REQUEST_COUNT; ++i) {
1060ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
10617979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org        // Exhaust event queue so it doesn't keep growing
1062ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        while (mListener->ReadEvent() != UNKNOWN);
1063ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1064ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        // Get the metadata
106583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org        EXPECT_OK(mCamera->waitForFrameMetadata());
10665f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        CameraMetadata meta = mCamera->consumeFrameMetadata();
106783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org        EXPECT_FALSE(meta.isEmpty());
106883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
1069eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        // Get the buffers
1070750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1071750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_EQ(1, mCamera->waitForFrameBuffer(depthStreamId));
1072750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1073750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        /**
1074750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          * Guaranteed to be able to consume the depth frame,
1075750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          * since we waited on it.
1076750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          */
1077750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        CpuConsumer::LockedBuffer depthBuffer;
1078750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_OK(depthConsumer->lockNextBuffer(&depthBuffer));
10793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        dout << "Depth Buffer synchronously received on streamId = " <<
10815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org                streamId <<
1082381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org                ", dataPtr = " << (void*)depthBuffer.data <<
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                ", timestamp = " << depthBuffer.timestamp << std::endl;
108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        EXPECT_OK(depthConsumer->unlockBuffer(depthBuffer));
10863a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
10873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        depthFrames++;
10883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1089eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
10903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        /** Consume Greyscale frames if there are any.
10913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org          * There may not be since it runs at half FPS */
1092750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        CpuConsumer::LockedBuffer greyBuffer;
1093355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        while (consumer->lockNextBuffer(&greyBuffer) == OK) {
1094355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
10958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            dout << "GRAY Buffer synchronously received on streamId = " <<
10968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                streamId <<
10978e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                ", dataPtr = " << (void*)greyBuffer.data <<
1098ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                ", timestamp = " << greyBuffer.timestamp << std::endl;
10998e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org            EXPECT_OK(consumer->unlockBuffer(greyBuffer));
1101750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1102750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            greyFrames++;
1103750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        }
1104750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    }
1105750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1106750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    dout << "Done, summary: depth frames " << std::dec << depthFrames
1107750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org         << ", grey frames " << std::dec << greyFrames << std::endl;
11088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Done: clean up
11108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
1111355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
1112c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
1113c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1114c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgTEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesSync) {
1115c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    if (HasFatalFailure()) {
1116c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        return;
1117c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    }
1118355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1119355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
11208e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11218e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int streamId = -1;
11228e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<CpuConsumer> consumer;
11238e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
11248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
11258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                  /*synchronousMode*/true, &consumer, &streamId));
11268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_NE(-1, streamId);
1127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
112883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
11293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
113083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    int32_t streams[] = { streamId };
11315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
113283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org                                                     /*requests*/NUM_REQUESTS));
113383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
1134eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Consume a couple of results
1135750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    for (int i = 0; i < NUM_REQUESTS; ++i) {
1136750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        int numFrames;
1137750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_TRUE((numFrames = mCamera->waitForFrameBuffer(streamId)) > 0);
1138750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        // Drop all but the newest framebuffer
1140750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        EXPECT_EQ(numFrames-1, mCamera->dropFrameBuffer(streamId, numFrames-1));
1141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1142750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
1143750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
11443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        // Skip the counter ahead, don't try to consume these frames again
11453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        i += numFrames-1;
11465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
1147381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org        // "Consume" the buffer
1148245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        CpuConsumer::LockedBuffer buf;
1149245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        EXPECT_OK(consumer->lockNextBuffer(&buf));
1150245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1151eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        dout << "Buffer synchronously received on streamId = " << streamId <<
1152355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                ", dataPtr = " << (void*)buf.data <<
1153355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                ", timestamp = " << buf.timestamp << std::endl;
11548e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11558e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        // Process at 10fps, stream is at 15fps.
11568e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        // This means we will definitely fill up the buffer queue with
11578e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        // extra buffers and need to drop them.
11588e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        usleep(TEST_FRAME_PROCESSING_DELAY_US);
1159355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1160c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        EXPECT_OK(consumer->unlockBuffer(buf));
1161355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    }
1162355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
11638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Done: clean up
11648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
11658e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
11668e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}
11678e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11688e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgTEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesAsync) {
11698e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    if (HasFatalFailure()) {
1170ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return;
117183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    }
11725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
117383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
117483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
1175eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    int streamId = -1;
11765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    sp<CpuConsumer> consumer;
11775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
1178381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  /*synchronousMode*/false, &consumer, &streamId));
118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EXPECT_NE(-1, streamId);
118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11824a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    EXPECT_OK(mCamera->exclusiveTryLock());
11838e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int32_t streams[] = { streamId };
11854a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
11864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org                                                     /*requests*/NUM_REQUESTS));
11874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
11884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    uint64_t lastFrameNumber = 0;
118971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org    int numFrames;
1190355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1191355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    // Consume a couple of results
11928e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    int i;
11938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    for (i = 0; i < NUM_REQUESTS && lastFrameNumber < NUM_REQUESTS; ++i) {
11948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        EXPECT_LT(0, (numFrames = mCamera->waitForFrameBuffer(streamId)));
11958e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
11968e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
1197355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1198c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        // Skip the counter ahead, don't try to consume these frames again
1199355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org        i += numFrames-1;
1200355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
12018e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        // "Consume" the buffer
12028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        CpuConsumer::LockedBuffer buf;
12038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        EXPECT_EQ(OK, consumer->lockNextBuffer(&buf));
12058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org        lastFrameNumber = buf.frameNumber;
12078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
1208ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        dout << "Buffer asynchronously received on streamId = " << streamId <<
120983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org                ", dataPtr = " << (void*)buf.data <<
12105f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                ", timestamp = " << buf.timestamp <<
12115f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                ", framenumber = " << buf.frameNumber << std::endl;
1212eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1213eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        // Process at 10fps, stream is at 15fps.
121471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org        // This means we will definitely fill up the buffer queue with
12155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org        // extra buffers and need to drop them.
12165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org        usleep(TEST_FRAME_PROCESSING_DELAY_US);
121771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org
121871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org        EXPECT_OK(consumer->unlockBuffer(buf));
121971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org    }
122071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org
122143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    dout << "Done after " << i << " iterations " << std::endl;
1222355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
12238e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Done: clean up
12248e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->deleteStream(streamId));
12258e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(mCamera->exclusiveUnlock());
12268e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}
12278e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
1228b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1229b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1230b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//TODO: refactor into separate file
1231b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST_F(ProCameraTest, ServiceListenersSubscribe) {
1232b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1233355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    ASSERT_EQ(4u, sizeof(ServiceListener::Status));
12348e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12358e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    sp<ServiceListener> listener = new ServiceListener();
12368e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12378e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
12388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    EXPECT_OK(ProCamera::addServiceListener(listener));
1239b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1240b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    EXPECT_EQ(ALREADY_EXISTS, ProCamera::addServiceListener(listener));
1241b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    EXPECT_OK(ProCamera::removeServiceListener(listener));
1242c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1243c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
1244c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
1245c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1246c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org//TODO: refactor into separate file
1247c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgTEST_F(ProCameraTest, ServiceListenersFunctional) {
1248c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1249c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    sp<ServiceListener> listener = new ServiceListener();
1250c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1251c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(ProCamera::addServiceListener(listener));
1252c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1253c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    sp<Camera> cam = Camera::connect(CAMERA_ID,
1254c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                     /*clientPackageName*/String16(),
1255c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                     -1);
1256c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_NE((void*)NULL, cam.get());
1257c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1258c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
1259c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
1260c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1261c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(ServiceListener::STATUS_NOT_AVAILABLE, stat);
1262c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1263c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    if (cam.get()) {
1264c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        cam->disconnect();
1265c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    }
1266c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1267c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
1268c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_EQ(ServiceListener::STATUS_PRESENT, stat);
1269c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1270c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    EXPECT_OK(ProCamera::removeServiceListener(listener));
1271c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
1272c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1273c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1274c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org
1275c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}
1276b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
1277b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
12788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}
12798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
12808e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org