1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/*
2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * you may not use this file except in compliance with the License.
6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * You may obtain a copy of the License at
7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * See the License for the specific language governing permissions and
14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * limitations under the License.
15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin */
16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gtest/gtest.h>
18634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <iostream>
19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
205376573eff55f370f041889618c9a7a9e1894615Igor Murashkin#include <binder/IPCThreadState.h>
215376573eff55f370f041889618c9a7a9e1894615Igor Murashkin#include <utils/Thread.h>
225376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include "Camera.h"
24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include "ProCamera.h"
255376573eff55f370f041889618c9a7a9e1894615Igor Murashkin#include <utils/Vector.h>
265376573eff55f370f041889618c9a7a9e1894615Igor Murashkin#include <utils/Mutex.h>
275376573eff55f370f041889618c9a7a9e1894615Igor Murashkin#include <utils/Condition.h>
28634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
2968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin#include <gui/SurfaceComposerClient.h>
3068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin#include <gui/Surface.h>
3168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
3268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin#include <system/camera_metadata.h>
3368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin#include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only
34dcb07d51e307019731147751946774f45321edfbIgor Murashkin#include <camera/CameraMetadata.h>
3568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
36bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h>
37bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android {
39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace camera2 {
40634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace tests {
41634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace client {
42634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
43634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define CAMERA_ID 0
44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define TEST_DEBUGGING 0
45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
4668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin#define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout
475835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead
485835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
49eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin#define TEST_FORMAT_MAIN HAL_PIXEL_FORMAT_Y8
505835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16
515835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
52dcb07d51e307019731147751946774f45321edfbIgor Murashkin// defaults for display "test"
53bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#define TEST_DISPLAY_FORMAT HAL_PIXEL_FORMAT_Y8
54bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#define TEST_DISPLAY_WIDTH 320
55bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#define TEST_DISPLAY_HEIGHT 240
56dcb07d51e307019731147751946774f45321edfbIgor Murashkin
575835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#define TEST_CPU_FRAME_COUNT 2
585835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#define TEST_CPU_HEAP_COUNT 5
595376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
604bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin#define TEST_FRAME_PROCESSING_DELAY_US 200000 // 200 ms
614bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#if TEST_DEBUGGING
63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define dout std::cerr
64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#else
65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define dout if (0) std::cerr
66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#endif
67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
6839f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin#define EXPECT_OK(x) EXPECT_EQ(OK, (x))
6939f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin#define ASSERT_OK(x) ASSERT_EQ(OK, (x))
7039f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
7139f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkinclass ProCameraTest;
7239f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
73bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkinstruct ServiceListener : public BnCameraServiceListener {
74bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
75bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ServiceListener() :
76bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        mLatestStatus(STATUS_UNKNOWN),
77bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        mPrevStatus(STATUS_UNKNOWN)
78bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    {
79bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
80bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
81bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void onStatusChanged(Status status, int32_t cameraId) {
82bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        dout << "On status changed: 0x" << std::hex
83c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin             << (unsigned int) status << " cameraId " << cameraId
84bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin             << std::endl;
85bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
86bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Mutex::Autolock al(mMutex);
87bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
88bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        mLatestStatus = status;
89bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        mCondition.broadcast();
90bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
91bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
92bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    status_t waitForStatusChange(Status& newStatus) {
93bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Mutex::Autolock al(mMutex);
94bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
95bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        if (mLatestStatus != mPrevStatus) {
96bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            newStatus = mLatestStatus;
97bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            mPrevStatus = mLatestStatus;
98bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            return OK;
99bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        }
100bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
101bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        status_t stat = mCondition.waitRelative(mMutex,
102bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                               TEST_LISTENER_TIMEOUT);
103bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
104bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        if (stat == OK) {
105bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            newStatus = mLatestStatus;
106bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            mPrevStatus = mLatestStatus;
107bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        }
108bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
109bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        return stat;
110bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
111bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
112bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Condition mCondition;
113bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Mutex mMutex;
114bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
115bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Status mLatestStatus;
116bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Status mPrevStatus;
117bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin};
118bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinenum ProEvent {
1205376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    UNKNOWN,
1215376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    ACQUIRED,
1225376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    RELEASED,
1235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    STOLEN,
124c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    FRAME_RECEIVED,
125a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    RESULT_RECEIVED,
1265376573eff55f370f041889618c9a7a9e1894615Igor Murashkin};
1275376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
128a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkininline int ProEvent_Mask(ProEvent e) {
129a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    return (1 << static_cast<int>(e));
130a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}
131a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
1325835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkintypedef Vector<ProEvent> EventList;
1335376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1345376573eff55f370f041889618c9a7a9e1894615Igor Murashkinclass ProCameraTestThread : public Thread
1355376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{
1365376573eff55f370f041889618c9a7a9e1894615Igor Murashkinpublic:
1375376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    ProCameraTestThread() {
1385376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
1395376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1405376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual bool threadLoop() {
1415376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mProc = ProcessState::self();
1425376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mProc->startThreadPool();
1435376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1445376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        IPCThreadState *ptr = IPCThreadState::self();
1455376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1465376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        ptr->joinThreadPool();
1475376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1485376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        return false;
1495376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
1505376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1515376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    sp<ProcessState> mProc;
1525376573eff55f370f041889618c9a7a9e1894615Igor Murashkin};
1535376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1545376573eff55f370f041889618c9a7a9e1894615Igor Murashkinclass ProCameraTestListener : public ProCameraListener {
1555376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1565376573eff55f370f041889618c9a7a9e1894615Igor Murashkinpublic:
157a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    static const int EVENT_MASK_ALL = 0xFFFFFFFF;
158a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
159a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    ProCameraTestListener() {
160a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        mEventMask = EVENT_MASK_ALL;
161c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        mDropFrames = false;
162a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    }
163a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
1645376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    status_t WaitForEvent() {
1655376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        Mutex::Autolock cal(mConditionMutex);
1665376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1675376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        {
1685376573eff55f370f041889618c9a7a9e1894615Igor Murashkin            Mutex::Autolock al(mListenerMutex);
1695376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1705835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            if (mProEventList.size() > 0) {
1715376573eff55f370f041889618c9a7a9e1894615Igor Murashkin                return OK;
1725376573eff55f370f041889618c9a7a9e1894615Igor Murashkin            }
1735376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        }
1745376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1755376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        return mListenerCondition.waitRelative(mConditionMutex,
1765376573eff55f370f041889618c9a7a9e1894615Igor Murashkin                                               TEST_LISTENER_TIMEOUT);
1775376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
1785376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1795376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    /* Read events into out. Existing queue is flushed */
1805376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    void ReadEvents(EventList& out) {
1815376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        Mutex::Autolock al(mListenerMutex);
1825376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        for (size_t i = 0; i < mProEventList.size(); ++i) {
1845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            out.push(mProEventList[i]);
1855376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        }
1865376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1875835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        mProEventList.clear();
1885376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
1895376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1905376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    /**
1915376573eff55f370f041889618c9a7a9e1894615Igor Murashkin      * Dequeue 1 event from the event queue.
1925376573eff55f370f041889618c9a7a9e1894615Igor Murashkin      * Returns UNKNOWN if queue is empty
1935376573eff55f370f041889618c9a7a9e1894615Igor Murashkin      */
1945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    ProEvent ReadEvent() {
1955376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        Mutex::Autolock al(mListenerMutex);
1965376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
1975835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        if (mProEventList.size() == 0) {
1985376573eff55f370f041889618c9a7a9e1894615Igor Murashkin            return UNKNOWN;
1995376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        }
2005376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ProEvent ev = mProEventList[0];
2025835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        mProEventList.removeAt(0);
2035376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2045376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        return ev;
2055376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2065376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
207a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    void SetEventMask(int eventMask) {
208a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        Mutex::Autolock al(mListenerMutex);
209a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        mEventMask = eventMask;
210a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    }
211a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
212c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    // Automatically acquire/release frames as they are available
213c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    void SetDropFrames(bool dropFrames) {
214c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        Mutex::Autolock al(mListenerMutex);
215c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        mDropFrames = dropFrames;
216c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    }
217c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
2185376573eff55f370f041889618c9a7a9e1894615Igor Murashkinprivate:
2195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    void QueueEvent(ProEvent ev) {
220a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        bool eventAdded = false;
2215376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        {
2225376573eff55f370f041889618c9a7a9e1894615Igor Murashkin            Mutex::Autolock al(mListenerMutex);
2235376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
224c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            // Drop events not part of mask
225a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            if (ProEvent_Mask(ev) & mEventMask) {
226a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                mProEventList.push(ev);
227a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                eventAdded = true;
228a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            }
229a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        }
2305376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
231a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        if (eventAdded) {
232a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            mListenerCondition.broadcast();
233a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        }
2345376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2355376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2365376573eff55f370f041889618c9a7a9e1894615Igor Murashkinprotected:
2375376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2385376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    //////////////////////////////////////////////////
2395376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    ///////// ProCameraListener //////////////////////
2405376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    //////////////////////////////////////////////////
2415376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2425376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2435376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock has been acquired. Write operations now available.
2445376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void onLockAcquired() {
2455376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        QueueEvent(ACQUIRED);
2465376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2475376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock has been released with exclusiveUnlock
2485376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void onLockReleased() {
2495376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        QueueEvent(RELEASED);
2505376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2515376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2525376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock has been stolen by another client.
2535376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void onLockStolen() {
2545376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        QueueEvent(STOLEN);
2555376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2565376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2575376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock free.
2585376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) {
2595376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
2605376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        dout << "Trigger notify: " << ext1 << " " << ext2
2615376573eff55f370f041889618c9a7a9e1894615Igor Murashkin             << " " << ext3 << std::endl;
2625376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
2635376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
264c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    virtual void onFrameAvailable(int streamId,
265c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                                  const sp<CpuConsumer>& consumer) {
2665835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
267c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        QueueEvent(FRAME_RECEIVED);
268c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
269c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        Mutex::Autolock al(mListenerMutex);
270c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        if (mDropFrames) {
271c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            CpuConsumer::LockedBuffer buf;
272c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            status_t ret;
273c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
274c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            if (OK == (ret = consumer->lockNextBuffer(&buf))) {
2755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
276c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                dout << "Frame received on streamId = " << streamId <<
277c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                        ", dataPtr = " << (void*)buf.data <<
278c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                        ", timestamp = " << buf.timestamp << std::endl;
2795835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
280c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                EXPECT_OK(consumer->unlockBuffer(buf));
281c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            }
282c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        } else {
283c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin            dout << "Frame received on streamId = " << streamId << std::endl;
284c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        }
2855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
286c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void onResultReceived(int32_t requestId,
288a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                                  camera_metadata* request) {
289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        dout << "Result received requestId = " << requestId
290a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin             << ", requestPtr = " << (void*)request << std::endl;
291a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        QueueEvent(RESULT_RECEIVED);
2925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        free_camera_metadata(request);
2935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
2945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
295fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    virtual void notify(int32_t msg, int32_t ext1, int32_t ext2) {
296fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        dout << "Notify received: msg " << std::hex << msg
297fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin             << ", ext1: " << std::hex << ext1 << ", ext2: " << std::hex << ext2
298fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin             << std::endl;
299fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    }
3005376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
3015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    Vector<ProEvent> mProEventList;
3025376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    Mutex             mListenerMutex;
3035376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    Mutex             mConditionMutex;
3045376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    Condition         mListenerCondition;
305a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    int               mEventMask;
306c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    bool              mDropFrames;
3075376573eff55f370f041889618c9a7a9e1894615Igor Murashkin};
3085376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
309634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinclass ProCameraTest : public ::testing::Test {
310634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
3115376573eff55f370f041889618c9a7a9e1894615Igor Murashkinpublic:
3125376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    ProCameraTest() {
313dcb07d51e307019731147751946774f45321edfbIgor Murashkin        char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
314dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (displaySecsEnv != NULL) {
315dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplaySecs = atoi(displaySecsEnv);
316dcb07d51e307019731147751946774f45321edfbIgor Murashkin            if (mDisplaySecs < 0) {
317dcb07d51e307019731147751946774f45321edfbIgor Murashkin                mDisplaySecs = 0;
318dcb07d51e307019731147751946774f45321edfbIgor Murashkin            }
319dcb07d51e307019731147751946774f45321edfbIgor Murashkin        } else {
320dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplaySecs = 0;
321dcb07d51e307019731147751946774f45321edfbIgor Murashkin        }
322dcb07d51e307019731147751946774f45321edfbIgor Murashkin
323dcb07d51e307019731147751946774f45321edfbIgor Murashkin        char* displayFmtEnv = getenv("TEST_DISPLAY_FORMAT");
324dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (displayFmtEnv != NULL) {
325dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayFmt = FormatFromString(displayFmtEnv);
326dcb07d51e307019731147751946774f45321edfbIgor Murashkin        } else {
327dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayFmt = TEST_DISPLAY_FORMAT;
328dcb07d51e307019731147751946774f45321edfbIgor Murashkin        }
329dcb07d51e307019731147751946774f45321edfbIgor Murashkin
330dcb07d51e307019731147751946774f45321edfbIgor Murashkin        char* displayWidthEnv = getenv("TEST_DISPLAY_WIDTH");
331dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (displayWidthEnv != NULL) {
332dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayW = atoi(displayWidthEnv);
333dcb07d51e307019731147751946774f45321edfbIgor Murashkin            if (mDisplayW < 0) {
334dcb07d51e307019731147751946774f45321edfbIgor Murashkin                mDisplayW = 0;
335dcb07d51e307019731147751946774f45321edfbIgor Murashkin            }
336dcb07d51e307019731147751946774f45321edfbIgor Murashkin        } else {
337dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayW = TEST_DISPLAY_WIDTH;
338dcb07d51e307019731147751946774f45321edfbIgor Murashkin        }
339dcb07d51e307019731147751946774f45321edfbIgor Murashkin
340dcb07d51e307019731147751946774f45321edfbIgor Murashkin        char* displayHeightEnv = getenv("TEST_DISPLAY_HEIGHT");
341dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (displayHeightEnv != NULL) {
342dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayH = atoi(displayHeightEnv);
343dcb07d51e307019731147751946774f45321edfbIgor Murashkin            if (mDisplayH < 0) {
344dcb07d51e307019731147751946774f45321edfbIgor Murashkin                mDisplayH = 0;
345dcb07d51e307019731147751946774f45321edfbIgor Murashkin            }
346dcb07d51e307019731147751946774f45321edfbIgor Murashkin        } else {
347dcb07d51e307019731147751946774f45321edfbIgor Murashkin            mDisplayH = TEST_DISPLAY_HEIGHT;
348dcb07d51e307019731147751946774f45321edfbIgor Murashkin        }
3495376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    }
3505376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
35139f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    static void SetUpTestCase() {
35239f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin        // Binder Thread Pool Initialization
3535376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mTestThread = new ProCameraTestThread();
3545376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mTestThread->run("ProCameraTestThread");
35539f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    }
3565376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
35739f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    virtual void SetUp() {
358634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        mCamera = ProCamera::connect(CAMERA_ID);
359634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        ASSERT_NE((void*)NULL, mCamera.get());
3605376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
3615376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mListener = new ProCameraTestListener();
3625376573eff55f370f041889618c9a7a9e1894615Igor Murashkin        mCamera->setListener(mListener);
363634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
364634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
365634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void TearDown() {
366634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        ASSERT_NE((void*)NULL, mCamera.get());
367634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        mCamera->disconnect();
368634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
369634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
370634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinprotected:
371634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ProCamera> mCamera;
3725376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    sp<ProCameraTestListener> mListener;
3735376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
37439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    static sp<Thread> mTestThread;
3755376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
37668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    int mDisplaySecs;
377dcb07d51e307019731147751946774f45321edfbIgor Murashkin    int mDisplayFmt;
378dcb07d51e307019731147751946774f45321edfbIgor Murashkin    int mDisplayW;
379dcb07d51e307019731147751946774f45321edfbIgor Murashkin    int mDisplayH;
380dcb07d51e307019731147751946774f45321edfbIgor Murashkin
38168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    sp<SurfaceComposerClient> mComposerClient;
38268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    sp<SurfaceControl> mSurfaceControl;
38368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
3845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    sp<SurfaceComposerClient> mDepthComposerClient;
3855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    sp<SurfaceControl> mDepthSurfaceControl;
3865835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
38768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    int getSurfaceWidth() {
38868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        return 512;
38968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    }
39068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    int getSurfaceHeight() {
39168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        return 512;
39268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    }
39368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
39468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    void createOnScreenSurface(sp<Surface>& surface) {
39568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        mComposerClient = new SurfaceComposerClient;
39668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
39768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
39868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        mSurfaceControl = mComposerClient->createSurface(
39968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                String8("ProCameraTest StreamingImage Surface"),
40068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                getSurfaceWidth(), getSurfaceHeight(),
40168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                PIXEL_FORMAT_RGB_888, 0);
40268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
403dcb07d51e307019731147751946774f45321edfbIgor Murashkin        mSurfaceControl->setPosition(0, 0);
4045835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
40568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_TRUE(mSurfaceControl != NULL);
40668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_TRUE(mSurfaceControl->isValid());
40768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
40868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        SurfaceComposerClient::openGlobalTransaction();
40968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
41068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
41168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        SurfaceComposerClient::closeGlobalTransaction();
41268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
41368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        sp<ANativeWindow> window = mSurfaceControl->getSurface();
41468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        surface = mSurfaceControl->getSurface();
41568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
41668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        ASSERT_NE((void*)NULL, surface.get());
41768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    }
41868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
4195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    void createDepthOnScreenSurface(sp<Surface>& surface) {
4205835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        mDepthComposerClient = new SurfaceComposerClient;
4215835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck());
4225835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        mDepthSurfaceControl = mDepthComposerClient->createSurface(
4245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                String8("ProCameraTest StreamingImage Surface"),
4255835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                getSurfaceWidth(), getSurfaceHeight(),
4265835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                PIXEL_FORMAT_RGB_888, 0);
4275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4285835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        mDepthSurfaceControl->setPosition(640, 0);
4295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4305835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_TRUE(mDepthSurfaceControl != NULL);
4315835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_TRUE(mDepthSurfaceControl->isValid());
4325835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4335835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        SurfaceComposerClient::openGlobalTransaction();
4345835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF));
4355835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show());
4365835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        SurfaceComposerClient::closeGlobalTransaction();
4375835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4385835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        sp<ANativeWindow> window = mDepthSurfaceControl->getSurface();
4395835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        surface = mDepthSurfaceControl->getSurface();
4405835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4415835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_NE((void*)NULL, surface.get());
4425835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
4435835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
4447b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    template <typename T>
445dcb07d51e307019731147751946774f45321edfbIgor Murashkin    static bool ExistsItem(T needle, T* array, size_t count) {
446dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (!array) {
447dcb07d51e307019731147751946774f45321edfbIgor Murashkin            return false;
448dcb07d51e307019731147751946774f45321edfbIgor Murashkin        }
449dcb07d51e307019731147751946774f45321edfbIgor Murashkin
450a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        for (size_t i = 0; i < count; ++i) {
4517b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            if (array[i] == needle) {
4527b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin                return true;
4537b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            }
4547b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        }
4557b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        return false;
4567b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    }
4577b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
458dcb07d51e307019731147751946774f45321edfbIgor Murashkin
459dcb07d51e307019731147751946774f45321edfbIgor Murashkin    static int FormatFromString(const char* str) {
460dcb07d51e307019731147751946774f45321edfbIgor Murashkin        std::string s(str);
461dcb07d51e307019731147751946774f45321edfbIgor Murashkin
462dcb07d51e307019731147751946774f45321edfbIgor Murashkin#define CMP_STR(x, y)                               \
463dcb07d51e307019731147751946774f45321edfbIgor Murashkin        if (s == #x) return HAL_PIXEL_FORMAT_ ## y;
464dcb07d51e307019731147751946774f45321edfbIgor Murashkin#define CMP_STR_SAME(x) CMP_STR(x, x)
465dcb07d51e307019731147751946774f45321edfbIgor Murashkin
466dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR_SAME( Y16);
467dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR_SAME( Y8);
468dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR_SAME( YV12);
469dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR(NV16, YCbCr_422_SP);
470dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR(NV21, YCrCb_420_SP);
471dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR(YUY2, YCbCr_422_I);
472dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR(RAW,  RAW_SENSOR);
473dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CMP_STR(RGBA, RGBA_8888);
474dcb07d51e307019731147751946774f45321edfbIgor Murashkin
475dcb07d51e307019731147751946774f45321edfbIgor Murashkin        std::cerr << "Unknown format string " << str << std::endl;
476dcb07d51e307019731147751946774f45321edfbIgor Murashkin        return -1;
477dcb07d51e307019731147751946774f45321edfbIgor Murashkin
478dcb07d51e307019731147751946774f45321edfbIgor Murashkin    }
479dcb07d51e307019731147751946774f45321edfbIgor Murashkin
480dcb07d51e307019731147751946774f45321edfbIgor Murashkin    /**
481dcb07d51e307019731147751946774f45321edfbIgor Murashkin     * Creating a streaming request for these output streams from a template,
482dcb07d51e307019731147751946774f45321edfbIgor Murashkin     *  and submit it
483dcb07d51e307019731147751946774f45321edfbIgor Murashkin     */
484d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    void createSubmitRequestForStreams(int32_t* streamIds, size_t count, int requestCount=-1) {
485dcb07d51e307019731147751946774f45321edfbIgor Murashkin
486dcb07d51e307019731147751946774f45321edfbIgor Murashkin        ASSERT_NE((void*)NULL, streamIds);
487a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        ASSERT_LT(0u, count);
488dcb07d51e307019731147751946774f45321edfbIgor Murashkin
489dcb07d51e307019731147751946774f45321edfbIgor Murashkin        camera_metadata_t *requestTmp = NULL;
490dcb07d51e307019731147751946774f45321edfbIgor Murashkin        EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
491dcb07d51e307019731147751946774f45321edfbIgor Murashkin                                                /*out*/&requestTmp));
492dcb07d51e307019731147751946774f45321edfbIgor Murashkin        ASSERT_NE((void*)NULL, requestTmp);
493dcb07d51e307019731147751946774f45321edfbIgor Murashkin        CameraMetadata request(requestTmp);
494dcb07d51e307019731147751946774f45321edfbIgor Murashkin
495dcb07d51e307019731147751946774f45321edfbIgor Murashkin        // set the output streams. default is empty
496dcb07d51e307019731147751946774f45321edfbIgor Murashkin
497dcb07d51e307019731147751946774f45321edfbIgor Murashkin        uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
498dcb07d51e307019731147751946774f45321edfbIgor Murashkin        request.update(tag, streamIds, count);
499dcb07d51e307019731147751946774f45321edfbIgor Murashkin
500dcb07d51e307019731147751946774f45321edfbIgor Murashkin        requestTmp = request.release();
501a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
502a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        if (requestCount < 0) {
503a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            EXPECT_OK(mCamera->submitRequest(requestTmp, /*streaming*/true));
504a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        } else {
505a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            for (int i = 0; i < requestCount; ++i) {
506a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                EXPECT_OK(mCamera->submitRequest(requestTmp,
507a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                                                 /*streaming*/false));
508a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            }
509a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        }
510dcb07d51e307019731147751946774f45321edfbIgor Murashkin        request.acquire(requestTmp);
511dcb07d51e307019731147751946774f45321edfbIgor Murashkin    }
512634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin};
513634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
51439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkinsp<Thread> ProCameraTest::mTestThread;
51539f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
5167b33a74bbc514b99c16be7fff9a34e892bc19264Igor MurashkinTEST_F(ProCameraTest, AvailableFormats) {
5177b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    if (HasFatalFailure()) {
5187b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        return;
5197b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    }
5207b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
521dcb07d51e307019731147751946774f45321edfbIgor Murashkin    CameraMetadata staticInfo = mCamera->getCameraInfo(CAMERA_ID);
522dcb07d51e307019731147751946774f45321edfbIgor Murashkin    ASSERT_FALSE(staticInfo.isEmpty());
5237b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
5247b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    uint32_t tag = static_cast<uint32_t>(ANDROID_SCALER_AVAILABLE_FORMATS);
525dcb07d51e307019731147751946774f45321edfbIgor Murashkin    EXPECT_TRUE(staticInfo.exists(tag));
526dcb07d51e307019731147751946774f45321edfbIgor Murashkin    camera_metadata_entry_t entry = staticInfo.find(tag);
5277b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
528dcb07d51e307019731147751946774f45321edfbIgor Murashkin    EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YV12,
5297b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin                                                  entry.data.i32, entry.count));
530dcb07d51e307019731147751946774f45321edfbIgor Murashkin    EXPECT_TRUE(ExistsItem<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP,
5317b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin                                                  entry.data.i32, entry.count));
5327b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin}
5337b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
53439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin// test around exclusiveTryLock (immediate locking)
5355376573eff55f370f041889618c9a7a9e1894615Igor MurashkinTEST_F(ProCameraTest, LockingImmediate) {
536634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
537634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    if (HasFatalFailure()) {
538634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return;
539634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
540634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
541a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
542a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                            ProEvent_Mask(STOLEN)   |
543a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                            ProEvent_Mask(RELEASED));
544a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
5455376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_FALSE(mCamera->hasExclusiveLock());
5465376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(OK, mCamera->exclusiveTryLock());
54739f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    // at this point we definitely have the lock
54839f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
54939f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_EQ(OK, mListener->WaitForEvent());
55039f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
55139f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
55239f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_TRUE(mCamera->hasExclusiveLock());
55339f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
55439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
55539f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_EQ(OK, mListener->WaitForEvent());
55639f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_EQ(RELEASED, mListener->ReadEvent());
55739f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
55839f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_FALSE(mCamera->hasExclusiveLock());
55939f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin}
56039f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
56139f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin// test around exclusiveLock (locking at some future point in time)
56239f79f77a435c2f769477caeb071e2f9f6e78742Igor MurashkinTEST_F(ProCameraTest, LockingAsynchronous) {
56339f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
56439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    if (HasFatalFailure()) {
56539f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin        return;
56639f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    }
56739f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
568a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
569a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
570a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                            ProEvent_Mask(STOLEN)   |
571a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                            ProEvent_Mask(RELEASED));
572a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
57339f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    // TODO: Add another procamera that has a lock here.
57439f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    // then we can be test that the lock wont immediately be acquired
57539f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin
57639f79f77a435c2f769477caeb071e2f9f6e78742Igor Murashkin    EXPECT_FALSE(mCamera->hasExclusiveLock());
577a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_EQ(OK, mCamera->exclusiveTryLock());
578a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // at this point we definitely have the lock
5795376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
5805376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(OK, mListener->WaitForEvent());
5815376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
5825376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
5835376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_TRUE(mCamera->hasExclusiveLock());
5845376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
5855376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
5865376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(OK, mListener->WaitForEvent());
5875376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_EQ(RELEASED, mListener->ReadEvent());
5885376573eff55f370f041889618c9a7a9e1894615Igor Murashkin
5895376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    EXPECT_FALSE(mCamera->hasExclusiveLock());
590634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
591634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
59268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin// Stream directly to the screen.
593a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor MurashkinTEST_F(ProCameraTest, DISABLED_StreamingImageSingle) {
59468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    if (HasFatalFailure()) {
59568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin        return;
59668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    }
59768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
598dcb07d51e307019731147751946774f45321edfbIgor Murashkin    sp<Surface> surface;
59968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    if (mDisplaySecs > 0) {
600dcb07d51e307019731147751946774f45321edfbIgor Murashkin        createOnScreenSurface(/*out*/surface);
601dcb07d51e307019731147751946774f45321edfbIgor Murashkin    }
602dcb07d51e307019731147751946774f45321edfbIgor Murashkin    else {
603dcb07d51e307019731147751946774f45321edfbIgor Murashkin        dout << "Skipping, will not render to screen" << std::endl;
604dcb07d51e307019731147751946774f45321edfbIgor Murashkin        return;
60568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    }
6065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
6075835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    int depthStreamId = -1;
60868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
609bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    sp<ServiceListener> listener = new ServiceListener();
610bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::addServiceListener(listener));
61168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
612cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    ServiceListener::Status currentStatus;
613cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin
614cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    // when subscribing a new listener,
615cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    // we immediately get a callback to the current status
616cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    while (listener->waitForStatusChange(/*out*/currentStatus) != OK);
617cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    EXPECT_EQ(ServiceListener::STATUS_PRESENT, currentStatus);
61868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
619bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    dout << "Will now stream and resume infinitely..." << std::endl;
620bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    while (true) {
621bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
622cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin        if (currentStatus == ServiceListener::STATUS_PRESENT) {
623bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
624cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin            ASSERT_OK(mCamera->createStream(mDisplayW, mDisplayH, mDisplayFmt,
625bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                            surface,
626bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                            &depthStreamId));
627bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            EXPECT_NE(-1, depthStreamId);
62868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
629bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            EXPECT_OK(mCamera->exclusiveTryLock());
630bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
631d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He            int32_t streams[] = { depthStreamId };
632bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(
633bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                                 streams,
634bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                                 /*count*/1));
635bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        }
636bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
637bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
638bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
639bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        // TODO: maybe check for getch every once in a while?
640bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        while (listener->waitForStatusChange(/*out*/stat) != OK);
641bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
642bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        if (currentStatus != stat) {
643cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin            if (stat == ServiceListener::STATUS_PRESENT) {
644bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                dout << "Reconnecting to camera" << std::endl;
645bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                mCamera = ProCamera::connect(CAMERA_ID);
646bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            } else if (stat == ServiceListener::STATUS_NOT_AVAILABLE) {
647bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                dout << "Disconnecting from camera" << std::endl;
648bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                mCamera->disconnect();
649cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin            } else if (stat == ServiceListener::STATUS_NOT_PRESENT) {
650cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin                dout << "Camera unplugged" << std::endl;
651cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin                mCamera = NULL;
652bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            } else {
653bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                dout << "Unknown status change "
654bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                     << std::hex << stat << std::endl;
655bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            }
656bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
657bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            currentStatus = stat;
658bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        }
659bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
660bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
661bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::removeServiceListener(listener));
662dcb07d51e307019731147751946774f45321edfbIgor Murashkin    EXPECT_OK(mCamera->deleteStream(depthStreamId));
6635835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
6645835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin}
6655835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
666eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin// Stream directly to the screen.
667a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor MurashkinTEST_F(ProCameraTest, DISABLED_StreamingImageDual) {
668eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if (HasFatalFailure()) {
669eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        return;
670eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
671eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    sp<Surface> surface;
672eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    sp<Surface> depthSurface;
673eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if (mDisplaySecs > 0) {
674eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        createOnScreenSurface(/*out*/surface);
675eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        createDepthOnScreenSurface(/*out*/depthSurface);
676eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
677eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
678eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int streamId = -1;
679eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960,
680eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin              TEST_FORMAT_MAIN, surface, &streamId));
681eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE(-1, streamId);
682eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
683eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int depthStreamId = -1;
684eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
685eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin              TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
686eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE(-1, depthStreamId);
687eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
688eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
689eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    /*
690eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    */
691eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    /* iterate in a loop submitting requests every frame.
692eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin     *  what kind of requests doesnt really matter, just whatever.
693eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin     */
694eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
695eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // it would probably be better to use CameraMetadata from camera service.
696eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    camera_metadata_t *request = NULL;
697eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
698eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin              /*out*/&request));
699eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE((void*)NULL, request);
700eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
701eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    /*FIXME: dont need this later, at which point the above should become an
702eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin             ASSERT_NE*/
703eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if(request == NULL) request = allocate_camera_metadata(10, 100);
704eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
705eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // set the output streams to just this stream ID
706eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
707eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // wow what a verbose API.
708d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t allStreams[] = { streamId, depthStreamId };
709eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // IMPORTANT. bad things will happen if its not a uint8.
710eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
711eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    camera_metadata_entry_t entry;
712eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
713eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int find = find_camera_metadata_entry(request, tag, &entry);
714eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if (find == -ENOENT) {
715eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        if (add_camera_metadata_entry(request, tag, &allStreams,
716eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                                      /*data_count*/streamCount) != OK) {
717eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
718eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            ASSERT_OK(append_camera_metadata(tmp, request));
719eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            free_camera_metadata(request);
720eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            request = tmp;
721eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
722eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
723eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                                                /*data_count*/streamCount));
724eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        }
725eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    } else {
726eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
727eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                  &allStreams, /*data_count*/streamCount, &entry));
728eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
729eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
730eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
731eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
732eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    dout << "will sleep now for " << mDisplaySecs << std::endl;
733eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    sleep(mDisplaySecs);
734eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
735eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    free_camera_metadata(request);
736eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
737d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    for (size_t i = 0; i < streamCount; ++i) {
738eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        EXPECT_OK(mCamera->deleteStream(allStreams[i]));
739eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
740eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
741eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin}
742eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
743eb72e1796b3af548e87891a6d2b73b0567807f25Igor MurashkinTEST_F(ProCameraTest, CpuConsumerSingle) {
7445835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    if (HasFatalFailure()) {
7455835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        return;
7465835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
747a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
748c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetEventMask(ProEvent_Mask(ACQUIRED) |
749c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                            ProEvent_Mask(STOLEN)   |
750c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                            ProEvent_Mask(RELEASED) |
751c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                            ProEvent_Mask(FRAME_RECEIVED));
752c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetDropFrames(true);
753a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
7545835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    int streamId = -1;
755a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
7565835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
757a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
7585835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_NE(-1, streamId);
7595835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7605835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
7615835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_EQ(OK, mListener->WaitForEvent());
7625835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
7635835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    /* iterate in a loop submitting requests every frame.
7645835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin     *  what kind of requests doesnt really matter, just whatever.
7655835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin     */
7665835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    // it would probably be better to use CameraMetadata from camera service.
7685835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    camera_metadata_t *request = NULL;
7695835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
7705835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        /*out*/&request));
7715835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_NE((void*)NULL, request);
7725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7735835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    /*FIXME: dont need this later, at which point the above should become an
7745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin      ASSERT_NE*/
7755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    if(request == NULL) request = allocate_camera_metadata(10, 100);
7765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7775835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    // set the output streams to just this stream ID
7785835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
779d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t allStreams[] = { streamId };
7805835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    camera_metadata_entry_t entry;
7815835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
7825835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    int find = find_camera_metadata_entry(request, tag, &entry);
7835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    if (find == -ENOENT) {
7845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        if (add_camera_metadata_entry(request, tag, &allStreams,
7855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                /*data_count*/1) != OK) {
7865835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
7875835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            ASSERT_OK(append_camera_metadata(tmp, request));
7885835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            free_camera_metadata(request);
7895835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            request = tmp;
7905835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7915835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
7925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                /*data_count*/1));
7935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        }
7945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    } else {
7955835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
7965835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            &allStreams, /*data_count*/1, &entry));
7975835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
7985835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
7995835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
8005835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
8015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    // Consume a couple of frames
8025835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
8035835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        EXPECT_EQ(OK, mListener->WaitForEvent());
804c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
8055835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    }
8065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
8075835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    // Done: clean up
8085835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    free_camera_metadata(request);
8095835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
81068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
81168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin}
81268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
813eb72e1796b3af548e87891a6d2b73b0567807f25Igor MurashkinTEST_F(ProCameraTest, CpuConsumerDual) {
814eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if (HasFatalFailure()) {
815eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        return;
816eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
817a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
818c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetEventMask(ProEvent_Mask(FRAME_RECEIVED));
819c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetDropFrames(true);
820a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
821eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int streamId = -1;
822a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
823eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
824a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
825eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE(-1, streamId);
826eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
827eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int depthStreamId = -1;
828eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
829a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &consumer, &depthStreamId));
830eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE(-1, depthStreamId);
831eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
832eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
833eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    /*
834eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    */
835eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    /* iterate in a loop submitting requests every frame.
836eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin     *  what kind of requests doesnt really matter, just whatever.
837eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin     */
838eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
839eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // it would probably be better to use CameraMetadata from camera service.
840eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    camera_metadata_t *request = NULL;
841eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
842eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                                            /*out*/&request));
843eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_NE((void*)NULL, request);
844eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
845eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if(request == NULL) request = allocate_camera_metadata(10, 100);
846eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
847eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // set the output streams to just this stream ID
848eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
849eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // wow what a verbose API.
850d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t allStreams[] = { streamId, depthStreamId };
851eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    size_t streamCount = 2;
852eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    camera_metadata_entry_t entry;
853eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
854eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    int find = find_camera_metadata_entry(request, tag, &entry);
855eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    if (find == -ENOENT) {
856eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        if (add_camera_metadata_entry(request, tag, &allStreams,
857eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                                      /*data_count*/streamCount) != OK) {
858eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
859eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            ASSERT_OK(append_camera_metadata(tmp, request));
860eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            free_camera_metadata(request);
861eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            request = tmp;
862eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
863eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
864eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                                                   /*data_count*/streamCount));
865eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        }
866eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    } else {
867eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
868eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin                              &allStreams, /*data_count*/streamCount, &entry));
869eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
870eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
871eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
872eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
873eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // Consume a couple of frames
874eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
875eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        // stream id 1
876eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        EXPECT_EQ(OK, mListener->WaitForEvent());
877c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
878eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
879eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        // stream id 2
880eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        EXPECT_EQ(OK, mListener->WaitForEvent());
881c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        EXPECT_EQ(FRAME_RECEIVED, mListener->ReadEvent());
882eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
883eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin        //TODO: events should be a struct with some data like the stream id
884eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    }
885eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
886eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    // Done: clean up
887eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    free_camera_metadata(request);
888eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
889eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
890eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin}
891eb72e1796b3af548e87891a6d2b73b0567807f25Igor Murashkin
892a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor MurashkinTEST_F(ProCameraTest, ResultReceiver) {
893a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    if (HasFatalFailure()) {
894a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        return;
895a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    }
896a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
897a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    mListener->SetEventMask(ProEvent_Mask(RESULT_RECEIVED));
898c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetDropFrames(true);
899c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    //FIXME: if this is run right after the previous test we get FRAME_RECEIVED
900a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // need to filter out events at read time
901a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
902a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    int streamId = -1;
903a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
904a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
905a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
906a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_NE(-1, streamId);
907a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
908a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
909a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    /*
910a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    */
911a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    /* iterate in a loop submitting requests every frame.
912a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin     *  what kind of requests doesnt really matter, just whatever.
913a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin     */
914a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
915a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    camera_metadata_t *request = NULL;
916a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
917a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                                            /*out*/&request));
918a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_NE((void*)NULL, request);
919a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
920a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    /*FIXME*/
921a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    if(request == NULL) request = allocate_camera_metadata(10, 100);
922a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
923a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // set the output streams to just this stream ID
924a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
925d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t allStreams[] = { streamId };
926a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    size_t streamCount = 1;
927a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    camera_metadata_entry_t entry;
928a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
929a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    int find = find_camera_metadata_entry(request, tag, &entry);
930a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    if (find == -ENOENT) {
931a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        if (add_camera_metadata_entry(request, tag, &allStreams,
932a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                                      /*data_count*/streamCount) != OK) {
933a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
934a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            ASSERT_OK(append_camera_metadata(tmp, request));
935a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            free_camera_metadata(request);
936a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            request = tmp;
937a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
938a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
939a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                                                /*data_count*/streamCount));
940a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        }
941a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    } else {
942a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
943a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                               &allStreams, /*data_count*/streamCount, &entry));
944a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    }
945a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
946a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
947a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
948a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // Consume a couple of results
949a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
950a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        EXPECT_EQ(OK, mListener->WaitForEvent());
951a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin        EXPECT_EQ(RESULT_RECEIVED, mListener->ReadEvent());
952a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    }
953a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
954a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    // Done: clean up
955a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    free_camera_metadata(request);
956a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
957a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
958a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin}
959a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin
960c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin// FIXME: This is racy and sometimes fails on waitForFrameMetadata
961c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor MurashkinTEST_F(ProCameraTest, DISABLED_WaitForResult) {
962a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    if (HasFatalFailure()) {
963a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        return;
964a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
965a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
966c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    mListener->SetDropFrames(true);
967c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
968a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    int streamId = -1;
969a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
970a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
971a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
972a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_NE(-1, streamId);
973a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
974a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
975a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
976d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t streams[] = { streamId };
977a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1));
978a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
979a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Consume a couple of results
980a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
981a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(mCamera->waitForFrameMetadata());
982a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        CameraMetadata meta = mCamera->consumeFrameMetadata();
983a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_FALSE(meta.isEmpty());
984a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
985a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
986a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Done: clean up
987a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
988a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
989a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin}
990a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
991a140a6efea1db7837984b3578755cfa4eaa8d92dIgor MurashkinTEST_F(ProCameraTest, WaitForSingleStreamBuffer) {
992a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    if (HasFatalFailure()) {
993a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        return;
994a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
995a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
996a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    int streamId = -1;
997a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
998a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
999a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
1000a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_NE(-1, streamId);
1001a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1002a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
1003a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1004d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t streams[] = { streamId };
1005a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
1006a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                                            /*requests*/TEST_CPU_FRAME_COUNT));
1007a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1008a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Consume a couple of results
1009a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
10104bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_EQ(1, mCamera->waitForFrameBuffer(streamId));
1011a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1012a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        CpuConsumer::LockedBuffer buf;
1013a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(consumer->lockNextBuffer(&buf));
1014a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1015a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        dout << "Buffer synchronously received on streamId = " << streamId <<
1016a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", dataPtr = " << (void*)buf.data <<
1017a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", timestamp = " << buf.timestamp << std::endl;
1018a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1019a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(consumer->unlockBuffer(buf));
1020a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
1021a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1022a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Done: clean up
1023a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
1024a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
1025a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin}
1026a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1027c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin// FIXME: This is racy and sometimes fails on waitForFrameMetadata
1028c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor MurashkinTEST_F(ProCameraTest, DISABLED_WaitForDualStreamBuffer) {
1029a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    if (HasFatalFailure()) {
1030a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        return;
1031a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
1032a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1033a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    const int REQUEST_COUNT = TEST_CPU_FRAME_COUNT * 10;
1034a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1035a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // 15 fps
1036a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    int streamId = -1;
1037a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> consumer;
1038a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
1039a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                 TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &consumer, &streamId));
1040a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_NE(-1, streamId);
1041a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1042a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // 30 fps
1043a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    int depthStreamId = -1;
1044a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    sp<CpuConsumer> depthConsumer;
1045a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
1046a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin       TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthConsumer, &depthStreamId));
1047a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_NE(-1, depthStreamId);
1048a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1049a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
1050a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1051d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t streams[] = { streamId, depthStreamId };
1052a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/2,
1053a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                                                    /*requests*/REQUEST_COUNT));
1054a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1055475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin    int depthFrames = 0;
1056475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin    int greyFrames = 0;
1057475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin
1058a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Consume two frames simultaneously. Unsynchronized by timestamps.
1059a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    for (int i = 0; i < REQUEST_COUNT; ++i) {
1060a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
106165d7986ceac6e35426749ac7e05bbd2a38949db4Igor Murashkin        // Exhaust event queue so it doesn't keep growing
106265d7986ceac6e35426749ac7e05bbd2a38949db4Igor Murashkin        while (mListener->ReadEvent() != UNKNOWN);
106365d7986ceac6e35426749ac7e05bbd2a38949db4Igor Murashkin
1064a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        // Get the metadata
1065a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(mCamera->waitForFrameMetadata());
1066a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        CameraMetadata meta = mCamera->consumeFrameMetadata();
1067a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_FALSE(meta.isEmpty());
1068a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1069a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        // Get the buffers
1070a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
10714bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_EQ(1, mCamera->waitForFrameBuffer(depthStreamId));
1072a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1073a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        /**
1074a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin          * Guaranteed to be able to consume the depth frame,
1075a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin          * since we waited on it.
1076a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin          */
1077a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        CpuConsumer::LockedBuffer depthBuffer;
1078a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(depthConsumer->lockNextBuffer(&depthBuffer));
1079a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1080a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        dout << "Depth Buffer synchronously received on streamId = " <<
1081a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                streamId <<
1082a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", dataPtr = " << (void*)depthBuffer.data <<
1083a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", timestamp = " << depthBuffer.timestamp << std::endl;
1084a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1085a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        EXPECT_OK(depthConsumer->unlockBuffer(depthBuffer));
1086a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1087475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin        depthFrames++;
1088475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin
1089a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1090a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        /** Consume Greyscale frames if there are any.
1091a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin          * There may not be since it runs at half FPS */
1092a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        CpuConsumer::LockedBuffer greyBuffer;
1093a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        while (consumer->lockNextBuffer(&greyBuffer) == OK) {
1094a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1095a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            dout << "GRAY Buffer synchronously received on streamId = " <<
1096a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                streamId <<
1097a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", dataPtr = " << (void*)greyBuffer.data <<
1098a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                ", timestamp = " << greyBuffer.timestamp << std::endl;
1099a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1100a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin            EXPECT_OK(consumer->unlockBuffer(greyBuffer));
1101475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin
1102475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin            greyFrames++;
1103a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin        }
1104a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
1105a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1106475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin    dout << "Done, summary: depth frames " << std::dec << depthFrames
1107475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin         << ", grey frames " << std::dec << greyFrames << std::endl;
1108475391897f0886aae1833d5e8b2e5aea47cc36bbIgor Murashkin
1109a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Done: clean up
1110a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
1111a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
1112a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin}
1113a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1114ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor MurashkinTEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesSync) {
11154bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    if (HasFatalFailure()) {
11164bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        return;
11174bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    }
11184bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11194bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
11204bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11214bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    int streamId = -1;
11224bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    sp<CpuConsumer> consumer;
11234bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
1124ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
1125ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                  /*synchronousMode*/true, &consumer, &streamId));
11264bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    EXPECT_NE(-1, streamId);
11274bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11284bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
11294bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
1130d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t streams[] = { streamId };
11314bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
11324bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin                                                     /*requests*/NUM_REQUESTS));
11334bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11344bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Consume a couple of results
11354bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    for (int i = 0; i < NUM_REQUESTS; ++i) {
11364bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        int numFrames;
11374bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_TRUE((numFrames = mCamera->waitForFrameBuffer(streamId)) > 0);
11384bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11394bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        // Drop all but the newest framebuffer
11404bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_EQ(numFrames-1, mCamera->dropFrameBuffer(streamId, numFrames-1));
11414bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11424bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
11434bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11444bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        // Skip the counter ahead, don't try to consume these frames again
11454bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        i += numFrames-1;
11464bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11474bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        // "Consume" the buffer
11484bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        CpuConsumer::LockedBuffer buf;
11494bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_OK(consumer->lockNextBuffer(&buf));
11504bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11514bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        dout << "Buffer synchronously received on streamId = " << streamId <<
11524bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin                ", dataPtr = " << (void*)buf.data <<
11534bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin                ", timestamp = " << buf.timestamp << std::endl;
11544bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
11553fa4891f54bbfdbe8ee652930d22c96639964effIgor Murashkin        // Process at 10fps, stream is at 15fps.
11563fa4891f54bbfdbe8ee652930d22c96639964effIgor Murashkin        // This means we will definitely fill up the buffer queue with
11573fa4891f54bbfdbe8ee652930d22c96639964effIgor Murashkin        // extra buffers and need to drop them.
11583fa4891f54bbfdbe8ee652930d22c96639964effIgor Murashkin        usleep(TEST_FRAME_PROCESSING_DELAY_US);
11593fa4891f54bbfdbe8ee652930d22c96639964effIgor Murashkin
11604bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        EXPECT_OK(consumer->unlockBuffer(buf));
11614bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    }
1162a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
11634bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Done: clean up
11644bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
11654bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
11664bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin}
1167a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1168ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor MurashkinTEST_F(ProCameraTest, WaitForSingleStreamBufferAndDropFramesAsync) {
1169ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    if (HasFatalFailure()) {
1170ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        return;
1171ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    }
1172ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1173ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    const int NUM_REQUESTS = 20 * TEST_CPU_FRAME_COUNT;
1174ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1175ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    int streamId = -1;
1176ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    sp<CpuConsumer> consumer;
1177ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
1178ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                  TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT,
1179ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                  /*synchronousMode*/false, &consumer, &streamId));
1180ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    EXPECT_NE(-1, streamId);
1181ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1182ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    EXPECT_OK(mCamera->exclusiveTryLock());
1183ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1184d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    int32_t streams[] = { streamId };
1185ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    ASSERT_NO_FATAL_FAILURE(createSubmitRequestForStreams(streams, /*count*/1,
1186ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                                                     /*requests*/NUM_REQUESTS));
1187ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1188c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    uint64_t lastFrameNumber = 0;
1189c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    int numFrames;
1190c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
1191ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    // Consume a couple of results
1192c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    int i;
1193c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    for (i = 0; i < NUM_REQUESTS && lastFrameNumber < NUM_REQUESTS; ++i) {
1194c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        EXPECT_LT(0, (numFrames = mCamera->waitForFrameBuffer(streamId)));
1195ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1196ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        dout << "Dropped " << (numFrames - 1) << " frames" << std::endl;
1197ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1198ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        // Skip the counter ahead, don't try to consume these frames again
1199ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        i += numFrames-1;
1200ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1201ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        // "Consume" the buffer
1202ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        CpuConsumer::LockedBuffer buf;
1203c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
1204c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        EXPECT_EQ(OK, consumer->lockNextBuffer(&buf));
1205c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
1206c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin        lastFrameNumber = buf.frameNumber;
1207ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1208ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        dout << "Buffer asynchronously received on streamId = " << streamId <<
1209ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                ", dataPtr = " << (void*)buf.data <<
1210c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                ", timestamp = " << buf.timestamp <<
1211c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin                ", framenumber = " << buf.frameNumber << std::endl;
1212ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1213ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        // Process at 10fps, stream is at 15fps.
1214ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        // This means we will definitely fill up the buffer queue with
1215ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        // extra buffers and need to drop them.
1216ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        usleep(TEST_FRAME_PROCESSING_DELAY_US);
1217ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1218ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        EXPECT_OK(consumer->unlockBuffer(buf));
1219ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    }
1220ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1221c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin    dout << "Done after " << i << " iterations " << std::endl;
1222c6deb68aa7d1b9a4a4ba4549411c3be2753723d2Igor Murashkin
1223ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    // Done: clean up
1224ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    EXPECT_OK(mCamera->deleteStream(streamId));
1225ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    EXPECT_OK(mCamera->exclusiveUnlock());
1226ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin}
1227ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin
1228a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1229a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
1230bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin//TODO: refactor into separate file
1231bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor MurashkinTEST_F(ProCameraTest, ServiceListenersSubscribe) {
1232bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1233bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ASSERT_EQ(4u, sizeof(ServiceListener::Status));
1234bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1235bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    sp<ServiceListener> listener = new ServiceListener();
1236bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1237bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
1238bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::addServiceListener(listener));
1239bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1240bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_EQ(ALREADY_EXISTS, ProCamera::addServiceListener(listener));
1241bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::removeServiceListener(listener));
1242bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1243bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_EQ(BAD_VALUE, ProCamera::removeServiceListener(listener));
1244bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin}
1245bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1246bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin//TODO: refactor into separate file
1247bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor MurashkinTEST_F(ProCameraTest, ServiceListenersFunctional) {
1248bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1249bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    sp<ServiceListener> listener = new ServiceListener();
1250bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1251bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::addServiceListener(listener));
1252bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1253bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    sp<Camera> cam = Camera::connect(CAMERA_ID,
1254bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                     /*clientPackageName*/String16(),
1255bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                     -1);
1256bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_NE((void*)NULL, cam.get());
1257bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1258bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ServiceListener::Status stat = ServiceListener::STATUS_UNKNOWN;
1259bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
1260bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1261bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_EQ(ServiceListener::STATUS_NOT_AVAILABLE, stat);
1262bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1263bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    if (cam.get()) {
1264bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        cam->disconnect();
1265bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
1266bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1267bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(listener->waitForStatusChange(/*out*/stat));
1268cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    EXPECT_EQ(ServiceListener::STATUS_PRESENT, stat);
1269bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1270bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    EXPECT_OK(ProCamera::removeServiceListener(listener));
1271bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin}
1272bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1273bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1274bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
1275634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
1276634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
1277634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
1278634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
1279