private async Task SendMessage(int chunk_stream_id, RTMPMessage msg, CancellationToken cancel_token)
{
int offset = 0;
int fmt = 0;
while (msg.Body.Length-offset>0) {
switch (fmt) {
case 0:
await SendAsync(writer => {
writer.Write((byte)((fmt<<6) | chunk_stream_id));
if (msg.Timestamp>0xFFFFFF) {
writer.WriteUInt24(0xFFFFFF);
}
else {
writer.WriteUInt24((int)msg.Timestamp);
}
writer.WriteUInt24(msg.Body.Length);
writer.Write((byte)msg.MessageType);
writer.WriteUInt32LE(msg.StreamId);
if (msg.Timestamp>0xFFFFFF) {
writer.WriteUInt32(msg.Timestamp);
}
int chunk_len = Math.Min(sendChunkSize, msg.Body.Length-offset);
writer.Write(msg.Body, offset, chunk_len);
offset += chunk_len;
}, cancel_token);
fmt = 3;
break;
case 3:
await SendAsync(writer => {
writer.Write((byte)((fmt<<6) | chunk_stream_id));
int chunk_len = Math.Min(sendChunkSize, msg.Body.Length-offset);
writer.Write(msg.Body, offset, chunk_len);
offset += chunk_len;
}, cancel_token);
break;
}
}
}