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