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
2372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng//temporarily define format here
2472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#define HAL_PIXEL_FORMAT_TI_NV12 0x100
2572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
2672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengnamespace android {
2772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
2872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/**
2972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Display handler class - This class basically handles the buffer posting to display
3072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng */
3172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
3272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengclass ANativeWindowDisplayAdapter : public DisplayAdapter
3372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{
3472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
3572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
3672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    typedef struct
3772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
3872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        void *mBuffer;
3972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        void *mUser;
4072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mOffset;
4172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mWidth;
4272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mHeight;
4372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mWidthStride;
4472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mHeightStride;
4572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        int mLength;
4672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        CameraFrame::FrameType mType;
4772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        } DisplayFrame;
4872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
4972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    enum DisplayStates
5072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
5172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_INIT = 0,
5272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_STARTED,
5372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_STOPPED,
5472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        DISPLAY_EXITED
5572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        };
5672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
5772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
5872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
5972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ANativeWindowDisplayAdapter();
6072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual ~ANativeWindowDisplayAdapter();
6172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
6272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///Initializes the display adapter creates any resources required
6372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t initialize();
6472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
6572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setPreviewWindow(struct preview_stream_ops *window);
6672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setFrameProvider(FrameNotifier *frameProvider);
6772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int setErrorHandler(ErrorNotifier *errorNotifier);
6872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL, S3DParameters *s3dParams = NULL);
6972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int disableDisplay(bool cancel_buffer = true);
7072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t pauseDisplay(bool pause);
7172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
7372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for shot to snapshot measurement
7572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual status_t setSnapshotTimeRef(struct timeval *refTime = NULL);
7672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#endif
7872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
7972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int useBuffers(void* bufArr, int num);
8072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual bool supportsExternalBuffering();
8172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
8272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Implementation of inherited interfaces
8372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs);
8472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual uint32_t * getOffsets() ;
8572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int getFd() ;
8672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int freeBuffer(void* buf);
8772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
8872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    virtual int maxQueueableBuffers(unsigned int& queueable);
8972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
9072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///Class specific functions
9172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static void frameCallbackRelay(CameraFrame* caFrame);
9272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void frameCallback(CameraFrame* caFrame);
9372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
9472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void displayThread();
9572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
9672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    private:
9772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    void destroy();
9872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool processHalMsg();
9972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    status_t PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame);
10072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool handleFrameReturn();
10172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    status_t returnBuffersToWindow();
10272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
10372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengpublic:
10472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
10572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static const int DISPLAY_TIMEOUT;
10672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    static const int FAILED_DQS_TO_SUSPEND;
10772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
10872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    class DisplayThread : public Thread
10972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        {
11072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        ANativeWindowDisplayAdapter* mDisplayAdapter;
11172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        TIUTILS::MessageQueue mDisplayThreadQ;
11272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
11372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        public:
11472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            DisplayThread(ANativeWindowDisplayAdapter* da)
11572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            : Thread(false), mDisplayAdapter(da) { }
11672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
11772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        ///Returns a reference to the display message Q for display adapter to post messages
11872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            TIUTILS::MessageQueue& msgQ()
11972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
12072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                return mDisplayThreadQ;
12172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                }
12272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
12372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            virtual bool threadLoop()
12472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
12572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                mDisplayAdapter->displayThread();
12672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                return false;
12772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                }
12872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
12972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng            enum DisplayThreadCommands
13072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                {
13172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_START,
13272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_STOP,
13372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_FRAME,
13472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                DISPLAY_EXIT
13572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng                };
13672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng        };
13772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
13872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //friend declarations
13972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengfriend class DisplayThread;
14072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
14172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengprivate:
14272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int postBuffer(void* displayBuf);
14372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
14472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengprivate:
14572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mFirstInit;
14672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mSuspend;
14772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mFailedDQs;
14872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mPaused; //Pause state
14972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    preview_stream_ops_t*  mANativeWindow;
15072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    sp<DisplayThread> mDisplayThread;
15172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    FrameProvider *mFrameProvider; ///Pointer to the frame provider interface
15272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    TIUTILS::MessageQueue mDisplayQ;
15372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    unsigned int mDisplayState;
15472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    ///@todo Have a common class for these members
15572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    mutable Mutex mLock;
15672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mDisplayEnabled;
15772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mBufferCount;
15872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    buffer_handle_t** mBufferHandleMap;
15972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    IMG_native_handle_t** mGrallocHandleMap;
16072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t* mOffsetsMap;
16172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    int mFD;
16272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    KeyedVector<int, int> mFramesWithCameraAdapterMap;
16372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    sp<ErrorNotifier> mErrorNotifier;
16472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
16572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mFrameWidth;
16672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mFrameHeight;
16772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mPreviewWidth;
16872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mPreviewHeight;
16972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mXOff;
17172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    uint32_t mYOff;
17272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    const char *mPixelFormat;
17472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
17572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
17672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for calculating standby to first shot
17772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    struct timeval mStandbyToShot;
17872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mMeasureStandby;
17972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    //Used for shot to snapshot/shot calculation
18072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    struct timeval mStartCapture;
18172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng    bool mShotToShot;
18272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
18372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#endif
18472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
18572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng};
18672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
18772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng};
18872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng
189