/* * Copyright (C) 2012 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_SERVERS_CAMERA_CAMERA2CLIENT_H #define ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H #include "Camera2Device.h" #include "CameraService.h" #include "camera2/Parameters.h" #include "camera2/FrameProcessor.h" #include "camera2/JpegProcessor.h" #include "camera2/ZslProcessor.h" #include "camera2/CaptureSequencer.h" #include "camera2/CallbackProcessor.h" #include #include #include #include namespace android { /** * Implements the android.hardware.camera API on top of * camera device HAL version 2. */ class Camera2Client : public CameraService::Client, public Camera2Device::NotificationListener { public: /** * ICamera interface (see ICamera for details) */ virtual void disconnect(); virtual status_t connect(const sp& client); virtual status_t lock(); virtual status_t unlock(); virtual status_t setPreviewDisplay(const sp& surface); virtual status_t setPreviewTexture( const sp& surfaceTexture); virtual void setPreviewCallbackFlag(int flag); virtual status_t startPreview(); virtual void stopPreview(); virtual bool previewEnabled(); virtual status_t storeMetaDataInBuffers(bool enabled); virtual status_t startRecording(); virtual void stopRecording(); virtual bool recordingEnabled(); virtual void releaseRecordingFrame(const sp& mem); virtual status_t autoFocus(); virtual status_t cancelAutoFocus(); virtual status_t takePicture(int msgType); virtual status_t setParameters(const String8& params); virtual String8 getParameters() const; virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); /** * Interface used by CameraService */ Camera2Client(const sp& cameraService, const sp& cameraClient, int cameraId, int cameraFacing, int clientPid); virtual ~Camera2Client(); status_t initialize(camera_module_t *module); virtual status_t dump(int fd, const Vector& args); /** * Interface used by Camera2Device */ virtual void notifyError(int errorCode, int arg1, int arg2); virtual void notifyShutter(int frameNumber, nsecs_t timestamp); virtual void notifyAutoFocus(uint8_t newState, int triggerId); virtual void notifyAutoExposure(uint8_t newState, int triggerId); virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId); /** * Interface used by independent components of Camera2Client. */ int getCameraId() const; const sp& getCameraDevice(); camera2::SharedParameters& getParameters(); int getPreviewStreamId() const; int getCaptureStreamId() const; int getCallbackStreamId() const; int getRecordingStreamId() const; int getZslStreamId() const; status_t registerFrameListener(int32_t id, wp listener); status_t removeFrameListener(int32_t id); // Simple class to ensure that access to ICameraClient is serialized by // requiring mCameraClientLock to be locked before access to mCameraClient // is possible. class SharedCameraClient { public: class Lock { public: Lock(SharedCameraClient &client); ~Lock(); sp &mCameraClient; private: SharedCameraClient &mSharedClient; }; SharedCameraClient(const sp& client); SharedCameraClient& operator=(const sp& client); void clear(); private: sp mCameraClient; mutable Mutex mCameraClientLock; } mSharedCameraClient; static size_t calculateBufferSize(int width, int height, int format, int stride); static const int32_t kPreviewRequestId = 1000; static const int32_t kRecordRequestId = 2000; static const int32_t kFirstCaptureRequestId = 3000; private: /** ICamera interface-related private members */ // Mutex that must be locked by methods implementing the ICamera interface. // Ensures serialization between incoming ICamera calls. All methods below // that append 'L' to the name assume that mICameraLock is locked when // they're called mutable Mutex mICameraLock; typedef camera2::Parameters Parameters; typedef camera2::CameraMetadata CameraMetadata; status_t setPreviewWindowL(const sp& binder, sp window); status_t startPreviewL(Parameters ¶ms, bool restart); void stopPreviewL(); status_t startRecordingL(Parameters ¶ms, bool restart); bool recordingEnabledL(); // Individual commands for sendCommand() status_t commandStartSmoothZoomL(); status_t commandStopSmoothZoomL(); status_t commandSetDisplayOrientationL(int degrees); status_t commandEnableShutterSoundL(bool enable); status_t commandPlayRecordingSoundL(); status_t commandStartFaceDetectionL(int type); status_t commandStopFaceDetectionL(Parameters ¶ms); status_t commandEnableFocusMoveMsgL(bool enable); status_t commandPingL(); status_t commandSetVideoBufferCountL(size_t count); // Current camera device configuration camera2::SharedParameters mParameters; /** Camera device-related private members */ void setPreviewCallbackFlagL(Parameters ¶ms, int flag); status_t updateRequests(const Parameters ¶ms); // Used with stream IDs static const int NO_STREAM = -1; sp mFrameProcessor; /* Preview related members */ int mPreviewStreamId; CameraMetadata mPreviewRequest; sp mPreviewSurface; sp mPreviewWindow; status_t updatePreviewRequest(const Parameters ¶ms); status_t updatePreviewStream(const Parameters ¶ms); /** Preview callback related members */ sp mCallbackProcessor; /* Still image capture related members */ sp mCaptureSequencer; sp mJpegProcessor; sp mZslProcessor; /* Recording related members */ int mRecordingStreamId; int mRecordingFrameCount; sp mRecordingConsumer; sp mRecordingWindow; // Simple listener that forwards frame available notifications from // a CPU consumer to the recording notification class RecordingWaiter: public BufferItemConsumer::FrameAvailableListener { public: RecordingWaiter(Camera2Client *parent) : mParent(parent) {} void onFrameAvailable() { mParent->onRecordingFrameAvailable(); } private: Camera2Client *mParent; }; sp mRecordingWaiter; CameraMetadata mRecordingRequest; sp mRecordingHeap; static const size_t kDefaultRecordingHeapCount = 8; size_t mRecordingHeapCount; Vector mRecordingBuffers; size_t mRecordingHeapHead, mRecordingHeapFree; // Handle new recording image buffers void onRecordingFrameAvailable(); status_t updateRecordingRequest(const Parameters ¶ms); status_t updateRecordingStream(const Parameters ¶ms); /** Notification-related members */ bool mAfInMotion; /** Camera2Device instance wrapping HAL2 entry */ sp mDevice; /** Utility members */ // Verify that caller is the owner of the camera status_t checkPid(const char *checkLocation) const; }; }; // namespace android #endif