/****************************************************************************** Copyright (C), 2001-2016, Allwinner Tech. Co., Ltd. ****************************************************************************** File Name : CveBDII.h Version : Initial Draft Author : Allwinner BU3-PD2 Team Created : 2016/08/08 Last Modified : Description : ISE(Image Stitching Engine) module. Function List : History : ******************************************************************************/ #ifndef __IPCLINUX_CVE_BDII_H__ #define __IPCLINUX_CVE_BDII_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../camera/CameraBufferReference.h" #include "../camera/PreviewWindow.h" #include "EyeseeCamera.h" #include "EyeseeBDIICommon.h" namespace EyeseeLinux { typedef struct BDII_FRAME_NODE_S { VIDEO_FRAME_BUFFER_S *pFrame0; VIDEO_FRAME_BUFFER_S *pFrame1; }BDII_FRAME_NODE_S; class CveBDII { public: CveBDII(unsigned int mId); ~CveBDII(); status_t prepare(); status_t start(); status_t stop(); status_t setDisplay(int hlay); status_t setPreviewRotation(int rotation); void setDataListener(DataListener *pCb); void setNotifyListener(NotifyListener *pCb); void enableMessage(unsigned int msg_type); //CAMERA_MSG_COMPRESSED_IMAGE void disableMessage(unsigned int msg_type); //CAMERA_MSG_COMPRESSED_IMAGE bool isMessageEnabled(unsigned int msg_type); //CAMERA_MSG_COMPRESSED_IMAGE status_t setCamera(std::vector& cameraChannels); void dataCallbackTimestamp(int nCameraIndex, const VIDEO_FRAME_BUFFER_S *pCameraFrameInfo); status_t setBDIIConfigParams(AW_AI_CVE_BDII_INIT_PARA_S &Param); status_t getBDIIConfigParams(AW_AI_CVE_BDII_INIT_PARA_S &Param); status_t setDebugYuvDataOut(bool saveOut, std::vector&vec); protected: class DoProcessFrameThread : public Thread { public: DoProcessFrameThread(CveBDII *pCveBDII); ~DoProcessFrameThread(); status_t ProcessFrameThreadStart(); //status_t ProcessFrameThreadPause(); status_t ProcessFrameThreadStop(); status_t sendFrame(VIDEO_FRAME_BUFFER_S *pFrame0, VIDEO_FRAME_BUFFER_S *pFrame1); //status_t SendMessage_InputFrameReady(); status_t SetBDIIProcessConfigParams(AW_AI_CVE_BDII_INIT_PARA_S &Param); status_t GetBDIIProcessConfigParams(AW_AI_CVE_BDII_INIT_PARA_S &Param); status_t debugYuvDataOut(bool isOut, std::vector&vec); private: friend class CveBDII; Mutex mLock; Mutex mWaitLock; Mutex mStateLock; Mutex mBDIINodeLock; std::list mIdleBDIINodeList; //BDII_FRAME_NODE_S frame node std::list mUsedBDIINodeList; //BDII_FRAME_NODE_S frame node Condition mLoadedCompleteCond; Condition mPauseCompleteCond; Condition mStartCompleteCond; // Values for ProcessFrameThread message type enum ProcessFrameMsgType { MsgTypeProcessFrame_SetState = 0x100, MsgTypeProcessFrame_InputFrameAvailable, MsgTypeProcessFrame_Exit, }; EyeseeMessageQueue mProcessFrameMsgQueue; EyeseeQueue *mpProcessFrameDataQueue; //BDII_FRAME_NODE_S -> thread to handle bool mbWaitInputFrameBuf; enum PROCESS_FRAME_STATE_E { PROCESS_FRAME_STATE_LOADED, /* Do not send frame to ISE. */ PROCESS_FRAME_STATE_PAUSED, /* Start send frame. */ PROCESS_FRAME_STATE_STARTED, }; PROCESS_FRAME_STATE_E mProcessFrameThreadState; virtual bool threadLoop(); /** * send mCameraProxies's frame to MPP-ISE. * * @return true if want thread continue. false if want to quit thread. */ bool processFrameThread(); CveBDII* const mpCveBDII; bool mbThreadOK; AW_AI_CVE_BDII_INIT_PARA_S mInitParam; AW_HANDLE hBDII; void *mpCostImg; void *mpDeepImg; unsigned int mCostImagSize; unsigned int mDeepImagSize; SIZE_S mImageSize; bool bSaveYuvOut; std::map mMapFdOut; }; class DoPreviewThread : public Thread, public CameraBufferReference { public: DoPreviewThread(CveBDII *pBDII); ~DoPreviewThread(); status_t startThread(); void stopThread(); status_t sendDeepImage(CVE_BDII_RES_OUT_S *pBDIIResult); status_t setDisplay(int hlay); status_t setPreviewRotation(int rotation); virtual bool threadLoop(); virtual void increaseBufRef(VIDEO_FRAME_BUFFER_S *pbuf); virtual void decreaseBufRef(unsigned int nBufId); virtual void NotifyRenderStart(); private: bool previewThread(); static status_t convertBDIIDeepImage2NV21(CVE_BDII_RES_OUT_S *pBDIIResult, VIDEO_FRAME_BUFFER_S *pFrmBuf); //friend class CveBDII; int mHlay; int mPreviewRotation; //90: need clock-wise rotate 90 degree to display normal picture. enum PreviewMsgType { MsgTypePreview_InputFrameAvailable = 0x200, MsgTypePreview_Exit, }; Mutex mFrameLock; std::list mIdleFrameList; std::list mUsingFrame; //only one element std::list mReadyFrameList; std::list mDisplayFrameList; SIZE_S mImageSize; static int mFrameIdCounter; PreviewWindow *mpPreviewWindow; EyeseeMessageQueue mMsgQueue; Mutex mWaitLock; //Condition mCondReleaseAllFramesFinished; //bool mbWaitReleaseAllFrames; bool mbWaitPreviewFrame; CveBDII* const mpBDII; }; private: status_t stop_l(); //int ifStartReceiveFrame(int nCameraIndex); private: class CameraProxyListener: public CameraRecordingProxyListener //I set to camera, camera call. { public: CameraProxyListener(CveBDII *pIse, int nCameraIndex); virtual void dataCallbackTimestamp(const void *pdata); private: CveBDII * mpCveBDII; int mCameraIndex; }; //camera input class CameraProxyInfo { public: CameraRecordingProxy *mpCameraProxy; // for return to camera int mnCameraChannel; unsigned int mFrameCounter; //reserve std::list mIdleFrameBufList; std::list mReadyFrameBufList; std::list mUsedFrameBufList; Mutex mFrameBufListLock; status_t SetBDIICameraChnInfo(BDIICameraChnInfo *pCameraChnInfo); status_t releaseUsedFrame(VIDEO_FRAME_BUFFER_S *pFrame); status_t releaseUsedFrame_l(VIDEO_FRAME_BUFFER_S *pFrame); status_t releaseAllFrames(); CameraProxyInfo(); CameraProxyInfo(const CameraProxyInfo& ref); ~CameraProxyInfo(); }; std::vector mCameraProxies; //CameraParameters mParameters; enum BDIIWorkState { BDII_STATE_CONSTRUCTED = 0, BDII_STATE_PREPARED, BDII_STATE_STARTED, }; BDIIWorkState mBDIIState; Mutex mLock; //BOOL mWaitReturnSomeFrameFlag; //cdx_sem_t mWaitReturnFrameSem; const unsigned int m_ID; unsigned int mMessageEnabler; //CAMERA_MSG_BDII_DATA DataListener *mpDataCallback; NotifyListener *mpNotifyCallback; DoProcessFrameThread *mpProcessFrameThread; DoPreviewThread *mpPreviewThread; //int mInitCamIndex[2]; //the camera that has receiver data }; /* class CveBDII */ }; /* namespace EyeseeLinux */ #endif /* __IPCLINUX_CVE_BDII_H__ */