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