ICameraDeviceUser.cpp revision abaa51d3ca31f0eda99e1d271e6dc64c877dbf58
1/* 2** 3** Copyright 2013, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18// #define LOG_NDEBUG 0 19#define LOG_TAG "ICameraDeviceUser" 20#include <utils/Log.h> 21#include <stdint.h> 22#include <sys/types.h> 23#include <binder/Parcel.h> 24#include <camera/camera2/ICameraDeviceUser.h> 25#include <gui/IGraphicBufferProducer.h> 26#include <gui/Surface.h> 27#include <camera/CameraMetadata.h> 28#include <camera/camera2/CaptureRequest.h> 29 30namespace android { 31 32typedef Parcel::WritableBlob WritableBlob; 33typedef Parcel::ReadableBlob ReadableBlob; 34 35enum { 36 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, 37 SUBMIT_REQUEST, 38 CANCEL_REQUEST, 39 DELETE_STREAM, 40 CREATE_STREAM, 41 CREATE_DEFAULT_REQUEST, 42 GET_CAMERA_INFO, 43 WAIT_UNTIL_IDLE, 44 FLUSH 45}; 46 47class BpCameraDeviceUser : public BpInterface<ICameraDeviceUser> 48{ 49public: 50 BpCameraDeviceUser(const sp<IBinder>& impl) 51 : BpInterface<ICameraDeviceUser>(impl) 52 { 53 } 54 55 // disconnect from camera service 56 void disconnect() 57 { 58 ALOGV("disconnect"); 59 Parcel data, reply; 60 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 61 remote()->transact(DISCONNECT, data, &reply); 62 reply.readExceptionCode(); 63 } 64 65 virtual int submitRequest(sp<CaptureRequest> request, bool streaming) 66 { 67 Parcel data, reply; 68 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 69 70 // arg0 = CaptureRequest 71 if (request != 0) { 72 data.writeInt32(1); 73 request->writeToParcel(&data); 74 } else { 75 data.writeInt32(0); 76 } 77 78 // arg1 = streaming (bool) 79 data.writeInt32(streaming); 80 81 remote()->transact(SUBMIT_REQUEST, data, &reply); 82 83 reply.readExceptionCode(); 84 return reply.readInt32(); 85 } 86 87 virtual status_t cancelRequest(int requestId) 88 { 89 Parcel data, reply; 90 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 91 data.writeInt32(requestId); 92 93 remote()->transact(CANCEL_REQUEST, data, &reply); 94 95 reply.readExceptionCode(); 96 return reply.readInt32(); 97 } 98 99 virtual status_t deleteStream(int streamId) 100 { 101 Parcel data, reply; 102 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 103 data.writeInt32(streamId); 104 105 remote()->transact(DELETE_STREAM, data, &reply); 106 107 reply.readExceptionCode(); 108 return reply.readInt32(); 109 } 110 111 virtual status_t createStream(int width, int height, int format, 112 const sp<IGraphicBufferProducer>& bufferProducer) 113 { 114 Parcel data, reply; 115 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 116 data.writeInt32(width); 117 data.writeInt32(height); 118 data.writeInt32(format); 119 120 data.writeInt32(1); // marker that bufferProducer is not null 121 data.writeString16(String16("unknown_name")); // name of surface 122 sp<IBinder> b(bufferProducer->asBinder()); 123 data.writeStrongBinder(b); 124 125 remote()->transact(CREATE_STREAM, data, &reply); 126 127 reply.readExceptionCode(); 128 return reply.readInt32(); 129 } 130 131 // Create a request object from a template. 132 virtual status_t createDefaultRequest(int templateId, 133 /*out*/ 134 CameraMetadata* request) 135 { 136 Parcel data, reply; 137 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 138 data.writeInt32(templateId); 139 remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply); 140 141 reply.readExceptionCode(); 142 status_t result = reply.readInt32(); 143 144 CameraMetadata out; 145 if (reply.readInt32() != 0) { 146 out.readFromParcel(&reply); 147 } 148 149 if (request != NULL) { 150 request->swap(out); 151 } 152 return result; 153 } 154 155 156 virtual status_t getCameraInfo(CameraMetadata* info) 157 { 158 Parcel data, reply; 159 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 160 remote()->transact(GET_CAMERA_INFO, data, &reply); 161 162 reply.readExceptionCode(); 163 status_t result = reply.readInt32(); 164 165 CameraMetadata out; 166 if (reply.readInt32() != 0) { 167 out.readFromParcel(&reply); 168 } 169 170 if (info != NULL) { 171 info->swap(out); 172 } 173 174 return result; 175 } 176 177 virtual status_t waitUntilIdle() 178 { 179 ALOGV("waitUntilIdle"); 180 Parcel data, reply; 181 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 182 remote()->transact(WAIT_UNTIL_IDLE, data, &reply); 183 reply.readExceptionCode(); 184 return reply.readInt32(); 185 } 186 187 virtual status_t flush() 188 { 189 ALOGV("flush"); 190 Parcel data, reply; 191 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 192 remote()->transact(FLUSH, data, &reply); 193 reply.readExceptionCode(); 194 return reply.readInt32(); 195 } 196 197private: 198 199 200}; 201 202IMPLEMENT_META_INTERFACE(CameraDeviceUser, 203 "android.hardware.camera2.ICameraDeviceUser"); 204 205// ---------------------------------------------------------------------- 206 207status_t BnCameraDeviceUser::onTransact( 208 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 209{ 210 switch(code) { 211 case DISCONNECT: { 212 ALOGV("DISCONNECT"); 213 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 214 disconnect(); 215 reply->writeNoException(); 216 return NO_ERROR; 217 } break; 218 case SUBMIT_REQUEST: { 219 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 220 221 // arg0 = request 222 sp<CaptureRequest> request; 223 if (data.readInt32() != 0) { 224 request = new CaptureRequest(); 225 request->readFromParcel(const_cast<Parcel*>(&data)); 226 } 227 228 // arg1 = streaming (bool) 229 bool streaming = data.readInt32(); 230 231 // return code: requestId (int32) 232 reply->writeNoException(); 233 reply->writeInt32(submitRequest(request, streaming)); 234 235 return NO_ERROR; 236 } break; 237 case CANCEL_REQUEST: { 238 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 239 int requestId = data.readInt32(); 240 reply->writeNoException(); 241 reply->writeInt32(cancelRequest(requestId)); 242 return NO_ERROR; 243 } break; 244 case DELETE_STREAM: { 245 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 246 int streamId = data.readInt32(); 247 reply->writeNoException(); 248 reply->writeInt32(deleteStream(streamId)); 249 return NO_ERROR; 250 } break; 251 case CREATE_STREAM: { 252 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 253 int width, height, format; 254 255 width = data.readInt32(); 256 ALOGV("%s: CREATE_STREAM: width = %d", __FUNCTION__, width); 257 height = data.readInt32(); 258 ALOGV("%s: CREATE_STREAM: height = %d", __FUNCTION__, height); 259 format = data.readInt32(); 260 ALOGV("%s: CREATE_STREAM: format = %d", __FUNCTION__, format); 261 262 sp<IGraphicBufferProducer> bp; 263 if (data.readInt32() != 0) { 264 String16 name = data.readString16(); 265 bp = interface_cast<IGraphicBufferProducer>( 266 data.readStrongBinder()); 267 268 ALOGV("%s: CREATE_STREAM: bp = %p, name = %s", __FUNCTION__, 269 bp.get(), String8(name).string()); 270 } else { 271 ALOGV("%s: CREATE_STREAM: bp = unset, name = unset", 272 __FUNCTION__); 273 } 274 275 status_t ret; 276 ret = createStream(width, height, format, bp); 277 278 reply->writeNoException(); 279 ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__); 280 reply->writeInt32(ret); 281 ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret); 282 283 return NO_ERROR; 284 } break; 285 286 case CREATE_DEFAULT_REQUEST: { 287 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 288 289 int templateId = data.readInt32(); 290 291 CameraMetadata request; 292 status_t ret; 293 ret = createDefaultRequest(templateId, &request); 294 295 reply->writeNoException(); 296 reply->writeInt32(ret); 297 298 // out-variables are after exception and return value 299 reply->writeInt32(1); // to mark presence of metadata object 300 request.writeToParcel(const_cast<Parcel*>(reply)); 301 302 return NO_ERROR; 303 } break; 304 case GET_CAMERA_INFO: { 305 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 306 307 CameraMetadata info; 308 status_t ret; 309 ret = getCameraInfo(&info); 310 311 reply->writeNoException(); 312 reply->writeInt32(ret); 313 314 // out-variables are after exception and return value 315 reply->writeInt32(1); // to mark presence of metadata object 316 info.writeToParcel(reply); 317 318 return NO_ERROR; 319 } break; 320 case WAIT_UNTIL_IDLE: { 321 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 322 reply->writeNoException(); 323 reply->writeInt32(waitUntilIdle()); 324 return NO_ERROR; 325 } break; 326 case FLUSH: { 327 CHECK_INTERFACE(ICameraDeviceUser, data, reply); 328 reply->writeNoException(); 329 reply->writeInt32(flush()); 330 return NO_ERROR; 331 } 332 default: 333 return BBinder::onTransact(code, data, reply, flags); 334 } 335} 336 337// ---------------------------------------------------------------------------- 338 339}; // namespace android 340