DDNet documentation
Loading...
Searching...
No Matches
demo.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SHARED_DEMO_H
4#define ENGINE_SHARED_DEMO_H
5
6#include "snapshot.h"
7
8#include <base/hash.h>
9
10#include <engine/demo.h>
12
13#include <functional>
14#include <vector>
15
16typedef std::function<void()> TUpdateIntraTimesFunc;
17
18class CSnapshotDelta;
19class IConsole;
20class IStorage;
21
23{
26
32
35
38
40
42 void *m_pUser;
43
44 void WriteTickMarker(int Tick, bool Keyframe);
45 void Write(int Type, const void *pData, int Size);
46
47public:
48 CDemoRecorder(CSnapshotDelta *pSnapshotDelta, bool NoMapData = false);
49 CDemoRecorder() = default;
50 ~CDemoRecorder() override;
51
52 int Start(IStorage *pStorage, IConsole *pConsole, const char *pFilename, const char *pNetversion, const char *pMap, const SHA256_DIGEST &Sha256, unsigned MapCrc, const char *pType, unsigned MapSize, unsigned char *pMapData, IOHANDLE MapFile, DEMOFUNC_FILTER pfnFilter, void *pUser);
53 int Stop(IDemoRecorder::EStopMode Mode, const char *pTargetFilename = "") override;
54
55 void AddDemoMarker();
56 void AddDemoMarker(int Tick);
57
58 void RecordSnapshot(int Tick, const void *pData, int Size);
59 void RecordMessage(const void *pData, int Size);
60
61 bool IsRecording() const override { return m_File != nullptr; }
62 const char *CurrentFilename() const override { return m_aCurrentFilename; }
63
64 int Length() const override { return (m_LastTickMarker - m_FirstTick) / SERVER_TICK_SPEED; }
65};
66
68{
69public:
71 {
72 public:
73 virtual ~IListener() = default;
74 virtual void OnDemoPlayerSnapshot(void *pData, int Size) = 0;
75 virtual void OnDemoPlayerMessage(void *pData, int Size) = 0;
76 };
77
101
102private:
104
106
107 // Playback
109 {
110 public:
111 int64_t m_Filepos;
113
114 CKeyFrame(int64_t Filepos, int Tick) :
115 m_Filepos(Filepos), m_Tick(Tick)
116 {
117 }
118 };
119
122 int64_t m_MapOffset;
125 std::vector<CKeyFrame> m_vKeyFrames;
128
132
133 // Depending on the chunk header
134 // this is either a full CSnapshot or a CSnapshotDelta.
136 // Storage for the full snapshot
137 // where the delta gets unpacked into.
143
145#if defined(CONF_VIDEORECORDER)
146 bool m_WasRecording = false;
147#endif
148
155 EReadChunkHeaderResult ReadChunkHeader(int *pType, int *pSize, int *pTick);
156 void DoTick();
164 void UpdateTimes();
165
166 int64_t Time();
168
170 void Construct(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo);
171
172public:
173 CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo);
174 CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo, TUpdateIntraTimesFunc &&UpdateIntraTimesFunc);
175 ~CDemoPlayer() override;
176
177 void SetListener(IListener *pListener);
178
179 int Load(IStorage *pStorage, IConsole *pConsole, const char *pFilename, int StorageType);
180 unsigned char *GetMapData(IStorage *pStorage);
181 bool ExtractMap(IStorage *pStorage);
182 void Play();
183 void Pause() override;
184 void Unpause() override;
185 void Stop(const char *pErrorMessage = "");
186 void SetSpeed(float Speed) override;
187 void SetSpeedIndex(int SpeedIndex) override;
188 void AdjustSpeedIndex(int Offset) override;
189 bool SeekPercent(float Percent) override;
190 bool SeekTime(float Seconds) override;
191 bool SeekTick(ETickOffset TickOffset) override;
192 bool SetPos(int WantedTick) override;
193 const CInfo *BaseInfo() const override { return &m_Info.m_Info; }
194 void GetDemoName(char *pBuffer, size_t BufferSize) const override;
195 bool GetDemoInfo(IStorage *pStorage, IConsole *pConsole, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader, CTimelineMarkers *pTimelineMarkers, CMapInfo *pMapInfo, IOHANDLE *pFile = nullptr, char *pErrorMessage = nullptr, size_t ErrorMessageSize = 0) const override;
196 const char *Filename() const { return m_aFilename; }
197 const char *ErrorMessage() const override { return m_aErrorMessage; }
198
199 void Update(bool RealTime = true);
200 bool IsSixup() const { return m_Sixup; }
201
202 const CPlaybackInfo *Info() const { return &m_Info; }
203 bool IsPlaying() const override { return m_File != nullptr; }
204 const CMapInfo *GetMapInfo() const { return &m_MapInfo; }
205};
206
208{
213
214public:
215 virtual void Init(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, IConsole *pConsole, IStorage *pStorage);
216 bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override;
217};
218
219#endif
Definition demo.h:208
IConsole * m_pConsole
Definition demo.h:209
CSnapshotDelta * m_pSnapshotDeltaSixup
Definition demo.h:212
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:211
bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override
Definition demo.cpp:1431
IStorage * m_pStorage
Definition demo.h:210
virtual void Init(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, IConsole *pConsole, IStorage *pStorage)
Definition demo.cpp:1423
int64_t m_Filepos
Definition demo.h:111
int m_Tick
Definition demo.h:112
CKeyFrame(int64_t Filepos, int Tick)
Definition demo.h:114
Definition demo.h:79
CTimelineMarkers m_TimelineMarkers
Definition demo.h:82
bool m_LiveStateUpdating
Definition demo.h:97
float m_IntraTickSincePrev
Definition demo.h:94
CDemoHeader m_Header
Definition demo.h:81
int64_t m_LastScan
Definition demo.h:87
float m_IntraTick
Definition demo.h:93
int m_LiveStateFailedCount
Definition demo.h:98
IDemoPlayer::CInfo m_Info
Definition demo.h:84
int64_t m_CurrentTime
Definition demo.h:88
int64_t m_LastUpdate
Definition demo.h:86
int m_LiveStateUnchangedCount
Definition demo.h:99
int m_NextTick
Definition demo.h:90
int m_PreviousTick
Definition demo.h:91
float m_TickTime
Definition demo.h:95
Definition demo.h:71
virtual void OnDemoPlayerMessage(void *pData, int Size)=0
virtual ~IListener()=default
virtual void OnDemoPlayerSnapshot(void *pData, int Size)=0
bool SeekTick(ETickOffset TickOffset) override
Definition demo.cpp:1020
const char * ErrorMessage() const override
Definition demo.h:197
int m_LastSnapshotDataSize
Definition demo.h:140
std::vector< CKeyFrame > m_vKeyFrames
Definition demo.h:125
void SetListener(IListener *pListener)
Definition demo.cpp:521
int Load(IStorage *pStorage, IConsole *pConsole, const char *pFilename, int StorageType)
Definition demo.cpp:828
bool m_Sixup
Definition demo.h:167
int m_SpeedIndex
Definition demo.h:127
void Play()
Definition demo.cpp:981
EScanFileResult ScanFile()
Definition demo.cpp:591
bool ExtractMap(IStorage *pStorage)
Definition demo.cpp:914
bool SeekTime(float Seconds) override
Definition demo.cpp:1014
CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo)
Definition demo.cpp:511
IListener * m_pListener
Definition demo.h:103
const char * Filename() const
Definition demo.h:196
IOHANDLE m_File
Definition demo.h:121
bool SeekPercent(float Percent) override
Definition demo.cpp:1008
bool IsPlaying() const override
Definition demo.h:203
EReadChunkHeaderResult
Definition demo.h:150
@ CHUNKHEADER_SUCCESS
Definition demo.h:151
@ CHUNKHEADER_ERROR
Definition demo.h:152
@ CHUNKHEADER_EOF
Definition demo.h:153
~CDemoPlayer() override
Definition demo.cpp:516
void UpdateTimes()
Definition demo.cpp:1247
bool IsSixup() const
Definition demo.h:200
void AdjustSpeedIndex(int Offset) override
Definition demo.cpp:1127
bool m_UseVideo
Definition demo.h:144
IConsole * m_pConsole
Definition demo.h:120
CSnapshotDelta * m_pSnapshotDeltaSixup
Definition demo.h:142
CPlaybackInfo m_Info
Definition demo.h:129
char m_aFilename[IO_MAX_PATH_LENGTH]
Definition demo.h:123
unsigned char * GetMapData(IStorage *pStorage)
Definition demo.cpp:896
unsigned char m_aCompressedSnapshotData[CSnapshot::MAX_SIZE]
Definition demo.h:130
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:141
void SetSpeedIndex(int SpeedIndex) override
Definition demo.cpp:1120
const CMapInfo * GetMapInfo() const
Definition demo.h:204
const CInfo * BaseInfo() const override
Definition demo.h:193
bool m_WasRecording
Definition demo.h:146
void Update(bool RealTime=true)
Definition demo.cpp:1132
const CPlaybackInfo * Info() const
Definition demo.h:202
void SetSpeed(float Speed) override
Definition demo.cpp:1115
EScanFileResult
Definition demo.h:158
@ ERROR_UNRECOVERABLE
Definition demo.h:161
@ ERROR_RECOVERABLE
Definition demo.h:160
@ SUCCESS
Definition demo.h:159
CSnapshotBuffer m_LastSnapshotData
Definition demo.h:139
CSnapshotDelta * SnapshotDelta()
Definition demo.cpp:480
void Unpause() override
Definition demo.cpp:819
unsigned char m_aDecompressedSnapshotData[CSnapshot::MAX_SIZE]
Definition demo.h:131
char m_aErrorMessage[256]
Definition demo.h:124
EReadChunkHeaderResult ReadChunkHeader(int *pType, int *pSize, int *pTick)
Definition demo.cpp:526
int64_t Time()
Definition demo.cpp:954
int64_t m_MapOffset
Definition demo.h:122
void DoTick()
Definition demo.cpp:668
bool GetDemoInfo(IStorage *pStorage, IConsole *pConsole, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader, CTimelineMarkers *pTimelineMarkers, CMapInfo *pMapInfo, IOHANDLE *pFile=nullptr, char *pErrorMessage=nullptr, size_t ErrorMessageSize=0) const override
Definition demo.cpp:1296
unsigned char m_aChunkData[CSnapshot::MAX_SIZE]
Definition demo.h:135
void Pause() override
Definition demo.cpp:810
void Stop(const char *pErrorMessage="")
Definition demo.cpp:1263
CSnapshotBuffer m_Snapshot
Definition demo.h:138
bool SetPos(int WantedTick) override
Definition demo.cpp:1044
void Construct(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo)
Definition demo.cpp:489
CMapInfo m_MapInfo
Definition demo.h:126
void GetDemoName(char *pBuffer, size_t BufferSize) const override
Definition demo.cpp:1291
TUpdateIntraTimesFunc m_UpdateIntraTimesFunc
Definition demo.h:105
int m_LastKeyFrame
Definition demo.h:30
bool IsRecording() const override
Definition demo.h:61
~CDemoRecorder() override
Definition demo.cpp:60
int Start(IStorage *pStorage, IConsole *pConsole, const char *pFilename, const char *pNetversion, const char *pMap, const SHA256_DIGEST &Sha256, unsigned MapCrc, const char *pType, unsigned MapSize, unsigned char *pMapData, IOHANDLE MapFile, DEMOFUNC_FILTER pfnFilter, void *pUser)
Definition demo.cpp:66
void WriteTickMarker(int Tick, bool Keyframe)
Definition demo.cpp:256
char m_aCurrentFilename[IO_MAX_PATH_LENGTH]
Definition demo.h:28
int Length() const override
Definition demo.h:64
void RecordSnapshot(int Tick, const void *pData, int Size)
Definition demo.cpp:331
bool m_NoMapData
Definition demo.h:39
IOHANDLE m_File
Definition demo.h:27
int m_LastTickMarker
Definition demo.h:29
CSnapshotBuffer m_LastSnapshotData
Definition demo.h:33
int Stop(IDemoRecorder::EStopMode Mode, const char *pTargetFilename="") override
Definition demo.cpp:373
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:34
IStorage * m_pStorage
Definition demo.h:25
int m_NumTimelineMarkers
Definition demo.h:36
CDemoRecorder()=default
int m_FirstTick
Definition demo.h:31
void RecordMessage(const void *pData, int Size)
Definition demo.cpp:361
void AddDemoMarker()
Definition demo.cpp:439
IConsole * m_pConsole
Definition demo.h:24
CDemoRecorder(CSnapshotDelta *pSnapshotDelta, bool NoMapData=false)
Definition demo.cpp:49
DEMOFUNC_FILTER m_pfnFilter
Definition demo.h:41
int m_aTimelineMarkers[MAX_TIMELINE_MARKERS]
Definition demo.h:37
const char * CurrentFilename() const override
Definition demo.h:62
void * m_pUser
Definition demo.h:42
Definition snapshot.h:76
Definition snapshot.h:87
@ MAX_SIZE
Definition snapshot.h:52
Definition console.h:20
Definition demo.h:123
Definition demo.h:68
Definition demo.h:64
ETickOffset
Definition demo.h:84
Definition demo.h:107
EStopMode
Definition demo.h:111
Definition storage.h:21
Write
Definition connection_pool.h:36
bool(* DEMOFUNC_FILTER)(const void *pData, int DataSize, void *pUser)
Definition demo.h:27
@ MAX_TIMELINE_MARKERS
Definition demo.h:18
@ SERVER_TICK_SPEED
Definition protocol.h:81
constexpr auto IO_MAX_PATH_LENGTH
Definition types.h:26
void * IOHANDLE
Definition logger.h:12
std::function< void()> TUpdateIntraTimesFunc
Definition demo.h:16
Definition demo.h:35
Definition demo.h:56
Definition demo.h:50
Definition hash.h:15