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