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.
@@ -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