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" 196773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <camera/CameraUtils.h> 204ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h> 214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 224ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/IMemory.h> 234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/Parcel.h> 246773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan#include <media/hardware/HardwareAPI.h> 254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <stdint.h> 264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <utils/Log.h> 274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Linamespace android { 294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lienum { 314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li START_RECORDING = IBinder::FIRST_CALL_TRANSACTION, 324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li STOP_RECORDING, 334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li RELEASE_RECORDING_FRAME, 342d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen RELEASE_RECORDING_FRAME_HANDLE, 354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 364ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass BpCameraRecordingProxy: public BpInterface<ICameraRecordingProxy> 394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lipublic: 414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li BpCameraRecordingProxy(const sp<IBinder>& impl) 424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li : BpInterface<ICameraRecordingProxy>(impl) 434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li status_t startRecording(const sp<ICameraRecordingProxyListener>& listener) 474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startRecording"); 494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 5106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li remote()->transact(START_RECORDING, data, &reply); 534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return reply.readInt32(); 544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 564ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void stopRecording() 574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopRecording"); 594ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 604ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li remote()->transact(STOP_RECORDING, data, &reply); 624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 634ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void releaseRecordingFrame(const sp<IMemory>& mem) 654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("releaseRecordingFrame"); 674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel data, reply; 684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 6906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(mem)); 702d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen remote()->transact(RELEASE_RECORDING_FRAME, data, &reply); 712d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 726773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan 732d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void releaseRecordingFrameHandle(native_handle_t *handle) { 742d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("releaseRecordingFrameHandle"); 752d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen Parcel data, reply; 762d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); 772d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen data.writeNativeHandle(handle); 786773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan 792d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen remote()->transact(RELEASE_RECORDING_FRAME_HANDLE, data, &reply); 806773d4777f4ccbbe6377e4ae1b42c117066ae6baPraveen Chavan 812d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // Close the native handle because camera received a dup copy. 822d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_close(handle); 832d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen native_handle_delete(handle); 844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiIMPLEMENT_META_INTERFACE(CameraRecordingProxy, "android.hardware.ICameraRecordingProxy"); 884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li// ---------------------------------------------------------------------- 904ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t BnCameraRecordingProxy::onTransact( 924ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li switch(code) { 954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case START_RECORDING: { 963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("START_RECORDING"); 974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxyListener> listener = 994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li interface_cast<ICameraRecordingProxyListener>(data.readStrongBinder()); 1004ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li reply->writeInt32(startRecording(listener)); 1014ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 1024ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 1034ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case STOP_RECORDING: { 1043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("STOP_RECORDING"); 1054ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 1064ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li stopRecording(); 1074ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 1084ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 1094ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li case RELEASE_RECORDING_FRAME: { 1103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("RELEASE_RECORDING_FRAME"); 1114ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 1124ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder()); 1134ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li releaseRecordingFrame(mem); 1144ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return NO_ERROR; 1154ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } break; 1162d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen case RELEASE_RECORDING_FRAME_HANDLE: { 1172d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("RELEASE_RECORDING_FRAME_HANDLE"); 1182d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen CHECK_INTERFACE(ICameraRecordingProxy, data, reply); 1194ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1202d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // releaseRecordingFrameHandle will be responsble to close the native handle. 1212d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen releaseRecordingFrameHandle(data.readNativeHandle()); 1222d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return NO_ERROR; 1232d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } break; 1244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li default: 1254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return BBinder::onTransact(code, data, reply, flags); 1264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 1274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 1284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li// ---------------------------------------------------------------------------- 1304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; // namespace android 1324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 133