#pragma once #include "CHImageControls/CHImageData.h" #include "CHThreadPools/WorkThreadPools.h" class CFrameThreadData : public CWorkThreadData { public: CFrameThreadData(PVOID pPtr) : CWorkThreadData(pPtr) { m_nIndex = -1; } virtual ~CFrameThreadData() { m_nIndex = -1; } int SetFrameData(int nFrameIndex, BYTE* pFrameBuffer, int nFrameWidth, int nFrameHeight, int nFrameChannels) { m_nIndex = nFrameIndex; if (m_Image.CreateImageHeader(nFrameWidth, nFrameHeight, 8, nFrameChannels)==FALSE) { return 0; } m_Image.SetImageDataPtr((char*)pFrameBuffer); return 1; } int GetIndex() { return m_nIndex; } CCHImageData* GetFrameImage() { return &m_Image; } protected: int m_nIndex; CCHImageData m_Image; }; interface IImageReSampler2Parent { virtual void IIRS2P_ImageReSampleComplete(int nFrameCount) = 0; }; class AFX_EXT_CLASS CImageReSampler : public CWorkThreadPools { public: CImageReSampler(int nThreadCount=8, IImageReSampler2Parent* pIIRS2P=NULL); virtual ~CImageReSampler(void); void Reset(); void SetIIRS2P(IImageReSampler2Parent* pIIRS2P); int GetReSampledFrameCount() const { return m_nReSampledFrameCount; } void Start_ReSampling(); int SetBufferInfo(int nSrcWidth, int nSrcHeight, int nSrcChannels, int nFrameSize, int nTagWidth, int nTagHeight); int SetFrameBuffer(int nFrameIndex, BYTE* pFrameBuffer, int nFrameWidth, int nFrameHeight, int nFrameChannels); int SaveImage(const CString& strFilename, int nQual); int GetWidth() const { return m_TargetImage.GetWidth(); } int GetHeight() const { return m_TargetImage.GetHeight(); } int GetFrameHeight() const { return m_nTargetFrameHeight; } BYTE* GetImageBuffer() { return (BYTE*) m_TargetImage.GetImageBuffer(); } protected: virtual void WorkThreadProcess(PVOID pParameter); protected: int m_nSourceWidth; int m_nSourceHeight; int m_nSourceChannels; int m_nSourceFrameHeight; int m_nTargetFrameHeight; int m_nTargetFrameSize; int m_nTotalFrameCount; int m_nReSampledFrameCount; CCHImageData m_TargetImage; IImageReSampler2Parent* m_pIIRS2P; CCriticalSection m_csTargetImage; };