172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*
272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Copyright (C) Texas Instruments - http://www.ti.com/
372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng *
472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Licensed under the Apache License, Version 2.0 (the "License");
572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * you may not use this file except in compliance with the License.
672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * You may obtain a copy of the License at
772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng *
872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng *      http://www.apache.org/licenses/LICENSE-2.0
972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng *
1072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Unless required by applicable law or agreed to in writing, software
1172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * distributed under the License is distributed on an "AS IS" BASIS,
1272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * See the License for the specific language governing permissions and
1472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * limitations under the License.
1572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng */
1672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
1772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
1872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
1972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#include "CameraHal.h"
2072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#include <ui/GraphicBufferMapper.h>
2172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#include <hal_public.h>
2272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
23f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
24f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
2572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
2672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/**
2772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Display handler class - This class basically handles the buffer posting to display
2872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng */
2972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
3072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengclass ANativeWindowDisplayAdapter : public DisplayAdapter
3172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{
3272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
3372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
3472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    typedef struct
3572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CameraBuffer *mBuffer;
3772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        void *mUser;
3872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mOffset;
3972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mWidth;
4072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mHeight;
4172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mWidthStride;
4272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mHeightStride;
4372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mLength;
4472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        CameraFrame::FrameType mType;
4572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        } DisplayFrame;
4672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
4772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    enum DisplayStates
4872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
4972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_INIT = 0,
5072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_STARTED,
5172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_STOPPED,
5272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_EXITED
5372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        };
5472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
5572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
5672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
5772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ANativeWindowDisplayAdapter();
5872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual ~ANativeWindowDisplayAdapter();
5972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
6072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///Initializes the display adapter creates any resources required
6172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t initialize();
6272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
6372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setPreviewWindow(struct preview_stream_ops *window);
6472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setFrameProvider(FrameNotifier *frameProvider);
6572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setErrorHandler(ErrorNotifier *errorNotifier);
66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL);
6772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int disableDisplay(bool cancel_buffer = true);
6872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t pauseDisplay(bool pause);
6972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
7172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for shot to snapshot measurement
7372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t setSnapshotTimeRef(struct timeval *refTime = NULL);
7472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#endif
7672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual bool supportsExternalBuffering();
7872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Implementation of inherited interfaces
80f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer * allocateBufferList(int width, int height, const char* format, int &bytes, int numBufs);
81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual CameraBuffer *getBufferList(int *numBufs);
8272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual uint32_t * getOffsets() ;
8372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int getFd() ;
84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual int freeBufferList(CameraBuffer * buflist);
8572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t maxQueueableBuffers(unsigned int& queueable);
87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    virtual status_t minUndequeueableBuffers(int& unqueueable);
8872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
8972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///Class specific functions
9072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static void frameCallbackRelay(CameraFrame* caFrame);
9172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void frameCallback(CameraFrame* caFrame);
9272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
9372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void displayThread();
9472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
9572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    private:
9672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void destroy();
9772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool processHalMsg();
9872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    status_t PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame);
9972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool handleFrameReturn();
10072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    status_t returnBuffersToWindow();
10172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
10272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
10372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
10472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static const int DISPLAY_TIMEOUT;
10572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static const int FAILED_DQS_TO_SUSPEND;
10672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    class DisplayThread : public android::Thread
10872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
10972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        ANativeWindowDisplayAdapter* mDisplayAdapter;
110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        Utils::MessageQueue mDisplayThreadQ;
11172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
11272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        public:
11372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            DisplayThread(ANativeWindowDisplayAdapter* da)
11472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            : Thread(false), mDisplayAdapter(da) { }
11572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
11672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        ///Returns a reference to the display message Q for display adapter to post messages
117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            Utils::MessageQueue& msgQ()
11872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
11972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                return mDisplayThreadQ;
12072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                }
12172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
12272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            virtual bool threadLoop()
12372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
12472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                mDisplayAdapter->displayThread();
12572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                return false;
12672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                }
12772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
12872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            enum DisplayThreadCommands
12972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
13072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_START,
13172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_STOP,
13272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_FRAME,
13372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_EXIT
13472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                };
13572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        };
13672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
13772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //friend declarations
13872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengfriend class DisplayThread;
13972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
14072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengprivate:
14172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int postBuffer(void* displayBuf);
14272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
14372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengprivate:
14472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mFirstInit;
14572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mSuspend;
14672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mFailedDQs;
14772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mPaused; //Pause state
14872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    preview_stream_ops_t*  mANativeWindow;
149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<DisplayThread> mDisplayThread;
15072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    FrameProvider *mFrameProvider; ///Pointer to the frame provider interface
151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    Utils::MessageQueue mDisplayQ;
15272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    unsigned int mDisplayState;
15372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///@todo Have a common class for these members
154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    mutable android::Mutex mLock;
15572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mDisplayEnabled;
15672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mBufferCount;
157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraBuffer *mBuffers;
158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //buffer_handle_t** mBufferHandleMap; // -> frames[i].BufferHandle
159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    //IMG_native_handle_t** mGrallocHandleMap; // -> frames[i].GrallocHandle
160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    uint32_t* mOffsetsMap; // -> frames[i].Offset
16172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mFD;
162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<buffer_handle_t *, int> mFramesWithCameraAdapterMap;
163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::KeyedVector<int, int> mFramesType;
164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::sp<ErrorNotifier> mErrorNotifier;
16572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
16672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mFrameWidth;
16772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mFrameHeight;
16872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mPreviewWidth;
16972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mPreviewHeight;
17072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mXOff;
17272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mYOff;
17372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    const char *mPixelFormat;
17572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
17772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for calculating standby to first shot
17872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    struct timeval mStandbyToShot;
17972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mMeasureStandby;
18072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for shot to snapshot/shot calculation
18172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    struct timeval mStartCapture;
18272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mShotToShot;
18372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
18472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#endif
18572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
18672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng};
18772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
190