/* ** ** Copyright 2008, 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_CAMERA_HARDWARE_STUB_H #define ANDROID_HARDWARE_CAMERA_HARDWARE_STUB_H #include "FakeCamera.h" #include #include #include #include #include namespace android { class CameraHardwareStub : public CameraHardwareInterface { public: virtual sp getPreviewHeap() const; virtual sp getRawHeap() const; virtual void setCallbacks(notify_callback notify_cb, data_callback data_cb, data_callback_timestamp data_cb_timestamp, void* user); virtual void enableMsgType(int32_t msgType); virtual void disableMsgType(int32_t msgType); virtual bool msgTypeEnabled(int32_t msgType); virtual status_t startPreview(); virtual void stopPreview(); virtual bool previewEnabled(); 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(); virtual status_t cancelPicture(); virtual status_t dump(int fd, const Vector& args) const; virtual status_t setParameters(const CameraParameters& params); virtual CameraParameters getParameters() const; virtual status_t sendCommand(int32_t command, int32_t arg1, int32_t arg2); virtual status_t getBufferInfo( sp& Frame, size_t *alignedSize); virtual void encodeData(); virtual void release(); static sp createInstance(); virtual status_t takeLiveSnapshot(); private: CameraHardwareStub(); virtual ~CameraHardwareStub(); static const int kBufferCount = 4; class PreviewThread : public Thread { CameraHardwareStub* mHardware; public: PreviewThread(CameraHardwareStub* hw) : #ifdef SINGLE_PROCESS // In single process mode this thread needs to be a java thread, // since we won't be calling through the binder. Thread(true), #else Thread(false), #endif mHardware(hw) { } virtual void onFirstRef() { run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); } virtual bool threadLoop() { mHardware->previewThread(); // loop until we need to quit return true; } }; void initDefaultParameters(); void initHeapLocked(); int previewThread(); static int beginAutoFocusThread(void *cookie); int autoFocusThread(); static int beginPictureThread(void *cookie); int pictureThread(); mutable Mutex mLock; CameraParameters mParameters; sp mPreviewHeap; sp mRawHeap; sp mBuffers[kBufferCount]; FakeCamera *mFakeCamera; bool mPreviewRunning; int mPreviewFrameSize; // protected by mLock sp mPreviewThread; notify_callback mNotifyCb; data_callback mDataCb; data_callback_timestamp mDataCbTimestamp; void *mCallbackCookie; int32_t mMsgEnabled; // only used from PreviewThread int mCurrentPreviewFrame; }; }; // namespace android #endif