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(&timestamp);
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(&timestamps[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