1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* 2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Copyright 2013, The Android Open Source Project 4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License"); 6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** you may not use this file except in compliance with the License. 7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** You may obtain a copy of the License at 8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** http://www.apache.org/licenses/LICENSE-2.0 10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Unless required by applicable law or agreed to in writing, software 12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS, 13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** See the License for the specific language governing permissions and 15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** limitations under the License. 16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin*/ 17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// #define LOG_NDEBUG 0 19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define LOG_TAG "IProCameraUser" 20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Log.h> 21634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <stdint.h> 22634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <sys/types.h> 23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/Parcel.h> 24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraUser.h> 25634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/IGraphicBufferProducer.h> 26634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/Surface.h> 27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "camera/CameraMetadata.h" 28634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 29634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android { 30634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 31634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinenum { 32634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, 33634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CONNECT, 34634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin EXCLUSIVE_TRY_LOCK, 35634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin EXCLUSIVE_LOCK, 36634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin EXCLUSIVE_UNLOCK, 37634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin HAS_EXCLUSIVE_LOCK, 38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin SUBMIT_REQUEST, 39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CANCEL_REQUEST, 40fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin DELETE_STREAM, 41985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin CREATE_STREAM, 42985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin CREATE_DEFAULT_REQUEST, 437b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin GET_CAMERA_INFO, 44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; 45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 46634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinclass BpProCameraUser: public BpInterface<IProCameraUser> 47634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 48634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinpublic: 49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin BpProCameraUser(const sp<IBinder>& impl) 50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin : BpInterface<IProCameraUser>(impl) 51634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 53634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 54634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // disconnect from camera service 55634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin void disconnect() 56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("disconnect"); 58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(DISCONNECT, data, &reply); 61bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply.readExceptionCode(); 62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t connect(const sp<IProCameraCallbacks>& cameraClient) 65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 68634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeStrongBinder(cameraClient->asBinder()); 69634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(CONNECT, data, &reply); 70634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 71634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 72634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin /* Shared ProCameraUser */ 74634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 75634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t exclusiveTryLock() 76634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 77634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 78634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 79634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(EXCLUSIVE_TRY_LOCK, data, &reply); 80634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 81634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 82634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t exclusiveLock() 83634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 84634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 85634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 86634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(EXCLUSIVE_LOCK, data, &reply); 87634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 88634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 89634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 90634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t exclusiveUnlock() 91634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 92634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 93634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 94634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(EXCLUSIVE_UNLOCK, data, &reply); 95634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 96634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 97634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 98634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual bool hasExclusiveLock() 99634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 100634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 101634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 102634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(HAS_EXCLUSIVE_LOCK, data, &reply); 103634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return !!reply.readInt32(); 104634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 105634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 106634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual int submitRequest(camera_metadata_t* metadata, bool streaming) 107634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 108634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 109634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 110634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 111634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 112985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin // arg0+arg1 113e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::writeToParcel(data, metadata); 114634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 115634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // arg2 = streaming (bool) 116634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInt32(streaming); 117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 118634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(SUBMIT_REQUEST, data, &reply); 119634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin virtual status_t cancelRequest(int requestId) 123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 126634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInt32(requestId); 127634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 128634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(CANCEL_REQUEST, data, &reply); 129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 132fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin virtual status_t deleteStream(int streamId) 133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInt32(streamId); 137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 138fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin remote()->transact(DELETE_STREAM, data, &reply); 139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return reply.readInt32(); 140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 142985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin virtual status_t createStream(int width, int height, int format, 14376f8b43909817179b317880202360863b8f976d0Igor Murashkin const sp<IGraphicBufferProducer>& bufferProducer, 144985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin /*out*/ 145985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin int* streamId) 146985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin { 147985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin Parcel data, reply; 148985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 149985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInt32(width); 150985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInt32(height); 151985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInt32(format); 152985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 15376f8b43909817179b317880202360863b8f976d0Igor Murashkin sp<IBinder> b(bufferProducer->asBinder()); 15476f8b43909817179b317880202360863b8f976d0Igor Murashkin data.writeStrongBinder(b); 15576f8b43909817179b317880202360863b8f976d0Igor Murashkin 156985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin remote()->transact(CREATE_STREAM, data, &reply); 157985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 158985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin int sId = reply.readInt32(); 159985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (streamId) { 160985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin *streamId = sId; 161985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin } 162985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return reply.readInt32(); 163985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin } 164985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 165985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin // Create a request object from a template. 166985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin virtual status_t createDefaultRequest(int templateId, 167985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin /*out*/ 168985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin camera_metadata** request) 169985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin { 170985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin Parcel data, reply; 171985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 172985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin data.writeInt32(templateId); 173985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply); 174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::readFromParcel(reply, /*out*/request); 175985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return reply.readInt32(); 176985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin } 177985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 178985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 1797b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin virtual status_t getCameraInfo(int cameraId, camera_metadata** info) 1807b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin { 1817b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin Parcel data, reply; 1827b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); 1837b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin data.writeInt32(cameraId); 1847b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin remote()->transact(GET_CAMERA_INFO, data, &reply); 185e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::readFromParcel(reply, /*out*/info); 1867b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return reply.readInt32(); 1877b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin } 1887b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 1897b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 190985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkinprivate: 191985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 192985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; 194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinIMPLEMENT_META_INTERFACE(ProCameraUser, "android.hardware.IProCameraUser"); 196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// ---------------------------------------------------------------------- 198634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 199634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t BnProCameraUser::onTransact( 200634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 201634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 202634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin switch(code) { 203634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case DISCONNECT: { 204634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin ALOGV("DISCONNECT"); 205634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 206634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin disconnect(); 207bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 208634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 209634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 210634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case CONNECT: { 211634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 212634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp<IProCameraCallbacks> cameraClient = 213634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin interface_cast<IProCameraCallbacks>(data.readStrongBinder()); 214634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(connect(cameraClient)); 215634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 216634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 217634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 218634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin /* Shared ProCameraUser */ 219634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case EXCLUSIVE_TRY_LOCK: { 220634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 221634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(exclusiveTryLock()); 222634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 223634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 224634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case EXCLUSIVE_LOCK: { 225634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 226634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(exclusiveLock()); 227634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 228634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case EXCLUSIVE_UNLOCK: { 230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 231634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(exclusiveUnlock()); 232634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 233634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 234634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case HAS_EXCLUSIVE_LOCK: { 235634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 236634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(hasExclusiveLock()); 237634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 238634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 239634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case SUBMIT_REQUEST: { 240634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 241634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin camera_metadata_t* metadata; 242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::readFromParcel(data, /*out*/&metadata); 243634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 244634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // arg2 = streaming (bool) 245634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin bool streaming = data.readInt32(); 246634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 247634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // return code: requestId (int32) 248634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(submitRequest(metadata, streaming)); 249634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 250634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 251634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 252634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case CANCEL_REQUEST: { 253634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 254634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int requestId = data.readInt32(); 255634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin reply->writeInt32(cancelRequest(requestId)); 256634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 257634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 258fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin case DELETE_STREAM: { 259634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 260634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin int streamId = data.readInt32(); 261fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin reply->writeInt32(deleteStream(streamId)); 262634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 263634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 264985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin case CREATE_STREAM: { 265985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 266985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin int width, height, format; 267985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 268985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin width = data.readInt32(); 269985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin height = data.readInt32(); 270985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin format = data.readInt32(); 271985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 27276f8b43909817179b317880202360863b8f976d0Igor Murashkin sp<IGraphicBufferProducer> bp = 27376f8b43909817179b317880202360863b8f976d0Igor Murashkin interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 274985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 275985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin int streamId = -1; 276985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin status_t ret; 27776f8b43909817179b317880202360863b8f976d0Igor Murashkin ret = createStream(width, height, format, bp, &streamId); 278985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 279985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin reply->writeInt32(streamId); 280985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin reply->writeInt32(ret); 281985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 282985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return NO_ERROR; 283985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin } break; 284985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 285985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin case CREATE_DEFAULT_REQUEST: { 286985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 287985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 288985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin int templateId = data.readInt32(); 289985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 290985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin camera_metadata_t* request = NULL; 291985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin status_t ret; 292985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin ret = createDefaultRequest(templateId, &request); 293985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::writeToParcel(*reply, request); 295985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin reply->writeInt32(ret); 296985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 2977b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin free_camera_metadata(request); 2987b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 2997b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return NO_ERROR; 3007b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin } break; 3017b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin case GET_CAMERA_INFO: { 3027b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin CHECK_INTERFACE(IProCameraUser, data, reply); 3037b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3047b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin int cameraId = data.readInt32(); 3057b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3067b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin camera_metadata_t* info = NULL; 3077b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin status_t ret; 3087b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin ret = getCameraInfo(cameraId, &info); 3097b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata::writeToParcel(*reply, info); 3117b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin reply->writeInt32(ret); 3127b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 3137b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin free_camera_metadata(info); 3147b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 315985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return NO_ERROR; 316985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin } break; 317634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin default: 318634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return BBinder::onTransact(code, data, reply, flags); 319634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 320634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 321634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 322634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// ---------------------------------------------------------------------------- 323634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 324634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android 325