ICameraClient.cpp revision 3856b090cd04ba5dd4a59a12430ed724d5995909
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright 2008, The Android Open Source Project 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License. 73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software 123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License. 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/ 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//#define LOG_NDEBUG 0 193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "ICameraClient" 203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h> 213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdint.h> 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <sys/types.h> 233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraClient.h> 243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianenum { 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian DATA_CALLBACK, 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian DATA_CALLBACK_TIMESTAMP, 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraClient: public BpInterface<ICameraClient> 343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian BpCameraClient(const sp<IBinder>& impl) 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian : BpInterface<ICameraClient>(impl) 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic callback from camera service to app 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("notifyCallback"); 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext1); 493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext2); 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 5457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li void dataCallback(int32_t msgType, const sp<IMemory>& imageData, 5557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeStrongBinder(imageData->asBinder()); 6257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) { 6357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.writeInt32(metadata->number_of_faces); 6457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.write(metadata->faces, sizeof(camera_face_t) * metadata->number_of_faces); 6557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData) 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt64(timestamp); 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeStrongBinder(imageData->asBinder()); 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY); 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient"); 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------- 853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraClient::onTransact( 873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian switch(code) { 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case NOTIFY_CALLBACK: { 913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NOTIFY_CALLBACK"); 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext1 = data.readInt32(); 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext2 = data.readInt32(); 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian notifyCallback(msgType, ext1, ext2); 973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK: { 1003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK"); 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 10457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata = NULL; 10557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (data.dataAvail() > 0) { 10657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata = new camera_frame_metadata_t; 10757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->number_of_faces = data.readInt32(); 10857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->faces = (camera_face_t *) data.readInplace( 10957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li sizeof(camera_face_t) * metadata->number_of_faces); 11057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 11157c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li dataCallback(msgType, imageData, metadata); 11257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) delete metadata; 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK_TIMESTAMP: { 1163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK_TIMESTAMP"); 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian nsecs_t timestamp = data.readInt64(); 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian dataCallbackTimestamp(timestamp, msgType, imageData); 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian default: 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------- 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 133