14ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li/* 24ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * Copyright (C) 2011 The Android Open Source Project 34ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 44ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 54ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * you may not use this file except in compliance with the License. 64ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * You may obtain a copy of the License at 74ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 84ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 94ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 104ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * Unless required by applicable law or agreed to in writing, software 114ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 124ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * See the License for the specific language governing permissions and 144ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * limitations under the License. 154ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li */ 164ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 174ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li//#define LOG_NDEBUG 0 184ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#define LOG_TAG "ICameraRecordingProxy" 194ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h> 204ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/IMemory.h> 224ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/Parcel.h> 234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <stdint.h> 244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <utils/Log.h> 254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Linamespace android { 274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lienum { 294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li START_RECORDING = IBinder::FIRST_CALL_TRANSACTION, 304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li STOP_RECORDING, 314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li RELEASE_RECORDING_FRAME, 324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 344ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass BpCameraRecordingProxy: public BpInterface<ICameraRecordingProxy> 364ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lipublic: 384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li BpCameraRecordingProxy(const sp<IBinder>& impl) 394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li : BpInterface<ICameraRecordingProxy>(impl) 404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li status_t startRecording(const sp<ICameraRecordingProxyListener>& listener) 444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startRecording"); 464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeStrongBinder(listener->asBinder()); 494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li remote()->transact(START_RECORDING, data, &reply); 504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return reply.readInt32(); 514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void stopRecording() 544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopRecording"); 564ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 584ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li remote()->transact(STOP_RECORDING, data, &reply); 594ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 604ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void releaseRecordingFrame(const sp<IMemory>& mem) 624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("releaseRecordingFrame"); 644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 664ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeStrongBinder(mem->asBinder()); 674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li remote()->transact(RELEASE_RECORDING_FRAME, data, &reply); 684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 714ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiIMPLEMENT_META_INTERFACE(CameraRecordingProxy, "android.hardware.ICameraRecordingProxy"); 724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li// ---------------------------------------------------------------------- 744ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t BnCameraRecordingProxy::onTransact( 764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li switch(code) { 794ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case START_RECORDING: { 803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("START_RECORDING"); 814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxyListener> listener = 834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li interface_cast<ICameraRecordingProxyListener>(data.readStrongBinder()); 844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li reply->writeInt32(startRecording(listener)); 854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case STOP_RECORDING: { 883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("STOP_RECORDING"); 894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 904ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li stopRecording(); 914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 924ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case RELEASE_RECORDING_FRAME: { 943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("RELEASE_RECORDING_FRAME"); 954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 964ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder()); 974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li releaseRecordingFrame(mem); 984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 1004ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1014ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li default: 1024ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return BBinder::onTransact(code, data, reply, flags); 1034ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 1044ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 1054ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1064ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li// ---------------------------------------------------------------------------- 1074ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1084ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; // namespace android 1094ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 110