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#ifndef ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H 184ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#define ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H 194ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 204ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/IInterface.h> 214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <utils/RefBase.h> 224ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Linamespace android { 244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass ICameraRecordingProxyListener; 264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass IMemory; 274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass Parcel; 284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li/* 304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * The purpose of ICameraRecordingProxy and ICameraRecordingProxyListener is to 314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * allow applications using the camera during recording. 324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * Camera service allows only one client at a time. Since camcorder application 344ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * needs to own the camera to do things like zoom, the media recorder cannot 354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * access the camera directly during recording. So ICameraRecordingProxy is a 364ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * proxy of ICamera, which allows the media recorder to start/stop the recording 374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * and release recording frames. ICameraRecordingProxyListener is an interface 384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * that allows the recorder to receive video frames during recording. 394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * ICameraRecordingProxy 414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * startRecording() 424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * stopRecording() 434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * releaseRecordingFrame() 444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * ICameraRecordingProxyListener 464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * dataCallbackTimestamp() 474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * The camcorder app opens the camera and starts the preview. The app passes 494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * ICamera and ICameraRecordingProxy to the media recorder by 504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * MediaRecorder::setCamera(). The recorder uses ICamera to setup the camera in 514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * MediaRecorder::start(). After setup, the recorder disconnects from camera 524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * service. The recorder calls ICameraRecordingProxy::startRecording() and 534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * passes a ICameraRecordingProxyListener to the app. The app connects back to 544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * camera service and starts the recording. The app owns the camera and can do 554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * things like zoom. The media recorder receives the video frames from the 564ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * listener and releases them by ICameraRecordingProxy::releaseRecordingFrame. 574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * The recorder calls ICameraRecordingProxy::stopRecording() to stop the 584ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * recording. 594ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 604ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * The call sequences are as follows: 614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 1. The app: Camera.unlock(). 624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 2. The app: MediaRecorder.setCamera(). 634ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 3. Start recording 644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (1) The app: MediaRecorder.start(). 654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (2) The recorder: ICamera.unlock() and ICamera.disconnect(). 664ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (3) The recorder: ICameraRecordingProxy.startRecording(). 674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (4) The app: ICamera.reconnect(). 684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (5) The app: ICamera.startRecording(). 694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 4. During recording 704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (1) The recorder: receive frames from ICameraRecordingProxyListener.dataCallbackTimestamp() 714ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (2) The recorder: release frames by ICameraRecordingProxy.releaseRecordingFrame(). 724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * 5. Stop recording 734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (1) The app: MediaRecorder.stop() 744ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (2) The recorder: ICameraRecordingProxy.stopRecording(). 754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li * (3) The app: ICamera.stopRecording(). 764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li */ 774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass ICameraRecordingProxy: public IInterface 794ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lipublic: 814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li DECLARE_META_INTERFACE(CameraRecordingProxy); 824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener) = 0; 844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void stopRecording() = 0; 854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; 864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li// ---------------------------------------------------------------------------- 894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 904ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass BnCameraRecordingProxy: public BnInterface<ICameraRecordingProxy> 914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 924ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lipublic: 934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual status_t onTransact( uint32_t code, 944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li const Parcel& data, 954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Parcel* reply, 964ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li uint32_t flags = 0); 974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; 984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}; // namespace android 1004ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1014ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#endif 102