Loading core/java/android/hardware/Camera.java +14 −5 Original line number Diff line number Diff line Loading @@ -288,7 +288,8 @@ public class Camera { * you can call {@link #reconnect()} to reclaim the camera. * * <p>This must be done before calling * {@link android.media.MediaRecorder#setCamera(Camera)}. * {@link android.media.MediaRecorder#setCamera(Camera)}. This cannot be * called after recording starts. * * <p>If you are not recording video, you probably do not need this method. * Loading @@ -301,6 +302,11 @@ public class Camera { * Camera objects are locked by default unless {@link #unlock()} is * called. Normally {@link #reconnect()} is used instead. * * <p>Since API level 13, camera is automatically locked for applications in * {@link android.media.MediaRecorder#start()}. Applications can use the * camera (ex: zoom) after recording starts. There is no need to call this * after recording starts or stops. * * <p>If you are not recording video, you probably do not need this method. * * @throws RuntimeException if the camera cannot be re-locked (for Loading @@ -315,9 +321,10 @@ public class Camera { * which will re-acquire the lock and allow you to continue using the * camera. * * <p>This must be done after {@link android.media.MediaRecorder} is * done recording if {@link android.media.MediaRecorder#setCamera(Camera)} * was used. * <p>Since API level 13, camera is automatically locked for applications in * {@link android.media.MediaRecorder#start()}. Applications can use the * camera (ex: zoom) after recording starts. There is no need to call this * after recording starts or stops. * * <p>If you are not recording video, you probably do not need this method. * Loading Loading @@ -827,7 +834,9 @@ public class Camera { * <p>This method is only valid when preview is active (after * {@link #startPreview()}). Preview will be stopped after the image is * taken; callers must call {@link #startPreview()} again if they want to * re-start preview or take more pictures. * re-start preview or take more pictures. This should not be called between * {@link android.media.MediaRecorder#start()} and * {@link android.media.MediaRecorder#stop()}. * * <p>After calling this method, you must not call {@link #startPreview()} * or take another picture until the JPEG callback has returned. Loading include/camera/Camera.h +22 −3 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ #define ANDROID_HARDWARE_CAMERA_H #include <utils/Timers.h> #include <camera/ICameraClient.h> #include <gui/ISurfaceTexture.h> #include <system/camera.h> #include <camera/ICameraClient.h> #include <camera/ICameraRecordingProxy.h> #include <camera/ICameraRecordingProxyListener.h> namespace android { Loading Loading @@ -70,7 +72,7 @@ public: static status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo); static sp<Camera> connect(int cameraId); ~Camera(); virtual ~Camera(); void init(); status_t reconnect(); Loading Loading @@ -129,8 +131,11 @@ public: status_t storeMetaDataInBuffers(bool enabled); void setListener(const sp<CameraListener>& listener); void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); void setPreviewCallbackFlags(int preview_callback_flag); sp<ICameraRecordingProxy> getRecordingProxy(); // ICameraClient interface virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr); Loading @@ -138,6 +143,20 @@ public: sp<ICamera> remote(); class RecordingProxy : public BnCameraRecordingProxy { public: RecordingProxy(const sp<Camera>& camera); // ICameraRecordingProxy interface virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); virtual void stopRecording(); virtual void releaseRecordingFrame(const sp<IMemory>& mem); private: sp<Camera> mCamera; }; private: Camera(); Camera(const Camera&); Loading @@ -162,12 +181,12 @@ private: status_t mStatus; sp<CameraListener> mListener; sp<ICameraRecordingProxyListener> mRecordingProxyListener; friend class DeathNotifier; static Mutex mLock; static sp<ICameraService> mCameraService; }; }; // namespace android Loading include/camera/ICameraRecordingProxy.h 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H #define ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H #include <binder/IInterface.h> #include <utils/RefBase.h> namespace android { class ICameraRecordingProxyListener; class IMemory; class Parcel; /* * The purpose of ICameraRecordingProxy and ICameraRecordingProxyListener is to * allow applications using the camera during recording. * * Camera service allows only one client at a time. Since camcorder application * needs to own the camera to do things like zoom, the media recorder cannot * access the camera directly during recording. So ICameraRecordingProxy is a * proxy of ICamera, which allows the media recorder to start/stop the recording * and release recording frames. ICameraRecordingProxyListener is an interface * that allows the recorder to receive video frames during recording. * * ICameraRecordingProxy * startRecording() * stopRecording() * releaseRecordingFrame() * * ICameraRecordingProxyListener * dataCallbackTimestamp() * The camcorder app opens the camera and starts the preview. The app passes * ICamera and ICameraRecordingProxy to the media recorder by * MediaRecorder::setCamera(). The recorder uses ICamera to setup the camera in * MediaRecorder::start(). After setup, the recorder disconnects from camera * service. The recorder calls ICameraRecordingProxy::startRecording() and * passes a ICameraRecordingProxyListener to the app. The app connects back to * camera service and starts the recording. The app owns the camera and can do * things like zoom. The media recorder receives the video frames from the * listener and releases them by ICameraRecordingProxy::releaseRecordingFrame. * The recorder calls ICameraRecordingProxy::stopRecording() to stop the * recording. * * The call sequences are as follows: * 1. The app: Camera.unlock(). * 2. The app: MediaRecorder.setCamera(). * 3. Start recording * (1) The app: MediaRecorder.start(). * (2) The recorder: ICamera.unlock() and ICamera.disconnect(). * (3) The recorder: ICameraRecordingProxy.startRecording(). * (4) The app: ICamera.reconnect(). * (5) The app: ICamera.startRecording(). * 4. During recording * (1) The recorder: receive frames from ICameraRecordingProxyListener.dataCallbackTimestamp() * (2) The recorder: release frames by ICameraRecordingProxy.releaseRecordingFrame(). * 5. Stop recording * (1) The app: MediaRecorder.stop() * (2) The recorder: ICameraRecordingProxy.stopRecording(). * (3) The app: ICamera.stopRecording(). */ class ICameraRecordingProxy: public IInterface { public: DECLARE_META_INTERFACE(CameraRecordingProxy); virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener) = 0; virtual void stopRecording() = 0; virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; }; // ---------------------------------------------------------------------------- class BnCameraRecordingProxy: public BnInterface<ICameraRecordingProxy> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; }; // namespace android #endif include/camera/ICameraRecordingProxyListener.h 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_LISTENER_H #define ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_LISTENER_H #include <binder/IInterface.h> #include <stdint.h> #include <utils/RefBase.h> #include <utils/Timers.h> namespace android { class Parcel; class IMemory; class ICameraRecordingProxyListener: public IInterface { public: DECLARE_META_INTERFACE(CameraRecordingProxyListener); virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) = 0; }; // ---------------------------------------------------------------------------- class BnCameraRecordingProxyListener: public BnInterface<ICameraRecordingProxyListener> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; }; // namespace android #endif include/media/IMediaRecorder.h +24 −22 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ namespace android { class Surface; class ICamera; class ICameraRecordingProxy; class IMediaRecorderClient; class IMediaRecorder: public IInterface Loading @@ -31,7 +32,8 @@ class IMediaRecorder: public IInterface public: DECLARE_META_INTERFACE(MediaRecorder); virtual status_t setCamera(const sp<ICamera>& camera) = 0; virtual status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy) = 0; virtual status_t setPreviewSurface(const sp<Surface>& surface) = 0; virtual status_t setVideoSource(int vs) = 0; virtual status_t setAudioSource(int as) = 0; Loading Loading
core/java/android/hardware/Camera.java +14 −5 Original line number Diff line number Diff line Loading @@ -288,7 +288,8 @@ public class Camera { * you can call {@link #reconnect()} to reclaim the camera. * * <p>This must be done before calling * {@link android.media.MediaRecorder#setCamera(Camera)}. * {@link android.media.MediaRecorder#setCamera(Camera)}. This cannot be * called after recording starts. * * <p>If you are not recording video, you probably do not need this method. * Loading @@ -301,6 +302,11 @@ public class Camera { * Camera objects are locked by default unless {@link #unlock()} is * called. Normally {@link #reconnect()} is used instead. * * <p>Since API level 13, camera is automatically locked for applications in * {@link android.media.MediaRecorder#start()}. Applications can use the * camera (ex: zoom) after recording starts. There is no need to call this * after recording starts or stops. * * <p>If you are not recording video, you probably do not need this method. * * @throws RuntimeException if the camera cannot be re-locked (for Loading @@ -315,9 +321,10 @@ public class Camera { * which will re-acquire the lock and allow you to continue using the * camera. * * <p>This must be done after {@link android.media.MediaRecorder} is * done recording if {@link android.media.MediaRecorder#setCamera(Camera)} * was used. * <p>Since API level 13, camera is automatically locked for applications in * {@link android.media.MediaRecorder#start()}. Applications can use the * camera (ex: zoom) after recording starts. There is no need to call this * after recording starts or stops. * * <p>If you are not recording video, you probably do not need this method. * Loading Loading @@ -827,7 +834,9 @@ public class Camera { * <p>This method is only valid when preview is active (after * {@link #startPreview()}). Preview will be stopped after the image is * taken; callers must call {@link #startPreview()} again if they want to * re-start preview or take more pictures. * re-start preview or take more pictures. This should not be called between * {@link android.media.MediaRecorder#start()} and * {@link android.media.MediaRecorder#stop()}. * * <p>After calling this method, you must not call {@link #startPreview()} * or take another picture until the JPEG callback has returned. Loading
include/camera/Camera.h +22 −3 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ #define ANDROID_HARDWARE_CAMERA_H #include <utils/Timers.h> #include <camera/ICameraClient.h> #include <gui/ISurfaceTexture.h> #include <system/camera.h> #include <camera/ICameraClient.h> #include <camera/ICameraRecordingProxy.h> #include <camera/ICameraRecordingProxyListener.h> namespace android { Loading Loading @@ -70,7 +72,7 @@ public: static status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo); static sp<Camera> connect(int cameraId); ~Camera(); virtual ~Camera(); void init(); status_t reconnect(); Loading Loading @@ -129,8 +131,11 @@ public: status_t storeMetaDataInBuffers(bool enabled); void setListener(const sp<CameraListener>& listener); void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); void setPreviewCallbackFlags(int preview_callback_flag); sp<ICameraRecordingProxy> getRecordingProxy(); // ICameraClient interface virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr); Loading @@ -138,6 +143,20 @@ public: sp<ICamera> remote(); class RecordingProxy : public BnCameraRecordingProxy { public: RecordingProxy(const sp<Camera>& camera); // ICameraRecordingProxy interface virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); virtual void stopRecording(); virtual void releaseRecordingFrame(const sp<IMemory>& mem); private: sp<Camera> mCamera; }; private: Camera(); Camera(const Camera&); Loading @@ -162,12 +181,12 @@ private: status_t mStatus; sp<CameraListener> mListener; sp<ICameraRecordingProxyListener> mRecordingProxyListener; friend class DeathNotifier; static Mutex mLock; static sp<ICameraService> mCameraService; }; }; // namespace android Loading
include/camera/ICameraRecordingProxy.h 0 → 100644 +101 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H #define ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_H #include <binder/IInterface.h> #include <utils/RefBase.h> namespace android { class ICameraRecordingProxyListener; class IMemory; class Parcel; /* * The purpose of ICameraRecordingProxy and ICameraRecordingProxyListener is to * allow applications using the camera during recording. * * Camera service allows only one client at a time. Since camcorder application * needs to own the camera to do things like zoom, the media recorder cannot * access the camera directly during recording. So ICameraRecordingProxy is a * proxy of ICamera, which allows the media recorder to start/stop the recording * and release recording frames. ICameraRecordingProxyListener is an interface * that allows the recorder to receive video frames during recording. * * ICameraRecordingProxy * startRecording() * stopRecording() * releaseRecordingFrame() * * ICameraRecordingProxyListener * dataCallbackTimestamp() * The camcorder app opens the camera and starts the preview. The app passes * ICamera and ICameraRecordingProxy to the media recorder by * MediaRecorder::setCamera(). The recorder uses ICamera to setup the camera in * MediaRecorder::start(). After setup, the recorder disconnects from camera * service. The recorder calls ICameraRecordingProxy::startRecording() and * passes a ICameraRecordingProxyListener to the app. The app connects back to * camera service and starts the recording. The app owns the camera and can do * things like zoom. The media recorder receives the video frames from the * listener and releases them by ICameraRecordingProxy::releaseRecordingFrame. * The recorder calls ICameraRecordingProxy::stopRecording() to stop the * recording. * * The call sequences are as follows: * 1. The app: Camera.unlock(). * 2. The app: MediaRecorder.setCamera(). * 3. Start recording * (1) The app: MediaRecorder.start(). * (2) The recorder: ICamera.unlock() and ICamera.disconnect(). * (3) The recorder: ICameraRecordingProxy.startRecording(). * (4) The app: ICamera.reconnect(). * (5) The app: ICamera.startRecording(). * 4. During recording * (1) The recorder: receive frames from ICameraRecordingProxyListener.dataCallbackTimestamp() * (2) The recorder: release frames by ICameraRecordingProxy.releaseRecordingFrame(). * 5. Stop recording * (1) The app: MediaRecorder.stop() * (2) The recorder: ICameraRecordingProxy.stopRecording(). * (3) The app: ICamera.stopRecording(). */ class ICameraRecordingProxy: public IInterface { public: DECLARE_META_INTERFACE(CameraRecordingProxy); virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener) = 0; virtual void stopRecording() = 0; virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; }; // ---------------------------------------------------------------------------- class BnCameraRecordingProxy: public BnInterface<ICameraRecordingProxy> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; }; // namespace android #endif
include/camera/ICameraRecordingProxyListener.h 0 → 100644 +52 −0 Original line number Diff line number Diff line /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_LISTENER_H #define ANDROID_HARDWARE_ICAMERA_RECORDING_PROXY_LISTENER_H #include <binder/IInterface.h> #include <stdint.h> #include <utils/RefBase.h> #include <utils/Timers.h> namespace android { class Parcel; class IMemory; class ICameraRecordingProxyListener: public IInterface { public: DECLARE_META_INTERFACE(CameraRecordingProxyListener); virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) = 0; }; // ---------------------------------------------------------------------------- class BnCameraRecordingProxyListener: public BnInterface<ICameraRecordingProxyListener> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; }; // namespace android #endif
include/media/IMediaRecorder.h +24 −22 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ namespace android { class Surface; class ICamera; class ICameraRecordingProxy; class IMediaRecorderClient; class IMediaRecorder: public IInterface Loading @@ -31,7 +32,8 @@ class IMediaRecorder: public IInterface public: DECLARE_META_INTERFACE(MediaRecorder); virtual status_t setCamera(const sp<ICamera>& camera) = 0; virtual status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy) = 0; virtual status_t setPreviewSurface(const sp<Surface>& surface) = 0; virtual status_t setVideoSource(int vs) = 0; virtual status_t setAudioSource(int as) = 0; Loading