From 6364e3e17682864c0b9d8621bd671664786df324 Mon Sep 17 00:00:00 2001 From: BeaR Date: Mon, 23 Feb 2015 14:26:10 +0100 Subject: [PATCH 1/2] Fix bug when reading reading chunks with a tick delta of 0 * Remove magic value '63' * Add flag for chunks where the tick value is stored on the first chunk along the flags * Correctly read chunks with tick values smaller then the tick mask --- src/engine/shared/demo.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 2860d76b4..3142970ca 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -152,8 +152,9 @@ enum { CHUNKTYPEFLAG_TICKMARKER = 0x80, CHUNKTICKFLAG_KEYFRAME = 0x40, // only when tickmarker is set + CHUNKTICKFLAG_TICK_COMPRESSED = 0x20, // when we store the tick value in the first chunk - CHUNKMASK_TICK = 0x3f, + CHUNKMASK_TICK = 0x1f, CHUNKMASK_TYPE = 0x60, CHUNKMASK_SIZE = 0x1f, @@ -166,7 +167,7 @@ enum void CDemoRecorder::WriteTickMarker(int Tick, int Keyframe) { - if(m_LastTickMarker == -1 || Tick-m_LastTickMarker > 63 || Keyframe) + if(m_LastTickMarker == -1 || Tick-m_LastTickMarker > CHUNKMASK_TICK || Keyframe) { unsigned char aChunk[5]; aChunk[0] = CHUNKTYPEFLAG_TICKMARKER; @@ -183,7 +184,7 @@ void CDemoRecorder::WriteTickMarker(int Tick, int Keyframe) else { unsigned char aChunk[1]; - aChunk[0] = CHUNKTYPEFLAG_TICKMARKER | (Tick-m_LastTickMarker); + aChunk[0] = CHUNKTYPEFLAG_TICKMARKER | CHUNKTICKFLAG_TICK_COMPRESSED | (Tick-m_LastTickMarker); io_write(m_File, aChunk, sizeof(aChunk)); } @@ -371,20 +372,20 @@ int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick) if(Chunk&CHUNKTYPEFLAG_TICKMARKER) { // decode tick marker - int Tickdelta = Chunk&(CHUNKMASK_TICK); *pType = Chunk&(CHUNKTYPEFLAG_TICKMARKER|CHUNKTICKFLAG_KEYFRAME); - if(Tickdelta == 0) + if(Chunk&(CHUNKTICKFLAG_TICK_COMPRESSED)) + { + int Tickdelta = Chunk&(CHUNKMASK_TICK); + *pTick += Tickdelta; + } + else { unsigned char aTickdata[4]; if(io_read(m_File, aTickdata, sizeof(aTickdata)) != sizeof(aTickdata)) return -1; *pTick = (aTickdata[0]<<24) | (aTickdata[1]<<16) | (aTickdata[2]<<8) | aTickdata[3]; } - else - { - *pTick += Tickdelta; - } } else From 723bf0f6dc1d133cc2249c6aeebfce6dd620fc8e Mon Sep 17 00:00:00 2001 From: BeaR Date: Wed, 11 Mar 2015 17:52:18 +0100 Subject: [PATCH 2/2] Restore compatibility with older demo versions --- src/engine/shared/demo.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 3142970ca..81083eb63 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -15,8 +15,9 @@ #include "snapshot.h" static const unsigned char gs_aHeaderMarker[7] = {'T', 'W', 'D', 'E', 'M', 'O', 0}; -static const unsigned char gs_ActVersion = 4; +static const unsigned char gs_ActVersion = 5; static const unsigned char gs_OldVersion = 3; +static const unsigned char gs_VersionTickCompression = 5; // demo files with this version or higher will use `CHUNKTICKFLAG_TICK_COMPRESSED` static const int gs_LengthOffset = 152; static const int gs_NumMarkersOffset = 176; @@ -155,6 +156,7 @@ enum CHUNKTICKFLAG_TICK_COMPRESSED = 0x20, // when we store the tick value in the first chunk CHUNKMASK_TICK = 0x1f, + CHUNKMASK_TICK_LEGACY = 0x3f, CHUNKMASK_TYPE = 0x60, CHUNKMASK_SIZE = 0x1f, @@ -372,9 +374,14 @@ int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick) if(Chunk&CHUNKTYPEFLAG_TICKMARKER) { // decode tick marker + int Tickdelta_legacy = Chunk&(CHUNKMASK_TICK_LEGACY); // compatibility *pType = Chunk&(CHUNKTYPEFLAG_TICKMARKER|CHUNKTICKFLAG_KEYFRAME); - if(Chunk&(CHUNKTICKFLAG_TICK_COMPRESSED)) + if(m_Info.m_Header.m_Version < gs_VersionTickCompression && Tickdelta_legacy != 0) + { + *pTick += Tickdelta_legacy; + } + else if(Chunk&(CHUNKTICKFLAG_TICK_COMPRESSED)) { int Tickdelta = Chunk&(CHUNKMASK_TICK); *pTick += Tickdelta;