/* -LICENSE-START-
 ** Copyright (c) 2019 Blackmagic Design
 **  
 ** Permission is hereby granted, free of charge, to any person or organization 
 ** obtaining a copy of the software and accompanying documentation (the 
 ** "Software") to use, reproduce, display, distribute, sub-license, execute, 
 ** and transmit the Software, and to prepare derivative works of the Software, 
 ** and to permit third-parties to whom the Software is furnished to do so, in 
 ** accordance with:
 ** 
 ** (1) if the Software is obtained from Blackmagic Design, the End User License 
 ** Agreement for the Software Development Kit (“EULA”) available at 
 ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or
 ** 
 ** (2) if the Software is obtained from any third party, such licensing terms 
 ** as notified by that third party,
 ** 
 ** and all subject to the following:
 ** 
 ** (3) the copyright notices in the Software and this entire statement, 
 ** including the above license grant, this restriction and the following 
 ** disclaimer, must be included in all copies of the Software, in whole or in 
 ** part, and all derivative works of the Software, unless such copies or 
 ** derivative works are solely in the form of machine-executable object code 
 ** generated by a source language processor.
 ** 
 ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
 ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 
 ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 
 ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 
 ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 ** DEALINGS IN THE SOFTWARE.
 ** 
 ** A copy of the Software is available free of charge at 
 ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA.
 ** 
 ** -LICENSE-END-
 */

#pragma once

#include "com_ptr.h"
#include "DeckLinkAPI.h"

class LoopThroughVideoFrame
{
public:
	LoopThroughVideoFrame(const com_ptr<IDeckLinkVideoFrame>& videoFrame):
		m_videoFrame(videoFrame),
		m_videoStreamTime(0),
		m_videoFrameDuration(0),
		m_inputFrameStartReferenceTime(0),
		m_inputFrameArrivedReferenceTime(0),
		m_outputFrameScheduledReferenceTime(0),
		m_outputFrameCompletedReferenceTime(0),
		m_outputFrameCompletionResult(bmdOutputFrameDropped)
	{
	}
	virtual ~LoopThroughVideoFrame(void) = default;
	
	void	setVideoFrame(const com_ptr<IDeckLinkVideoFrame>& videoFrame) { m_videoFrame = videoFrame; }
	void	setVideoStreamTime(const BMDTimeValue time) { m_videoStreamTime = time; }
	void	setVideoFrameDuration(const BMDTimeValue duration) { m_videoFrameDuration = duration; }
	void	setInputFrameStartReferenceTime(const BMDTimeValue time) { m_inputFrameStartReferenceTime = time; }
	void	setInputFrameArrivedReferenceTime(const BMDTimeValue time) { m_inputFrameArrivedReferenceTime = time; }
	void	setOutputFrameScheduledReferenceTime(const BMDTimeValue time) { m_outputFrameScheduledReferenceTime = time; }
	void	setOutputFrameCompletedReferenceTime(const BMDTimeValue time) { m_outputFrameCompletedReferenceTime = time; }
	void	setOutputCompletionResult(const BMDOutputFrameCompletionResult result) { m_outputFrameCompletionResult = result; }

	IDeckLinkVideoFrame*			getVideoFramePtr(void) const { return m_videoFrame.get(); }
	BMDTimeValue					getVideoStreamTime(void) const { return m_videoStreamTime; }
	BMDTimeValue					getVideoFrameDuration(void) const { return m_videoFrameDuration; }
	BMDTimeValue					getInputLatency(void) const { return m_inputFrameArrivedReferenceTime - m_inputFrameStartReferenceTime; }
	BMDTimeValue					getProcessingLatency(void) const { return m_outputFrameScheduledReferenceTime - m_inputFrameArrivedReferenceTime; }
	BMDTimeValue					getOutputLatency(void) const { return m_outputFrameCompletedReferenceTime - m_outputFrameScheduledReferenceTime; }
	BMDOutputFrameCompletionResult	getOutputCompletionResult(void) const { return m_outputFrameCompletionResult; }
	
private:
	com_ptr<IDeckLinkVideoFrame>	m_videoFrame;
	BMDTimeValue					m_videoStreamTime;
	BMDTimeValue					m_videoFrameDuration;
	
	BMDTimeValue					m_inputFrameStartReferenceTime;
	BMDTimeValue					m_inputFrameArrivedReferenceTime;

	BMDTimeValue					m_outputFrameScheduledReferenceTime;
	BMDTimeValue					m_outputFrameCompletedReferenceTime;
	
	BMDOutputFrameCompletionResult	m_outputFrameCompletionResult;
};
