//========= 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 VIDEOSERVICES_H #define VIDEOSERVICES_H #if defined ( WIN32 ) #pragma once #endif #include "video/ivideoservices.h" #include "videosubsystem.h" struct CVideFileoExtInfo_t { const char *m_pExtension; // extension including "." VideoSystem_t m_VideoSystemSupporting; VideoSystemFeature_t m_VideoFeaturesSupporting; }; struct CActiveVideoObjectRecord_t { void *m_pObject; int m_VideoSystem; }; //----------------------------------------------------------------------------- // Main VIDEO_SERVICES interface //----------------------------------------------------------------------------- class CValveVideoServices : public CTier3AppSystem< IVideoServices > { typedef CTier3AppSystem< IVideoServices > BaseClass; public: CValveVideoServices(); ~CValveVideoServices(); // 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 IVideoServices // Query the available video systems virtual int GetAvailableVideoSystemCount(); virtual VideoSystem_t GetAvailableVideoSystem( int n ); virtual bool IsVideoSystemAvailable( VideoSystem_t videoSystem ); virtual VideoSystemStatus_t GetVideoSystemStatus( VideoSystem_t videoSystem ); virtual VideoSystemFeature_t GetVideoSystemFeatures( VideoSystem_t videoSystem ); virtual const char *GetVideoSystemName( VideoSystem_t videoSystem ); virtual VideoSystem_t FindNextSystemWithFeature( VideoSystemFeature_t features, VideoSystem_t startAfter = VideoSystem::NONE ); virtual VideoResult_t GetLastResult(); // deal with video file extensions and video system mappings virtual int GetSupportedFileExtensionCount( VideoSystem_t videoSystem ); virtual const char *GetSupportedFileExtension( VideoSystem_t videoSystem, int extNum = 0 ); virtual VideoSystemFeature_t GetSupportedFileExtensionFeatures( VideoSystem_t videoSystem, int extNum = 0 ); virtual VideoSystem_t LocateVideoSystemForPlayingFile( const char *pFileName, VideoSystemFeature_t playMode = VideoSystemFeature::PLAY_VIDEO_FILE_IN_MATERIAL ); virtual VideoResult_t LocatePlayableVideoFile( const char *pSearchFileName, const char *pPathID, VideoSystem_t *pPlaybackSystem, char *pPlaybackFileName, int fileNameMaxLen, VideoSystemFeature_t playMode = VideoSystemFeature::FULL_PLAYBACK ); // Create/destroy a video material virtual IVideoMaterial *CreateVideoMaterial( const char *pMaterialName, const char *pVideoFileName, const char *pPathID = nullptr, VideoPlaybackFlags_t playbackFlags = VideoPlaybackFlags::DEFAULT_MATERIAL_OPTIONS, VideoSystem_t videoSystem = VideoSystem::DETERMINE_FROM_FILE_EXTENSION, bool PlayAlternateIfNotAvailable = true ); virtual VideoResult_t DestroyVideoMaterial( IVideoMaterial* pVideoMaterial ); virtual int GetUniqueMaterialID(); // Create/destroy a video encoder virtual VideoResult_t IsRecordCodecAvailable( VideoSystem_t videoSystem, VideoEncodeCodec_t codec ); virtual IVideoRecorder *CreateVideoRecorder( VideoSystem_t videoSystem ); virtual VideoResult_t DestroyVideoRecorder( IVideoRecorder *pVideoRecorder ); // Plays a given video file until it completes or the user presses ESC, SPACE, or ENTER virtual VideoResult_t PlayVideoFileFullScreen( const char *pFileName, const char *pPathID, void *mainWindow, int windowWidth, int windowHeight, int desktopWidth, int desktopHeight, bool windowed, float forcedMinTime, VideoPlaybackFlags_t playbackFlags = VideoPlaybackFlags::DEFAULT_FULLSCREEN_OPTIONS, VideoSystem_t videoSystem = VideoSystem::DETERMINE_FROM_FILE_EXTENSION, bool PlayAlternateIfNotAvailable = true ); // Sets the sound devices that the video will decode to virtual VideoResult_t SoundDeviceCommand( VideoSoundDeviceOperation_t operation, void *pDevice = nullptr, void *pData = nullptr, VideoSystem_t videoSystem = VideoSystem::ALL_VIDEO_SYSTEMS ); // Get the name of a codec as a string const wchar_t *GetCodecName( VideoEncodeCodec_t nCodec ); private: VideoResult_t ResolveToPlayableVideoFile( const char *pFileName, const char *pPathID, VideoSystem_t videoSystem, VideoSystemFeature_t requiredFeature, bool PlayAlternateIfNotAvailable, char *pResolvedFileName, int resolvedFileNameMaxLen, VideoSystem_t *pResolvedVideoSystem ); VideoSystem_t LocateSystemAndFeaturesForFileName( const char *pFileName, VideoSystemFeature_t *pFeatures = nullptr, VideoSystemFeature_t requiredFeatures = VideoSystemFeature::NO_FEATURES ); bool IsMatchAnyExtension( const char *pFileName ); bool ConnectVideoLibraries( CreateInterfaceFn factory ); bool DisconnectVideoLibraries(); int DestroyAllVideoInterfaces(); int GetIndexForSystem( VideoSystem_t n ); VideoSystem_t GetSystemForIndex( int n ); VideoResult_t SetResult( VideoResult_t resultCode ); const char *GetFileExtension( const char *pFileName ); static const int SYSTEM_NOT_FOUND = -1; VideoResult_t m_LastResult; int m_nInstalledSystems; bool m_bInitialized; CSysModule *m_VideoSystemModule[VideoSystem::VIDEO_SYSTEM_COUNT]; IVideoSubSystem *m_VideoSystems[VideoSystem::VIDEO_SYSTEM_COUNT]; VideoSystem_t m_VideoSystemType[VideoSystem::VIDEO_SYSTEM_COUNT]; VideoSystemFeature_t m_VideoSystemFeatures[VideoSystem::VIDEO_SYSTEM_COUNT]; CUtlVector< VideoFileExtensionInfo_t > m_ExtInfo; // info about supported file extensions CUtlVector< CActiveVideoObjectRecord_t > m_RecorderList; CUtlVector< CActiveVideoObjectRecord_t > m_MaterialList; int m_nMaterialCount; }; class CVideoCommonServices : public IVideoCommonServices { public: CVideoCommonServices(); ~CVideoCommonServices(); virtual bool CalculateVideoDimensions( int videoWidth, int videoHeight, int displayWidth, int displayHeight, VideoPlaybackFlags_t playbackFlags, int *pOutputWidth, int *pOutputHeight, int *pXOffset, int *pYOffset ); virtual float GetSystemVolume(); virtual VideoResult_t InitFullScreenPlaybackInputHandler( VideoPlaybackFlags_t playbackFlags, float forcedMinTime, bool windowed ); virtual bool ProcessFullScreenInput( bool &bAbortEvent, bool &bPauseEvent, bool &bQuitEvent ); virtual VideoResult_t TerminateFullScreenPlaybackInputHandler(); private: void ResetInputHandlerState(); bool m_bInputHandlerInitialized; bool m_bScanAll; bool m_bScanEsc; bool m_bScanReturn; bool m_bScanSpace; bool m_bPauseEnabled; bool m_bAbortEnabled; bool m_bEscLast; bool m_bReturnLast; bool m_bSpaceLast; bool m_bForceMinPlayTime; bool m_bWindowed; VideoPlaybackFlags_t m_playbackFlags; float m_forcedMinTime; double m_StartTime; }; #endif // VIDEOSERVICES_H