19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2008, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ICameraClient" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 23000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <camera/ICameraClient.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 28d6289b1b03d209219c2dd3126ee8839a45682b33Dave Sparks NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, 292a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks DATA_CALLBACK, 3059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks DATA_CALLBACK_TIMESTAMP, 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpCameraClient: public BpInterface<ICameraClient> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpCameraClient(const sp<IBinder>& impl) 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<ICameraClient>(impl) 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 412a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks // generic callback from camera service to app 422a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 432a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks { 442a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks LOGV("notifyCallback"); 452a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks Parcel data, reply; 462a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 472a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInt32(msgType); 482a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInt32(ext1); 492a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInt32(ext2); 502a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 512a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks } 522a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks 532a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks // generic data callback from camera service to app with image data 54bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li void dataCallback(int32_t msgType, const sp<IMemory>& imageData, 55bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li camera_frame_metadata_t *metadata) 562a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks { 572a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks LOGV("dataCallback"); 582a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks Parcel data, reply; 592a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 602a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeInt32(msgType); 612a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks data.writeStrongBinder(imageData->asBinder()); 62bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li if (metadata) { 63bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li data.writeInt32(metadata->number_of_faces); 64bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li data.write(metadata->faces, sizeof(camera_face_t) * metadata->number_of_faces); 65bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li } 662a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 672a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks } 682a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks 6959c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks // generic data callback from camera service to app with image data 7059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData) 7159c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks { 7259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks LOGV("dataCallback"); 7359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks Parcel data, reply; 7459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 7559c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks data.writeInt64(timestamp); 7659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks data.writeInt32(msgType); 7759c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks data.writeStrongBinder(imageData->asBinder()); 7859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY); 7959c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient"); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnCameraClient::onTransact( 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(code) { 902a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks case NOTIFY_CALLBACK: { 912a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks LOGV("NOTIFY_CALLBACK"); 922a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks CHECK_INTERFACE(ICameraClient, data, reply); 932a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks int32_t msgType = data.readInt32(); 942a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks int32_t ext1 = data.readInt32(); 952a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks int32_t ext2 = data.readInt32(); 962a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks notifyCallback(msgType, ext1, ext2); 972a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks return NO_ERROR; 982a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks } break; 992a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks case DATA_CALLBACK: { 10059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks LOGV("DATA_CALLBACK"); 1012a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks CHECK_INTERFACE(ICameraClient, data, reply); 1022a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks int32_t msgType = data.readInt32(); 1032a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 104bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li camera_frame_metadata_t *metadata = NULL; 105bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li if (data.dataAvail() > 0) { 106bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li metadata = new camera_frame_metadata_t; 107bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li metadata->number_of_faces = data.readInt32(); 108bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li metadata->faces = (camera_face_t *) data.readInplace( 109bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li sizeof(camera_face_t) * metadata->number_of_faces); 110bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li } 111bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li dataCallback(msgType, imageData, metadata); 112bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li if (metadata) delete metadata; 1132a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks return NO_ERROR; 1142a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks } break; 11559c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks case DATA_CALLBACK_TIMESTAMP: { 11659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks LOGV("DATA_CALLBACK_TIMESTAMP"); 11759c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks CHECK_INTERFACE(ICameraClient, data, reply); 11859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks nsecs_t timestamp = data.readInt64(); 11959c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks int32_t msgType = data.readInt32(); 12059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 12159c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks dataCallbackTimestamp(timestamp, msgType, imageData); 12259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks return NO_ERROR; 12359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks } break; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133