summaryrefslogtreecommitdiff
path: root/video/webm_video.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'video/webm_video.cpp')
-rw-r--r--video/webm_video.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/video/webm_video.cpp b/video/webm_video.cpp
new file mode 100644
index 0000000..fb9fab8
--- /dev/null
+++ b/video/webm_video.cpp
@@ -0,0 +1,353 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "webm_video.h"
+#include "webm_recorder.h"
+
+
+#include "filesystem.h"
+#include "tier0/icommandline.h"
+#include "tier1/strtools.h"
+#include "tier1/utllinkedlist.h"
+#include "tier1/KeyValues.h"
+#include "materialsystem/imaterial.h"
+#include "materialsystem/imaterialsystem.h"
+#include "materialsystem/MaterialSystemUtil.h"
+#include "materialsystem/itexture.h"
+#include "vtf/vtf.h"
+#include "pixelwriter.h"
+#include "tier2/tier2.h"
+#include "platform.h"
+
+
+#include "tier0/memdbgon.h"
+
+
+// ===========================================================================
+// Singleton to expose WebM video subsystem
+// ===========================================================================
+static CWebMVideoSubSystem g_WebMSystem;
+EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CWebMVideoSubSystem, IVideoSubSystem, VIDEO_SUBSYSTEM_INTERFACE_VERSION, g_WebMSystem );
+
+
+// ===========================================================================
+// List of file extensions and features supported by this subsystem
+// ===========================================================================
+VideoFileExtensionInfo_t s_WebMExtensions[] =
+{
+ { ".webm", VideoSystem::WEBM, VideoSystemFeature::FULL_ENCODE },
+};
+
+const int s_WebMExtensionCount = ARRAYSIZE( s_WebMExtensions );
+
+const VideoSystemFeature_t CWebMVideoSubSystem::DEFAULT_FEATURE_SET = VideoSystemFeature::FULL_ENCODE;
+
+
+// ===========================================================================
+// CWebMVideoSubSystem class
+// ===========================================================================
+CWebMVideoSubSystem::CWebMVideoSubSystem() :
+ m_bWebMInitialized( false ),
+ m_LastResult( VideoResult::SUCCESS ),
+ m_CurrentStatus( VideoSystemStatus::NOT_INITIALIZED ),
+ m_AvailableFeatures( CWebMVideoSubSystem::DEFAULT_FEATURE_SET ),
+ m_pCommonServices( nullptr )
+{
+
+}
+
+
+CWebMVideoSubSystem::~CWebMVideoSubSystem()
+{
+ ShutdownWebM(); // Super redundant safety check
+}
+
+
+// ===========================================================================
+// IAppSystem methods
+// ===========================================================================
+bool CWebMVideoSubSystem::Connect( CreateInterfaceFn factory )
+{
+ if ( !BaseClass::Connect( factory ) )
+ {
+ return false;
+ }
+
+ if ( g_pFullFileSystem == nullptr || materials == nullptr )
+ {
+ Msg( "WebM video subsystem failed to connect to missing a required system\n" );
+ return false;
+ }
+ return true;
+}
+
+
+void CWebMVideoSubSystem::Disconnect()
+{
+ BaseClass::Disconnect();
+}
+
+
+void* CWebMVideoSubSystem::QueryInterface( const char *pInterfaceName )
+{
+
+ if ( IS_NOT_EMPTY( pInterfaceName ) )
+ {
+ if ( V_strncmp( pInterfaceName, VIDEO_SUBSYSTEM_INTERFACE_VERSION, Q_strlen( VIDEO_SUBSYSTEM_INTERFACE_VERSION ) + 1) == STRINGS_MATCH )
+ {
+ return (IVideoSubSystem*) this;
+ }
+ }
+
+ return nullptr;
+}
+
+
+InitReturnVal_t CWebMVideoSubSystem::Init()
+{
+ InitReturnVal_t nRetVal = BaseClass::Init();
+ if ( nRetVal != INIT_OK )
+ {
+ return nRetVal;
+ }
+
+ return INIT_OK;
+
+}
+
+
+void CWebMVideoSubSystem::Shutdown()
+{
+ // Make sure we shut down WebM
+ ShutdownWebM();
+
+ BaseClass::Shutdown();
+}
+
+
+// ===========================================================================
+// IVideoSubSystem identification methods
+// ===========================================================================
+VideoSystem_t CWebMVideoSubSystem::GetSystemID()
+{
+ return VideoSystem::WEBM;
+}
+
+
+VideoSystemStatus_t CWebMVideoSubSystem::GetSystemStatus()
+{
+ return m_CurrentStatus;
+}
+
+
+VideoSystemFeature_t CWebMVideoSubSystem::GetSupportedFeatures()
+{
+ return m_AvailableFeatures;
+}
+
+
+const char* CWebMVideoSubSystem::GetVideoSystemName()
+{
+ return "WebM";
+}
+
+
+// ===========================================================================
+// IVideoSubSystem setup and shutdown services
+// ===========================================================================
+bool CWebMVideoSubSystem::InitializeVideoSystem( IVideoCommonServices *pCommonServices )
+{
+ m_AvailableFeatures = DEFAULT_FEATURE_SET; // Put here because of issue with static const int, binary OR and DEBUG builds
+
+ AssertPtr( pCommonServices );
+ m_pCommonServices = pCommonServices;
+
+ return ( m_bWebMInitialized ) ? true : SetupWebM();
+}
+
+
+bool CWebMVideoSubSystem::ShutdownVideoSystem()
+{
+ return ( m_bWebMInitialized ) ? ShutdownWebM() : true;
+}
+
+
+VideoResult_t CWebMVideoSubSystem::VideoSoundDeviceCMD( VideoSoundDeviceOperation_t operation, void *pDevice, void *pData )
+{
+ switch ( operation )
+ {
+ case VideoSoundDeviceOperation::SET_DIRECT_SOUND_DEVICE:
+ {
+ return SetResult( VideoResult::OPERATION_NOT_SUPPORTED );
+ }
+
+ case VideoSoundDeviceOperation::SET_MILES_SOUND_DEVICE:
+ case VideoSoundDeviceOperation::HOOK_X_AUDIO:
+ {
+ return SetResult( VideoResult::OPERATION_NOT_SUPPORTED );
+ }
+
+ default:
+ {
+ return SetResult( VideoResult::UNKNOWN_OPERATION );
+ }
+ }
+}
+
+
+// ===========================================================================
+// IVideoSubSystem supported extensions & features
+// ===========================================================================
+int CWebMVideoSubSystem::GetSupportedFileExtensionCount()
+{
+ return s_WebMExtensionCount;
+}
+
+
+const char* CWebMVideoSubSystem::GetSupportedFileExtension( int num )
+{
+ return ( num < 0 || num >= s_WebMExtensionCount ) ? nullptr : s_WebMExtensions[num].m_FileExtension;
+}
+
+
+VideoSystemFeature_t CWebMVideoSubSystem::GetSupportedFileExtensionFeatures( int num )
+{
+ return ( num < 0 || num >= s_WebMExtensionCount ) ? VideoSystemFeature::NO_FEATURES : s_WebMExtensions[num].m_VideoFeatures;
+}
+
+
+// ===========================================================================
+// IVideoSubSystem Video Playback and Recording Services
+// ===========================================================================
+VideoResult_t CWebMVideoSubSystem::PlayVideoFileFullScreen( const char *filename, void *mainWindow, int windowWidth, int windowHeight, int desktopWidth, int desktopHeight, bool windowed, float forcedMinTime, VideoPlaybackFlags_t playbackFlags )
+{
+ return SetResult( VideoResult::FEATURE_NOT_AVAILABLE );
+}
+
+
+// ===========================================================================
+// IVideoSubSystem Video Material Services
+// note that the filename is absolute and has already resolved any paths
+// ===========================================================================
+IVideoMaterial* CWebMVideoSubSystem::CreateVideoMaterial( const char *pMaterialName, const char *pVideoFileName, VideoPlaybackFlags_t flags )
+{
+ SetResult( VideoResult::FEATURE_NOT_AVAILABLE );
+ return NULL;
+}
+
+
+VideoResult_t CWebMVideoSubSystem::DestroyVideoMaterial( IVideoMaterial *pVideoMaterial )
+{
+ return SetResult (VideoResult::FEATURE_NOT_AVAILABLE );
+
+}
+
+
+// ===========================================================================
+// IVideoSubSystem Video Recorder Services
+// ===========================================================================
+IVideoRecorder* CWebMVideoSubSystem::CreateVideoRecorder()
+{
+ SetResult( VideoResult::SYSTEM_NOT_AVAILABLE );
+ AssertExitN( m_CurrentStatus == VideoSystemStatus::OK );
+
+ CWebMVideoRecorder *pVideoRecorder = new CWebMVideoRecorder();
+
+ if ( pVideoRecorder != nullptr )
+ {
+ IVideoRecorder *pInterface = (IVideoRecorder*) pVideoRecorder;
+ m_RecorderList.AddToTail( pInterface );
+
+ SetResult( VideoResult::SUCCESS );
+ return pInterface;
+ }
+
+ SetResult( VideoResult::VIDEO_ERROR_OCCURED );
+ return nullptr;
+}
+
+
+VideoResult_t CWebMVideoSubSystem::DestroyVideoRecorder( IVideoRecorder *pRecorder )
+{
+ AssertExitV( m_CurrentStatus == VideoSystemStatus::OK, SetResult( VideoResult::SYSTEM_NOT_AVAILABLE ) );
+ AssertPtrExitV( pRecorder, SetResult( VideoResult::BAD_INPUT_PARAMETERS ) );
+
+ if ( m_RecorderList.Find( pRecorder ) != -1 )
+ {
+ CWebMVideoRecorder *pVideoRecorder = (CWebMVideoRecorder*) pRecorder;
+ delete pVideoRecorder;
+
+ m_RecorderList.FindAndFastRemove( pRecorder );
+
+ return SetResult( VideoResult::SUCCESS );
+ }
+
+ return SetResult( VideoResult::RECORDER_NOT_FOUND );
+}
+
+VideoResult_t CWebMVideoSubSystem::CheckCodecAvailability( VideoEncodeCodec_t codec )
+{
+ AssertExitV( m_CurrentStatus == VideoSystemStatus::OK, SetResult( VideoResult::SYSTEM_NOT_AVAILABLE ) );
+ AssertExitV( codec >= VideoEncodeCodec::DEFAULT_CODEC && codec < VideoEncodeCodec::CODEC_COUNT, SetResult( VideoResult::BAD_INPUT_PARAMETERS ) );
+
+ return SetResult( VideoResult::FEATURE_NOT_AVAILABLE );
+}
+
+
+// ===========================================================================
+// Status support
+// ===========================================================================
+VideoResult_t CWebMVideoSubSystem::GetLastResult()
+{
+ return m_LastResult;
+}
+
+
+VideoResult_t CWebMVideoSubSystem::SetResult( VideoResult_t status )
+{
+ m_LastResult = status;
+ return status;
+}
+
+
+// ===========================================================================
+// WebM Initialization & Shutdown
+// ===========================================================================
+bool CWebMVideoSubSystem::SetupWebM()
+{
+ SetResult( VideoResult::INITIALIZATION_ERROR_OCCURED);
+ AssertExitF( m_bWebMInitialized == false );
+
+ // This is set early to indicate we have already been through here, even if we error out for some reason
+ m_bWebMInitialized = true;
+ m_CurrentStatus = VideoSystemStatus::OK;
+ m_AvailableFeatures = DEFAULT_FEATURE_SET;
+ // $$INIT CODE HERE$$
+
+
+ // Note that we are now open for business....
+ m_bWebMInitialized = true;
+ SetResult( VideoResult::SUCCESS );
+
+ return true;
+}
+
+
+bool CWebMVideoSubSystem::ShutdownWebM()
+{
+ if ( m_bWebMInitialized && m_CurrentStatus == VideoSystemStatus::OK )
+ {
+
+ }
+
+ m_bWebMInitialized = false;
+ m_CurrentStatus = VideoSystemStatus::NOT_INITIALIZED;
+ m_AvailableFeatures = VideoSystemFeature::NO_FEATURES;
+ SetResult( VideoResult::SUCCESS );
+
+ return true;
+}
+