summaryrefslogtreecommitdiff
path: root/public/avi/ibik.h
blob: 36e86f6cd3b909d07dda964d04114e6319dba11f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//========= 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 IBIK_H
#define IBIK_H

#ifdef _WIN32
#pragma once
#endif

#include "appframework/IAppSystem.h"

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

//-----------------------------------------------------------------------------
// Parameters for creating a new BINK
//-----------------------------------------------------------------------------
struct BIKParams_t
{
	BIKParams_t() :
		m_nFrameRate( 0 ), m_nFrameScale( 1 ), m_nWidth( 0 ), m_nHeight( 0 ),
		m_nSampleRate( 0 ), m_nSampleBits( 0 ), m_nNumChannels( 0 )
	{
		m_pFileName[ 0 ] = 0;
	}

	char		m_pFileName[ 256 ];
	char		m_pPathID[ 256 ];

	// fps = m_nFrameRate / m_nFrameScale
	// for integer framerates, set framerate to the fps, and framescale to 1
	// for ntsc-style framerates like 29.97 (or 23.976 or 59.94),
	// set framerate to 30,000 (or 24,000 or 60,000) and framescale to 1001
	// yes, framescale is an odd naming choice, but it matching MS's AVI api
	int			m_nFrameRate;
	int			m_nFrameScale;

	int			m_nWidth;
	int			m_nHeight;

	// Sound/.wav info
	int			m_nSampleRate;
	int			m_nSampleBits;
	int			m_nNumChannels;
};

//-----------------------------------------------------------------------------
// Handle to an BINK
//-----------------------------------------------------------------------------
typedef unsigned short BIKHandle_t;
enum
{
	BIKHANDLE_INVALID = (BIKHandle_t)~0
};


//-----------------------------------------------------------------------------
// Handle to an BINK material
//-----------------------------------------------------------------------------
typedef unsigned short BIKMaterial_t;
enum
{
	BIKMATERIAL_INVALID = (BIKMaterial_t)~0
};


//-----------------------------------------------------------------------------
// Main AVI interface
//-----------------------------------------------------------------------------
#define BIK_INTERFACE_VERSION "VBik001"

class IBik : public IAppSystem
{
public:
	// Create/destroy a BINK material (a materialsystem IMaterial)
	virtual BIKMaterial_t CreateMaterial( const char *pMaterialName, const char *pFileName, const char *pPathID ) = 0;
	virtual void DestroyMaterial( BIKMaterial_t hMaterial ) = 0;
	
	// Update the frame (if necessary)
	virtual bool Update( BIKMaterial_t hMaterial ) = 0;

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

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

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

	// Returns the frame rate of the BINK
	virtual int GetFrameRate( BIKMaterial_t hMaterial ) = 0;

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

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

#ifdef WIN32
#if !defined( _X360 )
	// Sets the direct sound device that Bink will decode to
	virtual bool SetDirectSoundDevice( void	*pDevice ) = 0;
#else
	//needs to be called after xaudio is initialized
	virtual bool HookXAudio( void ) = 0;
#endif
#elif defined( LINUX )
	// Sets the SDL device that Bink will decode to
	virtual bool SetSDLDevice( int frequency, uint16 format, int nchannels ) = 0;

	// Called to mix in Bink audio. Returns true if audio was mixed in, false otherwise.
	virtual bool SDLMixerAudioCallback( void *stream, int len ) = 0;
#endif

	// Plays a given Bink file until it completes or the user presses ESC, SPACE, or ENTER
	virtual void PlayBinkVideo( const char *filename, void *mainWindow, int width, int height, float forcedMinTime ) = 0;
};



#endif // IBIK_H