/* ** ** 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 <utils/threads.h> #include <ui/CameraHardwareInterface.h> #include <binder/MemoryBase.h> #include <binder/MemoryHeapBase.h> #include <utils/threads.h> namespace android { class CameraHardwareStub : public CameraHardwareInterface { public: virtual sp<IMemoryHeap> getPreviewHeap() const; virtual sp<IMemoryHeap> getRawHeap() const; virtual status_t startPreview(preview_callback cb, void* user); virtual void stopPreview(); virtual bool previewEnabled(); virtual status_t startRecording(recording_callback cb, void* user); virtual void stopRecording(); virtual bool recordingEnabled(); virtual void releaseRecordingFrame(const sp<IMemory>& mem); virtual status_t autoFocus(autofocus_callback, void *user); virtual status_t takePicture(shutter_callback, raw_callback, jpeg_callback, void* user); virtual status_t cancelPicture(bool cancel_shutter, bool cancel_raw, bool cancel_jpeg); virtual status_t dump(int fd, const Vector<String16>& args) const; virtual status_t setParameters(const CameraParameters& params); virtual CameraParameters getParameters() const; virtual void release(); static sp<CameraHardwareInterface> createInstance(); private: CameraHardwareStub(); virtual ~CameraHardwareStub(); static wp<CameraHardwareInterface> singleton; static const int kBufferCount = 4; class PreviewThread : public Thread { CameraHardwareStub* mHardware; public: PreviewThread(CameraHardwareStub* hw) : Thread(false), 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<MemoryHeapBase> mPreviewHeap; sp<MemoryHeapBase> mRawHeap; sp<MemoryBase> mBuffers[kBufferCount]; FakeCamera *mFakeCamera; bool mPreviewRunning; int mPreviewFrameSize; shutter_callback mShutterCallback; raw_callback mRawPictureCallback; jpeg_callback mJpegPictureCallback; void *mPictureCallbackCookie; // protected by mLock sp<PreviewThread> mPreviewThread; preview_callback mPreviewCallback; void *mPreviewCallbackCookie; autofocus_callback mAutoFocusCallback; void *mAutoFocusCallbackCookie; // only used from PreviewThread int mCurrentPreviewFrame; }; }; // namespace android #endif