19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2008, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_STUB_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_HARDWARE_CAMERA_HARDWARE_STUB_H
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "FakeCamera.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
23000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <camera/CameraHardwareInterface.h>
240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryBase.h>
250795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryHeapBase.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass CameraHardwareStub : public CameraHardwareInterface {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemoryHeap> getPreviewHeap() const;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemoryHeap> getRawHeap() const;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual void        setCallbacks(notify_callback notify_cb,
36da83f4674a564007baac03db062a289c8158d940Benny Wong                                     data_callback data_cb,
37da83f4674a564007baac03db062a289c8158d940Benny Wong                                     data_callback_timestamp data_cb_timestamp,
38da83f4674a564007baac03db062a289c8158d940Benny Wong                                     void* user);
39da83f4674a564007baac03db062a289c8158d940Benny Wong
40da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual void        enableMsgType(int32_t msgType);
41da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual void        disableMsgType(int32_t msgType);
42da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual bool        msgTypeEnabled(int32_t msgType);
43da83f4674a564007baac03db062a289c8158d940Benny Wong
44da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual status_t    startPreview();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        stopPreview();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool        previewEnabled();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual status_t    startRecording();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        stopRecording();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool        recordingEnabled();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        releaseRecordingFrame(const sp<IMemory>& mem);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual status_t    autoFocus();
54244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    virtual status_t    cancelAutoFocus();
55da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual status_t    takePicture();
56da83f4674a564007baac03db062a289c8158d940Benny Wong    virtual status_t    cancelPicture();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    dump(int fd, const Vector<String16>& args) const;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    setParameters(const CameraParameters& params);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual CameraParameters  getParameters() const;
6036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    virtual status_t    sendCommand(int32_t command, int32_t arg1,
6136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li                                    int32_t arg2);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void release();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static sp<CameraHardwareInterface> createInstance();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        CameraHardwareStub();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual             ~CameraHardwareStub();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static wp<CameraHardwareInterface> singleton;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const int kBufferCount = 4;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class PreviewThread : public Thread {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CameraHardwareStub* mHardware;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
77ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen        PreviewThread(CameraHardwareStub* hw) :
78ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen#ifdef SINGLE_PROCESS
79ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen            // In single process mode this thread needs to be a java thread,
80ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen            // since we won't be calling through the binder.
81ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen            Thread(true),
82ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen#else
83ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen            Thread(false),
84ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen#endif
85ae7f3c5dcb4e7bfd56afcd1f86a8f37888afb358Marco Nelissen              mHardware(hw) { }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void onFirstRef() {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual bool threadLoop() {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHardware->previewThread();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // loop until we need to quit
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initDefaultParameters();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initHeapLocked();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int previewThread();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int beginAutoFocusThread(void *cookie);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int autoFocusThread();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int beginPictureThread(void *cookie);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int pictureThread();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable Mutex       mLock;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CameraParameters    mParameters;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MemoryHeapBase>  mPreviewHeap;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MemoryHeapBase>  mRawHeap;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MemoryBase>      mBuffers[kBufferCount];
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FakeCamera          *mFakeCamera;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool                mPreviewRunning;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                 mPreviewFrameSize;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // protected by mLock
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<PreviewThread>   mPreviewThread;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
122da83f4674a564007baac03db062a289c8158d940Benny Wong    notify_callback    mNotifyCb;
123da83f4674a564007baac03db062a289c8158d940Benny Wong    data_callback      mDataCb;
124da83f4674a564007baac03db062a289c8158d940Benny Wong    data_callback_timestamp mDataCbTimestamp;
125da83f4674a564007baac03db062a289c8158d940Benny Wong    void               *mCallbackCookie;
126da83f4674a564007baac03db062a289c8158d940Benny Wong
127da83f4674a564007baac03db062a289c8158d940Benny Wong    int32_t             mMsgEnabled;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // only used from PreviewThread
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                 mCurrentPreviewFrame;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
136