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