diff options
Diffstat (limited to 'public/panorama/data/panoramavideoplayer.h')
| -rw-r--r-- | public/panorama/data/panoramavideoplayer.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/public/panorama/data/panoramavideoplayer.h b/public/panorama/data/panoramavideoplayer.h new file mode 100644 index 0000000..5478dbd --- /dev/null +++ b/public/panorama/data/panoramavideoplayer.h @@ -0,0 +1,196 @@ +//=========== 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
\ No newline at end of file |