1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
mod types;
mod deserialization_errors;
mod serialization_errors;
mod message_payload;
pub use self::deserialization_errors::{MessageDeserializationError, MessageDeserializationErrorKind};
pub use self::serialization_errors::{MessageSerializationError, MessageSerializationErrorKind};
pub use self::message_payload::MessagePayload;
use bytes::Bytes;
use rml_amf0::Amf0Value;
use ::time::RtmpTimestamp;
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum PeerBandwidthLimitType {
Hard,
Soft,
Dynamic
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum UserControlEventType {
StreamBegin,
StreamEof,
StreamDry,
SetBufferLength,
StreamIsRecorded,
PingRequest,
PingResponse
}
#[derive(PartialEq, Debug, Clone)]
pub enum RtmpMessage {
Unknown { type_id: u8, data: Bytes },
Abort { stream_id: u32 },
Acknowledgement { sequence_number: u32 },
Amf0Command { command_name: String, transaction_id: f64, command_object: Amf0Value, additional_arguments: Vec<Amf0Value> },
Amf0Data { values: Vec<Amf0Value> },
AudioData { data: Bytes },
SetChunkSize { size: u32 },
SetPeerBandwidth { size: u32, limit_type: PeerBandwidthLimitType },
UserControl { event_type: UserControlEventType, stream_id: Option<u32>, buffer_length: Option<u32>, timestamp: Option<RtmpTimestamp> },
VideoData { data: Bytes },
WindowAcknowledgement { size: u32 }
}
impl RtmpMessage {
pub fn into_message_payload(self, timestamp: RtmpTimestamp, message_stream_id: u32) -> Result<MessagePayload, MessageSerializationError> {
MessagePayload::from_rtmp_message(self, timestamp, message_stream_id)
}
pub fn get_message_type_id(&self) -> u8 {
match *self {
RtmpMessage::Unknown { type_id, data: _ } => type_id,
RtmpMessage::Abort { stream_id: _ } => 2_u8,
RtmpMessage::Acknowledgement { sequence_number: _ } => 3_u8,
RtmpMessage::Amf0Command { command_name: _, transaction_id: _, command_object: _, additional_arguments: _ } => 20_u8,
RtmpMessage::Amf0Data { values: _ } => 18_u8,
RtmpMessage::AudioData { data: _ } => 8_u8,
RtmpMessage::SetChunkSize { size: _ } => 1_u8,
RtmpMessage::SetPeerBandwidth { size: _, limit_type: _ } => 6_u8,
RtmpMessage::UserControl { event_type: _, stream_id: _, buffer_length: _, timestamp: _ } => 4_u8,
RtmpMessage::VideoData { data: _ } => 9_u8,
RtmpMessage::WindowAcknowledgement { size: _ } => 5_u8,
}
}
}