1
1
use super :: * ;
2
2
3
+ const RRT_REPORT_BLOCK_MIN_LENGTH : u16 = 8 ;
4
+
3
5
/// ReceiverReferenceTimeReportBlock encodes a Receiver Reference Time
4
6
/// report block as described in RFC 3611 section 4.4.
5
7
///
@@ -14,7 +16,6 @@ use super::*;
14
16
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
15
17
#[ derive( Debug , Default , PartialEq , Clone ) ]
16
18
pub struct ReceiverReferenceTimeReportBlock {
17
- pub xr_header : XRHeader ,
18
19
pub ntp_timestamp : u64 ,
19
20
}
20
21
@@ -24,34 +25,88 @@ impl fmt::Display for ReceiverReferenceTimeReportBlock {
24
25
}
25
26
}
26
27
27
- impl ReportBlock for ReceiverReferenceTimeReportBlock {
28
- /// destination_ssrc returns an array of ssrc values that this report block refers to.
29
- fn destination_ssrc ( & self ) -> Vec < u32 > {
30
- vec ! [ ]
28
+ impl ReceiverReferenceTimeReportBlock {
29
+ pub fn xr_header ( & self ) -> XRHeader {
30
+ XRHeader {
31
+ block_type : BlockType :: ReceiverReferenceTime ,
32
+ type_specific : 0 ,
33
+ block_length : ( self . raw_size ( ) / 4 - 1 ) as u16 ,
34
+ }
31
35
}
36
+ }
32
37
33
- fn setup_block_header ( & mut self ) {
34
- self . xr_header . block_type = ReportBlockType :: ReceiverReferenceTime ;
35
- self . xr_header . type_specific = 0 ;
36
- self . xr_header . block_length = ( self . raw_size ( ) / 4 - 1 ) as u16 ;
38
+ impl Packet for ReceiverReferenceTimeReportBlock {
39
+ fn header ( & self ) -> Header {
40
+ Header :: default ( )
37
41
}
38
42
39
- fn unpack_block_header ( & mut self ) { }
43
+ /// destination_ssrc returns an array of ssrc values that this report block refers to.
44
+ fn destination_ssrc ( & self ) -> Vec < u32 > {
45
+ vec ! [ ]
46
+ }
40
47
41
48
fn raw_size ( & self ) -> usize {
42
- 4 + 8
49
+ XR_HEADER_LENGTH + RRT_REPORT_BLOCK_MIN_LENGTH as usize
43
50
}
44
51
45
52
fn as_any ( & self ) -> & ( dyn Any + Send + Sync ) {
46
53
self
47
54
}
48
- fn equal ( & self , other : & ( dyn ReportBlock + Send + Sync ) ) -> bool {
55
+ fn equal ( & self , other : & ( dyn Packet + Send + Sync ) ) -> bool {
49
56
other
50
57
. as_any ( )
51
58
. downcast_ref :: < ReceiverReferenceTimeReportBlock > ( )
52
59
. map_or ( false , |a| self == a)
53
60
}
54
- fn cloned ( & self ) -> Box < dyn ReportBlock + Send + Sync > {
61
+ fn cloned ( & self ) -> Box < dyn Packet + Send + Sync > {
55
62
Box :: new ( self . clone ( ) )
56
63
}
57
64
}
65
+
66
+ impl MarshalSize for ReceiverReferenceTimeReportBlock {
67
+ fn marshal_size ( & self ) -> usize {
68
+ self . raw_size ( )
69
+ }
70
+ }
71
+
72
+ impl Marshal for ReceiverReferenceTimeReportBlock {
73
+ /// marshal_to encodes the PacketReceiptTimesReportBlock in binary
74
+ fn marshal_to ( & self , mut buf : & mut [ u8 ] ) -> Result < usize > {
75
+ if buf. remaining_mut ( ) < self . marshal_size ( ) {
76
+ return Err ( error:: Error :: BufferTooShort . into ( ) ) ;
77
+ }
78
+
79
+ let h = self . xr_header ( ) ;
80
+ let n = h. marshal_to ( buf) ?;
81
+ buf = & mut buf[ n..] ;
82
+
83
+ buf. put_u64 ( self . ntp_timestamp ) ;
84
+
85
+ Ok ( self . marshal_size ( ) )
86
+ }
87
+ }
88
+
89
+ impl Unmarshal for ReceiverReferenceTimeReportBlock {
90
+ /// Unmarshal decodes the PacketReceiptTimesReportBlock from binary
91
+ fn unmarshal < B > ( raw_packet : & mut B ) -> Result < Self >
92
+ where
93
+ Self : Sized ,
94
+ B : Buf ,
95
+ {
96
+ if raw_packet. remaining ( ) < XR_HEADER_LENGTH {
97
+ return Err ( error:: Error :: PacketTooShort . into ( ) ) ;
98
+ }
99
+
100
+ let xr_header = XRHeader :: unmarshal ( raw_packet) ?;
101
+
102
+ if xr_header. block_length != RRT_REPORT_BLOCK_MIN_LENGTH
103
+ || raw_packet. remaining ( ) < xr_header. block_length as usize
104
+ {
105
+ return Err ( error:: Error :: PacketTooShort . into ( ) ) ;
106
+ }
107
+
108
+ let ntp_timestamp = raw_packet. get_u64 ( ) ;
109
+
110
+ Ok ( ReceiverReferenceTimeReportBlock { ntp_timestamp } )
111
+ }
112
+ }
0 commit comments