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, 38cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei SUBMIT_REQUEST_LIST, 39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CANCEL_REQUEST, 4029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk BEGIN_CONFIGURE, 4129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk END_CONFIGURE, 42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin DELETE_STREAM, 43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CREATE_STREAM, 44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CREATE_DEFAULT_REQUEST, 45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin GET_CAMERA_INFO, 462ab500c632569e2f131a1a2288459933da70c4eeZhijun He WAIT_UNTIL_IDLE, 4729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk FLUSH 48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 5088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkinnamespace { 5188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin // Read empty strings without printing a false error message. 5288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin String16 readMaybeEmptyString16(const Parcel& parcel) { 5388aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin size_t len; 5488aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin const char16_t* str = parcel.readString16Inplace(&len); 5588aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin if (str != NULL) { 5688aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin return String16(str, len); 5788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } else { 5888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin return String16(); 5988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } 6088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin } 6188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin}; 6288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin 63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass BpCameraDeviceUser : public BpInterface<ICameraDeviceUser> 64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic: 66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin BpCameraDeviceUser(const sp<IBinder>& impl) 67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin : BpInterface<ICameraDeviceUser>(impl) 68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // disconnect from camera service 72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin void disconnect() 73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("disconnect"); 75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(DISCONNECT, data, &reply); 78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 81cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t submitRequest(sp<CaptureRequest> request, bool repeating, 82cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) 83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = CaptureRequest 88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (request != 0) { 89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(1); 90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->writeToParcel(&data); 91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(0); 93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = streaming (bool) 96cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInt32(repeating); 97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(SUBMIT_REQUEST, data, &reply); 99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 101cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t res = reply.readInt32(); 102cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 103cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t resFrameNumber = BAD_VALUE; 104cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (reply.readInt32() != 0) { 105cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (lastFrameNumber != NULL) { 106cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resFrameNumber = reply.readInt64(lastFrameNumber); 107cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 108cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 109cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 110cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { 111cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = FAILED_TRANSACTION; 112cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 113cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return res; 114e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 116cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t submitRequestList(List<sp<CaptureRequest> > requestList, bool repeating, 117cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) 118cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei { 119cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei Parcel data, reply; 120cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 121cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 122cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInt32(requestList.size()); 123cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 124cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei for (List<sp<CaptureRequest> >::iterator it = requestList.begin(); 125cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei it != requestList.end(); ++it) { 126cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei sp<CaptureRequest> request = *it; 127cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (request != 0) { 128cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInt32(1); 129cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (request->writeToParcel(&data) != OK) { 130cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 131cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 132cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 133cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInt32(0); 134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 135cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 136cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 137cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei data.writeInt32(repeating); 138cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 139cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei remote()->transact(SUBMIT_REQUEST_LIST, data, &reply); 140cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 141cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply.readExceptionCode(); 142cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t res = reply.readInt32(); 143cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 144cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t resFrameNumber = BAD_VALUE; 145cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (reply.readInt32() != 0) { 146cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (lastFrameNumber != NULL) { 147cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resFrameNumber = reply.readInt64(lastFrameNumber); 148cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 149cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 150cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { 151cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = FAILED_TRANSACTION; 152cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 153cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return res; 154cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 155cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 156cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t cancelRequest(int requestId, int64_t *lastFrameNumber) 157e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(requestId); 161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CANCEL_REQUEST, data, &reply); 163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 165cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t res = reply.readInt32(); 166cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 167cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t resFrameNumber = BAD_VALUE; 168cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (reply.readInt32() != 0) { 169cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (lastFrameNumber != NULL) { 170cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = reply.readInt64(lastFrameNumber); 171cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 172cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 173cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { 174cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = FAILED_TRANSACTION; 175cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 176cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return res; 177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 178e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 17929478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk virtual status_t beginConfigure() 18029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk { 18129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk ALOGV("beginConfigure"); 18229478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk Parcel data, reply; 18329478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 18429478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk remote()->transact(BEGIN_CONFIGURE, data, &reply); 18529478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk reply.readExceptionCode(); 18629478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk return reply.readInt32(); 18729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk } 18829478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk 18929478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk virtual status_t endConfigure() 19029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk { 19129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk ALOGV("endConfigure"); 19229478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk Parcel data, reply; 19329478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 19429478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk remote()->transact(END_CONFIGURE, data, &reply); 19529478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk reply.readExceptionCode(); 19629478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk return reply.readInt32(); 19729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk } 19829478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk 199e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t deleteStream(int streamId) 200e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 201e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 202e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 203e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(streamId); 204e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 205e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(DELETE_STREAM, data, &reply); 206e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 207e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 208e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 209e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createStream(int width, int height, int format, 212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<IGraphicBufferProducer>& bufferProducer) 213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 215e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 216e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(width); 217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(height); 218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(format); 219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(1); // marker that bufferProducer is not null 221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeString16(String16("unknown_name")); // name of surface 222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<IBinder> b(bufferProducer->asBinder()); 223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeStrongBinder(b); 224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CREATE_STREAM, data, &reply); 226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return reply.readInt32(); 229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // Create a request object from a template. 232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin virtual status_t createDefaultRequest(int templateId, 233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin /*out*/ 234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata* request) 235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(templateId); 239e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply); 240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t result = reply.readInt32(); 243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata out; 245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (reply.readInt32() != 0) { 246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin out.readFromParcel(&reply); 247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (request != NULL) { 250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->swap(out); 251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return result; 253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 256099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin virtual status_t getCameraInfo(CameraMetadata* info) 257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 260e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(GET_CAMERA_INFO, data, &reply); 261e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 262e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply.readExceptionCode(); 263e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t result = reply.readInt32(); 264e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 265099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin CameraMetadata out; 266e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (reply.readInt32() != 0) { 267099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin out.readFromParcel(&reply); 268099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin } 269099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin 270099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin if (info != NULL) { 271099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin info->swap(out); 272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return result; 275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 2772ab500c632569e2f131a1a2288459933da70c4eeZhijun He virtual status_t waitUntilIdle() 2782ab500c632569e2f131a1a2288459933da70c4eeZhijun He { 2792ab500c632569e2f131a1a2288459933da70c4eeZhijun He ALOGV("waitUntilIdle"); 2802ab500c632569e2f131a1a2288459933da70c4eeZhijun He Parcel data, reply; 2812ab500c632569e2f131a1a2288459933da70c4eeZhijun He data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 2822ab500c632569e2f131a1a2288459933da70c4eeZhijun He remote()->transact(WAIT_UNTIL_IDLE, data, &reply); 2832ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply.readExceptionCode(); 2842ab500c632569e2f131a1a2288459933da70c4eeZhijun He return reply.readInt32(); 2852ab500c632569e2f131a1a2288459933da70c4eeZhijun He } 286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 287cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t flush(int64_t *lastFrameNumber) 288abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala { 289abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("flush"); 290abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Parcel data, reply; 291abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); 292abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala remote()->transact(FLUSH, data, &reply); 293abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala reply.readExceptionCode(); 294cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t res = reply.readInt32(); 295cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 296cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t resFrameNumber = BAD_VALUE; 297cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (reply.readInt32() != 0) { 298cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (lastFrameNumber != NULL) { 299cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = reply.readInt64(lastFrameNumber); 300cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 301cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 302cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { 303cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = FAILED_TRANSACTION; 304cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 305cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return res; 306abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala } 307abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 308e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate: 309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 311e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; 312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 313e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinIMPLEMENT_META_INTERFACE(CameraDeviceUser, 3147b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala "android.hardware.camera2.ICameraDeviceUser"); 315e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 316e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ---------------------------------------------------------------------- 317e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 318e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t BnCameraDeviceUser::onTransact( 319e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 320e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{ 321e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin switch(code) { 322e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case DISCONNECT: { 323e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("DISCONNECT"); 324e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 325e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin disconnect(); 326e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 327e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 328e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 329e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case SUBMIT_REQUEST: { 330e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg0 = request 333e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<CaptureRequest> request; 334e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (data.readInt32() != 0) { 335e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request = new CaptureRequest(); 336e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request->readFromParcel(const_cast<Parcel*>(&data)); 337e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 338e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 339e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // arg1 = streaming (bool) 340cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei bool repeating = data.readInt32(); 341e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 342e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // return code: requestId (int32) 343e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 344cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t lastFrameNumber = -1; 345cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(submitRequest(request, repeating, &lastFrameNumber)); 346cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(1); 347cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt64(lastFrameNumber); 348cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 349cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return NO_ERROR; 350cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } break; 351cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei case SUBMIT_REQUEST_LIST: { 352cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CHECK_INTERFACE(ICameraDeviceUser, data, reply); 353cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 354cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei List<sp<CaptureRequest> > requestList; 355cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int requestListSize = data.readInt32(); 356cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei for (int i = 0; i < requestListSize; i++) { 357cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (data.readInt32() != 0) { 358cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei sp<CaptureRequest> request = new CaptureRequest(); 359cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (request->readFromParcel(const_cast<Parcel*>(&data)) != OK) { 360cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 361cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 362cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei requestList.push_back(request); 363cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 364cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei sp<CaptureRequest> request = 0; 365cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei requestList.push_back(request); 366cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("A request is missing. Sending in null request."); 367cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 368cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 369cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 370cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei bool repeating = data.readInt32(); 371cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 372cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeNoException(); 373cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t lastFrameNumber = -1; 374cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(submitRequestList(requestList, repeating, &lastFrameNumber)); 375cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(1); 376cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt64(lastFrameNumber); 377e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 378e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 379e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 380e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CANCEL_REQUEST: { 381e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 382e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int requestId = data.readInt32(); 383e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 384cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t lastFrameNumber = -1; 385cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(cancelRequest(requestId, &lastFrameNumber)); 386cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(1); 387cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt64(lastFrameNumber); 388e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 389e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 390e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case DELETE_STREAM: { 391e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 392e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int streamId = data.readInt32(); 393e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 394e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(deleteStream(streamId)); 395e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 396e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 397e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CREATE_STREAM: { 398e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 399e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int width, height, format; 400e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 401e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin width = data.readInt32(); 402e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: width = %d", __FUNCTION__, width); 403e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin height = data.readInt32(); 404e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: height = %d", __FUNCTION__, height); 405e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin format = data.readInt32(); 406e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: format = %d", __FUNCTION__, format); 407e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 408e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<IGraphicBufferProducer> bp; 409e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin if (data.readInt32() != 0) { 41088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin String16 name = readMaybeEmptyString16(data); 411e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bp = interface_cast<IGraphicBufferProducer>( 412e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.readStrongBinder()); 413e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 414e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: bp = %p, name = %s", __FUNCTION__, 415e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin bp.get(), String8(name).string()); 416e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } else { 417e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: bp = unset, name = unset", 418e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin __FUNCTION__); 419e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 420e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 421e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 422e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ret = createStream(width, height, format, bp); 423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__); 426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret); 428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CREATE_DEFAULT_REQUEST: { 433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int templateId = data.readInt32(); 436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CameraMetadata request; 438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin ret = createDefaultRequest(templateId, &request); 440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 444099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin // out-variables are after exception and return value 445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(1); // to mark presence of metadata object 446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin request.writeToParcel(const_cast<Parcel*>(reply)); 447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case GET_CAMERA_INFO: { 451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraDeviceUser, data, reply); 452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 453099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin CameraMetadata info; 454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin status_t ret; 455099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin ret = getCameraInfo(&info); 456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeInt32(ret); 459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 460099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin // out-variables are after exception and return value 461099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin reply->writeInt32(1); // to mark presence of metadata object 462099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin info.writeToParcel(reply); 463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 4662ab500c632569e2f131a1a2288459933da70c4eeZhijun He case WAIT_UNTIL_IDLE: { 4672ab500c632569e2f131a1a2288459933da70c4eeZhijun He CHECK_INTERFACE(ICameraDeviceUser, data, reply); 4682ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply->writeNoException(); 4692ab500c632569e2f131a1a2288459933da70c4eeZhijun He reply->writeInt32(waitUntilIdle()); 4702ab500c632569e2f131a1a2288459933da70c4eeZhijun He return NO_ERROR; 4712ab500c632569e2f131a1a2288459933da70c4eeZhijun He } break; 472abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala case FLUSH: { 473abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala CHECK_INTERFACE(ICameraDeviceUser, data, reply); 474abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala reply->writeNoException(); 475cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t lastFrameNumber = -1; 476cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(flush(&lastFrameNumber)); 477cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt32(1); 478cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reply->writeInt64(lastFrameNumber); 479abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return NO_ERROR; 480abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala } 481b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk case BEGIN_CONFIGURE: { 482b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk CHECK_INTERFACE(ICameraDeviceUser, data, reply); 483b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk reply->writeNoException(); 484b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk reply->writeInt32(beginConfigure()); 485b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk return NO_ERROR; 486b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk } break; 487b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk case END_CONFIGURE: { 488b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk CHECK_INTERFACE(ICameraDeviceUser, data, reply); 489b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk reply->writeNoException(); 490b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk reply->writeInt32(endConfigure()); 491b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk return NO_ERROR; 492b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk } break; 493e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin default: 494e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return BBinder::onTransact(code, data, reply, flags); 495e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 496e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} 497e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 498e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ---------------------------------------------------------------------------- 499e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 500e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android 501