Twitch SDK (Internal)
rtmpstate.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
14 
15 #define __STDC_FORMAT_MACROS
16 #include <inttypes.h>
17 
18 namespace ttv
19 {
20  namespace broadcast
21  {
22  class RtmpState;
23  class RtmpIdleState;
24  class RtmpInitializeState;
25  class RtmpHandshakeState;
26  class RtmpConnectState;
27  class RtmpCreateStreamState;
28  class RtmpPublishState;
29  class RtmpSendVideoState;
30  class RtmpShutdownState;
32 
33  typedef std::array<uint8_t, 0x10000> rtmpinputbuffer_t;
34  }
35 }
36 
38 // Base class for the RTMP State machine
41 {
42 public:
44  : mContext(context) {}
45  virtual ~RtmpState() {}
46 
47  void OnEnter()
48  {
50  ttv::trace::Message("rtmp", TTV_ML_DEBUG, "RtmpState::OnEnter - state start time: %" PRId64, GetSystemTimeMilliseconds());
51 
53  }
54  void OnExit() { OnExitInternal(); }
55  void Update()
56  {
58 
59  if (timeout > GetTimeoutDuration())
60  {
61  ttv::trace::Message("rtmp", TTV_ML_ERROR, "RtmpState::Update - Rtmp state timed out at time: %" PRId64, GetSystemTimeMilliseconds());
62 
63  GetContext()->mLastError = TTV_EC_BROADCAST_RTMP_TIMEOUT;
65  }
66  else
67  {
68  // Todo PollForInput can return a valid
69  // error that will be lost right here.
71  if (TTV_FAILED(ret))
72  {
73  GetContext()->mLastError = ret;
75  }
76  }
77  }
78 
79  // TODO: This should be private/protected
80  void EndChunk()
81  {
82  GetContext()->mChunkSpace = 0;
83  }
84 
85  // TODO: This should be private/protected
86  // TODO: This doesn't belong in rtmpstate at all
87  TTV_ErrorCode AppendChunkData(const uint8_t* buffer, size_t length, RtmpMessageDetails& chunkDetails);
88  template <class _T> TTV_ErrorCode AppendChunkData(const std::vector<_T>& buffer, RtmpMessageDetails& chunkDetails)
89  {
90  return AppendChunkData(reinterpret_cast<const uint8_t*> (&buffer[0]), buffer.size() * sizeof(_T), chunkDetails);
91  }
92 protected:
93 
95  TTV_ErrorCode SendChunkData(const uint8_t* buffer, size_t length, RtmpMessageDetails& chunkDetails)
96  {
97  TTV_ErrorCode ret = AppendChunkData(buffer, length, chunkDetails);
98  EndChunk();
99  return ret;
100  }
101  template <class _T> TTV_ErrorCode SendChunkData(const std::vector<_T>& buffer, RtmpMessageDetails& chunkDetails)
102  {
103  return SendChunkData(reinterpret_cast<const uint8_t*> (&buffer[0]), buffer.size() * sizeof(_T), chunkDetails);
104  }
105 
107  const RtmpContext* GetContext() const { assert (mContext); return mContext; }
108 
109  virtual void HandleIncomingChunkSize(ChunkHeader header, const uint8_t* data);
110  virtual void HandleIncomingAbortMsg(ChunkHeader header, const uint8_t* data);
111  virtual void HandleIncomingBytesRead(ChunkHeader header, const uint8_t* data);
112  virtual void HandleIncomingControl(ChunkHeader header, const uint8_t* data);
113  virtual void HandleIncomingWinacksize(ChunkHeader header, const uint8_t* data);
114  virtual void HandleIncomingPeerBW(ChunkHeader header, const uint8_t* data);
115  virtual void HandleIncomingEdgeOrigin(ChunkHeader header, const uint8_t* data);
116  virtual void HandleIncomingAudio(ChunkHeader header, const uint8_t* data);
117  virtual void HandleIncomingVideo(ChunkHeader header, const uint8_t* data);
118  virtual void HandleIncomingAmf3Data(ChunkHeader header, const uint8_t* data);
119  virtual void HandleIncomingAmf3SharedObject(ChunkHeader header, uint8_t* data);
120  virtual void HandleIncomingAmf3(ChunkHeader header, const uint8_t* data);
121  virtual void HandleIncomingAmf0Data(ChunkHeader header, const uint8_t* data);
122  virtual void HandleIncomingAmf0SharedObject(ChunkHeader header, const uint8_t* data);
123  virtual void HandleIncomingAmf0(ChunkHeader header, const uint8_t* data);
124  virtual void HandleIncomingAggregate(ChunkHeader header, const uint8_t* data);
125 
126 private:
127  virtual void OnEnterInternal() {}
128  virtual void OnExitInternal() {}
129 
130  virtual uint64_t GetTimeoutDuration() const
131  {
132  return std::numeric_limits<uint64_t>::max();
133  }
134 
137  static rtmpinputbuffer_t::size_type mInputBufferPos;
138 
140  uint64_t mStateStartTime;
141 };
142 
144 // Idle state, doesn't do anything
147 {
148 public:
150  : RtmpState(context) {}
151  virtual ~RtmpIdleState();
152 };
153 
154 
156 {
157 public:
159  : RtmpState(context) {}
160  virtual ~RtmpErrorState();
161 
162  virtual void OnEnterInternal()
163  {
164  ttv::trace::Message("rtmp", TTV_ML_ERROR, "RTMP Entered error state with error %s", ErrorToString(GetContext()->mLastError));
165  }
166 };
virtual void HandleIncomingAggregate(ChunkHeader header, const uint8_t *data)
TTV_ErrorCode AppendChunkData(const uint8_t *buffer, size_t length, RtmpMessageDetails &chunkDetails)
uint64_t mStateStartTime
Definition: rtmpstate.h:140
virtual void HandleIncomingChunkSize(ChunkHeader header, const uint8_t *data)
uint64_t GetSystemTimeMilliseconds()
virtual void HandleIncomingAmf3Data(ChunkHeader header, const uint8_t *data)
RtmpContext * GetContext()
Definition: rtmpstate.h:106
RtmpState(RtmpContext *context)
Definition: rtmpstate.h:43
virtual ~RtmpState()
Definition: rtmpstate.h:45
virtual void HandleIncomingAmf0SharedObject(ChunkHeader header, const uint8_t *data)
Definition: rtmpstate.h:146
virtual void HandleIncomingAmf0(ChunkHeader header, const uint8_t *data)
static rtmpinputbuffer_t::size_type mInputBufferPos
Definition: rtmpstate.h:137
Definition: rtmpstate.h:40
Definition: rtmpcontext.h:31
virtual void HandleIncomingAbortMsg(ChunkHeader header, const uint8_t *data)
TTV_ErrorCode _PollForInput()
virtual uint64_t GetTimeoutDuration() const
Definition: rtmpstate.h:130
Definition: tracingtypes.h:19
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
TTV_ErrorCode mLastError
Definition: rtmpcontext.h:70
TTV_ErrorCode AppendChunkData(const std::vector< _T > &buffer, RtmpMessageDetails &chunkDetails)
Definition: rtmpstate.h:88
void OnEnter()
Definition: rtmpstate.h:47
#define assert(expr)
Definition: assertion.h:47
std::array< uint8_t, 0x10000 > rtmpinputbuffer_t
Definition: rtmpstate.h:31
#define TTV_FAILED(ec)
Definition: errortypes.h:234
void EndChunk()
Definition: rtmpstate.h:80
size_t mChunkSpace
Definition: rtmpcontext.h:65
void Message(const char *component, const TTV_MessageLevel messageLevel, const char *format,...)
virtual void HandleIncomingPeerBW(ChunkHeader header, const uint8_t *data)
void OnExit()
Definition: rtmpstate.h:54
Definition: tracingtypes.h:16
TTV_ErrorCode SendChunkData(const std::vector< _T > &buffer, RtmpMessageDetails &chunkDetails)
Definition: rtmpstate.h:101
void Update()
Definition: rtmpstate.h:55
const char * ErrorToString(TTV_ErrorCode ec)
virtual void OnEnterInternal()
Definition: rtmpstate.h:127
uint64_t SystemTimeToMs(uint64_t sysTime)
virtual void HandleIncomingVideo(ChunkHeader header, const uint8_t *data)
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
virtual void HandleIncomingBytesRead(ChunkHeader header, const uint8_t *data)
Definition: rtmp.h:141
virtual void HandleIncomingAmf3SharedObject(ChunkHeader header, uint8_t *data)
virtual void HandleIncomingAudio(ChunkHeader header, const uint8_t *data)
Definition: rtmpstate.h:155
void SetNextState(State nextState)
virtual void HandleIncomingWinacksize(ChunkHeader header, const uint8_t *data)
TTV_ErrorCode PollForInput()
virtual void HandleIncomingEdgeOrigin(ChunkHeader header, const uint8_t *data)
virtual void HandleIncomingAmf3(ChunkHeader header, const uint8_t *data)
const RtmpContext * GetContext() const
Definition: rtmpstate.h:107
virtual void OnExitInternal()
Definition: rtmpstate.h:128
TTV_ErrorCode SendChunkData(const uint8_t *buffer, size_t length, RtmpMessageDetails &chunkDetails)
Definition: rtmpstate.h:95
uint64_t GetSystemClockTime()
virtual void OnEnterInternal()
Definition: rtmpstate.h:162
RtmpIdleState(RtmpContext *context)
Definition: rtmpstate.h:149
RtmpContext * mContext
Definition: rtmpstate.h:139
virtual void HandleIncomingControl(ChunkHeader header, const uint8_t *data)
RtmpErrorState(RtmpContext *context)
Definition: rtmpstate.h:158
static rtmpinputbuffer_t mInputBuffer
Definition: rtmpstate.h:136
virtual void HandleIncomingAmf0Data(ChunkHeader header, const uint8_t *data)