//================================================================================
// Copyright (c) 2013 ~ 2021. HyungKi Jeong(clonextop@gmail.com)
// All rights reserved.
// 
// The 3-Clause BSD License (https://opensource.org/licenses/BSD-3-Clause)
// 
// Redistribution and use in source and binary forms,
// with or without modification, are permitted provided
// that the following conditions are met:
// 
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
// 
// 3. Neither the name of the copyright holder nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
// OF SUCH DAMAGE.
// 
// Title : Testbench
// Rev.  : 3/31/2021 Wed (clonextop@gmail.com)
//================================================================================
#ifndef __GE_CAMERA_H__
#define __GE_CAMERA_H__
#include "GePrimitive.h"
#include "VideoSource.h"

class CGeCamera;

struct CameraPost {
	virtual BOOL CameraPostProcess(CGeCamera* pCamera, long lSize, BYTE* pBuffer) = 0;
};

class CGeCamera : public CGePrimitive, public VideoSourceCallBack
{
public:
	CGeCamera(void);
	virtual ~CGeCamera(void);

	BOOL Create(int iWidth, int iHeight);
	void ReleaseAll(void);
	void RegisterPost(CameraPost* pPost);
	inline LPDIRECT3DTEXTURE9 Texture(void)	{return m_pTexture;}

	inline void Lock(void)			{m_Source.Lock();}
	inline void Unlock(void)		{m_Source.Unlock();}
	inline int Width(void)			{return m_iWidth;}
	inline int Height(void)			{return m_iHeight;}
	inline BOOL IsInitialized(void)	{return m_iWidth != 0;}

protected:
	virtual void SampleVideoSource(long lSize, BYTE* pBuffer);

private:
	LPDIRECT3DTEXTURE9		m_pTexture;
	CameraPost*				m_pPost;
	VideoSource				m_Source;
	int						m_iWidth, m_iHeight;
};

#endif//__GE_CAMERA_H__
