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