//========= Copyright Valve Corporation, All rights reserved. ============//
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
//=============================================================================

#ifndef IQUICKTIME_H
#define IQUICKTIME_H

#ifdef _WIN32
#pragma once
#endif

  
#include "appframework/IAppSystem.h"

//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
struct BGR888_t;
class IMaterial;


//-----------------------------------------------------------------------------
// Handle to a QUICKTIME
//-----------------------------------------------------------------------------
typedef unsigned short QUICKTIMEHandle_t;
enum
{
	QUICKTIMEHANDLE_INVALID = (QUICKTIMEHandle_t)~0
};


//-----------------------------------------------------------------------------
// Handle to an QUICKTIME material
//-----------------------------------------------------------------------------
typedef unsigned short QUICKTIMEMaterial_t;
enum
{
	QUICKTIMEMATERIAL_INVALID = (QUICKTIMEMaterial_t)~0
};

typedef unsigned int MovieHandle_t;
const MovieHandle_t	cInvalidMovieHandle = (MovieHandle_t) ~0;

enum eVideoSystemStatus
{
	cVideoSystem_OK = 0,
	cVideoSystem_NotInstalled,
	cVideoSystem_NotCurrentVersion,
	cVideoSystem_InitializationError,
	
	cVideoSystem_ForceInt32 = 0x7FFFFFFF	// Make sure eNum is (at least) an int32
};


enum eVideoSystemFeatures
{
	cVideoSystem_NoFeatures						= 0x00000000,
	cVideoSystem_PlayMoviesFromFile				= 0x00000001,
	cVideoSystem_RenderVideoFrameToMaterial		= 0x00000002,
	cVideoSystem_EncodeVideoToFile				= 0x00000010,
	cVideoSystem_EncodeAudioToFile				= 0x00000020,
	
	cVideoSystem_ForceInt32a					= 0x7FFFFFFF
};

DEFINE_ENUM_BITWISE_OPERATORS( eVideoSystemFeatures );

enum eVideoEncodeQuality
{
	cVEQuality_Min = 0,
	cVEQuality_Low = 25,
	cVEQuality_Normal = 50,
	cVEQuality_High = 75,
	cVEQuality_Max = 100
};

// -----------------------------------------------------------------------
// eVideoFrameFormat_t - bit format for quicktime video frames
// -----------------------------------------------------------------------
enum eVideoFrameFormat_t
{
	cVFF_Undefined = 0,
	cVFF_R8G8B8A8_32Bit,
	cVFF_R8G8B8_24Bit,
	
	cVFF_Count,						// Auto list counter
	cVFF_ForceInt32	= 0x7FFFFFFF	// Make sure eNum is (at least) an int32
};

// -----------------------------------------------------------------------
// eAudioSourceFormat_t - Audio encoding source options
// -----------------------------------------------------------------------
enum eAudioSourceFormat_t
{
	cASF_Undefined = 0,
	cASF_None,
	cASF_16BitPCMStereo,
	
	cASF_Count,						// Auto list counter
	cASF_ForceInt32	= 0x7FFFFFFF	// Make sure eNum is (at least) an int32
};



//-----------------------------------------------------------------------------
// IQuickTimeMovieMaker interface
//-----------------------------------------------------------------------------
class IQuickTimeMovieMaker : public IBaseInterface
{
public:
	virtual bool	CreateNewMovieFile(  MovieHandle_t &theMovie, const char *pFilename, int nWidth, int nHeight, int nFps, eVideoEncodeQuality quality, eAudioSourceFormat_t srcAudioFormat = cASF_None, int audioSampleRate = 0  ) = 0;
	virtual bool	AppendVideoFrame( MovieHandle_t theMovie, unsigned char *pFrame ) = 0;
	virtual bool	AppendAudioSamples( MovieHandle_t theMovie, void *sampleBuffer, size_t sampleSize ) = 0;
	virtual bool	FinishMovie( MovieHandle_t theMovie, bool success = true ) = 0;
};

//-----------------------------------------------------------------------------
// Main QUICKTIME interface
//-----------------------------------------------------------------------------
#define QUICKTIME_INTERFACE_VERSION "IQuickTime002"

class IQuickTime : public IAppSystem
{
public:
	virtual bool					IsVideoSystemAvailable() = 0;
	virtual eVideoSystemStatus		GetVideoSystemStatus() = 0;
	virtual eVideoSystemFeatures	GetVideoSystemFeatures() = 0;

	// Create/destroy a QUICKTIME material (a materialsystem IMaterial)
	virtual QUICKTIMEMaterial_t CreateMaterial( const char *pMaterialName, const char *pFileName, const char *pPathID ) = 0;
	virtual void DestroyMaterial( QUICKTIMEMaterial_t hMaterial ) = 0;

	// Create/destroy a quicktime movie maker, which will encode audio/video
	virtual IQuickTimeMovieMaker *CreateMovieMaker() = 0;
	virtual void DestroyMovieMaker( IQuickTimeMovieMaker *&pMovieMaker ) = 0;
	
	// Update the frame (if necessary)
	virtual bool Update( QUICKTIMEMaterial_t hMaterial ) = 0;

	// Gets the IMaterial associated with an BINK material
	virtual IMaterial* GetMaterial( QUICKTIMEMaterial_t hMaterial ) = 0;

	// Returns the max texture coordinate of the BINK
	virtual void GetTexCoordRange( QUICKTIMEMaterial_t hMaterial, float *pMaxU, float *pMaxV ) = 0;

	// Returns the frame size of the QUICKTIME Image Frame (stored in a subrect of the material itself)
	virtual void GetFrameSize( QUICKTIMEMaterial_t hMaterial, int *pWidth, int *pHeight ) = 0;

	// Returns the frame rate of the QUICKTIME
	virtual int GetFrameRate( QUICKTIMEMaterial_t hMaterial ) = 0;

	// Sets the frame for an BINK material (use instead of SetTime)
	virtual void SetFrame( QUICKTIMEMaterial_t hMaterial, float flFrame ) = 0;

	// Returns the total frame count of the BINK
	virtual int GetFrameCount( QUICKTIMEMaterial_t hMaterial ) = 0;

	virtual bool SetSoundDevice( void *pDevice ) = 0;

	// Plays a given MOV file until it completes or the user presses ESC, SPACE, or ENTER
	virtual void PlayQuicktimeVideo( const char *filename, void *mainWindow, int windowWidth, int windowHeight, int desktopWidth, int desktopHeight, bool windowed, float forcedMinTime ) = 0;
	
	// Estimates the size of a recorded movie
    virtual bool EstimateMovieSize( unsigned long &EstSize, int nWidth, int nHeight, int nFps,  float duration, eVideoEncodeQuality quality, eAudioSourceFormat_t srcAudioFormat = cASF_None, int audioSampleRate = 0 ) = 0;

};


#endif // IQUICKTIME_H