275 lines
8.0 KiB
C++
275 lines
8.0 KiB
C++
//===== Copyright (c) 2010, Valve Corporation, All rights reserved. ===========
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
|
|
#ifndef QUICKTIME_H
|
|
#define QUICKTIME_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <avi/iquicktime.h>
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
class IFileSystem;
|
|
class IMaterialSystem;
|
|
class CQuickTimeMaterial;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Global interfaces - you already did the needed includes, right?
|
|
//-----------------------------------------------------------------------------
|
|
extern IFileSystem *g_pFileSystem;
|
|
extern IMaterialSystem *materials;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Quicktime includes - conditional compilation on #define QUICKTIME in VPC
|
|
// The intent is to have a default functionality fallback if not defined
|
|
// which provides a dynamically generated texture (moving line on background)
|
|
//-----------------------------------------------------------------------------
|
|
#if defined( QUICKTIME_VIDEO )
|
|
|
|
#if defined ( OSX )
|
|
#include <quicktime/QTML.h>
|
|
#include <quicktime/Movies.h>
|
|
#elif defined ( WIN32 )
|
|
#include <QTML.h>
|
|
#include <Movies.h>
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#else
|
|
typedef TimeValue long;
|
|
#endif
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
// eVideoFrameFormat_t - bitformat 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
|
|
};
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// texture regenerator - callback to get new movie pixels into the texture
|
|
//-----------------------------------------------------------------------------
|
|
class CQuicktimeMaterialRGBTextureRegenerator : public ITextureRegenerator
|
|
{
|
|
public:
|
|
CQuicktimeMaterialRGBTextureRegenerator() :
|
|
m_pQTMaterial( NULL ),
|
|
m_nSourceWidth( 0 ),
|
|
m_nSourceHeight( 0 )
|
|
{
|
|
}
|
|
|
|
void SetParentMaterial( CQuickTimeMaterial *pQTMaterial, int nWidth, int nHeight )
|
|
{
|
|
m_pQTMaterial = pQTMaterial;
|
|
m_nSourceWidth = nWidth;
|
|
m_nSourceHeight = nHeight;
|
|
}
|
|
|
|
// Inherited from ITextureRegenerator
|
|
virtual void RegenerateTextureBits( ITexture *pTexture, IVTFTexture *pVTFTexture, Rect_t *pRect );
|
|
virtual void Release();
|
|
|
|
private:
|
|
CQuickTimeMaterial *m_pQTMaterial;
|
|
int m_nSourceWidth;
|
|
int m_nSourceHeight;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Class used to associated QuickTime video files with IMaterials
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
class CQuickTimeMaterial
|
|
{
|
|
public:
|
|
CQuickTimeMaterial();
|
|
~CQuickTimeMaterial();
|
|
|
|
// Initializes, shuts down the material
|
|
bool Init( const char *pMaterialName, const char *pFileName, const char *pPathID );
|
|
void Shutdown();
|
|
|
|
// Keeps the frames updated
|
|
bool Update( void );
|
|
|
|
// Check if a new frame is available
|
|
bool ReadyForSwap( void );
|
|
|
|
// Returns the material
|
|
IMaterial *GetMaterial();
|
|
|
|
// Returns the texcoord range
|
|
void GetTexCoordRange( float *pMaxU, float *pMaxV );
|
|
|
|
// Returns the frame size of the QuickTime Video (stored in a subrect of the material itself)
|
|
void GetFrameSize( int *pWidth, int *pHeight );
|
|
|
|
// Sets the current time
|
|
void SetTime( float flTime );
|
|
|
|
// Returns the frame rate/count of the QuickTime Material
|
|
int GetFrameRate( );
|
|
int GetFrameCount( );
|
|
|
|
// Sets the frame for an QuickTime material (use instead of SetTime) ??
|
|
void SetFrame( float flFrame );
|
|
|
|
void SetLooping( bool loop );
|
|
|
|
private:
|
|
friend class CQuicktimeMaterialRGBTextureRegenerator;
|
|
|
|
void Reset();
|
|
void OpenQTMovie( const char* theQTMovieFileName );
|
|
void SetQTFileName( const char *theQTMovieFileName );
|
|
void GetErrorFrame();
|
|
|
|
void CloseQTFile();
|
|
|
|
|
|
// Initializes, shuts down the procedural texture
|
|
void CreateProceduralTexture( const char *pTextureName );
|
|
void DestroyProceduralTexture();
|
|
|
|
// Initializes, shuts down the procedural material
|
|
void CreateProceduralMaterial( const char *pMaterialName );
|
|
void DestroyProceduralMaterial();
|
|
|
|
// Initializes, shuts down the video stream
|
|
|
|
CQuicktimeMaterialRGBTextureRegenerator m_TextureRegen;
|
|
|
|
CMaterialReference m_Material; // Ref to Material used for rendering the video frame
|
|
CTextureReference m_Texture; // Ref to the renderable texture which contains the most recent video frame (in a sub-rect)
|
|
|
|
float m_TexCordU; // Max U texture coordinate of the texture sub-rect which holds the video frame
|
|
float m_TexCordV; // Max V texture coordinate of the texture sub-rect which holds the video frame
|
|
|
|
int m_VideoFrameWidth;
|
|
int m_VideoFrameHeight;
|
|
|
|
char *m_pFileName;
|
|
|
|
char m_TextureName[128];
|
|
char m_MaterialName[128];
|
|
|
|
bool m_bActive;
|
|
bool m_bLoopMovie;
|
|
|
|
|
|
bool m_bMoviePlaying;
|
|
double m_MovieBeganPlayingTime;
|
|
double m_MovieCurrentTime;
|
|
#if defined( QUICKTIME_VIDEO )
|
|
|
|
// QuickTime Stuff
|
|
Movie m_QTMovie;
|
|
TimeValue m_QTMovieTimeScale; // Units per second
|
|
TimeValue m_QTMovieDuration; // movie duration is UPS
|
|
float m_QTMovieDurationinSec; // movie duration in seconds
|
|
long m_QTMoveFrameRate;
|
|
Rect m_QTMovieRect;
|
|
GWorldPtr m_MovieGWorld;
|
|
|
|
QTAudioContextRef m_AudioContext;
|
|
|
|
TimeValue m_LastInterestingTimePlayed;
|
|
TimeValue m_NextInterestingTimeToPlay;
|
|
|
|
// our Frame buffer stuff
|
|
#if defined ( WIN32 )
|
|
BITMAPINFO m_BitmapInfo;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
void *m_BitMapData;
|
|
int m_BitMapDataSize;
|
|
|
|
bool m_bIsErrorFrame;
|
|
float m_nLastFrameTime;
|
|
|
|
static const int cMaxQTFileNameLen = 255;
|
|
|
|
static const int cMinVideoFrameWidth = 16;
|
|
static const int cMinVideoFrameHeight = 16;
|
|
static const int cMaxVideoFrameWidth = 2048;
|
|
static const int cMaxVideoFrameHeight = 2048;
|
|
};
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// Implementation of IQuickTime
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
class CQuickTime : public CBaseAppSystem<IQuickTime>
|
|
{
|
|
public:
|
|
CQuickTime();
|
|
~CQuickTime();
|
|
|
|
// Inherited from IAppSystem
|
|
virtual bool Connect( CreateInterfaceFn factory );
|
|
virtual void Disconnect();
|
|
virtual void *QueryInterface( const char *pInterfaceName );
|
|
virtual InitReturnVal_t Init();
|
|
virtual void Shutdown();
|
|
|
|
// Inherited from IQuickTime
|
|
virtual QUICKTIMEMaterial_t CreateMaterial( const char *pMaterialName, const char *pFileName, const char *pPathID, int flags = 0 );
|
|
virtual void DestroyMaterial( QUICKTIMEMaterial_t hMaterial );
|
|
|
|
virtual bool Update( QUICKTIMEMaterial_t hMaterial );
|
|
virtual bool ReadyForSwap( QUICKTIMEMaterial_t hMaterial );
|
|
|
|
virtual IMaterial *GetMaterial( QUICKTIMEMaterial_t hMaterial );
|
|
virtual void GetTexCoordRange( QUICKTIMEMaterial_t hMaterial, float *pMaxU, float *pMaxV );
|
|
virtual void GetFrameSize( QUICKTIMEMaterial_t hMaterial, int *pWidth, int *pHeight );
|
|
virtual int GetFrameRate( QUICKTIMEMaterial_t hMaterial );
|
|
virtual void SetFrame( QUICKTIMEMaterial_t hMaterial, float flFrame );
|
|
virtual int GetFrameCount( QUICKTIMEMaterial_t hMaterial );
|
|
|
|
virtual bool SetSoundDevice( void *pDevice );
|
|
|
|
private:
|
|
|
|
bool SetupQuicktime();
|
|
void ShutdownQuicktime();
|
|
|
|
// NOTE: Have to use pointers here since QuickTimeKMaterials inherit from ITextureRegenerator
|
|
// The realloc screws up the pointers held to ITextureRegenerators in the material system.
|
|
CUtlLinkedList< CQuickTimeMaterial*, QUICKTIMEMaterial_t > m_QTMaterials;
|
|
|
|
bool m_bQTInitialized;
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // QUICKTIME_H
|