Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

196 lines
7.9 KiB

//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose: Panorama specific video player code
//=============================================================================//
#ifndef PANORAMA_VIDEO_PLAYER_H
#define PANORAMA_VIDEO_PLAYER_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/smartptr.h"
#include "../common/video/ivideoplayer.h"
#include "panorama/controls/panelptr.h"
namespace panorama
{
class IUIRenderEngine;
class IUIDoubleBufferedYUV420Texture;
class CPanoramaVideoPlayer;
//-----------------------------------------------------------------------------
// Purpose: Renders video frames from video player for tenfoot
//-----------------------------------------------------------------------------
class CVideoPlayerVideoRenderer : public IVideoPlayerVideoCallback
{
public:
CVideoPlayerVideoRenderer( IUIRenderEngine *pSurface );
virtual ~CVideoPlayerVideoRenderer();
uint32 GetTextureID() { return m_unTextureID; }
uint32 GetTextureWidth();
uint32 GetTextureHeight();
// IVideoPlayerVideoCallback
virtual bool BPresentYUV420Texture( uint nWidth, uint nHeight, void *pPlaneY, void *pPlaneU, void *pPlaneV, uint unStrideY, uint unStrideU, uint unStrideV ) OVERRIDE;
#ifdef DBGFLAG_VALIDATE
void Validate( CValidator &validator, const char *pchName );
#endif
private:
CInterlockedUInt m_unTextureID;
// used by video threads
IUIRenderEngine *m_pSurface;
IUIDoubleBufferedYUV420Texture *m_pYUV420DoubleBufferedTexture;
};
//-----------------------------------------------------------------------------
// Purpose: Renders audio frames from video player for tenfoot
//-----------------------------------------------------------------------------
class CVideoPlayerAudioRenderer : public IVideoPlayerAudioCallback
{
public:
CVideoPlayerAudioRenderer();
virtual ~CVideoPlayerAudioRenderer();
void SetPlaybackVolume( float flVolume );
void MarkShuttingDown();
void Shutdown();
// IVideoPlayerAudioCallback
virtual bool InitAudioOutput( int nSampleRate, int nChannels ) OVERRIDE;
virtual void FreeAudioOutput() OVERRIDE;
virtual bool IsReadyForAudioData() OVERRIDE;
virtual void *GetAudioBuffer() OVERRIDE;
virtual uint32 GetAudioBufferSize() OVERRIDE;
virtual uint32 GetAudioBufferMinSize() OVERRIDE;
virtual void CommitAudioBuffer( uint32 unBytes ) OVERRIDE;
virtual uint32 GetRemainingCommittedAudio() OVERRIDE;
virtual uint32 GetMixedMilliseconds() OVERRIDE;
virtual uint32 GetPlaybackLatency() OVERRIDE;
virtual void Pause() OVERRIDE;
virtual void Resume() OVERRIDE;
#ifdef DBGFLAG_VALIDATE
void Validate( CValidator &validator, const char *pchName );
#endif
private:
bool OnInitAudioMainThread( CVideoPlayerAudioRenderer *pThis, int nSampleRate, int nChannels );
bool OnFreeAudioMainThread( CVideoPlayerAudioRenderer *pThis );
CInterlockedInt m_bShuttingDown;
CThreadEvent m_eventWait;
#ifdef SUPPORTS_AUDIO
IAudioOutputStream *m_pAudioStream;
#endif
float m_flVolume;
};
//-----------------------------------------------------------------------------
// Purpose: Dispatches events to main panorama thread
//-----------------------------------------------------------------------------
typedef CUtlDelegate< void ( EVideoPlayerEvent ) > VideoPlayerEventDelegate_t;
class CVideoPlayerEventDispatcher : public IVideoPlayerEventCallback
{
public:
CVideoPlayerEventDispatcher( CPanoramaVideoPlayer *pPlayer );
~CVideoPlayerEventDispatcher();
void RegisterEventListener( IUIPanel *pPanel );
void UnregisterEventListener( IUIPanel *pPanel );
void RegisterEventCallback( VideoPlayerEventDelegate_t del );
void UnregisterEventCallback( VideoPlayerEventDelegate_t del );
bool VideoPlayerEventUIThread( CVideoPlayerEventDispatcher *pDispatcher, EVideoPlayerEvent eEvent );
// IVideoPlayerEventCallback
virtual void VideoPlayerEvent( EVideoPlayerEvent eEvent ) OVERRIDE;
#ifdef DBGFLAG_VALIDATE
void Validate( CValidator &validator, const char *pchName );
#endif
private:
void DispatchVideoEvent( EVideoPlayerEvent eEvent, IUIPanel *pTarget );
CPanoramaVideoPlayer *m_pPlayer;
CUtlVector< CPanelPtr< IUIPanel > > m_vecListeners;
CUtlVector< VideoPlayerEventDelegate_t > m_vecCallbacks;
double m_flLastRepeatEventDispatch;
};
//-----------------------------------------------------------------------------
// Purpose: Helper to create a tenfoot video player
//-----------------------------------------------------------------------------
class CPanoramaVideoPlayer : public IVideoPlayer, public ::CRefCount
{
public:
CPanoramaVideoPlayer( IUIPanel *pPanel );
CPanoramaVideoPlayer( IUIRenderEngine *pSurface );
virtual ~CPanoramaVideoPlayer();
virtual uint32 GetTextureID() { return m_videoCallback.GetTextureID(); }
uint32 GetTextureWidth() { return m_videoCallback.GetTextureWidth(); }
uint32 GetTextureHeight() { return m_videoCallback.GetTextureHeight(); }
void RegisterEventListener( IUIPanel *pPanel ) { m_eventCallback.RegisterEventListener( pPanel ); }
void UnregisterEventListener( IUIPanel *pPanel ) { m_eventCallback.UnregisterEventListener( pPanel ); }
void RegisterEventCallback( VideoPlayerEventDelegate_t del ) { m_eventCallback.RegisterEventCallback( del ); }
void UnregisterEventCallback( VideoPlayerEventDelegate_t del ) { m_eventCallback.UnregisterEventCallback( del ); }
void SetPlaybackVolume( float flVolume ) { m_audioCallback.SetPlaybackVolume( flVolume ); }
// IVideoPlayer
virtual bool BLoad( const char *pchURL ) OVERRIDE;
virtual bool BLoad( const byte *pubData, uint cubData ) OVERRIDE;
virtual void Play() OVERRIDE { m_pVideoPlayer->Play(); }
virtual void Stop() OVERRIDE;
virtual void Pause() OVERRIDE { m_pVideoPlayer->Pause(); }
virtual void SetPlaybackSpeed( float flPlaybackSpeed ) OVERRIDE { m_pVideoPlayer->SetPlaybackSpeed( flPlaybackSpeed ); }
virtual void Seek( uint unSeekMS ) OVERRIDE { m_pVideoPlayer->Seek( unSeekMS ); }
virtual void SetRepeat( bool bRepeat ) OVERRIDE { m_pVideoPlayer->SetRepeat( bRepeat ); }
virtual void SuggestMaxVeritcalResolution( int nHeight ) OVERRIDE { m_pVideoPlayer->SuggestMaxVeritcalResolution( nHeight ); }
virtual EVideoPlayerPlaybackState GetPlaybackState() OVERRIDE { return m_pVideoPlayer->GetPlaybackState(); }
virtual bool IsStoppedForBuffering() OVERRIDE { return m_pVideoPlayer->IsStoppedForBuffering(); }
virtual float GetPlaybackSpeed() OVERRIDE { return m_pVideoPlayer->GetPlaybackSpeed(); }
virtual uint32 GetDuration() OVERRIDE { return m_pVideoPlayer->GetDuration(); }
virtual uint32 GetCurrentPlaybackTime() OVERRIDE { return m_pVideoPlayer->GetCurrentPlaybackTime(); }
virtual EVideoPlayerPlaybackError GetPlaybackError() OVERRIDE { return m_pVideoPlayer->GetPlaybackError(); }
virtual void GetVideoResolution( int *pnWidth, int *pnHeight ) OVERRIDE { m_pVideoPlayer->GetVideoResolution( pnWidth, pnHeight ); }
virtual int GetVideoDownloadRate() OVERRIDE { return m_pVideoPlayer->GetVideoDownloadRate(); }
virtual int GetVideoRepresentationCount() OVERRIDE { return m_pVideoPlayer->GetVideoRepresentationCount(); }
virtual bool BGetVideoRepresentationInfo( int iRep, int *pnWidth, int *pnHeight ) OVERRIDE { return m_pVideoPlayer->BGetVideoRepresentationInfo( iRep, pnWidth, pnHeight ); }
virtual int GetCurrentVideoRepresentation() OVERRIDE { return m_pVideoPlayer->GetCurrentVideoRepresentation(); }
virtual void ForceVideoRepresentation( int iRep ) OVERRIDE { return m_pVideoPlayer->ForceVideoRepresentation( iRep ); }
virtual void GetVideoSegmentInfo( int *pnCurrent, int *pnTotal ) OVERRIDE { m_pVideoPlayer->GetVideoSegmentInfo( pnCurrent, pnTotal ); }
virtual bool BHasAudioTrack() OVERRIDE { return m_pVideoPlayer->BHasAudioTrack(); }
#ifdef DBGFLAG_VALIDATE
void Validate( CValidator &validator, const char *pchName );
#endif
private:
IVideoPlayer *m_pVideoPlayer;
CVideoPlayerVideoRenderer m_videoCallback;
CVideoPlayerAudioRenderer m_audioCallback;
CVideoPlayerEventDispatcher m_eventCallback;
};
typedef CSmartPtr< CPanoramaVideoPlayer > CVideoPlayerPtr;
} // namespace panorama
#endif // PANORAMA_VIDEO_PLAYER_H