@@ -438,15 +438,15 @@ void expect_recv_report(const RecvReport& report,
438438 }
439439}
440440
441- packet::PacketPtr read_packet (packet::FifoQueue& source, core::nanoseconds_t ts = -1 ) {
441+ packet::PacketPtr read_packet (packet::FifoQueue& source, core::nanoseconds_t recv_ts = -1 ) {
442442 CHECK (source.size () != 0 );
443443 packet::PacketPtr pp;
444444 LONGS_EQUAL (status::StatusOK, source.read (pp, packet::ModeFetch));
445445 CHECK (pp);
446446 CHECK (pp->rtcp ());
447447 CHECK (pp->rtcp ()->payload );
448- if (ts >= 0 ) {
449- pp->udp ()->receive_timestamp = ts ;
448+ if (recv_ts >= 0 ) {
449+ pp->udp ()->receive_timestamp = recv_ts ;
450450 }
451451 roc_log (LogTrace, " delivering rtcp packet" );
452452 if (core::Logger::instance ().get_level () >= LogTrace) {
@@ -3107,7 +3107,7 @@ TEST(communicator, report_to_address_sender) {
31073107 CHECK_EQUAL (1 , send_comm.total_destinations ());
31083108 CHECK_EQUAL (1 , send_queue.size ());
31093109
3110- pp = read_packet (send_queue, send_time );
3110+ pp = read_packet (send_queue);
31113111 expect_has_dest_address (pp, send_dest_addr);
31123112 expect_has_orig_ssrc (pp, SendSsrc, true );
31133113 expect_has_dest_ssrc (pp, Recv1Ssrc, true );
@@ -3279,7 +3279,7 @@ TEST(communicator, report_back_sender) {
32793279 CHECK_EQUAL (1 , send_comm.total_destinations ());
32803280 CHECK_EQUAL (1 , send_queue.size ());
32813281
3282- pp = read_packet (send_queue, send_time );
3282+ pp = read_packet (send_queue);
32833283 expect_has_dest_address (pp, recv1_addr);
32843284 expect_has_orig_ssrc (pp, SendSsrc, true );
32853285 expect_has_dest_ssrc (pp, Recv1Ssrc, true );
@@ -3320,13 +3320,13 @@ TEST(communicator, report_back_sender) {
33203320 CHECK_EQUAL (2 , send_comm.total_destinations ());
33213321 CHECK_EQUAL (2 , send_queue.size ());
33223322
3323- pp = read_packet (send_queue, send_time );
3323+ pp = read_packet (send_queue);
33243324 expect_has_dest_address (pp, recv1_addr);
33253325 expect_has_orig_ssrc (pp, SendSsrc, true );
33263326 expect_has_dest_ssrc (pp, Recv1Ssrc, true );
33273327 expect_has_dest_ssrc (pp, Recv2Ssrc, false );
33283328
3329- pp = read_packet (send_queue, send_time );
3329+ pp = read_packet (send_queue);
33303330 expect_has_dest_address (pp, recv2_addr);
33313331 expect_has_orig_ssrc (pp, SendSsrc, true );
33323332 expect_has_dest_ssrc (pp, Recv1Ssrc, false );
@@ -3423,7 +3423,7 @@ TEST(communicator, report_back_receiver) {
34233423 CHECK_EQUAL (1 , recv_comm.total_destinations ());
34243424 CHECK_EQUAL (1 , recv_queue.size ());
34253425
3426- pp = read_packet (recv_queue, send1_time );
3426+ pp = read_packet (recv_queue);
34273427 expect_has_dest_address (pp, send1_addr);
34283428 expect_has_orig_ssrc (pp, RecvSsrc, true );
34293429 expect_has_dest_ssrc (pp, Send1Ssrc, true );
@@ -3469,13 +3469,13 @@ TEST(communicator, report_back_receiver) {
34693469 CHECK_EQUAL (2 , recv_comm.total_destinations ());
34703470 CHECK_EQUAL (2 , recv_queue.size ());
34713471
3472- pp = read_packet (recv_queue, recv_time );
3472+ pp = read_packet (recv_queue);
34733473 expect_has_dest_address (pp, send1_addr);
34743474 expect_has_orig_ssrc (pp, RecvSsrc, true );
34753475 expect_has_dest_ssrc (pp, Send1Ssrc, true );
34763476 expect_has_dest_ssrc (pp, Send2Ssrc, false );
34773477
3478- pp = read_packet (recv_queue, recv_time );
3478+ pp = read_packet (recv_queue);
34793479 expect_has_dest_address (pp, send2_addr);
34803480 expect_has_orig_ssrc (pp, RecvSsrc, true );
34813481 expect_has_dest_ssrc (pp, Send1Ssrc, false );
@@ -3606,14 +3606,14 @@ TEST(communicator, report_back_combine_reports) {
36063606 CHECK_EQUAL (2 , recv_comm.total_destinations ());
36073607 CHECK_EQUAL (2 , recv_queue.size ());
36083608
3609- pp = read_packet (recv_queue, send3_time );
3609+ pp = read_packet (recv_queue);
36103610 expect_has_dest_address (pp, send1_addr);
36113611 expect_has_orig_ssrc (pp, RecvSsrc, true );
36123612 expect_has_dest_ssrc (pp, Send1Ssrc, true );
36133613 expect_has_dest_ssrc (pp, Send2Ssrc, true );
36143614 expect_has_dest_ssrc (pp, Send3Ssrc, false );
36153615
3616- pp = read_packet (recv_queue, send3_time );
3616+ pp = read_packet (recv_queue);
36173617 expect_has_dest_address (pp, send3_addr);
36183618 expect_has_orig_ssrc (pp, RecvSsrc, true );
36193619 expect_has_dest_ssrc (pp, Send1Ssrc, false );
@@ -3832,6 +3832,99 @@ TEST(communicator, rtt) {
38323832 }
38333833}
38343834
3835+ // Same, but there is a persistent clock drift between sender and receiver
3836+ TEST (communicator, rtt_clock_drift) {
3837+ enum { SendSsrc = 11 , RecvSsrc = 22 , NumIters = 200 };
3838+
3839+ const char * SendCname = " send_cname" ;
3840+ const char * RecvCname = " recv_cname" ;
3841+
3842+ const core::nanoseconds_t SendStartTime = 10000000000000000 ;
3843+ const core::nanoseconds_t RecvStartTime = 30000000000000000 ;
3844+
3845+ const core::nanoseconds_t ReportInterval = 500 * core::Millisecond;
3846+ const core::nanoseconds_t Rtt = 200 * core::Millisecond;
3847+ const core::nanoseconds_t Drift = 1 * core::Millisecond;
3848+
3849+ Config config;
3850+ config.rtt .rtt_winlen = 1 ; // Disable smoothing
3851+ config.rtt .clock_offset_winlen = 1 ;
3852+
3853+ packet::FifoQueue send_queue;
3854+ MockParticipant send_part (SendCname, SendSsrc, Report_ToAddress);
3855+ Communicator send_comm (config, send_part, send_queue, composer, packet_factory, arena,
3856+ NULL );
3857+ LONGS_EQUAL (status::StatusOK, send_comm.init_status ());
3858+
3859+ packet::FifoQueue recv_queue;
3860+ MockParticipant recv_part (RecvCname, RecvSsrc, Report_Back);
3861+ Communicator recv_comm (config, recv_part, recv_queue, composer, packet_factory, arena,
3862+ NULL );
3863+ LONGS_EQUAL (status::StatusOK, recv_comm.init_status ());
3864+
3865+ core::nanoseconds_t send_time = SendStartTime;
3866+ core::nanoseconds_t recv_time = RecvStartTime;
3867+
3868+ for (int iter = 0 ; iter < NumIters; iter++) {
3869+ // Generate sender report
3870+ send_part.set_send_report (make_send_report (send_time, SendCname, SendSsrc, Seed));
3871+ LONGS_EQUAL (status::StatusOK, send_comm.generate_reports (send_time));
3872+ CHECK_EQUAL (1 , send_queue.size ());
3873+
3874+ advance_time (send_time, Rtt / 2 );
3875+ advance_time (recv_time, Rtt / 2 );
3876+
3877+ // Deliver sender report to receiver
3878+ if (iter != 0 ) {
3879+ recv_part.set_recv_report (
3880+ 0 , make_recv_report (recv_time, RecvCname, RecvSsrc, SendSsrc, Seed));
3881+ }
3882+ LONGS_EQUAL (status::StatusOK,
3883+ recv_comm.process_packet (read_packet (send_queue, recv_time)));
3884+
3885+ {
3886+ // Check metrics on receiver
3887+ const SendReport report = recv_part.next_send_notification ();
3888+ if (iter != 0 ) {
3889+ expect_timestamp (" receiver rtt" , Rtt, report.rtt , RttEpsilon + Drift);
3890+ expect_timestamp (" receiver clock_offset" ,
3891+ SendStartTime + (Drift * iter) - RecvStartTime,
3892+ report.clock_offset , RttEpsilon + Drift);
3893+ }
3894+ }
3895+
3896+ advance_time (send_time, ReportInterval / 2 + Drift);
3897+ advance_time (recv_time, ReportInterval / 2 );
3898+
3899+ // Generate receiver report
3900+ recv_part.set_recv_report (
3901+ 0 , make_recv_report (recv_time, RecvCname, RecvSsrc, SendSsrc, Seed));
3902+ LONGS_EQUAL (status::StatusOK, recv_comm.generate_reports (recv_time));
3903+ CHECK_EQUAL (1 , recv_queue.size ());
3904+
3905+ advance_time (send_time, Rtt / 2 );
3906+ advance_time (recv_time, Rtt / 2 );
3907+
3908+ // Deliver receiver report to sender
3909+ send_part.set_send_report (make_send_report (send_time, SendCname, SendSsrc, Seed));
3910+ LONGS_EQUAL (status::StatusOK,
3911+ send_comm.process_packet (read_packet (recv_queue, send_time)));
3912+
3913+ {
3914+ // Check metrics on sender
3915+ const RecvReport report = send_part.next_recv_notification ();
3916+
3917+ expect_timestamp (" sender rtt" , Rtt, report.rtt , RttEpsilon + Drift);
3918+ expect_timestamp (" sender clock_offset" ,
3919+ RecvStartTime - SendStartTime - (Drift * iter),
3920+ report.clock_offset , RttEpsilon + Drift);
3921+ }
3922+
3923+ advance_time (send_time, ReportInterval / 2 );
3924+ advance_time (recv_time, ReportInterval / 2 );
3925+ }
3926+ }
3927+
38353928// Same, but there is persistent network jitter
38363929TEST (communicator, rtt_network_jitter) {
38373930 enum { SendSsrc = 11 , RecvSsrc = 22 , NumIters = 200 };
@@ -4269,7 +4362,7 @@ TEST(communicator, rtt_network_reordering) {
42694362 recv_reorder_countdown = ReorderBurst;
42704363 }
42714364 recv_reorder_countdown--;
4272- packet::PacketPtr pp = read_packet (recv_queue, recv_time );
4365+ packet::PacketPtr pp = read_packet (recv_queue);
42734366 recv_packet_stash.push_back (*pp);
42744367 }
42754368
0 commit comments