stream-deploy/ZLM/3rdpart/media-server/librtmp/source/rtmp-control-message.c

80 lines
2.4 KiB
C++
Raw Normal View History

#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;
}