ProCameraTests.cpp revision eb72e1796b3af548e87891a6d2b73b0567807f25
124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/*
224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * Copyright (C) 2013 The Android Open Source Project
324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o *
40cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Licensed under the Apache License, Version 2.0 (the "License");
50cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * you may not use this file except in compliance with the License.
60cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * You may obtain a copy of the License at
70cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o *
8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *      http://www.apache.org/licenses/LICENSE-2.0
924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o *
100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Unless required by applicable law or agreed to in writing, software
110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * distributed under the License is distributed on an "AS IS" BASIS,
1224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * See the License for the specific language governing permissions and
1424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * limitations under the License.
1505e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o */
1605e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o
1705e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#include <gtest/gtest.h>
18a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <iostream>
1905e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o
20a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <binder/IPCThreadState.h>
21a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Thread.h>
22a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
23a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include "Camera.h"
24a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include "ProCamera.h"
25a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Vector.h>
26a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Mutex.h>
27a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <utils/Condition.h>
28a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
29a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <gui/SurfaceComposerClient.h>
30a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <gui/Surface.h>
31a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
32a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <system/camera_metadata.h>
33a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#include <hardware/camera2.h> // for CAMERA2_TEMPLATE_PREVIEW only
3405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o
35a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'onamespace android {
3624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'onamespace camera2 {
37b969b1b8a5c13992cadb026114731958644540d8Matthias Andreenamespace tests {
3824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'onamespace client {
39546a1ff18cc912003883ff67ba3e87c69f700fc4Theodore Ts'o
40a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define CAMERA_ID 0
41a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_DEBUGGING 0
42a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
4386acdebd539864908127561034752082c86105e2Theodore Ts'o#define TEST_LISTENER_TIMEOUT 1000000000 // 1 second listener timeout
44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define TEST_FORMAT HAL_PIXEL_FORMAT_Y16 //TODO: YUY2 instead
45a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
46a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_FORMAT_MAIN HAL_PIXEL_FORMAT_Y8
47a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_FORMAT_DEPTH HAL_PIXEL_FORMAT_Y16
48a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
49a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define TEST_CPU_FRAME_COUNT 2
509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o#define TEST_CPU_HEAP_COUNT 5
51a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
528a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen#if TEST_DEBUGGING
53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define dout std::cerr
54e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#else
55a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define dout if (0) std::cerr
56a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#endif
57a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
58a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define EXPECT_OK(x) EXPECT_EQ(OK, (x))
59e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define ASSERT_OK(x) ASSERT_EQ(OK, (x))
60e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
61a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oclass ProCameraTest;
62e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallenum ProEvent {
6465f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall    UNKNOWN,
651773c87c7e9ee5c4b8753919320d6d06910ea25bTheodore Ts'o    ACQUIRED,
66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    RELEASED,
67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    STOLEN,
68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    BUFFER_RECEIVED,
69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgralltypedef Vector<ProEvent> EventList;
72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallclass ProCameraTestThread : public Thread
74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallpublic:
762d8c0c8a4fd99d79caa45afba1462dd5ae0f1e45Theodore Ts'o    ProCameraTestThread() {
77a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
78a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
79a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    virtual bool threadLoop() {
80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mProc = ProcessState::self();
81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mProc->startThreadPool();
8286acdebd539864908127561034752082c86105e2Theodore Ts'o
8386acdebd539864908127561034752082c86105e2Theodore Ts'o        IPCThreadState *ptr = IPCThreadState::self();
84a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
85a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ptr->joinThreadPool();
86a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return false;
8896cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o    }
89a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
90a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    sp<ProcessState> mProc;
91a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o};
92c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o
93a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oclass ProCameraTestListener : public ProCameraListener {
94a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
9565f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrallpublic:
96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    status_t WaitForEvent() {
977f9c96ee74315388d758675f69a930b9990e0789Theodore Ts'o        Mutex::Autolock cal(mConditionMutex);
98a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
99a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        {
100a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o            Mutex::Autolock al(mListenerMutex);
101a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            if (mProEventList.size() > 0) {
103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                return OK;
104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            }
105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        }
106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return mListenerCondition.waitRelative(mConditionMutex,
108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                                               TEST_LISTENER_TIMEOUT);
109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    /* Read events into out. Existing queue is flushed */
112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    void ReadEvents(EventList& out) {
113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        Mutex::Autolock al(mListenerMutex);
114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        for (size_t i = 0; i < mProEventList.size(); ++i) {
116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            out.push(mProEventList[i]);
117a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        }
118a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
119a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        mProEventList.clear();
120a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
121e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
122116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o    /**
123a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o      * Dequeue 1 event from the event queue.
124a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o      * Returns UNKNOWN if queue is empty
125e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall      */
126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    ProEvent ReadEvent() {
1271eb31c4885156b595e6ceb4516cb1e1fb2d251fdTheodore Ts'o        Mutex::Autolock al(mListenerMutex);
128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
12986acdebd539864908127561034752082c86105e2Theodore Ts'o        if (mProEventList.size() == 0) {
130e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            return UNKNOWN;
13186acdebd539864908127561034752082c86105e2Theodore Ts'o        }
132e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
133e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ProEvent ev = mProEventList[0];
13486acdebd539864908127561034752082c86105e2Theodore Ts'o        mProEventList.removeAt(0);
135e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
136116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o        return ev;
137e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
138a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
139a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'oprivate:
140a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    void QueueEvent(ProEvent ev) {
141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        {
142a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o            Mutex::Autolock al(mListenerMutex);
143a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o            mProEventList.push(ev);
144a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        }
145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
146e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
147e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mListenerCondition.broadcast();
148a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
149a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
150efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oprotected:
151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
152a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    //////////////////////////////////////////////////
153a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    ///////// ProCameraListener //////////////////////
154a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    //////////////////////////////////////////////////
155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
156a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // Lock has been acquired. Write operations now available.
158a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    virtual void onLockAcquired() {
159a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        QueueEvent(ACQUIRED);
160a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // Lock has been released with exclusiveUnlock
162a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    virtual void onLockReleased() {
163e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        QueueEvent(RELEASED);
164a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
165a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
166a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    // Lock has been stolen by another client.
167e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    virtual void onLockStolen() {
168a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        QueueEvent(STOLEN);
169e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
170a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
171a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    // Lock free.
172a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    virtual void onTriggerNotify(int32_t ext1, int32_t ext2, int32_t ext3) {
173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
174a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        dout << "Trigger notify: " << ext1 << " " << ext2
175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall             << " " << ext3 << std::endl;
17664ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o    }
17764ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o
17864ad98acbe694e74925ad4e4fc88fd10fd3b3a44Theodore Ts'o    virtual void onBufferReceived(int streamId,
179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                                  const CpuConsumer::LockedBuffer& buf) {
180efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
181e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        dout << "Buffer received on streamId = " << streamId <<
1829213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o                ", dataPtr = " << (void*)buf.data << std::endl;
1839213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o
1849213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o        QueueEvent(BUFFER_RECEIVED);
185e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
1869213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    }
187e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    virtual void onRequestReceived(
1888a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen                                   camera_metadata* request) {
1898a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen        free_camera_metadata(request);
1908a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen    }
191e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
1928a6ede8b7a8d5be0d49d6bfa7616537b61dfdc1bEric Sandeen    // TODO: remove
19396cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o
194efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    virtual void notify(int32_t , int32_t , int32_t ) {}
195e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    virtual void postData(int32_t , const sp<IMemory>& ,
196e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                          camera_frame_metadata_t *) {}
197a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    virtual void postDataTimestamp(nsecs_t , int32_t , const sp<IMemory>& ) {}
198a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
199a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
200a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    Vector<ProEvent> mProEventList;
201a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    Mutex             mListenerMutex;
202efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    Mutex             mConditionMutex;
203a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    Condition         mListenerCondition;
204a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o};
205c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o
206e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'oclass ProCameraTest : public ::testing::Test {
207e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'o
208e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'opublic:
209e2ca097fc641e9be2bbafc3db7fd96e4ac87387aTheodore Ts'o    ProCameraTest() {
210c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o    }
211efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
212a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    static void SetUpTestCase() {
213a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        // Binder Thread Pool Initialization
214a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        mTestThread = new ProCameraTestThread();
215a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        mTestThread->run("ProCameraTestThread");
216a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
217a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
218c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o    virtual void SetUp() {
219c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o        mCamera = ProCamera::connect(CAMERA_ID);
220a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ASSERT_NE((void*)NULL, mCamera.get());
221a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
222a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        mListener = new ProCameraTestListener();
22386acdebd539864908127561034752082c86105e2Theodore Ts'o        mCamera->setListener(mListener);
22486acdebd539864908127561034752082c86105e2Theodore Ts'o    }
22586acdebd539864908127561034752082c86105e2Theodore Ts'o
22686acdebd539864908127561034752082c86105e2Theodore Ts'o    virtual void TearDown() {
22786acdebd539864908127561034752082c86105e2Theodore Ts'o        ASSERT_NE((void*)NULL, mCamera.get());
228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mCamera->disconnect();
22986acdebd539864908127561034752082c86105e2Theodore Ts'o    }
230e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
23186acdebd539864908127561034752082c86105e2Theodore Ts'oprotected:
23286acdebd539864908127561034752082c86105e2Theodore Ts'o    sp<ProCamera> mCamera;
23386acdebd539864908127561034752082c86105e2Theodore Ts'o    sp<ProCameraTestListener> mListener;
23486acdebd539864908127561034752082c86105e2Theodore Ts'o
23586acdebd539864908127561034752082c86105e2Theodore Ts'o    static sp<Thread> mTestThread;
23686acdebd539864908127561034752082c86105e2Theodore Ts'o
237e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    int mDisplaySecs;
23886acdebd539864908127561034752082c86105e2Theodore Ts'o    sp<SurfaceComposerClient> mComposerClient;
23986acdebd539864908127561034752082c86105e2Theodore Ts'o    sp<SurfaceControl> mSurfaceControl;
240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    sp<SurfaceComposerClient> mDepthComposerClient;
242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    sp<SurfaceControl> mDepthSurfaceControl;
243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    int getSurfaceWidth() {
245e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return 512;
246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    int getSurfaceHeight() {
248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return 512;
249e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
250e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
251e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    void createOnScreenSurface(sp<Surface>& surface) {
252e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mComposerClient = new SurfaceComposerClient;
253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
25486acdebd539864908127561034752082c86105e2Theodore Ts'o
25586acdebd539864908127561034752082c86105e2Theodore Ts'o        mSurfaceControl = mComposerClient->createSurface(
25686acdebd539864908127561034752082c86105e2Theodore Ts'o                String8("ProCameraTest StreamingImage Surface"),
257a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o                getSurfaceWidth(), getSurfaceHeight(),
258a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o                PIXEL_FORMAT_RGB_888, 0);
259a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
260a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        mSurfaceControl->setPosition(640, 0);
261a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
262a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ASSERT_TRUE(mSurfaceControl != NULL);
263a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ASSERT_TRUE(mSurfaceControl->isValid());
264a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
265a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        SurfaceComposerClient::openGlobalTransaction();
266a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7FFFFFFF));
267a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
26824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        SurfaceComposerClient::closeGlobalTransaction();
2699227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
270c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o        sp<ANativeWindow> window = mSurfaceControl->getSurface();
271c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o        surface = mSurfaceControl->getSurface();
2729227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
273c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o        ASSERT_NE((void*)NULL, surface.get());
274c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o    }
275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    void createDepthOnScreenSurface(sp<Surface>& surface) {
2779227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o        mDepthComposerClient = new SurfaceComposerClient;
278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_EQ(NO_ERROR, mDepthComposerClient->initCheck());
2799227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
2809227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o        mDepthSurfaceControl = mDepthComposerClient->createSurface(
281e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                String8("ProCameraTest StreamingImage Surface"),
282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                getSurfaceWidth(), getSurfaceHeight(),
283e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                PIXEL_FORMAT_RGB_888, 0);
284e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
285e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mDepthSurfaceControl->setPosition(640, 0);
286c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o
2879227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o        ASSERT_TRUE(mDepthSurfaceControl != NULL);
288e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_TRUE(mDepthSurfaceControl->isValid());
289e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
290e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        SurfaceComposerClient::openGlobalTransaction();
291e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->setLayer(0x7FFFFFFF));
292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_EQ(NO_ERROR, mDepthSurfaceControl->show());
293c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o        SurfaceComposerClient::closeGlobalTransaction();
2949227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        sp<ANativeWindow> window = mDepthSurfaceControl->getSurface();
296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        surface = mDepthSurfaceControl->getSurface();
297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
2989227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o        ASSERT_NE((void*)NULL, surface.get());
2999227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    }
300e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
3019227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o};
302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
3039227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'osp<Thread> ProCameraTest::mTestThread;
304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall// test around exclusiveTryLock (immediate locking)
3069227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'oTEST_F(ProCameraTest, LockingImmediate) {
3079227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
3089227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    if (HasFatalFailure()) {
3099227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o        return;
310bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    }
311bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
31224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_FALSE(mCamera->hasExclusiveLock());
313c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o    EXPECT_EQ(OK, mCamera->exclusiveTryLock());
314e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // at this point we definitely have the lock
31524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
31624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_EQ(OK, mListener->WaitForEvent());
317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
318e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_TRUE(mCamera->hasExclusiveLock());
320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
321e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(OK, mListener->WaitForEvent());
323544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o    EXPECT_EQ(RELEASED, mListener->ReadEvent());
32474128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o
325de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger    EXPECT_FALSE(mCamera->hasExclusiveLock());
3269ff8ece57d46a9419fc60057547810824881bb45Theodore Ts'o}
327bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall// test around exclusiveLock (locking at some future point in time)
32924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'oTEST_F(ProCameraTest, LockingAsynchronous) {
33024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if (HasFatalFailure()) {
33269022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o        return;
33369022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o    }
33424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
33524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    // TODO: Add another procamera that has a lock here.
336efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    // then we can be test that the lock wont immediately be acquired
33769022e029f3273b3b860bf701219cd3fe615f76bTheodore Ts'o
33824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_FALSE(mCamera->hasExclusiveLock());
33924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_EQ(OK, mCamera->exclusiveLock());
34024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    // at this point we may or may not have the lock
34124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    // we cant be sure until we get an ACQUIRED event
34224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
34324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_EQ(OK, mListener->WaitForEvent());
34424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
3459213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o
3469213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_TRUE(mCamera->hasExclusiveLock());
3479213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_EQ(OK, mCamera->exclusiveUnlock());
348efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
3499213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_EQ(OK, mListener->WaitForEvent());
3509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_EQ(RELEASED, mListener->ReadEvent());
35124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
35224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_FALSE(mCamera->hasExclusiveLock());
35324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o}
35424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
35524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o// Stream directly to the screen.
356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, StreamingImageSingle) {
35724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    if (HasFatalFailure()) {
35824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        return;
35924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    }
360e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
361e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if (displaySecsEnv != NULL) {
362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        mDisplaySecs = atoi(displaySecsEnv);
36324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        if (mDisplaySecs < 0) {
36424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o            mDisplaySecs = 0;
36524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        }
36624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    } else {
36724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        mDisplaySecs = 0;
368de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger    }
369f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen
370f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen    sp<Surface> depthSurface;
371f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen    if (mDisplaySecs > 0) {
372f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen        createDepthOnScreenSurface(/*out*/depthSurface);
373f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen    }
37424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
37524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    int depthStreamId = -1;
37624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
37724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o                              TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
37824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_NE(-1, depthStreamId);
37924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
380e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->exclusiveTryLock());
381e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    /* iterate in a loop submitting requests every frame.
382e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     *  what kind of requests doesnt really matter, just whatever.
383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     */
384e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
38524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    // it would probably be better to use CameraMetadata from camera service.
386e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    camera_metadata_t *request = NULL;
387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
388e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall              /*out*/&request));
38924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_NE((void*)NULL, request);
39024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
391c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    /* FIXME: dont need this later, at which point the above should become an
392c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o       ASSERT_NE*/
393e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if(request == NULL) request = allocate_camera_metadata(10, 100);
394e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
395e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // set the output streams to just this stream ID
396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // wow what a verbose API.
398c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    // i would give a loaf of bread for
399c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    //   metadata->updateOrInsert(keys.request.output.streams, streamId);
40024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    uint8_t allStreams[] = { depthStreamId };
40124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
402e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
40324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    camera_metadata_entry_t entry;
40424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
405c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    int find = find_camera_metadata_entry(request, tag, &entry);
406efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    if (find == -ENOENT) {
407e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        if (add_camera_metadata_entry(request, tag, &allStreams,
408e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            /*data_count*/streamCount) != OK) {
409e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            ASSERT_OK(append_camera_metadata(tmp, request));
411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            free_camera_metadata(request);
41265f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall            request = tmp;
413f026f1a37061a021f7188c9e45d0fbff1bde9e60Theodore Ts'o
414f026f1a37061a021f7188c9e45d0fbff1bde9e60Theodore Ts'o            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
415e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                /*data_count*/streamCount));
416e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        }
417e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    } else {
418e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
419e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall                &allStreams, /*data_count*/streamCount, &entry));
420e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
422e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
423e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
424e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    dout << "will sleep now for " << mDisplaySecs << std::endl;
42524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    sleep(mDisplaySecs);
42624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
427bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    free_camera_metadata(request);
428bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
42976f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o    for (int i = 0; i < streamCount; ++i) {
43076f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o        EXPECT_OK(mCamera->deleteStream(allStreams[i]));
431c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o    }
432ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o    EXPECT_OK(mCamera->exclusiveUnlock());
433a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o}
434efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
435efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o// Stream directly to the screen.
436bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'oTEST_F(ProCameraTest, StreamingImageDual) {
437bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    if (HasFatalFailure()) {
4382787276ec59e1d52087d307bc30446d088ec65bcTheodore Ts'o        return;
43924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    }
4401e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    char* displaySecsEnv = getenv("TEST_DISPLAY_SECS");
4411e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    if (displaySecsEnv != NULL) {
4429213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o        mDisplaySecs = atoi(displaySecsEnv);
4439213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o        if (mDisplaySecs < 0) {
4449213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o            mDisplaySecs = 0;
4459213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o        }
4469213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    } else {
447efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o        mDisplaySecs = 0;
4489213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    }
449bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
4509213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    sp<Surface> surface;
4519213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    sp<Surface> depthSurface;
452efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    if (mDisplaySecs > 0) {
453bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        createOnScreenSurface(/*out*/surface);
4549213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o        createDepthOnScreenSurface(/*out*/depthSurface);
4559213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    }
456de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger
4579213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    int streamId = -1;
4589213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_OK(mCamera->createStream(/*width*/1280, /*height*/960,
4599213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o              TEST_FORMAT_MAIN, surface, &streamId));
4609213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o    EXPECT_NE(-1, streamId);
4619213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o
462c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o    int depthStreamId = -1;
463c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o    EXPECT_OK(mCamera->createStream(/*width*/320, /*height*/240,
4641e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o              TEST_FORMAT_DEPTH, depthSurface, &depthStreamId));
465bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_NE(-1, depthStreamId);
4669227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o
4679227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    EXPECT_OK(mCamera->exclusiveTryLock());
4689227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    /*
4699227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    */
4709227c5bbbd0861878ae73f7dceb4deb9e9f06a3cTheodore Ts'o    /* iterate in a loop submitting requests every frame.
471e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     *  what kind of requests doesnt really matter, just whatever.
472e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     */
473c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
474c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    // it would probably be better to use CameraMetadata from camera service.
475c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    camera_metadata_t *request = NULL;
476bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
477a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o              /*out*/&request));
478a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    EXPECT_NE((void*)NULL, request);
479a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
480e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    /*FIXME: dont need this later, at which point the above should become an
481bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o             ASSERT_NE*/
482bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    if(request == NULL) request = allocate_camera_metadata(10, 100);
4831e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o
484bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // set the output streams to just this stream ID
485bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
486e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // wow what a verbose API.
487bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    uint8_t allStreams[] = { streamId, depthStreamId };
488bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // IMPORTANT. bad things will happen if its not a uint8.
4891e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    size_t streamCount = sizeof(allStreams) / sizeof(allStreams[0]);
490bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    camera_metadata_entry_t entry;
4911e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
492bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    int find = find_camera_metadata_entry(request, tag, &entry);
493bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    if (find == -ENOENT) {
494e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        if (add_camera_metadata_entry(request, tag, &allStreams,
495236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos                                      /*data_count*/streamCount) != OK) {
496236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
4971e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o            ASSERT_OK(append_camera_metadata(tmp, request));
498a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o            free_camera_metadata(request);
499a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o            request = tmp;
500a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
5011e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
502bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                                                /*data_count*/streamCount));
503c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o        }
504c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o    } else {
505c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
506bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                  &allStreams, /*data_count*/streamCount, &entry));
507a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    }
508a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
509a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
510e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
511e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    dout << "will sleep now for " << mDisplaySecs << std::endl;
51274128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o    sleep(mDisplaySecs);
51374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o
514e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    free_camera_metadata(request);
515e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
51676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    for (int i = 0; i < streamCount; ++i) {
51776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o        EXPECT_OK(mCamera->deleteStream(allStreams[i]));
51876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    }
519efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    EXPECT_OK(mCamera->exclusiveUnlock());
5209213a93b22accd2a27064b12f6bc5f1221ca6a70Theodore Ts'o}
521e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
522e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, CpuConsumerSingle) {
523e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if (HasFatalFailure()) {
524e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return;
525e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    }
526e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    int streamId = -1;
527e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
528e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &streamId));
529e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_NE(-1, streamId);
530bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
5311e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    EXPECT_OK(mCamera->exclusiveTryLock());
532e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(OK, mListener->WaitForEvent());
5331e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
5341e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    /* iterate in a loop submitting requests every frame.
5351e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o     *  what kind of requests doesnt really matter, just whatever.
536e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     */
537e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
538e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // it would probably be better to use CameraMetadata from camera service.
539e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    camera_metadata_t *request = NULL;
540e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
541e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        /*out*/&request));
542e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_NE((void*)NULL, request);
543e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
5442d8c0c8a4fd99d79caa45afba1462dd5ae0f1e45Theodore Ts'o    /*FIXME: dont need this later, at which point the above should become an
54598f4547198b369bef7e41eb7ce4a16855726c393Eric Sandeen      ASSERT_NE*/
546e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if(request == NULL) request = allocate_camera_metadata(10, 100);
547e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
548e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // set the output streams to just this stream ID
549e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
55076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    uint8_t allStreams[] = { streamId };
55176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    camera_metadata_entry_t entry;
552e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
55376dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    int find = find_camera_metadata_entry(request, tag, &entry);
55476dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    if (find == -ENOENT) {
555f2de1d38d0819b17895977fabc52d81d0ea6ec00Valerie Clement        if (add_camera_metadata_entry(request, tag, &allStreams,
55676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o                /*data_count*/1) != OK) {
55776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
55876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o            ASSERT_OK(append_camera_metadata(tmp, request));
55976dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o            free_camera_metadata(request);
56076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o            request = tmp;
56176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o
562e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
56374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o                /*data_count*/1));
56476dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o        }
56576dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    } else {
56676dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
56776dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o            &allStreams, /*data_count*/1, &entry));
56876dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    }
56976dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o
57076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
57176dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o
572e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // Consume a couple of frames
57374128f8d7e93fe633aa87951319a4afd252a4494Theodore Ts'o    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
57424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o        EXPECT_EQ(OK, mListener->WaitForEvent());
575efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o        EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent());
5761e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    }
577efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
5781e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    // Done: clean up
579e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    free_camera_metadata(request);
580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->deleteStream(streamId));
5811e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    EXPECT_OK(mCamera->exclusiveUnlock());
5821e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o}
583e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
584e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(ProCameraTest, CpuConsumerDual) {
585e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    if (HasFatalFailure()) {
586e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall        return;
587236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos    }
58824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    int streamId = -1;
5891e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o    EXPECT_OK(mCamera->createStreamCpu(/*width*/1280, /*height*/960,
590c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o                            TEST_FORMAT_MAIN, TEST_CPU_HEAP_COUNT, &streamId));
59124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o    EXPECT_NE(-1, streamId);
592bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
593bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    int depthStreamId = -1;
594bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->createStreamCpu(/*width*/320, /*height*/240,
595bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                     TEST_FORMAT_DEPTH, TEST_CPU_HEAP_COUNT, &depthStreamId));
596e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_NE(-1, depthStreamId);
597e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
598e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_OK(mCamera->exclusiveTryLock());
599e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(OK, mListener->WaitForEvent());
600e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    EXPECT_EQ(ACQUIRED, mListener->ReadEvent());
601e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    /*
602e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    */
603e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    /* iterate in a loop submitting requests every frame.
604e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     *  what kind of requests doesnt really matter, just whatever.
605e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall     */
606e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
607bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // it would probably be better to use CameraMetadata from camera service.
608bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    camera_metadata_t *request = NULL;
609bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
610bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                                            /*out*/&request));
611bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_NE((void*)NULL, request);
612bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
613bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    if(request == NULL) request = allocate_camera_metadata(10, 100);
614bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
615e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    // set the output streams to just this stream ID
616bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
617bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // wow what a verbose API.
618bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    uint8_t allStreams[] = { streamId, depthStreamId };
619bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    size_t streamCount = 2;
620e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall    camera_metadata_entry_t entry;
621bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    uint32_t tag = static_cast<uint32_t>(ANDROID_REQUEST_OUTPUT_STREAMS);
622bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    int find = find_camera_metadata_entry(request, tag, &entry);
623efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o    if (find == -ENOENT) {
624bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        if (add_camera_metadata_entry(request, tag, &allStreams,
625bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                                      /*data_count*/streamCount) != OK) {
626bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o            camera_metadata_t *tmp = allocate_camera_metadata(1000, 10000);
627bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o            ASSERT_OK(append_camera_metadata(tmp, request));
628bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o            free_camera_metadata(request);
629c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o            request = tmp;
630c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o
631c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o            ASSERT_OK(add_camera_metadata_entry(request, tag, &allStreams,
632c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o                                                   /*data_count*/streamCount));
633c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o        }
634c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o    } else {
635bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        ASSERT_OK(update_camera_metadata_entry(request, entry.index,
636bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o                              &allStreams, /*data_count*/streamCount, &entry));
637bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    }
638bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
639bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->submitRequest(request, /*streaming*/true));
640bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
641bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // Consume a couple of frames
642bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    for (int i = 0; i < TEST_CPU_FRAME_COUNT; ++i) {
643bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        // stream id 1
644bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        EXPECT_EQ(OK, mListener->WaitForEvent());
645bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent());
646bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
647bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        // stream id 2
648bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        EXPECT_EQ(OK, mListener->WaitForEvent());
649bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        EXPECT_EQ(BUFFER_RECEIVED, mListener->ReadEvent());
650bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
651bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o        //TODO: events should be a struct with some data like the stream id
652bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    }
653bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
654bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    // Done: clean up
655bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    free_camera_metadata(request);
656bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->deleteStream(streamId));
657bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o    EXPECT_OK(mCamera->exclusiveUnlock());
658bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o}
659bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
660bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o}
661bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o}
662bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o}
663bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o}
664bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
665bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o