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