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, 35b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP_BATCH, 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraClient: public BpInterface<ICameraClient> 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 41090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpCameraClient(const sp<IBinder>& impl) 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian : BpInterface<ICameraClient>(impl) 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic callback from camera service to app 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("notifyCallback"); 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext1); 543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(ext2); 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 5957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li void dataCallback(int32_t msgType, const sp<IMemory>& imageData, 6057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) 613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 6606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(imageData)); 6757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) { 6857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.writeInt32(metadata->number_of_faces); 6957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li data.write(metadata->faces, sizeof(camera_face_t) * metadata->number_of_faces); 7057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // generic data callback from camera service to app with image data 753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData) 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dataCallback"); 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt64(timestamp); 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInt32(msgType); 8206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(imageData)); 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY); 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 852d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 862d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle) { 872d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("recordingFrameHandleCallbackTimestamp"); 882d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen Parcel data, reply; 892d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 902d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeInt64(timestamp); 912d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeNativeHandle(handle); 922d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen remote()->transact(RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP, data, &reply, 932d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen IBinder::FLAG_ONEWAY); 942d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 95b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 96b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh void recordingFrameHandleCallbackTimestampBatch( 97b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<nsecs_t>& timestamps, 98b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles) { 99b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGV("recordingFrameHandleCallbackTimestampBatch"); 100b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh Parcel data, reply; 101b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); 102b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh uint32_t n = timestamps.size(); 103b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh if (n != handles.size()) { 104b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGE("%s: size of timestamps(%zu) and handles(%zu) mismatch!", 105b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh __FUNCTION__, timestamps.size(), handles.size()); 106b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return; 107b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 108b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh data.writeUint32(n); 109b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh for (auto ts : timestamps) { 110b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh data.writeInt64(ts); 111b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 112b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh for (auto& handle : handles) { 113b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh data.writeNativeHandle(handle); 114b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 115b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh remote()->transact(RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP_BATCH, data, &reply, 116b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh IBinder::FLAG_ONEWAY); 117b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient"); 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------- 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraClient::onTransact( 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian switch(code) { 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case NOTIFY_CALLBACK: { 1293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NOTIFY_CALLBACK"); 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext1 = data.readInt32(); 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t ext2 = data.readInt32(); 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian notifyCallback(msgType, ext1, ext2); 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK: { 1383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK"); 1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 14257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata = NULL; 14357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (data.dataAvail() > 0) { 14457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata = new camera_frame_metadata_t; 14557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->number_of_faces = data.readInt32(); 14657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li metadata->faces = (camera_face_t *) data.readInplace( 14757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li sizeof(camera_face_t) * metadata->number_of_faces); 14857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li } 14957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li dataCallback(msgType, imageData, metadata); 15057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li if (metadata) delete metadata; 1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case DATA_CALLBACK_TIMESTAMP: { 1543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("DATA_CALLBACK_TIMESTAMP"); 1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraClient, data, reply); 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian nsecs_t timestamp = data.readInt64(); 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian int32_t msgType = data.readInt32(); 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); 1592d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen dataCallbackTimestamp(timestamp, msgType, imageData); 1602d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return NO_ERROR; 1612d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } break; 1622d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen case RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP: { 1632d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP"); 1642d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen CHECK_INTERFACE(ICameraClient, data, reply); 1652d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen nsecs_t timestamp; 1662d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen status_t res = data.readInt64(×tamp); 1672d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (res != OK) { 1682d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGE("%s: Failed to read timestamp: %s (%d)", __FUNCTION__, strerror(-res), res); 1692d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return BAD_VALUE; 1702d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 1712d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_t* handle = data.readNativeHandle(); 1722d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (handle == nullptr) { 1732d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGE("%s: Received a null native handle", __FUNCTION__); 1742d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return BAD_VALUE; 1756773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan } 1766773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan 1772d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // The native handle will be freed in BpCamera::releaseRecordingFrameHandle. 1782d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen recordingFrameHandleCallbackTimestamp(timestamp, handle); 1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 181b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh case RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP_BATCH: { 182b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGV("RECORDING_FRAME_HANDLE_CALLBACK_TIMESTAMP_BATCH"); 183b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh CHECK_INTERFACE(ICameraClient, data, reply); 184b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh uint32_t n = 0; 185b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh status_t res = data.readUint32(&n); 186b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh if (res != OK) { 187b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGE("%s: Failed to read batch size: %s (%d)", __FUNCTION__, strerror(-res), res); 188b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return BAD_VALUE; 189b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 190b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::vector<nsecs_t> timestamps; 191b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh std::vector<native_handle_t*> handles; 192b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh timestamps.reserve(n); 193b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh handles.reserve(n); 194b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh for (uint32_t i = 0; i < n; i++) { 195b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh res = data.readInt64(×tamps[i]); 196b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh if (res != OK) { 197b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGE("%s: Failed to read timestamp[%d]: %s (%d)", 198b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh __FUNCTION__, i, strerror(-res), res); 199b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return BAD_VALUE; 200b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 201b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 202b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh for (uint32_t i = 0; i < n; i++) { 203b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh native_handle_t* handle = data.readNativeHandle(); 204b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh if (handle == nullptr) { 205b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh ALOGE("%s: Received a null native handle at handles[%d]", 206b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh __FUNCTION__, i); 207b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return BAD_VALUE; 208b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 209b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh handles.push_back(handle); 210b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } 211b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 212b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // The native handle will be freed in BpCamera::releaseRecordingFrameHandleBatch. 213b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh recordingFrameHandleCallbackTimestampBatch(timestamps, handles); 214b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh return NO_ERROR; 215b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh } break; 2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian default: 2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------- 2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 223d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace hardware 224d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace android 225