diff --git a/code/quake3.vcxproj b/code/quake3.vcxproj index f850f17..25d6f18 100644 --- a/code/quake3.vcxproj +++ b/code/quake3.vcxproj @@ -997,8 +997,6 @@ - - Disabled true diff --git a/code/server/sv_init.c b/code/server/sv_init.c index e1ffb4b..5aee942 100644 --- a/code/server/sv_init.c +++ b/code/server/sv_init.c @@ -623,7 +623,6 @@ void SV_Init (void) { // server-side demo settings Cvar_Get ("svdemo_autorecord", "0", CVAR_ARCHIVE); - Cvar_Get ("svdemo_compress", "1", CVAR_ARCHIVE); Cvar_Get ("svdemo_pauseEmpty", "1", CVAR_ARCHIVE); // initialize bot cvars so they are listed and can be set before loading the botlib diff --git a/code/server/sv_netdemo.c b/code/server/sv_netdemo.c index 0f2c441..da5e649 100644 --- a/code/server/sv_netdemo.c +++ b/code/server/sv_netdemo.c @@ -10,7 +10,6 @@ snapshot pipeline delivers them to a spectator client. */ #include "server.h" -#include "lz4.h" // --------------------------------------------------------------- // File format @@ -55,7 +54,6 @@ snapshot pipeline delivers them to a spectator client. #define SVDEMO_MAX_MAPNAME 64 // header flags -#define SVDEMO_FLAG_COMPRESSED 1 // per-frame data is LZ4 compressed // --------------------------------------------------------------- // State @@ -81,7 +79,6 @@ typedef struct { // recording fileHandle_t recordFile; qboolean recording; - qboolean compressed; // LZ4 compression enabled char *lastConfigstrings[MAX_CONFIGSTRINGS]; // for delta detection svdEntityState_t prevEntities[MAX_GENTITIES]; // previous frame for delta svdPlayerState_t prevPlayers[MAX_CLIENTS]; // previous frame player states @@ -131,58 +128,6 @@ static short SVD_ReadShort( fileHandle_t f ) { return v; } -// --------------------------------------------------------------- -// LZ4 block I/O: writes [uncompressed_size][compressed_size][data] -// --------------------------------------------------------------- - -static void SVD_WriteBlock( fileHandle_t f, const byte *data, int len ) { - if ( demo.compressed && len > 0 ) { - int bound = LZ4_compressBound( len ); - static byte compBuf[MAX_GENTITIES * 300]; - int compLen; - - compLen = LZ4_compress_default( (const char *)data, (char *)compBuf, len, bound ); - if ( compLen > 0 ) { - SVD_WriteInt( f, len ); // original size - SVD_WriteInt( f, compLen ); // compressed size - FS_Write( compBuf, compLen, f ); - return; - } - // fall through to uncompressed on failure - } - SVD_WriteInt( f, len ); // original size - SVD_WriteInt( f, 0 ); // 0 = not compressed - FS_Write( data, len, f ); -} - -static int SVD_ReadBlock( fileHandle_t f, byte *buf, int bufSize ) { - int origLen, compLen; - - origLen = SVD_ReadInt( f ); - compLen = SVD_ReadInt( f ); - - if ( origLen <= 0 || origLen > bufSize ) { - return -1; - } - - if ( compLen > 0 ) { - // compressed - static byte compBuf[MAX_GENTITIES * 300]; - if ( compLen > (int)sizeof(compBuf) ) { - return -1; - } - FS_Read( compBuf, compLen, f ); - if ( LZ4_decompress_safe( (const char *)compBuf, (char *)buf, compLen, bufSize ) != origLen ) { - return -1; - } - } else { - // uncompressed - FS_Read( buf, origLen, f ); - } - - return origLen; -} - // --------------------------------------------------------------- // Write header // --------------------------------------------------------------- @@ -193,7 +138,7 @@ static void SVD_WriteHeader( fileHandle_t f ) { SVD_WriteInt( f, SVDEMO_MAGIC ); SVD_WriteInt( f, SVDEMO_VERSION ); - SVD_WriteInt( f, demo.compressed ? SVDEMO_FLAG_COMPRESSED : 0 ); + SVD_WriteInt( f, 0 ); // flags (reserved) SVD_WriteInt( f, sv_maxclients->integer ); SVD_WriteInt( f, sv_fps->integer ); @@ -294,8 +239,9 @@ static void SVD_WriteFrame( fileHandle_t f ) { // end of entities marker MSG_WriteBits( &msg, (MAX_GENTITIES - 1), GENTITYNUM_BITS ); - // write entity message to file (optionally LZ4 compressed) - SVD_WriteBlock( f, msg.data, msg.cursize ); + // write entity message to file + SVD_WriteInt( f, msg.cursize ); + FS_Write( msg.data, msg.cursize, f ); // write player states (delta compressed) { @@ -346,7 +292,8 @@ static void SVD_WriteFrame( fileHandle_t f ) { MSG_WriteBits( &psmsg, MAX_CLIENTS - 1, 6 ); MSG_WriteBits( &psmsg, 0, 1 ); - SVD_WriteBlock( f, psmsg.data, psmsg.cursize ); + SVD_WriteInt( f, psmsg.cursize ); + FS_Write( psmsg.data, psmsg.cursize, f ); } // configstring changes @@ -417,10 +364,8 @@ static qboolean SVD_StartRecording( const char *demoname ) { return qfalse; } - Com_Printf( "Recording server demo to %s%s\n", path, - Cvar_VariableIntegerValue("svdemo_compress") ? " (LZ4)" : "" ); + Com_Printf( "Recording server demo to %s\n", path ); demo.recording = qtrue; - demo.compressed = Cvar_VariableIntegerValue("svdemo_compress") ? qtrue : qfalse; // clear delta state for fresh recording Com_Memset( demo.prevEntities, 0, sizeof(demo.prevEntities) ); @@ -567,10 +512,7 @@ static qboolean SVD_ReadHeader( fileHandle_t f ) { return qfalse; } - { - int flags = SVD_ReadInt( f ); - demo.compressed = ( flags & SVDEMO_FLAG_COMPRESSED ) ? qtrue : qfalse; - } + SVD_ReadInt( f ); // flags (reserved) demo.playMaxClients = SVD_ReadInt( f ); demo.playFps = SVD_ReadInt( f ); @@ -661,11 +603,12 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) { } } - // read entity message (optionally LZ4 compressed) - blockLen = SVD_ReadBlock( f, msgBuf, sizeof(msgBuf) ); - if ( blockLen <= 0 ) { + // read entity message + blockLen = SVD_ReadInt( f ); + if ( blockLen <= 0 || blockLen > (int)sizeof(msgBuf) ) { return qfalse; } + FS_Read( msgBuf, blockLen, f ); MSG_Init( &msg, msgBuf, sizeof(msgBuf) ); msg.cursize = blockLen; @@ -735,8 +678,9 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) { static byte psBuf[MAX_CLIENTS * 600]; // worst case: full playerState from baseline int psMsgLen; - psMsgLen = SVD_ReadBlock( f, psBuf, sizeof(psBuf) ); - if ( psMsgLen > 0 ) { + psMsgLen = SVD_ReadInt( f ); + if ( psMsgLen > 0 && psMsgLen <= (int)sizeof(psBuf) ) { + FS_Read( psBuf, psMsgLen, f ); MSG_Init( &psmsg, psBuf, sizeof(psBuf) ); psmsg.cursize = psMsgLen;