13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright 2008, The Android Open Source Project 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 56773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** Licensed under the Apache License, Version 2.0 (the "License"); 66773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** you may not use this file except in compliance with the License. 76773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** You may obtain a copy of the License at 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 96773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** http://www.apache.org/licenses/LICENSE-2.0 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** 116773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** Unless required by applicable law or agreed to in writing, software 126773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** distributed under the License is distributed on an "AS IS" BASIS, 136773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan** 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> 236773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <camera/CameraUtils.h> 24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraClient.h> 256773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <media/hardware/HardwareAPI.h> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalanamespace hardware { 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianenum { 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian DATA_CALLBACK, 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian DATA_CALLBACK_TIMESTAMP, 342d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP, 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraClient: public BpInterface<ICameraClient> 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian BpCameraClient(const sp<IBinder>& impl) 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian : BpInterface<ICameraClient>(impl) 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic callback from camera service to app 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("notifyCallback"); 493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext1); 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext2); 543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 5857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li void dataCallback(int32_t msgType, const sp<IMemory>& imageData, 5957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) 603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 6506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(imageData)); 6657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) { 6757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.writeInt32(metadata->number_of_faces); 6857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.write(metadata->faces, sizeof(camera_face_t) * metadata->number_of_faces); 6957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData) 753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt64(timestamp); 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 8106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(imageData)); 823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY); 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 842d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 852d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle) { 862d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("recordingFrameHandleCallbackTimestamp"); 872d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen Parcel data, reply; 882d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 892d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeInt64(timestamp); 902d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeNativeHandle(handle); 912d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen remote()->transact(RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP, data, &reply, 922d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen IBinder::FLAG_ONEWAY); 932d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient"); 973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------- 993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraClient::onTransact( 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian switch(code) { 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case NOTIFY_CALLBACK: { 1053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NOTIFY_CALLBACK"); 1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext1 = data.readInt32(); 1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext2 = data.readInt32(); 1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian notifyCallback(msgType, ext1, ext2); 1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK: { 1143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK"); 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 11857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata = NULL; 11957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (data.dataAvail() > 0) { 12057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata = new camera_frame_metadata_t; 12157c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->number_of_faces = data.readInt32(); 12257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->faces = (camera_face_t *) data.readInplace( 12357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li sizeof(camera_face_t) * metadata->number_of_faces); 12457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 12557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li dataCallback(msgType, imageData, metadata); 12657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) delete metadata; 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK_TIMESTAMP: { 1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK_TIMESTAMP"); 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian nsecs_t timestamp = data.readInt64(); 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 1352d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen dataCallbackTimestamp(timestamp, msgType, imageData); 1362d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return NO_ERROR; 1372d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } break; 1382d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen case RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP: { 1392d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP"); 1402d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen CHECK_INTERFACE(ICameraClient, data, reply); 1412d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen nsecs_t timestamp; 1422d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen status_t res = data.readInt64(×tamp); 1432d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (res != OK) { 1442d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGE("%s: Failed to read timestamp: %s (%d)", __FUNCTION__, strerror(-res), res); 1452d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return BAD_VALUE; 1462d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 1472d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_t* handle = data.readNativeHandle(); 1482d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (handle == nullptr) { 1492d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGE("%s: Received a null native handle", __FUNCTION__); 1502d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return BAD_VALUE; 1516773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan } 1526773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan 1532d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // The native handle will be freed in BpCamera::releaseRecordingFrameHandle. 1542d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen recordingFrameHandleCallbackTimestamp(timestamp, handle); 1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian default: 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------- 1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 164d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace hardware 165d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace android 166