public RTMPMessageBuilder(RTMPMessageBuilder x) { Timestamp = x.Timestamp + x.TimestampDelta; TypeId = x.TypeId; ChunkMessageStreamId = x.ChunkMessageStreamId; BodyLength = x.BodyLength; ReceivedLength = 0; Body = new byte[BodyLength]; }
public RTMPMessageBuilder( RTMPMessageBuilder x, long timestamp_delta, int type_id, int body_length) { Timestamp = x.Timestamp + timestamp_delta; TimestampDelta = timestamp_delta; TypeId = type_id; ChunkMessageStreamId = x.ChunkMessageStreamId; BodyLength = body_length; ReceivedLength = 0; Body = new byte[BodyLength]; }
public RTMPMessageBuilder( RTMPMessageBuilder x, long timestamp, int type_id, long chunk_message_stream_id, int body_length) { Timestamp = timestamp; TimestampDelta = x != null ? timestamp - x.Timestamp : 0; TypeId = type_id; ChunkMessageStreamId = chunk_message_stream_id; BodyLength = body_length; ReceivedLength = 0; Body = new byte[BodyLength]; }
private async Task <bool> RecvMessage(Queue <RTMPMessage> messages, CancellationToken cancel_token) { var basic_header = (await RecvStream(1, cancel_token).ConfigureAwait(false))[0]; var chunk_stream_id = basic_header & 0x3F; if (chunk_stream_id == 0) { chunk_stream_id = (await RecvStream(1, cancel_token).ConfigureAwait(false))[0] + 64; } else if (chunk_stream_id == 1) { var buf = await RecvStream(2, cancel_token).ConfigureAwait(false); chunk_stream_id = (buf[1] * 256 | buf[0]) + 64; } RTMPMessageBuilder msg = null; RTMPMessageBuilder last_msg = null; if (!lastMessages.TryGetValue(chunk_stream_id, out last_msg)) { last_msg = RTMPMessageBuilder.NullPacket; } switch ((basic_header & 0xC0) >> 6) { case 0: using (var reader = new RTMPBinaryReader(await RecvStream(11, cancel_token).ConfigureAwait(false))) { long timestamp = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); var stream_id = reader.ReadUInt32LE(); if (timestamp == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(await RecvStream(4, cancel_token).ConfigureAwait(false))) { timestamp = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp, type_id, stream_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 1: using (var reader = new RTMPBinaryReader(await RecvStream(7, cancel_token).ConfigureAwait(false))) { long timestamp_delta = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); if (timestamp_delta == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(await RecvStream(4, cancel_token).ConfigureAwait(false))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp_delta, type_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 2: using (var reader = new RTMPBinaryReader(await RecvStream(3, cancel_token).ConfigureAwait(false))) { long timestamp_delta = reader.ReadUInt24(); if (timestamp_delta == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(await RecvStream(4, cancel_token).ConfigureAwait(false))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder(last_msg, timestamp_delta); lastMessages[chunk_stream_id] = msg; } break; case 3: msg = last_msg; if (msg.ReceivedLength >= msg.BodyLength) { msg = new RTMPMessageBuilder(last_msg); lastMessages[chunk_stream_id] = msg; } break; } msg.ReceivedLength += await RecvStream( msg.Body, msg.ReceivedLength, Math.Min(recvChunkSize, msg.BodyLength - msg.ReceivedLength), cancel_token).ConfigureAwait(false); if (msg.ReceivedLength >= msg.BodyLength) { messages.Enqueue(msg.ToMessage()); } return(true); //TODO:接続エラー時はfalseを返す }
public RTMPMessageBuilder(RTMPMessageBuilder x) { Timestamp = x.Timestamp + x.TimestampDelta; TypeId = x.TypeId; ChunkMessageStreamId = x.ChunkMessageStreamId; BodyLength = x.BodyLength; ReceivedLength = 0; Body = new byte[BodyLength]; }
private async Task<bool> RecvMessage(Queue<RTMPMessage> messages, CancellationToken cancel_token) { var basic_header = (await RecvStream(1, cancel_token))[0]; var chunk_stream_id = basic_header & 0x3F; if (chunk_stream_id==0) { chunk_stream_id = (await RecvStream(1, cancel_token))[0] + 64; } else if (chunk_stream_id==1) { var buf = await RecvStream(2, cancel_token); chunk_stream_id = (buf[1]*256 | buf[0]) + 64; } RTMPMessageBuilder msg = null; RTMPMessageBuilder last_msg = null; if (!lastMessages.TryGetValue(chunk_stream_id, out last_msg)) { last_msg = RTMPMessageBuilder.NullPacket; } switch ((basic_header & 0xC0)>>6) { case 0: using (var reader=new RTMPBinaryReader(await RecvStream(11, cancel_token))) { long timestamp = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); var stream_id = reader.ReadUInt32LE(); if (timestamp==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(await RecvStream(4, cancel_token))) { timestamp = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp, type_id, stream_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 1: using (var reader=new RTMPBinaryReader(await RecvStream(7, cancel_token))) { long timestamp_delta = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); if (timestamp_delta==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(await RecvStream(4, cancel_token))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp_delta, type_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 2: using (var reader=new RTMPBinaryReader(await RecvStream(3, cancel_token))) { long timestamp_delta = reader.ReadUInt24(); if (timestamp_delta==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(await RecvStream(4, cancel_token))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder(last_msg, timestamp_delta); lastMessages[chunk_stream_id] = msg; } break; case 3: msg = last_msg; if (msg.ReceivedLength>=msg.BodyLength) { msg = new RTMPMessageBuilder(last_msg); lastMessages[chunk_stream_id] = msg; } break; } msg.ReceivedLength += await RecvStream( msg.Body, msg.ReceivedLength, Math.Min(recvChunkSize, msg.BodyLength-msg.ReceivedLength), cancel_token); if (msg.ReceivedLength>=msg.BodyLength) { messages.Enqueue(msg.ToMessage()); } return true; //TODO:接続エラー時はfalseを返す }
public RTMPMessageBuilder( RTMPMessageBuilder x, long timestamp_delta, int type_id, int body_length) { Timestamp = x.Timestamp + timestamp_delta; TimestampDelta = timestamp_delta; TypeId = type_id; ChunkMessageStreamId = x.ChunkMessageStreamId; BodyLength = body_length; ReceivedLength = 0; Body = new byte[BodyLength]; }
public RTMPMessageBuilder( RTMPMessageBuilder x, long timestamp, int type_id, long chunk_message_stream_id, int body_length) { Timestamp = timestamp; TimestampDelta = x!=null ? timestamp-x.Timestamp : 0; TypeId = type_id; ChunkMessageStreamId = chunk_message_stream_id; BodyLength = body_length; ReceivedLength = 0; Body = new byte[BodyLength]; }
private async Task RecvMessage(Queue<RTMPMessage> messages, CancellationToken cancel_token) { var basic_header = await RecvStreamByte(cancel_token); var chunk_stream_id = basic_header & 0x3F; if (chunk_stream_id==0) { chunk_stream_id = await RecvStreamByte(cancel_token) + 64; } else if (chunk_stream_id==1) { await RecvStream(2, reader => { var b0 = reader.ReadByte(); var b1 = reader.ReadByte(); chunk_stream_id = (b1*256 | b0) + 64; }, cancel_token); } RTMPMessageBuilder msg = null; RTMPMessageBuilder last_msg = null; lastMessages.TryGetValue(chunk_stream_id, out last_msg); switch ((basic_header & 0xC0)>>6) { case 0: await RecvStream(11, async reader => { long timestamp = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); var stream_id = reader.ReadUInt32LE(); if (timestamp==0xFFFFFF) { await RecvStream(4, ext_reader => { timestamp = ext_reader.ReadUInt32(); }, cancel_token); } msg = new RTMPMessageBuilder( last_msg, timestamp, type_id, stream_id, body_length); lastMessages[chunk_stream_id] = msg; }, cancel_token); break; case 1: await RecvStream(7, async reader => { long timestamp_delta = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); if (timestamp_delta==0xFFFFFF) { await RecvStream(4, ext_reader => { timestamp_delta = ext_reader.ReadUInt32(); }, cancel_token); } msg = new RTMPMessageBuilder( last_msg, timestamp_delta, type_id, body_length); lastMessages[chunk_stream_id] = msg; }, cancel_token); break; case 2: await RecvStream(3, async reader => { long timestamp_delta = reader.ReadUInt24(); if (timestamp_delta==0xFFFFFF) { await Recv(4, ext_reader => { timestamp_delta = ext_reader.ReadUInt32(); }, cancel_token); } msg = new RTMPMessageBuilder(last_msg, timestamp_delta); lastMessages[chunk_stream_id] = msg; }, cancel_token); break; case 3: msg = last_msg; if (msg.ReceivedLength>=msg.BodyLength) { msg = new RTMPMessageBuilder(last_msg); lastMessages[chunk_stream_id] = msg; } break; } msg.ReceivedLength += await RecvStream( msg.Body, msg.ReceivedLength, Math.Min(recvChunkSize, msg.BodyLength-msg.ReceivedLength), cancel_token); if (msg.ReceivedLength>=msg.BodyLength) { messages.Enqueue(msg.ToMessage()); } }
private bool RecvMessage(Queue <RTMPMessage> messages) { var basic_header = RecvStream(1)[0]; var chunk_stream_id = basic_header & 0x3F; if (chunk_stream_id == 0) { chunk_stream_id = RecvStream(1)[0] + 64; } else if (chunk_stream_id == 1) { var buf = RecvStream(2); chunk_stream_id = (buf[1] * 256 | buf[0]) + 64; } RTMPMessageBuilder msg = null; RTMPMessageBuilder last_msg = null; lastMessages.TryGetValue(chunk_stream_id, out last_msg); switch ((basic_header & 0xC0) >> 6) { case 0: using (var reader = new RTMPBinaryReader(new MemoryStream(RecvStream(11)))) { long timestamp = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); var stream_id = reader.ReadUInt32LE(); if (timestamp == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp, type_id, stream_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 1: using (var reader = new RTMPBinaryReader(new MemoryStream(RecvStream(7)))) { long timestamp_delta = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); if (timestamp_delta == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp_delta, type_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 2: using (var reader = new RTMPBinaryReader(new MemoryStream(RecvStream(3)))) { long timestamp_delta = reader.ReadUInt24(); if (timestamp_delta == 0xFFFFFF) { using (var ext_reader = new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder(last_msg, timestamp_delta); lastMessages[chunk_stream_id] = msg; } break; case 3: msg = last_msg; if (msg.ReceivedLength >= msg.BodyLength) { msg = new RTMPMessageBuilder(last_msg); lastMessages[chunk_stream_id] = msg; } break; } msg.ReceivedLength += RecvStream( msg.Body, msg.ReceivedLength, Math.Min(recvChunkSize, msg.BodyLength - msg.ReceivedLength)); if (msg.ReceivedLength >= msg.BodyLength) { messages.Enqueue(msg.ToMessage()); } return(true); //TODO:接続エラー時はfalseを返す }
private bool RecvMessage(Queue<RTMPMessage> messages) { var basic_header = RecvStream(1)[0]; var chunk_stream_id = basic_header & 0x3F; if (chunk_stream_id==0) { chunk_stream_id = RecvStream(1)[0] + 64; } else if (chunk_stream_id==1) { var buf = RecvStream(2); chunk_stream_id = (buf[1]*256 | buf[0]) + 64; } RTMPMessageBuilder msg = null; RTMPMessageBuilder last_msg = null; lastMessages.TryGetValue(chunk_stream_id, out last_msg); switch ((basic_header & 0xC0)>>6) { case 0: using (var reader=new RTMPBinaryReader(new MemoryStream(RecvStream(11)))) { long timestamp = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); var stream_id = reader.ReadUInt32LE(); if (timestamp==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp, type_id, stream_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 1: using (var reader=new RTMPBinaryReader(new MemoryStream(RecvStream(7)))) { long timestamp_delta = reader.ReadUInt24(); var body_length = reader.ReadUInt24(); var type_id = reader.ReadByte(); if (timestamp_delta==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder( last_msg, timestamp_delta, type_id, body_length); lastMessages[chunk_stream_id] = msg; } break; case 2: using (var reader=new RTMPBinaryReader(new MemoryStream(RecvStream(3)))) { long timestamp_delta = reader.ReadUInt24(); if (timestamp_delta==0xFFFFFF) { using (var ext_reader=new RTMPBinaryReader(new MemoryStream(RecvStream(4)))) { timestamp_delta = ext_reader.ReadUInt32(); } } msg = new RTMPMessageBuilder(last_msg, timestamp_delta); lastMessages[chunk_stream_id] = msg; } break; case 3: msg = last_msg; if (msg.ReceivedLength>=msg.BodyLength) { msg = new RTMPMessageBuilder(last_msg); } break; } msg.ReceivedLength += RecvStream( msg.Body, msg.ReceivedLength, Math.Min(recvChunkSize, msg.BodyLength-msg.ReceivedLength)); if (msg.ReceivedLength>=msg.BodyLength) { messages.Enqueue(msg.ToMessage()); } return true; //TODO:接続エラー時はfalseを返す }