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