80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
|
|
#include "rtmp-control-message.h"
|
||
|
|
#include "rtmp-msgtypeid.h"
|
||
|
|
#include "rtmp-util.h"
|
||
|
|
|
||
|
|
#define N_CHUNK_HEADER 12
|
||
|
|
|
||
|
|
static void rtmp_protocol_control_message_header(uint8_t* out, uint8_t id, size_t payload)
|
||
|
|
{
|
||
|
|
// 5.4. Protocol Control Messages (p18)
|
||
|
|
// These protocol control messages MUST have message stream ID 0 (known
|
||
|
|
// as the control stream) and be sent in chunk stream ID 2.
|
||
|
|
out[0] = (0x00 << 6) /*fmt*/ | 0x02 /*cs id*/;
|
||
|
|
|
||
|
|
/* timestamp */
|
||
|
|
out[1] = 0x00;
|
||
|
|
out[2] = 0x00;
|
||
|
|
out[3] = 0x00;
|
||
|
|
|
||
|
|
/* message length */
|
||
|
|
out[4] = (uint8_t)(payload >> 16);
|
||
|
|
out[5] = (uint8_t)(payload >> 8);
|
||
|
|
out[6] = (uint8_t)payload;
|
||
|
|
|
||
|
|
/* message type id */
|
||
|
|
out[7] = id;
|
||
|
|
|
||
|
|
/* message stream id */
|
||
|
|
out[8] = 0x00;
|
||
|
|
out[9] = 0x00;
|
||
|
|
out[10] = 0x00;
|
||
|
|
out[11] = 0x00;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5.4.1. Set Chunk Size (1) (p19)
|
||
|
|
int rtmp_set_chunk_size(uint8_t* out, size_t size, uint32_t chunkSize)
|
||
|
|
{
|
||
|
|
if (size < N_CHUNK_HEADER + 4) return 0;
|
||
|
|
|
||
|
|
rtmp_protocol_control_message_header(out, RTMP_TYPE_SET_CHUNK_SIZE, 4);
|
||
|
|
be_write_uint32(out + N_CHUNK_HEADER, chunkSize & 0x7FFFFFFF); // first bit MUST be zero
|
||
|
|
return N_CHUNK_HEADER + 4;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5.4.2. Abort Message (2) (p19)
|
||
|
|
int rtmp_abort_message(uint8_t* out, size_t size, uint32_t chunkStreamId)
|
||
|
|
{
|
||
|
|
if (size < N_CHUNK_HEADER + 4) return 0;
|
||
|
|
rtmp_protocol_control_message_header(out, RTMP_TYPE_ABORT, 4);
|
||
|
|
be_write_uint32(out + N_CHUNK_HEADER, chunkStreamId);
|
||
|
|
return N_CHUNK_HEADER + 4;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5.4.3. Acknowledgement (3) (p20)
|
||
|
|
int rtmp_acknowledgement(uint8_t* out, size_t size, uint32_t sequenceNumber)
|
||
|
|
{
|
||
|
|
if (size < N_CHUNK_HEADER + 4) return 0;
|
||
|
|
rtmp_protocol_control_message_header(out, RTMP_TYPE_ACKNOWLEDGEMENT, 4);
|
||
|
|
be_write_uint32(out + N_CHUNK_HEADER, sequenceNumber);
|
||
|
|
return N_CHUNK_HEADER + 4;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5.4.4. Window Acknowledgement Size (5) (p20)
|
||
|
|
int rtmp_window_acknowledgement_size(uint8_t* out, size_t size, uint32_t windowSize)
|
||
|
|
{
|
||
|
|
if (size < N_CHUNK_HEADER + 4) return 0;
|
||
|
|
rtmp_protocol_control_message_header(out, RTMP_TYPE_WINDOW_ACKNOWLEDGEMENT_SIZE, 4);
|
||
|
|
be_write_uint32(out + N_CHUNK_HEADER, windowSize);
|
||
|
|
return N_CHUNK_HEADER + 4;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 5.4.5. Set Peer Bandwidth (6) (p21)
|
||
|
|
int rtmp_set_peer_bandwidth(uint8_t* out, size_t size, uint32_t windowSize, uint8_t limitType)
|
||
|
|
{
|
||
|
|
if (size < N_CHUNK_HEADER + 5) return 0;
|
||
|
|
rtmp_protocol_control_message_header(out, RTMP_TYPE_SET_PEER_BANDWIDTH, 5);
|
||
|
|
be_write_uint32(out + N_CHUNK_HEADER, windowSize);
|
||
|
|
out[N_CHUNK_HEADER + 4] = limitType;
|
||
|
|
return N_CHUNK_HEADER + 5;
|
||
|
|
}
|