#ifndef WELSVP_BACKGROUNDDETECTION_H
#define WELSVP_BACKGROUNDDETECTION_H
#include "util.h"
#include "memory.h"
#include "WelsFrameWork.h"
#include "IWelsVP.h"
WELSVP_NAMESPACE_BEGIN
typedef struct {
int32_t iBackgroundFlag;
int32_t iSAD;
int32_t iSD;
int32_t iMAD;
int32_t iMinSubMad;
int32_t iMaxDiffSubSd;
} SBackgroundOU;
class CBackgroundDetection : public IStrategy {
public:
CBackgroundDetection (int32_t iCpuFlag);
~CBackgroundDetection();
EResult Process (int32_t iType, SPixMap* pSrc, SPixMap* pRef);
EResult Set (int32_t iType, void* pParam);
private:
struct vBGDParam {
uint8_t* pCur[3];
uint8_t* pRef[3];
int32_t iBgdWidth;
int32_t iBgdHeight;
int32_t iStride[3];
SBackgroundOU* pOU_array;
int8_t* pBackgroundMbFlag;
SVAACalcResult* pCalcRes;
} m_BgdParam;
int32_t m_iLargestFrameSize;
private:
inline SBackgroundOU* AllocateOUArrayMemory (int32_t iWidth, int32_t iHeight);
inline int32_t CalculateAsdChromaEdge (uint8_t* pOriRef, uint8_t* pOriCur, int32_t iStride);
inline bool ForegroundDilation23Luma (SBackgroundOU* pBackgroundOU,
SBackgroundOU* pOUNeighbours[]); inline bool ForegroundDilation23Chroma (int8_t iNeighbourForegroundFlags, int32_t iStartSamplePos,
int32_t iPicStrideUV, vBGDParam* pBgdParam); inline void ForegroundDilation (SBackgroundOU* pBackgroundOU, SBackgroundOU* pOUNeighbours[], vBGDParam* pBgdParam,
int32_t iChromaSampleStartPos);
inline void BackgroundErosion (SBackgroundOU* pBackgroundOU, SBackgroundOU* pOUNeighbours[]);
inline void SetBackgroundMbFlag (int8_t* pBackgroundMbFlag, int32_t iPicWidthInMb, int32_t iBackgroundMbFlag);
inline void UpperOUForegroundCheck (SBackgroundOU* pCurOU, int8_t* pBackgroundMbFlag, int32_t iPicWidthInOU,
int32_t iPicWidthInMb);
void GetOUParameters (SVAACalcResult* sVaaCalcInfo, int32_t iMbIndex, int32_t iMbWidth,
SBackgroundOU* pBackgroundOU);
void ForegroundBackgroundDivision (vBGDParam* pBgdParam);
void ForegroundDilationAndBackgroundErosion (vBGDParam* pBgdParam);
void BackgroundDetection (vBGDParam* pBgdParam);
};
WELSVP_NAMESPACE_END
#endif