1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/* 2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** 3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Copyright 2013, The Android Open Source Project 4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** 5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License"); 6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** you may not use this file except in compliance with the License. 7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** You may obtain a copy of the License at 8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** 9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** http://www.apache.org/licenses/LICENSE-2.0 10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** 11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Unless required by applicable law or agreed to in writing, software 12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS, 13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** See the License for the specific language governing permissions and 15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** limitations under the License. 16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin*/ 17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// #define LOG_NDEBUG 0 19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define LOG_TAG "ICameraDeviceUser" 20e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Log.h> 21e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <stdint.h> 22e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <sys/types.h> 23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <binder/Parcel.h> 247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h> 25e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/IGraphicBufferProducer.h> 26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/Surface.h> 27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <camera/CameraMetadata.h> 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/CaptureRequest.h> 29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android { 31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::WritableBlob WritableBlob; 33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::ReadableBlob ReadableBlob; 34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinenum { 36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, 37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin SUBMIT_REQUEST, 38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CANCEL_REQUEST, 39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin DELETE_STREAM, 40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CREATE_STREAM, 41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CREATE_DEFAULT_REQUEST, 42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin GET_CAMERA_INFO, 432ab500c632569e2f131a1a2288459933da70c4eeZhijun He WAIT_UNTIL_IDLE, 44abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala FLUSH 45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 4788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkinnamespace { 4888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin // Read empty strings without printing a false error message. 4988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin String16 readMaybeEmptyString16(const Parcel& parcel) { 5088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin size_t len; 5188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin const char16_t* str = parcel.readString16Inplace(&len); 5288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin if (str != NULL) { 5388aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin return String16(str, len); 5488aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } else { 5588aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin return String16(); 5688aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } 5788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } 5888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin}; 5988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin 60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass BpCameraDeviceUser : public BpInterface<ICameraDeviceUser> 61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic: 63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin BpCameraDeviceUser(const sp<IBinder>& impl) 64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin : BpInterface<ICameraDeviceUser>(impl) 65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // disconnect from camera service 69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin void disconnect() 70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("disconnect"); 72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(DISCONNECT, data, &reply); 75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual int submitRequest(sp<CaptureRequest> request, bool streaming) 79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = CaptureRequest 84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (request != 0) { 85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(1); 86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->writeToParcel(&data); 87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(0); 89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = streaming (bool) 92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(streaming); 93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(SUBMIT_REQUEST, data, &reply); 95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t cancelRequest(int requestId) 101e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 102e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 103e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 104e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(requestId); 105e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CANCEL_REQUEST, data, &reply); 107e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 108e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 109e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t deleteStream(int streamId) 113e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 114e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(streamId); 117e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 118e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(DELETE_STREAM, data, &reply); 119e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 120e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 121e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 123e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 124e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createStream(int width, int height, int format, 125e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<IGraphicBufferProducer>& bufferProducer) 126e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 127e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 128e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 129e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(width); 130e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(height); 131e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(format); 132e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 133e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(1); // marker that bufferProducer is not null 134e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeString16(String16("unknown_name")); // name of surface 135e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<IBinder> b(bufferProducer->asBinder()); 136e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeStrongBinder(b); 137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CREATE_STREAM, data, &reply); 139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Create a request object from a template. 145e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createDefaultRequest(int templateId, 146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /*out*/ 147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata* request) 148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(templateId); 152e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply); 153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 155e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t result = reply.readInt32(); 156e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 157e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata out; 158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (reply.readInt32() != 0) { 159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin out.readFromParcel(&reply); 160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (request != NULL) { 163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->swap(out); 164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 165e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return result; 166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 168e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 169099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin virtual status_t getCameraInfo(CameraMetadata* info) 170e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 173e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(GET_CAMERA_INFO, data, &reply); 174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 175e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 176e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t result = reply.readInt32(); 177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 178099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin CameraMetadata out; 179e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (reply.readInt32() != 0) { 180099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin out.readFromParcel(&reply); 181099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin } 182099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin 183099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin if (info != NULL) { 184099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin info->swap(out); 185e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 186e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 187e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return result; 188e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 189e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 1902ab500c632569e2f131a1a2288459933da70c4eeZhijun He virtual status_t waitUntilIdle() 1912ab500c632569e2f131a1a2288459933da70c4eeZhijun He { 1922ab500c632569e2f131a1a2288459933da70c4eeZhijun He ALOGV("waitUntilIdle"); 1932ab500c632569e2f131a1a2288459933da70c4eeZhijun He Parcel data, reply; 1942ab500c632569e2f131a1a2288459933da70c4eeZhijun He data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 1952ab500c632569e2f131a1a2288459933da70c4eeZhijun He remote()->transact(WAIT_UNTIL_IDLE, data, &reply); 1962ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply.readExceptionCode(); 1972ab500c632569e2f131a1a2288459933da70c4eeZhijun He return reply.readInt32(); 1982ab500c632569e2f131a1a2288459933da70c4eeZhijun He } 199e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 200abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala virtual status_t flush() 201abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala { 202abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("flush"); 203abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Parcel data, reply; 204abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 205abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala remote()->transact(FLUSH, data, &reply); 206abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala reply.readExceptionCode(); 207abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return reply.readInt32(); 208abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala } 209abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate: 211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 215e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinIMPLEMENT_META_INTERFACE(CameraDeviceUser, 2167b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala "android.hardware.camera2.ICameraDeviceUser"); 217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ---------------------------------------------------------------------- 219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t BnCameraDeviceUser::onTransact( 221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin switch(code) { 224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case DISCONNECT: { 225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("DISCONNECT"); 226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin disconnect(); 228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case SUBMIT_REQUEST: { 232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = request 235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<CaptureRequest> request; 236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (data.readInt32() != 0) { 237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request = new CaptureRequest(); 238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->readFromParcel(const_cast<Parcel*>(&data)); 239e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = streaming (bool) 242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bool streaming = data.readInt32(); 243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // return code: requestId (int32) 245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(submitRequest(request, streaming)); 247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CANCEL_REQUEST: { 251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int requestId = data.readInt32(); 253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(cancelRequest(requestId)); 255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 256e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case DELETE_STREAM: { 258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int streamId = data.readInt32(); 260e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 261e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(deleteStream(streamId)); 262e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 263e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 264e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CREATE_STREAM: { 265e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 266e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int width, height, format; 267e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 268e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin width = data.readInt32(); 269e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: width = %d", __FUNCTION__, width); 270e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin height = data.readInt32(); 271e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: height = %d", __FUNCTION__, height); 272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin format = data.readInt32(); 273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: format = %d", __FUNCTION__, format); 274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<IGraphicBufferProducer> bp; 276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (data.readInt32() != 0) { 27788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin String16 name = readMaybeEmptyString16(data); 278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bp = interface_cast<IGraphicBufferProducer>( 279e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.readStrongBinder()); 280e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 281e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: bp = %p, name = %s", __FUNCTION__, 282e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bp.get(), String8(name).string()); 283e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 284e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: bp = unset, name = unset", 285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 287e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 288e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 289e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ret = createStream(width, height, format, bp); 290e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 291e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 292e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__); 293e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret); 295e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 296e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CREATE_DEFAULT_REQUEST: { 300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 302e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int templateId = data.readInt32(); 303e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 304e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata request; 305e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 306e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ret = createDefaultRequest(templateId, &request); 307e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 308e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 311099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin // out-variables are after exception and return value 312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(1); // to mark presence of metadata object 313e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request.writeToParcel(const_cast<Parcel*>(reply)); 314e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 315e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 316e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 317e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case GET_CAMERA_INFO: { 318e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 319e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 320099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin CameraMetadata info; 321e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 322099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin ret = getCameraInfo(&info); 323e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 324e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 325e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 326e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 327099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin // out-variables are after exception and return value 328099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin reply->writeInt32(1); // to mark presence of metadata object 329099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin info.writeToParcel(reply); 330e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 3332ab500c632569e2f131a1a2288459933da70c4eeZhijun He case WAIT_UNTIL_IDLE: { 3342ab500c632569e2f131a1a2288459933da70c4eeZhijun He CHECK_INTERFACE(ICameraDeviceUser, data, reply); 3352ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply->writeNoException(); 3362ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply->writeInt32(waitUntilIdle()); 3372ab500c632569e2f131a1a2288459933da70c4eeZhijun He return NO_ERROR; 3382ab500c632569e2f131a1a2288459933da70c4eeZhijun He } break; 339abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala case FLUSH: { 340abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala CHECK_INTERFACE(ICameraDeviceUser, data, reply); 341abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala reply->writeNoException(); 342abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala reply->writeInt32(flush()); 343abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return NO_ERROR; 344abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala } 345e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin default: 346e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BBinder::onTransact(code, data, reply, flags); 347e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 348e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 349e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 350e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ---------------------------------------------------------------------------- 351e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 352e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android 353