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