rtcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +2 -0
- data/README.rdoc +79 -0
- data/Rakefile +8 -0
- data/lib/rtcp.rb +99 -0
- data/lib/rtcp/app.rb +36 -0
- data/lib/rtcp/bye.rb +48 -0
- data/lib/rtcp/decode_error.rb +4 -0
- data/lib/rtcp/psfb.rb +55 -0
- data/lib/rtcp/rr.rb +45 -0
- data/lib/rtcp/rsi.rb +82 -0
- data/lib/rtcp/sdes.rb +77 -0
- data/lib/rtcp/sr.rb +86 -0
- data/lib/rtcp/version.rb +4 -0
- data/lib/rtcp/xr.rb +170 -0
- data/rtcp.gemspec +25 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/test_descriptions.rb +124 -0
- data/spec/unit/rtcp/app_spec.rb +26 -0
- data/spec/unit/rtcp/bye_spec.rb +25 -0
- data/spec/unit/rtcp/psfb_spec.rb +25 -0
- data/spec/unit/rtcp/rr_spec.rb +59 -0
- data/spec/unit/rtcp/rsi_spec.rb +28 -0
- data/spec/unit/rtcp/sdes_spec.rb +44 -0
- data/spec/unit/rtcp/sr_spec.rb +62 -0
- data/spec/unit/rtcp/xr_spec.rb +95 -0
- data/spec/unit/rtcp_spec.rb +43 -0
- metadata +137 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::APP do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::APP.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Application-Defined" packet' do
|
|
11
|
+
packet = subject.decode(APP_PACKET)
|
|
12
|
+
packet.version.should == 2
|
|
13
|
+
packet.length.should == 48
|
|
14
|
+
packet.subtype.should == 1
|
|
15
|
+
packet.ssrc.should == 3945864703
|
|
16
|
+
packet.name.should == 'PLII'
|
|
17
|
+
packet.app_data.should be_kind_of(String)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'raises an RTCP::DecodeError when paket type is not "Application-Defined"' do
|
|
21
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
22
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp/bye'
|
|
3
|
+
|
|
4
|
+
describe RTCP::BYE do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::BYE.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Goodbye" packet' do
|
|
11
|
+
packet = subject.decode(BYE_PACKET_1)
|
|
12
|
+
packet.version.should == 2
|
|
13
|
+
packet.length.should == 16
|
|
14
|
+
packet.reason.should == 'mmptest'
|
|
15
|
+
packet.ssrcs.should == [ 1418033557 ]
|
|
16
|
+
packet.padding.should == nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'raises an RTCP::DecodeError when paket type is not "Goodbye"' do
|
|
20
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
21
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp/psfb'
|
|
3
|
+
|
|
4
|
+
describe RTCP::PSFB do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::PSFB.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Payload-specific FB message" packet' do
|
|
11
|
+
packet = subject.decode(PSFB_PACKET)
|
|
12
|
+
packet.version.should == 2
|
|
13
|
+
packet.length.should == 12
|
|
14
|
+
packet.sender_ssrc.should == 3945864703
|
|
15
|
+
packet.source_ssrc.should == 0
|
|
16
|
+
packet.format.should == :pli
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'raises an RTCP::DecodeError when paket type is not "PSFB"' do
|
|
20
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
21
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::RR do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::RR.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Receiver Record" packets' do
|
|
11
|
+
rr = subject.decode(RR_PACKET_1)
|
|
12
|
+
|
|
13
|
+
rr.version.should == 2
|
|
14
|
+
rr.length.should == 32
|
|
15
|
+
rr.ssrc.should == 1027816375
|
|
16
|
+
rr.padding.should == false
|
|
17
|
+
rr.report_blocks.should be_kind_of(Array)
|
|
18
|
+
rr.report_blocks.length.should == 1
|
|
19
|
+
|
|
20
|
+
report_block = rr.report_blocks.first
|
|
21
|
+
report_block.should be_kind_of(Hash)
|
|
22
|
+
report_block.keys.sort.should == [
|
|
23
|
+
:absolute_lost,
|
|
24
|
+
:delay_since_last_sr,
|
|
25
|
+
:fraction_lost,
|
|
26
|
+
:highest_sequence_number,
|
|
27
|
+
:jitter,
|
|
28
|
+
:last_sr,
|
|
29
|
+
:ssrc,
|
|
30
|
+
]
|
|
31
|
+
report_block[:absolute_lost].should == 0
|
|
32
|
+
report_block[:delay_since_last_sr].should == 0
|
|
33
|
+
report_block[:fraction_lost].should == 0
|
|
34
|
+
report_block[:highest_sequence_number].should == 13317180
|
|
35
|
+
report_block[:jitter].should == 6
|
|
36
|
+
report_block[:last_sr].should == 277966035
|
|
37
|
+
report_block[:ssrc].should == 2189077565
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'does not consider the follwing packet to be padding' do
|
|
41
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
42
|
+
.not_to raise_error
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'raises an RTCP::DecodeError when there is undeclared padding' do
|
|
46
|
+
corrupt_packet = RR_PACKET_1.clone + "xxxx"
|
|
47
|
+
corrupt_packet[2] = 0.chr
|
|
48
|
+
corrupt_packet[3] = 8.chr
|
|
49
|
+
expect { subject.decode(corrupt_packet) }
|
|
50
|
+
.to raise_error(RTCP::DecodeError, "Packet has undeclared padding")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'raises an RTCP::DecodeError when paket type is not "Receiver Record"' do
|
|
54
|
+
expect { subject.decode(SDES_PACKET_1) }
|
|
55
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::RSI do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::RSI.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Receiver Summary Information" packet' do
|
|
11
|
+
packet = subject.decode(RSI_PACKET)
|
|
12
|
+
packet.version.should == 2
|
|
13
|
+
packet.length.should == 16
|
|
14
|
+
packet.ssrc.should == 3945864703
|
|
15
|
+
packet.summarized_ssrc.should == 0
|
|
16
|
+
packet.ntp_timestamp.should be_kind_of(Time)
|
|
17
|
+
packet.ntp_timestamp.to_f.should == 263659984.0
|
|
18
|
+
packet.report_blocks.should be_kind_of(Array)
|
|
19
|
+
packet.report_blocks.length.should == 0
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'raises an RTCP::DecodeError when paket type is not "Application-Defined"' do
|
|
23
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
24
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::SDES do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::SDES.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Source Description" packet #1' do
|
|
11
|
+
packet = subject.decode(SDES_PACKET_1)
|
|
12
|
+
packet.version.should == 2
|
|
13
|
+
packet.length.should == 28
|
|
14
|
+
packet.chunks.should be_kind_of(Array)
|
|
15
|
+
packet.chunks.length.should == 1
|
|
16
|
+
|
|
17
|
+
sdes_chunk = packet.chunks.first
|
|
18
|
+
sdes_chunk.keys.sort.should == [ :data, :ssrc, :type ]
|
|
19
|
+
sdes_chunk[:ssrc].should == 1027816375
|
|
20
|
+
sdes_chunk[:type].should == :cname
|
|
21
|
+
sdes_chunk[:data].should == 'rtcp.example.com'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'decodes "Source Description" packet #2' do
|
|
25
|
+
packet = subject.decode(SDES_PACKET_2)
|
|
26
|
+
packet.version.should == 2
|
|
27
|
+
packet.length.should == 24
|
|
28
|
+
packet.chunks.should be_kind_of(Array)
|
|
29
|
+
packet.chunks.length.should == 1
|
|
30
|
+
|
|
31
|
+
sdes_chunk = packet.chunks.first
|
|
32
|
+
sdes_chunk.keys.sort.should == [ :data, :ssrc, :type ]
|
|
33
|
+
sdes_chunk[:ssrc].should == 4090175489
|
|
34
|
+
sdes_chunk[:type].should == :cname
|
|
35
|
+
sdes_chunk[:data].should == 'outChannel'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'raises an RTCP::DecodeError when paket type is not "Source Description"' do
|
|
39
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
40
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::SR do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::SR.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Sender Record" packets' do
|
|
11
|
+
sr = subject.decode(SR_PACKET_1)
|
|
12
|
+
|
|
13
|
+
sr.version.should == 2
|
|
14
|
+
sr.length.should == 28
|
|
15
|
+
sr.ssrc.should == 4090175489
|
|
16
|
+
sr.padding.should == false
|
|
17
|
+
sr.report_blocks.should be_kind_of(Array)
|
|
18
|
+
sr.report_blocks.length.should == 0
|
|
19
|
+
sr.rtp_timestamp.should == 37920
|
|
20
|
+
sr.ntp_timestamp.should be_kind_of(Time)
|
|
21
|
+
sr.ntp_timestamp.to_f.round(5).should == 34081.918
|
|
22
|
+
sr.packet_count.should == 158
|
|
23
|
+
sr.octet_count.should == 39816
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'decodes "Sender Record" packets wit report blocks' do
|
|
27
|
+
sr = subject.decode(SR_PACKET_2)
|
|
28
|
+
|
|
29
|
+
sr.ssrc.should == 3655205709
|
|
30
|
+
sr.report_blocks.should be_kind_of(Array)
|
|
31
|
+
sr.report_blocks.length.should == 1
|
|
32
|
+
sr.report_blocks.first.should == {
|
|
33
|
+
ssrc: 3974927014,
|
|
34
|
+
fraction_lost: 0,
|
|
35
|
+
absolute_lost: 0,
|
|
36
|
+
highest_sequence_number: 58775,
|
|
37
|
+
jitter: 2,
|
|
38
|
+
last_sr: 0,
|
|
39
|
+
delay_since_last_sr: 0,
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'does not consider the follwing packet to be padding' do
|
|
44
|
+
expect { subject.decode(SR_PACKET_1) }
|
|
45
|
+
.not_to raise_error
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'raises an RTCP::DecodeError when there is undeclared padding' do
|
|
49
|
+
corrupt_packet = SR_PACKET_1.clone + "xxxx"
|
|
50
|
+
corrupt_packet[2] = 0.chr
|
|
51
|
+
corrupt_packet[3] = 7.chr
|
|
52
|
+
expect { subject.decode(corrupt_packet) }
|
|
53
|
+
.to raise_error(RTCP::DecodeError, "Packet has undeclared padding")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'raises an RTCP::DecodeError when paket type is not "Sender Record"' do
|
|
57
|
+
expect { subject.decode(RR_PACKET_1) }
|
|
58
|
+
.to raise_error(RTCP::DecodeError, /Wrong Packet Type/)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP::XR do
|
|
5
|
+
subject do
|
|
6
|
+
RTCP::XR.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context '.decode' do
|
|
10
|
+
it 'decodes "Extended Record" packets' do
|
|
11
|
+
xr = subject.decode(XR_PACKET_1)
|
|
12
|
+
|
|
13
|
+
xr.version.should == 2
|
|
14
|
+
xr.length.should == 64
|
|
15
|
+
xr.ssrc.should == 1027816375
|
|
16
|
+
xr.report_blocks.should be_kind_of(Array)
|
|
17
|
+
xr.report_blocks.length.should == 3
|
|
18
|
+
|
|
19
|
+
xr.report_blocks[0].should == {
|
|
20
|
+
ssrc: 2189077565,
|
|
21
|
+
type: :statistics_summary,
|
|
22
|
+
begin_seq: 7791,
|
|
23
|
+
end_seq: 13373,
|
|
24
|
+
lost_packets: 0,
|
|
25
|
+
dup_packets: 0,
|
|
26
|
+
min_jitter: 0,
|
|
27
|
+
max_jitter: 21,
|
|
28
|
+
mean_jitter: 6,
|
|
29
|
+
dev_jitter: 5,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
xr.report_blocks[1].should == {
|
|
33
|
+
ssrc: 2189077565,
|
|
34
|
+
type: :statistics_summary,
|
|
35
|
+
begin_seq: 7791,
|
|
36
|
+
end_seq: 13373,
|
|
37
|
+
lost_packets: 0,
|
|
38
|
+
dup_packets: 0,
|
|
39
|
+
min_jitter: 0,
|
|
40
|
+
max_jitter: 21,
|
|
41
|
+
mean_jitter: 6,
|
|
42
|
+
dev_jitter: 5,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
xr.report_blocks[2].should == {
|
|
46
|
+
type: :loss_rle,
|
|
47
|
+
thinning: 0,
|
|
48
|
+
begin_seq: 7791,
|
|
49
|
+
end_seq: 13373,
|
|
50
|
+
chunks: [
|
|
51
|
+
{
|
|
52
|
+
chunk_type: :run_length,
|
|
53
|
+
run_type: 1,
|
|
54
|
+
run_length: 5580
|
|
55
|
+
}, {
|
|
56
|
+
chunk_type: :run_length,
|
|
57
|
+
run_type: 1,
|
|
58
|
+
run_length: 8192
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'decodes "Extended Record" packets with IPv4 TTL values' do
|
|
65
|
+
xr = subject.decode(XR_PACKET_2)
|
|
66
|
+
|
|
67
|
+
xr.version.should == 2
|
|
68
|
+
xr.length.should == 124
|
|
69
|
+
xr.ssrc.should == 3974927014
|
|
70
|
+
xr.report_blocks.should be_kind_of(Array)
|
|
71
|
+
xr.report_blocks.length.should == 4
|
|
72
|
+
|
|
73
|
+
# The first report block is of type :statistics_summary and contains
|
|
74
|
+
# the IPv4 TTL values
|
|
75
|
+
xr.report_blocks[0].should == {
|
|
76
|
+
ssrc: 3974927014,
|
|
77
|
+
type: :statistics_summary,
|
|
78
|
+
begin_seq: 6985,
|
|
79
|
+
end_seq: 7325,
|
|
80
|
+
lost_packets: 0,
|
|
81
|
+
dup_packets: 0,
|
|
82
|
+
max_jitter: 80,
|
|
83
|
+
mean_jitter: 4,
|
|
84
|
+
min_jitter: 0,
|
|
85
|
+
dev_jitter: 223,
|
|
86
|
+
min_ttl: 1,
|
|
87
|
+
max_ttl: 2,
|
|
88
|
+
mean_ttl: 3,
|
|
89
|
+
dev_ttl: 4,
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rtcp'
|
|
3
|
+
|
|
4
|
+
describe RTCP do
|
|
5
|
+
context "Detect malformed data" do
|
|
6
|
+
it "raises exception when packet is shorter than a property header" do
|
|
7
|
+
expect { RTCP.decode("Hello") }
|
|
8
|
+
.to raise_error RTCP::DecodeError
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context ".decode_all" do
|
|
13
|
+
|
|
14
|
+
it "returns an empty array when there is nothing to decode" do
|
|
15
|
+
rtcps = RTCP.decode_all("")
|
|
16
|
+
|
|
17
|
+
rtcps.should == []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "returns an array of RTCP:: objects" do
|
|
21
|
+
rtcps = RTCP.decode_all(RR_PACKET_1 +
|
|
22
|
+
SDES_PACKET_1 +
|
|
23
|
+
AVB_PACKET +
|
|
24
|
+
XR_PACKET_1
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
rtcps.should be_kind_of(Array)
|
|
28
|
+
rtcps.length.should == 4 # TEST_DATA contains 4 RTCP packets
|
|
29
|
+
rtcps[0].class.should == RTCP::RR
|
|
30
|
+
rtcps[1].class.should == RTCP::SDES
|
|
31
|
+
rtcps[2].class.should == RTCP
|
|
32
|
+
rtcps[3].class.should == RTCP::XR
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context ".decode" do
|
|
37
|
+
it "decodes the first packet and returns it as an RTCP:: object" do
|
|
38
|
+
rtcp = RTCP.decode(RR_PACKET_1 + SDES_PACKET_1)
|
|
39
|
+
|
|
40
|
+
rtcp.should be_kind_of(RTCP::RR)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: rtcp
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Christian Rusch
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2018-03-21 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 1.0.0
|
|
19
|
+
name: bundler
|
|
20
|
+
prerelease: false
|
|
21
|
+
type: :development
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.0.0
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
name: rake
|
|
34
|
+
prerelease: false
|
|
35
|
+
type: :development
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 2.6.0
|
|
47
|
+
name: rspec
|
|
48
|
+
prerelease: false
|
|
49
|
+
type: :development
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 2.6.0
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: 0.5.0
|
|
61
|
+
name: simplecov
|
|
62
|
+
prerelease: false
|
|
63
|
+
type: :development
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.5.0
|
|
69
|
+
description: Parse RTCP data into Ruby objects
|
|
70
|
+
email: git@rusch.asia
|
|
71
|
+
executables: []
|
|
72
|
+
extensions: []
|
|
73
|
+
extra_rdoc_files:
|
|
74
|
+
- README.rdoc
|
|
75
|
+
files:
|
|
76
|
+
- Gemfile
|
|
77
|
+
- README.rdoc
|
|
78
|
+
- Rakefile
|
|
79
|
+
- lib/rtcp.rb
|
|
80
|
+
- lib/rtcp/app.rb
|
|
81
|
+
- lib/rtcp/bye.rb
|
|
82
|
+
- lib/rtcp/decode_error.rb
|
|
83
|
+
- lib/rtcp/psfb.rb
|
|
84
|
+
- lib/rtcp/rr.rb
|
|
85
|
+
- lib/rtcp/rsi.rb
|
|
86
|
+
- lib/rtcp/sdes.rb
|
|
87
|
+
- lib/rtcp/sr.rb
|
|
88
|
+
- lib/rtcp/version.rb
|
|
89
|
+
- lib/rtcp/xr.rb
|
|
90
|
+
- rtcp.gemspec
|
|
91
|
+
- spec/spec_helper.rb
|
|
92
|
+
- spec/support/test_descriptions.rb
|
|
93
|
+
- spec/unit/rtcp/app_spec.rb
|
|
94
|
+
- spec/unit/rtcp/bye_spec.rb
|
|
95
|
+
- spec/unit/rtcp/psfb_spec.rb
|
|
96
|
+
- spec/unit/rtcp/rr_spec.rb
|
|
97
|
+
- spec/unit/rtcp/rsi_spec.rb
|
|
98
|
+
- spec/unit/rtcp/sdes_spec.rb
|
|
99
|
+
- spec/unit/rtcp/sr_spec.rb
|
|
100
|
+
- spec/unit/rtcp/xr_spec.rb
|
|
101
|
+
- spec/unit/rtcp_spec.rb
|
|
102
|
+
homepage: http://github.com/rusch/rtcp
|
|
103
|
+
licenses:
|
|
104
|
+
- MIT
|
|
105
|
+
metadata: {}
|
|
106
|
+
post_install_message:
|
|
107
|
+
rdoc_options: []
|
|
108
|
+
require_paths:
|
|
109
|
+
- lib
|
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
|
+
requirements:
|
|
112
|
+
- - ">="
|
|
113
|
+
- !ruby/object:Gem::Version
|
|
114
|
+
version: '0'
|
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
|
+
requirements:
|
|
117
|
+
- - ">="
|
|
118
|
+
- !ruby/object:Gem::Version
|
|
119
|
+
version: '0'
|
|
120
|
+
requirements: []
|
|
121
|
+
rubyforge_project:
|
|
122
|
+
rubygems_version: 2.6.13
|
|
123
|
+
signing_key:
|
|
124
|
+
specification_version: 4
|
|
125
|
+
summary: Parse RTCP data into Ruby objects
|
|
126
|
+
test_files:
|
|
127
|
+
- spec/spec_helper.rb
|
|
128
|
+
- spec/unit/rtcp_spec.rb
|
|
129
|
+
- spec/unit/rtcp/sdes_spec.rb
|
|
130
|
+
- spec/unit/rtcp/psfb_spec.rb
|
|
131
|
+
- spec/unit/rtcp/bye_spec.rb
|
|
132
|
+
- spec/unit/rtcp/rsi_spec.rb
|
|
133
|
+
- spec/unit/rtcp/app_spec.rb
|
|
134
|
+
- spec/unit/rtcp/sr_spec.rb
|
|
135
|
+
- spec/unit/rtcp/rr_spec.rb
|
|
136
|
+
- spec/unit/rtcp/xr_spec.rb
|
|
137
|
+
- spec/support/test_descriptions.rb
|