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 IStorage;
20
22{
24
30
33
36
38
40 void *m_pUser;
41
42 void WriteTickMarker(int Tick, bool Keyframe);
43 bool Write(int Type, const void *pData, int Size);
44
45public:
46 CDemoRecorder(CSnapshotDelta *pSnapshotDelta, bool NoMapData = false);
47 CDemoRecorder() = default;
48 ~CDemoRecorder() override;
49
50 int Start(IStorage *pStorage, 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);
51 int Stop(IDemoRecorder::EStopMode Mode, const char *pTargetFilename = "") override;
52
53 void AddDemoMarker();
54 void AddDemoMarker(int Tick);
55
56 void RecordSnapshot(int Tick, const void *pData, int Size);
57 void RecordMessage(const void *pData, int Size);
58
59 bool IsRecording() const override { return m_File != nullptr; }
60 const char *CurrentFilename() const override { return m_aCurrentFilename; }
61
62 bool HasMarkers() const override { return m_NumTimelineMarkers > 0; }
63 int Length() const override { return (m_LastTickMarker - m_FirstTick) / SERVER_TICK_SPEED; }
64};
65
67{
68public:
70 {
71 public:
72 virtual ~IListener() = default;
73 virtual void OnDemoPlayerSnapshot(void *pData, int Size) = 0;
74 virtual void OnDemoPlayerMessage(void *pData, int Size) = 0;
75 };
76
100
101private:
103
105
106 // Playback
108 {
109 public:
110 int64_t m_Filepos;
112
113 CKeyFrame(int64_t Filepos, int Tick) :
114 m_Filepos(Filepos), m_Tick(Tick)
115 {
116 }
117 };
118
120 int64_t m_MapOffset;
123 std::vector<CKeyFrame> m_vKeyFrames;
126
130
131 // Depending on the chunk header
132 // this is either a full CSnapshot or a CSnapshotDelta.
134 // Storage for the full snapshot
135 // where the delta gets unpacked into.
141
143#if defined(CONF_VIDEORECORDER)
144 bool m_WasRecording = false;
145#endif
146
153 EReadChunkHeaderResult ReadChunkHeader(int *pType, int *pSize, int *pTick);
154 void DoTick();
156 {
158 ERROR_RECOVERABLE,
159 ERROR_UNRECOVERABLE,
160 };
162 void UpdateTimes();
163
164 int64_t Time();
166
168 void Construct(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo);
169
170public:
171 CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo);
172 CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo, TUpdateIntraTimesFunc &&UpdateIntraTimesFunc);
173 ~CDemoPlayer() override;
174
175 void SetListener(IListener *pListener);
176
177 int Load(IStorage *pStorage, const char *pFilename, int StorageType);
178 unsigned char *GetMapData(IStorage *pStorage);
179 bool ExtractMap(IStorage *pStorage);
180 void Play();
181 void Pause() override;
182 void Unpause() override;
183 void Stop(const char *pErrorMessage = "");
184 void SetSpeed(float Speed) override;
185 void SetSpeedIndex(int SpeedIndex) override;
186 void AdjustSpeedIndex(int Offset) override;
187 bool SeekPercent(float Percent) override;
188 bool SeekTime(float Seconds) override;
189 bool SeekTick(ETickOffset TickOffset) override;
190 bool SetPos(int WantedTick) override;
191 const CInfo *BaseInfo() const override { return &m_Info.m_Info; }
192 void GetDemoName(char *pBuffer, size_t BufferSize) const override;
193 bool GetDemoInfo(IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader, CTimelineMarkers *pTimelineMarkers, CMapInfo *pMapInfo, IOHANDLE *pFile = nullptr, char *pErrorMessage = nullptr, size_t ErrorMessageSize = 0) const override;
194 const char *Filename() const { return m_aFilename; }
195 const char *ErrorMessage() const override { return m_aErrorMessage; }
196
197 void Update(bool RealTime = true);
198 bool IsSixup() const { return m_Sixup; }
199
200 const CPlaybackInfo *Info() const { return &m_Info; }
201 bool IsPlaying() const override { return m_File != nullptr; }
202 const CMapInfo *GetMapInfo() const { return &m_MapInfo; }
203};
204
206{
210
211public:
212 virtual void Init(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, IStorage *pStorage);
213 bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override;
214};
215
216#endif
Definition demo.h:206
CSnapshotDelta * m_pSnapshotDeltaSixup
Definition demo.h:209
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:208
bool Slice(const char *pDemo, const char *pDst, int StartTick, int EndTick, DEMOFUNC_FILTER pfnFilter, void *pUser) override
Definition demo.cpp:1376
virtual void Init(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, IStorage *pStorage)
Definition demo.cpp:1369
IStorage * m_pStorage
Definition demo.h:207
int64_t m_Filepos
Definition demo.h:110
int m_Tick
Definition demo.h:111
CKeyFrame(int64_t Filepos, int Tick)
Definition demo.h:113
Definition demo.h:78
CTimelineMarkers m_TimelineMarkers
Definition demo.h:81
bool m_LiveStateUpdating
Definition demo.h:96
float m_IntraTickSincePrev
Definition demo.h:93
CDemoHeader m_Header
Definition demo.h:80
int64_t m_LastScan
Definition demo.h:86
float m_IntraTick
Definition demo.h:92
int m_LiveStateFailedCount
Definition demo.h:97
IDemoPlayer::CInfo m_Info
Definition demo.h:83
int64_t m_CurrentTime
Definition demo.h:87
int64_t m_LastUpdate
Definition demo.h:85
int m_LiveStateUnchangedCount
Definition demo.h:98
int m_NextTick
Definition demo.h:89
int m_PreviousTick
Definition demo.h:90
float m_TickTime
Definition demo.h:94
Definition demo.h:70
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:970
const char * ErrorMessage() const override
Definition demo.h:195
int m_LastSnapshotDataSize
Definition demo.h:138
int Load(IStorage *pStorage, const char *pFilename, int StorageType)
Definition demo.cpp:779
std::vector< CKeyFrame > m_vKeyFrames
Definition demo.h:123
void SetListener(IListener *pListener)
Definition demo.cpp:481
bool m_Sixup
Definition demo.h:165
int m_SpeedIndex
Definition demo.h:125
void Play()
Definition demo.cpp:931
EScanFileResult ScanFile()
Definition demo.cpp:551
bool ExtractMap(IStorage *pStorage)
Definition demo.cpp:864
bool SeekTime(float Seconds) override
Definition demo.cpp:964
CDemoPlayer(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo)
Definition demo.cpp:471
IListener * m_pListener
Definition demo.h:102
const char * Filename() const
Definition demo.h:194
IOHANDLE m_File
Definition demo.h:119
bool SeekPercent(float Percent) override
Definition demo.cpp:958
bool IsPlaying() const override
Definition demo.h:201
EReadChunkHeaderResult
Definition demo.h:148
@ CHUNKHEADER_SUCCESS
Definition demo.h:149
@ CHUNKHEADER_ERROR
Definition demo.h:150
@ CHUNKHEADER_EOF
Definition demo.h:151
void UpdateTimes()
Definition demo.cpp:1197
bool IsSixup() const
Definition demo.h:198
void AdjustSpeedIndex(int Offset) override
Definition demo.cpp:1077
bool m_UseVideo
Definition demo.h:142
CSnapshotDelta * m_pSnapshotDeltaSixup
Definition demo.h:140
CPlaybackInfo m_Info
Definition demo.h:127
char m_aFilename[IO_MAX_PATH_LENGTH]
Definition demo.h:121
unsigned char * GetMapData(IStorage *pStorage)
Definition demo.cpp:846
unsigned char m_aCompressedSnapshotData[CSnapshot::MAX_SIZE]
Definition demo.h:128
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:139
void SetSpeedIndex(int SpeedIndex) override
Definition demo.cpp:1070
const CMapInfo * GetMapInfo() const
Definition demo.h:202
const CInfo * BaseInfo() const override
Definition demo.h:191
bool m_WasRecording
Definition demo.h:144
void Update(bool RealTime=true)
Definition demo.cpp:1082
const CPlaybackInfo * Info() const
Definition demo.h:200
void SetSpeed(float Speed) override
Definition demo.cpp:1065
EScanFileResult
Definition demo.h:156
CSnapshotBuffer m_LastSnapshotData
Definition demo.h:137
CSnapshotDelta * SnapshotDelta()
Definition demo.cpp:440
void Unpause() override
Definition demo.cpp:770
unsigned char m_aDecompressedSnapshotData[CSnapshot::MAX_SIZE]
Definition demo.h:129
char m_aErrorMessage[256]
Definition demo.h:122
EReadChunkHeaderResult ReadChunkHeader(int *pType, int *pSize, int *pTick)
Definition demo.cpp:486
int64_t Time()
Definition demo.cpp:904
int64_t m_MapOffset
Definition demo.h:120
void DoTick()
Definition demo.cpp:628
unsigned char m_aChunkData[CSnapshot::MAX_SIZE]
Definition demo.h:133
void Pause() override
Definition demo.cpp:761
void Stop(const char *pErrorMessage="")
Definition demo.cpp:1213
bool GetDemoInfo(IStorage *pStorage, 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:1245
CSnapshotBuffer m_Snapshot
Definition demo.h:136
bool SetPos(int WantedTick) override
Definition demo.cpp:994
void Construct(CSnapshotDelta *pSnapshotDelta, CSnapshotDelta *pSnapshotDeltaSixup, bool UseVideo)
Definition demo.cpp:449
CMapInfo m_MapInfo
Definition demo.h:124
void GetDemoName(char *pBuffer, size_t BufferSize) const override
Definition demo.cpp:1240
TUpdateIntraTimesFunc m_UpdateIntraTimesFunc
Definition demo.h:104
int m_LastKeyFrame
Definition demo.h:28
bool IsRecording() const override
Definition demo.h:59
void WriteTickMarker(int Tick, bool Keyframe)
Definition demo.cpp:233
char m_aCurrentFilename[IO_MAX_PATH_LENGTH]
Definition demo.h:26
int Start(IStorage *pStorage, 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:63
int Length() const override
Definition demo.h:63
void RecordSnapshot(int Tick, const void *pData, int Size)
Definition demo.cpp:312
bool m_NoMapData
Definition demo.h:37
IOHANDLE m_File
Definition demo.h:25
int m_LastTickMarker
Definition demo.h:27
CSnapshotBuffer m_LastSnapshotData
Definition demo.h:31
int Stop(IDemoRecorder::EStopMode Mode, const char *pTargetFilename="") override
Definition demo.cpp:357
CSnapshotDelta * m_pSnapshotDelta
Definition demo.h:32
IStorage * m_pStorage
Definition demo.h:23
int m_NumTimelineMarkers
Definition demo.h:34
CDemoRecorder()=default
bool Write(int Type, const void *pData, int Size)
Definition demo.cpp:258
int m_FirstTick
Definition demo.h:29
void RecordMessage(const void *pData, int Size)
Definition demo.cpp:345
void AddDemoMarker()
Definition demo.cpp:407
bool HasMarkers() const override
Definition demo.h:62
CDemoRecorder(CSnapshotDelta *pSnapshotDelta, bool NoMapData=false)
Definition demo.cpp:46
DEMOFUNC_FILTER m_pfnFilter
Definition demo.h:39
int m_aTimelineMarkers[MAX_TIMELINE_MARKERS]
Definition demo.h:35
const char * CurrentFilename() const override
Definition demo.h:60
void * m_pUser
Definition demo.h:40
Definition snapshot.h:74
Definition snapshot.h:94
@ MAX_SIZE
Definition snapshot.h:50
Definition demo.h:124
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
bool(*) DEMOFUNC_FILTER(const void *pData, int DataSize, void *pUser)
Definition demo.h:27
@ MAX_TIMELINE_MARKERS
Definition demo.h:18
constexpr auto IO_MAX_PATH_LENGTH
Definition types.h:26
void * IOHANDLE
Definition logger.h:12
@ SERVER_TICK_SPEED
Definition protocol.h:81
@ SUCCESS
Definition save.h:29
std::function< void()> TUpdateIntraTimesFunc
Definition demo.h:16
Definition demo.h:35
Definition demo.h:56
Definition demo.h:50
Definition hash.h:12