CameraServiceTest.cpp revision 8eb69d60c09c1c4683066a94c889df28d0e9d233
18eb69d60c09c1c4683066a94c889df28d0e9d233James Dong/* 28eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Copyright (C) 2010 The Android Open Source Project 38eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 48eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 58eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * you may not use this file except in compliance with the License. 68eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * You may obtain a copy of the License at 78eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 88eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * http://www.apache.org/licenses/LICENSE-2.0 98eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 108eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Unless required by applicable law or agreed to in writing, software 118eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * distributed under the License is distributed on an "AS IS" BASIS, 128eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * See the License for the specific language governing permissions and 148eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * limitations under the License. 158eb69d60c09c1c4683066a94c889df28d0e9d233James Dong */ 168eb69d60c09c1c4683066a94c889df28d0e9d233James Dong 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LOG_TAG "CameraServiceTest" 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdio.h> 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdlib.h> 2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <string.h> 2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/types.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/wait.h> 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <unistd.h> 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <surfaceflinger/ISurface.h> 2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/Camera.h> 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/CameraParameters.h> 2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <ui/GraphicBuffer.h> 2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICamera.h> 3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraClient.h> 3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraService.h> 3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <ui/Overlay.h> 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/IPCThreadState.h> 3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/IServiceManager.h> 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/ProcessState.h> 3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/KeyedVector.h> 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Log.h> 3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Vector.h> 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/threads.h> 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianusing namespace android; 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Assertion and Logging utilities 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define INFO(...) \ 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian do { \ 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian printf(__VA_ARGS__); \ 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian printf("\n"); \ 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian LOGD(__VA_ARGS__); \ 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } while(0) 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid assert_fail(const char *file, int line, const char *func, const char *expr) { 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("assertion failed at file %s, line %d, function %s:", 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian file, line, func); 5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", expr); 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian abort(); 5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid assert_eq_fail(const char *file, int line, const char *func, 6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *expr, int actual) { 6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("assertion failed at file %s, line %d, function %s:", 6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian file, line, func); 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("(expected) %s != (actual) %d", expr, actual); 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian abort(); 6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ASSERT(e) \ 6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian do { \ 7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (!(e)) \ 7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian assert_fail(__FILE__, __LINE__, __func__, #e); \ 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } while(0) 7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ASSERT_EQ(expected, actual) \ 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian do { \ 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int _x = (actual); \ 7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (_x != (expected)) \ 7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian assert_eq_fail(__FILE__, __LINE__, __func__, #expected, _x); \ 7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } while(0) 8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Holder service for pass objects between processes. 8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass IHolder : public IInterface { 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected: 8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum { 8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian HOLDER_PUT = IBinder::FIRST_CALL_TRANSACTION, 8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian HOLDER_GET, 8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian HOLDER_CLEAR 9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian }; 9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian DECLARE_META_INTERFACE(Holder); 9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void put(sp<IBinder> obj) = 0; 9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual sp<IBinder> get() = 0; 9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void clear() = 0; 9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass BnHolder : public BnInterface<IHolder> { 10065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t onTransact(uint32_t code, 10165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const Parcel& data, 10265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel* reply, 10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t flags = 0); 10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 10565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass BpHolder : public BpInterface<IHolder> { 10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian BpHolder(const sp<IBinder>& impl) 10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian : BpInterface<IHolder>(impl) { 11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void put(sp<IBinder> obj) { 11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel data, reply; 11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian data.writeStrongBinder(obj); 11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian remote()->transact(HOLDER_PUT, data, &reply, IBinder::FLAG_ONEWAY); 11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual sp<IBinder> get() { 11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel data, reply; 12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian remote()->transact(HOLDER_GET, data, &reply); 12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return reply.readStrongBinder(); 12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void clear() { 12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Parcel data, reply; 12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian remote()->transact(HOLDER_CLEAR, data, &reply); 12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianIMPLEMENT_META_INTERFACE(Holder, "CameraServiceTest.Holder"); 13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t BnHolder::onTransact( 13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian switch(code) { 13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case HOLDER_PUT: { 13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian put(data.readStrongBinder()); 13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NO_ERROR; 13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } break; 13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case HOLDER_GET: { 14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian reply->writeStrongBinder(get()); 14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NO_ERROR; 14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } break; 14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case HOLDER_CLEAR: { 14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian clear(); 14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NO_ERROR; 14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } break; 14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian default: 14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass HolderService : public BnHolder { 15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void put(sp<IBinder> obj) { 15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mObj = obj; 15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual sp<IBinder> get() { 15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return mObj; 15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void clear() { 16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mObj.clear(); 16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IBinder> mObj; 16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// A mock CameraClient 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MCameraClient : public BnCameraClient { 17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2); 17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void dataCallback(int32_t msgType, const sp<IMemory>& data); 17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void dataCallbackTimestamp(nsecs_t timestamp, 17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t msgType, const sp<IMemory>& data); 17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // new functions 17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void clearStat(); 17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian enum OP { EQ, GE, LE, GT, LT }; 17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void assertNotify(int32_t msgType, OP op, int count); 18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void assertData(int32_t msgType, OP op, int count); 18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void waitNotify(int32_t msgType, OP op, int count); 18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void waitData(int32_t msgType, OP op, int count); 18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void assertDataSize(int32_t msgType, OP op, int dataSize); 18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void setReleaser(ICamera *releaser) { 18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mReleaser = releaser; 18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex mLock; 19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mCond; 19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian DefaultKeyedVector<int32_t, int> mNotifyCount; 19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian DefaultKeyedVector<int32_t, int> mDataCount; 19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian DefaultKeyedVector<int32_t, int> mDataSize; 19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool test(OP op, int v1, int v2); 19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void assertTest(OP op, int v1, int v2); 19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ICamera *mReleaser; 19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::clearStat() { 20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mNotifyCount.clear(); 20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mDataCount.clear(); 20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mDataSize.clear(); 20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianbool MCameraClient::test(OP op, int v1, int v2) { 20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian switch (op) { 20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case EQ: return v1 == v2; 21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case GT: return v1 > v2; 21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case LT: return v1 < v2; 21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case GE: return v1 >= v2; 21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian case LE: return v1 <= v2; 21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian default: ASSERT(0); break; 21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return false; 21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertTest(OP op, int v1, int v2) { 22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (!test(op, v1, v2)) { 22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian LOGE("assertTest failed: op=%d, v1=%d, v2=%d", op, v1, v2); 22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(0); 22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertNotify(int32_t msgType, OP op, int count) { 22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int v = mNotifyCount.valueFor(msgType); 22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian assertTest(op, v, count); 23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertData(int32_t msgType, OP op, int count) { 23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 23465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int v = mDataCount.valueFor(msgType); 23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian assertTest(op, v, count); 23665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 23765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 23865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertDataSize(int32_t msgType, OP op, int dataSize) { 23965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 24065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int v = mDataSize.valueFor(msgType); 24165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian assertTest(op, v, dataSize); 24265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 24365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 24465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { 24565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 24665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ssize_t i = mNotifyCount.indexOfKey(msgType); 24865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (i < 0) { 24965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mNotifyCount.add(msgType, 1); 25065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } else { 25165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ++mNotifyCount.editValueAt(i); 25265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 25365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.signal(); 25465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 25565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 25665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::dataCallback(int32_t msgType, const sp<IMemory>& data) { 25765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 25865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int dataSize = data->size(); 25965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("data type = %d, size = %d", msgType, dataSize); 26065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 26165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ssize_t i = mDataCount.indexOfKey(msgType); 26265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (i < 0) { 26365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mDataCount.add(msgType, 1); 26465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mDataSize.add(msgType, dataSize); 26565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } else { 26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ++mDataCount.editValueAt(i); 26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mDataSize.editValueAt(i) = dataSize; 26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.signal(); 27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (msgType == CAMERA_MSG_VIDEO_FRAME) { 27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(mReleaser != NULL); 27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mReleaser->releaseRecordingFrame(data); 27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, 27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const sp<IMemory>& data) { 27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian dataCallback(msgType, data); 28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 28265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::waitNotify(int32_t msgType, OP op, int count) { 28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("waitNotify: %d, %d, %d", msgType, op, count); 28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (true) { 28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int v = mNotifyCount.valueFor(msgType); 28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (test(op, v, count)) { 28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian break; 28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 29065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.wait(mLock); 29165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 29265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 29365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 29465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::waitData(int32_t msgType, OP op, int count) { 29565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("waitData: %d, %d, %d", msgType, op, count); 29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (true) { 29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int v = mDataCount.valueFor(msgType); 29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (test(op, v, count)) { 30065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian break; 30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.wait(mLock); 30365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 30565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 30665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 30765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// A mock Surface 30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MSurface : public BnSurface { 31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t registerBuffers(const BufferHeap& buffers); 31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void postBuffer(ssize_t offset); 31365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void unregisterBuffers(); 31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual sp<OverlayRef> createOverlay( 31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t w, uint32_t h, int32_t format, int32_t orientation); 31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage); 31765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual status_t setBufferCount(int bufferCount); 31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // new functions 32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void clearStat(); 32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void waitUntil(int c0, int c1, int c2); 32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // check callback count 32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Condition mCond; 32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex mLock; 32765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int registerBuffersCount; 32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int postBufferCount; 32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int unregisterBuffersCount; 33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 33165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 33265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t MSurface::registerBuffers(const BufferHeap& buffers) { 33365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 33465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ++registerBuffersCount; 33665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.signal(); 33765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NO_ERROR; 33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::postBuffer(ssize_t offset) { 34165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // INFO("%s", __func__); 34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 34365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ++postBufferCount; 34465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.signal(); 34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::unregisterBuffers() { 34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 34965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ++unregisterBuffersCount; 35165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.signal(); 35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 35365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<GraphicBuffer> MSurface::requestBuffer(int bufferIdx, int usage) { 35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 35665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NULL; 35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t MSurface::setBufferCount(int bufferCount) { 36065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NULL; 36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::clearStat() { 36565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 36665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian registerBuffersCount = 0; 36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian postBufferCount = 0; 36865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian unregisterBuffersCount = 0; 36965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 37065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 37165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::waitUntil(int c0, int c1, int c2) { 37265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("waitUntil: %d %d %d", c0, c1, c2); 37365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian Mutex::Autolock _l(mLock); 37465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (true) { 37565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (registerBuffersCount >= c0 && 37665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian postBufferCount >= c1 && 37765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian unregisterBuffersCount >= c2) { 37865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian break; 37965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 38065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCond.wait(mLock); 38165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 38265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 38465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<OverlayRef> MSurface::createOverlay(uint32_t w, uint32_t h, int32_t format, 38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t orientation) { 38665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Not implemented. 38765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(0); 38865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return NULL; 38965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 39065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 39265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Utilities to use the Holder service 39365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 39465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<IHolder> getHolder() { 39565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IServiceManager> sm = defaultServiceManager(); 39665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(sm != 0); 39765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IBinder> binder = sm->getService(String16("CameraServiceTest.Holder")); 39865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(binder != 0); 39965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IHolder> holder = interface_cast<IHolder>(binder); 40065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(holder != 0); 40165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return holder; 40265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 40365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 40465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid putTempObject(sp<IBinder> obj) { 40565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 40665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian getHolder()->put(obj); 40765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 40865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 40965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<IBinder> getTempObject() { 41065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 41165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return getHolder()->get(); 41265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 41365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid clearTempObject() { 41565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian getHolder()->clear(); 41765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 41865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 42065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Get a Camera Service 42165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 42265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<ICameraService> getCameraService() { 42365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IServiceManager> sm = defaultServiceManager(); 42465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(sm != 0); 42565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<IBinder> binder = sm->getService(String16("media.camera")); 42665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(binder != 0); 42765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = interface_cast<ICameraService>(binder); 42865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(cs != 0); 42965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return cs; 43065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 43165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 43265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint getNumberOfCameras() { 43365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 43465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return cs->getNumberOfCameras(); 43565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 43665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 43765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 43865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Various Connect Tests 43965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 44065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testConnect(int cameraId) { 44165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 44265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 44365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 44465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = cs->connect(cc, cameraId); 44565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 44665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 44765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 44865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 44965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testAllowConnectOnceOnly(int cameraId) { 45065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 45165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 45265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Connect the first client. 45365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 45465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = cs->connect(cc, cameraId); 45565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 45665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Same client -- ok. 45765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(cs->connect(cc, cameraId) != 0); 45865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Different client -- not ok. 45965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc2 = new MCameraClient(); 46065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(cs->connect(cc2, cameraId) == 0); 46165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 46265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 46365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 46465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectFailed() { 46565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 46665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = interface_cast<ICamera>(getTempObject()); 46765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 46865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->connect(cc) != NO_ERROR); 46965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 47065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 47165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectSuccess() { 47265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 47365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = interface_cast<ICamera>(getTempObject()); 47465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 47565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->connect(cc) == NO_ERROR); 47665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 47765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 47865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 47965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockFailed() { 48065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 48165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = interface_cast<ICamera>(getTempObject()); 48265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->lock() != NO_ERROR); 48365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 48465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 48565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockUnlockSuccess() { 48665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 48765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = interface_cast<ICamera>(getTempObject()); 48865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->lock() == NO_ERROR); 48965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->unlock() == NO_ERROR); 49065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 49165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 49265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockSuccess() { 49365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 49465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = interface_cast<ICamera>(getTempObject()); 49565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->lock() == NO_ERROR); 49665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 49765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 49865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 49965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 50065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Run the connect tests in another process. 50165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// 50265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst char *gExecutable; 50365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 50465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstruct FunctionTableEntry { 50565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *name; 50665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void (*func)(); 50765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 50865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 50965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFunctionTableEntry function_table[] = { 51065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ENTRY(x) {#x, &x} 51165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ENTRY(testReconnectFailed), 51265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ENTRY(testReconnectSuccess), 51365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ENTRY(testLockUnlockSuccess), 51465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ENTRY(testLockFailed), 51565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ENTRY(testLockSuccess), 51665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#undef ENTRY 51765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 51865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 51965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runFunction(const char *tag) { 52065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("runFunction: %s", tag); 52165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int entries = sizeof(function_table) / sizeof(function_table[0]); 52265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int i = 0; i < entries; i++) { 52365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (strcmp(function_table[i].name, tag) == 0) { 52465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian (*function_table[i].func)(); 52565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return; 52665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 52765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 52865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(0); 52965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 53065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 53165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runInAnotherProcess(const char *tag) { 53265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pid_t pid = fork(); 53365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (pid == 0) { 53465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian execlp(gExecutable, gExecutable, tag, NULL); 53565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(0); 53665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } else { 53765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int status; 53865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT_EQ(pid, wait(&status)); 53965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT_EQ(0, status); 54065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 54165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 54265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 54365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnect(int cameraId) { 54465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 54565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 54665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 54765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = cs->connect(cc, cameraId); 54865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 54965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Reconnect to the same client -- ok. 55065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->connect(cc) == NO_ERROR); 55165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Reconnect to a different client (but the same pid) -- ok. 55265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc2 = new MCameraClient(); 55365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->connect(cc2) == NO_ERROR); 55465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 55565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 55665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 55765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 55865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockUnlock(int cameraId) { 55965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 56065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 56165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = cs->connect(cc, cameraId); 56265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 56365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // We can lock as many times as we want. 56465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->lock() == NO_ERROR); 56565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->lock() == NO_ERROR); 56665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Lock from a different process -- not ok. 56765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian putTempObject(c->asBinder()); 56865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runInAnotherProcess("testLockFailed"); 56965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Unlock then lock from a different process -- ok. 57065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->unlock() == NO_ERROR); 57165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runInAnotherProcess("testLockUnlockSuccess"); 57265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Unlock then lock from a different process -- ok. 57365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runInAnotherProcess("testLockSuccess"); 57465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian clearTempObject(); 57565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 57665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 57765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectFromAnotherProcess(int cameraId) { 57865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", __func__); 57965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 58065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs = getCameraService(); 58165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc = new MCameraClient(); 58265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c = cs->connect(cc, cameraId); 58365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 58465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Reconnect from a different process -- not ok. 58565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian putTempObject(c->asBinder()); 58665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runInAnotherProcess("testReconnectFailed"); 58765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Unlock then reconnect from a different process -- ok. 58865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->unlock() == NO_ERROR); 58965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runInAnotherProcess("testReconnectSuccess"); 59065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian clearTempObject(); 59165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 59265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 59365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// We need to flush the command buffer after the reference 59465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// to ICamera is gone. The sleep is for the server to run 59565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// the destructor for it. 59665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void flushCommands() { 59765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian IPCThreadState::self()->flushCommands(); 59865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian usleep(200000); // 200ms 59965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 60065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 60165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Run a test case 60265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define RUN(class_name, cameraId) do { \ 60365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian { \ 60465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO(#class_name); \ 60565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian class_name instance; \ 60665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian instance.init(cameraId); \ 60765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian instance.run(); \ 60865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } \ 60965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian flushCommands(); \ 61065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} while(0) 61165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 61265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Base test case after the the camera is connected. 61365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AfterConnect { 61465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 61565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void init(int cameraId) { 61665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cs = getCameraService(); 61765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc = new MCameraClient(); 61865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c = cs->connect(cc, cameraId); 61965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c != 0); 62065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 62165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 62265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected: 62365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICameraService> cs; 62465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MCameraClient> cc; 62565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<ICamera> c; 62665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 62765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ~AfterConnect() { 62865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 62965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c.clear(); 63065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc.clear(); 63165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cs.clear(); 63265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 63365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 63465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 63565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestSetPreviewDisplay : public AfterConnect { 63665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 63765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 63865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> surface = new MSurface(); 63965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); 64065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 64165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 64265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 64365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 64465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 64565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStartPreview : public AfterConnect { 64665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 64765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 64865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> surface = new MSurface(); 64965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); 65065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 65165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->startPreview() == NO_ERROR); 65265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == true); 65365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 65465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian surface->waitUntil(1, 10, 0); // needs 1 registerBuffers and 10 postBuffer 65565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian surface->clearStat(); 65665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 65765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> another_surface = new MSurface(); 65865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setPreviewDisplay(another_surface); // just to make sure unregisterBuffers 65965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // is called. 66065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian surface->waitUntil(0, 0, 1); // needs unregisterBuffers 66165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 66265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 66365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 66465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 66565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 66665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStartPreviewWithoutDisplay : public AfterConnect { 66765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 66865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 66965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->startPreview() == NO_ERROR); 67065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == true); 67165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 67265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 67365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 67465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 67565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 67665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Base test case after the the camera is connected and the preview is started. 67765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AfterStartPreview : public AfterConnect { 67865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 67965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void init(int cameraId) { 68065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AfterConnect::init(cameraId); 68165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian surface = new MSurface(); 68265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); 68365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->startPreview() == NO_ERROR); 68465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 68565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 68665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected: 68765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> surface; 68865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 68965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ~AfterStartPreview() { 69065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian surface.clear(); 69165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 69265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 69365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 69465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestAutoFocus : public AfterStartPreview { 69565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 69665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 69765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 0); 69865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->autoFocus(); 69965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 1); 70065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 70165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 70265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 70365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 70465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 70565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStopPreview : public AfterStartPreview { 70665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 70765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 70865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == true); 70965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->stopPreview(); 71065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == false); 71165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 71265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 71365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 71465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 71565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 71665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestTakePicture: public AfterStartPreview { 71765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 71865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 71965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->takePicture() == NO_ERROR); 72065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1); 72165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); 72265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); 72365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->stopPreview(); 72465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 72565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 72665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 72765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 72865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 72965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestTakeMultiplePictures: public AfterStartPreview { 73065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 73165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 73265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int i = 0; i < 10; i++) { 73365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->clearStat(); 73465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->takePicture() == NO_ERROR); 73565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1); 73665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); 73765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); 73865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 73965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->disconnect(); 74065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 74165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 74265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 74365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 74465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestGetParameters: public AfterStartPreview { 74565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 74665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 74765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 param_str = c->getParameters(); 74865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%s", static_cast<const char*>(param_str)); 74965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 75065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 75165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 75265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic bool getNextSize(const char **ptrS, int *w, int *h) { 75365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *s = *ptrS; 75465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 75565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // skip over ',' 75665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (*s == ',') s++; 75765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 75865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // remember start position in p 75965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *p = s; 76065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (*s != '\0' && *s != 'x') { 76165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian s++; 76265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 76365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (*s == '\0') return false; 76465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 76565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // get the width 76665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *w = atoi(p); 76765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 76865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // skip over 'x' 76965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(*s == 'x'); 77065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian p = s + 1; 77165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (*s != '\0' && *s != ',') { 77265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian s++; 77365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 77465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 77565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // get the height 77665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *h = atoi(p); 77765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *ptrS = s; 77865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return true; 77965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 78065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 78165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPictureSize : public AfterStartPreview { 78265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 78365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void checkOnePicture(int w, int h) { 78465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const float rate = 0.9; // byte per pixel limit 78565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int pixels = w * h; 78665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 78765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian CameraParameters param(c->getParameters()); 78865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param.setPictureSize(w, h); 78965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // disable thumbnail to get more accurate size. 79065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 0); 79165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 0); 79265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setParameters(param.flatten()); 79365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 79465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->clearStat(); 79565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->takePicture() == NO_ERROR); 79665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); 79765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian //cc->assertDataSize(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, pixels*3/2); 79865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); 79965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::LT, 80065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int(pixels * rate)); 80165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::GT, 0); 80265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); 80365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 80465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 80565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 80665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian CameraParameters param(c->getParameters()); 80765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int w, h; 80865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *s = param.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES); 80965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (getNextSize(&s, &w, &h)) { 81065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian LOGD("checking picture size %dx%d", w, h); 81165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian checkOnePicture(w, h); 81265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 81365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 81465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 81565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 81665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPreviewCallbackFlag : public AfterConnect { 81765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 81865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 81965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> surface = new MSurface(); 82065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); 82165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 82265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Try all flag combinations. 82365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int v = 0; v < 8; v++) { 82465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian LOGD("TestPreviewCallbackFlag: flag=%d", v); 82565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian usleep(100000); // sleep a while to clear the in-flight callbacks. 82665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->clearStat(); 82765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setPreviewCallbackFlag(v); 82865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == false); 82965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->startPreview() == NO_ERROR); 83065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->previewEnabled() == true); 83165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sleep(2); 83265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->stopPreview(); 83365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if ((v & FRAME_CALLBACK_FLAG_ENABLE_MASK) == 0) { 83465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 0); 83565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } else { 83665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if ((v & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) == 0) { 83765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 10); 83865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } else { 83965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 1); 84065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 84165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 84265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 84365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 84465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 84565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 84665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestRecording : public AfterConnect { 84765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 84865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 84965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->recordingEnabled() == false); 85065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sp<MSurface> surface = new MSurface(); 85165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); 85265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK); 85365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->setReleaser(c.get()); 85465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->startRecording(); 85565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ASSERT(c->recordingEnabled() == true); 85665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sleep(2); 85765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->stopRecording(); 85865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian usleep(100000); // sleep a while to clear the in-flight callbacks. 85965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->setReleaser(NULL); 86065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertData(CAMERA_MSG_VIDEO_FRAME, MCameraClient::GE, 10); 86165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 86265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 86365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 86465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPreviewSize : public AfterStartPreview { 86565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 86665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void checkOnePicture(int w, int h) { 86765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int size = w*h*3/2; // should read from parameters 86865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 86965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->stopPreview(); 87065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 87165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian CameraParameters param(c->getParameters()); 87265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param.setPreviewSize(w, h); 87365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK); 87465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->setParameters(param.flatten()); 87565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 87665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian c->startPreview(); 87765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 87865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->clearStat(); 87965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->waitData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 1); 88065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian cc->assertDataSize(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, size); 88165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 88265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 88365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void run() { 88465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian CameraParameters param(c->getParameters()); 88565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int w, h; 88665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const char *s = param.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES); 88765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian while (getNextSize(&s, &w, &h)) { 88865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian LOGD("checking preview size %dx%d", w, h); 88965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian checkOnePicture(w, h); 89065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 89165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 89265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 89365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 89465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runHolderService() { 89565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian defaultServiceManager()->addService( 89665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String16("CameraServiceTest.Holder"), new HolderService()); 89765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ProcessState::self()->startThreadPool(); 89865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 89965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 90065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint main(int argc, char **argv) 90165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 90265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (argc != 1) { 90365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runFunction(argv[1]); 90465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return 0; 90565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 90665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("CameraServiceTest start"); 90765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian gExecutable = argv[0]; 90865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian runHolderService(); 90965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int n = getNumberOfCameras(); 91065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("%d Cameras available", n); 91165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 91265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int id = 0; id < n; id++) { 91365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("Testing camera %d", id); 91465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian testConnect(id); flushCommands(); 91565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian testAllowConnectOnceOnly(id); flushCommands(); 91665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian testReconnect(id); flushCommands(); 91765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian testLockUnlock(id); flushCommands(); 91865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian testReconnectFromAnotherProcess(id); flushCommands(); 91965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 92065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestSetPreviewDisplay, id); 92165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestStartPreview, id); 92265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestStartPreviewWithoutDisplay, id); 92365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestAutoFocus, id); 92465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestStopPreview, id); 92565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestTakePicture, id); 92665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestTakeMultiplePictures, id); 92765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestGetParameters, id); 92865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestPictureSize, id); 92965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestPreviewCallbackFlag, id); 93065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestRecording, id); 93165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian RUN(TestPreviewSize, id); 93265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 93365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 93465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian INFO("CameraServiceTest finished"); 93565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 936