127 lines
5.2 KiB
C++
127 lines
5.2 KiB
C++
//========= 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
|