csgo-2018-source/engine/cl_broadcast.h

127 lines
5.2 KiB
C
Raw Permalink Normal View History

2021-07-25 12:11:47 +08:00
//========= Copyright (c) Valve Corporation, All rights reserved. ============//
//
// Purpose: Playback of broadcast (cst) files
//
//=============================================================================//
#ifndef ENGINE_CL_BROADCAST_HDR
#define ENGINE_CL_BROADCAST_HDR
#include "broadcast.h"
#include "demostreamhttp.h"
#include "tier1/utlbufferstrider.h"
class CBroadcastPlayer : public IDemoPlayer, public IDemoStreamClient
{
public:
CBroadcastPlayer();
~CBroadcastPlayer();
virtual IDemoStream *GetDemoStream();
virtual int GetPlaybackStartTick( void ) OVERRIDE;
virtual int GetPlaybackTick( void ) OVERRIDE;
virtual int GetPlaybackDeltaTick( void ) ;
virtual int GetPacketTick( void ) ;
void StartStreaming( const char *url, const char *options );
bool StartBroadcastPlayback( int nStartingTick );
bool OnEngineGotvSyncPacket( const CEngineGotvSyncPacket *pPkt );
virtual bool IsPlayingBack( void ) const OVERRIDE { return m_bPlayingBack; }
virtual bool IsPlaybackPaused( void ) const OVERRIDE;
virtual bool IsPlayingTimeDemo( void ) const OVERRIDE { return false; } // not supported
virtual bool IsSkipping( void ) const OVERRIDE { return m_bPlayingBack && m_nSkipToTick != -1; } // true, if demo player skipping trough packets
virtual bool CanSkipBackwards( void ) const OVERRIDE { return true; } // true if demoplayer can skip backwards
virtual void SetPlaybackTimeScale( float timescale ) OVERRIDE; // sets playback timescale
virtual float GetPlaybackTimeScale( void ) OVERRIDE; // get playback timescale
virtual void PausePlayback( float seconds ) OVERRIDE; // pause playback n seconds, -1 = forever
virtual void SkipToTick( int tick, bool bRelative, bool bPause ) OVERRIDE { } // goto a specific tick, 0 = start, -1 = end
virtual void SkipToImportantTick( const DemoImportantTick_t *pTick ) OVERRIDE { }
virtual void ResumePlayback( void ) OVERRIDE; // resume playback
virtual void StopPlayback( void ) OVERRIDE; // stop playback, close file
virtual void InterpolateViewpoint() OVERRIDE { } // override viewpoint
virtual netpacket_t *ReadPacket( void ) OVERRIDE; // read packet from demo file
void SetDemoBuffer( CDemoStreamHttp::Buffer_t * pBuffer );
void StrideDemoPacket( int nLength );
void StrideDemoPacket();
uint GetReminingStrideLength();
virtual void ResetDemoInterpolation() OVERRIDE { }
virtual CDemoPlaybackParameters_t const * GetDemoPlaybackParameters() OVERRIDE;
virtual void SetPacketReadSuspended( bool bSuspendPacketReading ) OVERRIDE;
virtual void SetImportantEventData( const KeyValues *pData ) OVERRIDE { }
virtual int FindNextImportantTick( int nCurrentTick, const char *pEventName = NULL ) OVERRIDE { Assert( !"not implemented" ); return 0; } // -1 = no next important tick
virtual int FindPreviousImportantTick( int nCurrentTick, const char *pEventName = NULL ) OVERRIDE { Assert( !"not implemented" ); return 0; } // -1 = no previous important tick
virtual const DemoImportantTick_t *GetImportantTick( int nIndex ) OVERRIDE { Assert( !"not implemented" ); return NULL; }
virtual const DemoImportantGameEvent_t *GetImportantGameEvent( const char *pszEventName ) OVERRIDE { Assert( !"not implemented" ); return NULL; }
virtual void ListImportantTicks( void ) OVERRIDE { Assert( !"not implemented" ); }
virtual void ListHighlightData( void ) OVERRIDE { Assert( !"not implemented" ); }
virtual void SetHighlightXuid( uint64 xuid, bool bLowlights ) OVERRIDE { Assert( !"not implemented" ); }
virtual bool ScanDemo( const char *filename, const char* pszMode ) OVERRIDE { Assert( !"not implemented" ); return false; }
virtual void OnDemoStreamStart( const DemoStreamReference_t &start, int nResync );
virtual bool OnDemoStreamRestarting();
virtual void OnDemoStreamStop() OVERRIDE;
protected:
bool StartStreamingInternal();
void ResyncDemoClock();
bool CheckPausedPlayback( void );
bool PreparePacket( void ); // read packet from demo file
void ReadCmdHeader( unsigned char& cmd, int& tick, int &nPlayerSlot );
void ResyncStream();
protected:
int m_nStartHostTick; // For synchronizing playback during timedemo.
int m_nStreamStartTick;
int m_nPreviousTick;
CDemoStreamHttp::BufferRef m_DemoBuffer;
CBufferStrider m_DemoStrider;
netpacket_t m_DemoPacket; // last read demo packet
bool m_bPlayingBack;
bool m_bPlaybackPaused;
float m_flAutoResumeTime;
float m_flPlaybackRateModifier;
int m_nSkipToTick; // skip to tick ASAP, -1 = off
uint m_nFileSize;
CUtlVector< BroadcastTocKeyframe_t > m_Keyframes;
bool m_bInterpolateView;
bool m_bResetInterpolation;
bool m_bPacketReadSuspended;
float m_flTotalFPSVariability; // Frame rate variability
int m_nPacketTick;
int m_nPreparePacketLastFail;
enum StreamStateEnum_t
{
STREAM_STOP,
STREAM_SYNC,
STREAM_START,
STREAM_MAP_LOADED,
STREAM_WAITING_FOR_KEYFRAME,
STREAM_FULLFRAME,
STREAM_BEFORE_DELTAFRAMES,
STREAM_DELTAFRAMES
};
StreamStateEnum_t m_nStreamState; // the pieces of stream state that still need to be streamed
int m_nStreamFragment; // the next fragment to stream
double m_dDelayedPrecacheTimeStart;
CDemoStreamHttp m_DemoStream;
bool m_bIgnoreDemoStopCommand;
bool m_bSkipSync;
double m_dResyncTimerStart;
};
extern CBroadcastPlayer s_ClientBroadcastPlayer;
#endif