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