Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relaxing roc_lib test #283

Merged
merged 1 commit into from
Dec 1, 2019
Merged

Conversation

alexandremgo
Copy link
Contributor

@alexandremgo alexandremgo commented Nov 1, 2019

Working on issue #278

I have several questions:

  1. The samples array is not defined in TEST_GROUP anymore. It is defined in Sender with a value that increases by sample_step_ in an infinite loop. In Receiver I check if the sample received is equal to a multiple (maybe ? for now i only check if it is equal to a current value or current value + sample_step_) of sample_step_ . Is it a good idea ?

  2. If the test succeeds, as the Sender sends infinitely a signal, the Sender never joins. And the test never ends. Do you have any idea how I could stop it ?

  3. What value should we put for N for the Receiver (N defined by: the Receiver should accumulate N non-zero samples)

Thanks!

PS: I did not handle the possible overflow yet
PS2: Does another mode than ROC_FRAME_ENCODING_PCM_FLOAT exists for roc_frame_encoding (I did not see another one in the doc) ?

@dshil
Copy link
Member

dshil commented Nov 1, 2019

Hi @alexandremgo!

Thanks for the PR! I will take a look tomorrow morning and answer to your questions.

@dshil
Copy link
Member

dshil commented Nov 2, 2019

Hi @alexandremgo,

Working on issue #278

I have several questions:

The samples array is not defined in TEST_GROUP anymore. It is defined in Sender with > a value that increases by sample_step_ in an infinite loop. In Receiver I check if the sample > received is equal to a multiple (maybe ? for now i only check if it is equal to a current value or
current value + sample_step_) of sample_step_ . Is it a good idea ?

Receiver may have some kind of current sample value that will be used to ensure that we receive the required sample.

On the receiver side the algorithm will be the following:

  • Wait for first non-zero sample
  • You receive first non-zero sample
  • The next possible sample can be either a valid sample (with value equal to the previously received sample + sample_step) or a zero-sample (in this case you simply increase you the current value to the sample_step)
  • On each received sample you update the current sample value (on the receiver side)

If the test succeeds, as the Sender sends infinitely a signal, the Sender never joins. And > the test never ends. Do you have any idea how I could stop it ?

You can use an atomic flag as:

class Sender {
public:
    void stop() {
        stopped_ = 1;
    }

private:
    virtual void run() {
        while (!stopped_) {
            // send a signal
        }
    }

    core::Atomic stopped_;
    // ... other stuff
};

What value should we put for N for the Receiver (N defined by: the Receiver should accumulate N non-zero samples)

The only requirement that this test should not be too long because it is the unit test. Lets make some experiments and measure how much time do we need to receive 1000, 10000, 100000 non-zero samples.

Thanks!

PS2: Does another mode than ROC_FRAME_ENCODING_PCM_FLOAT exists for roc_frame_encoding (I did not see another one in the doc) ?

No

@gavv gavv requested review from gavv and dshil November 4, 2019 08:55
@gavv gavv added the contribution A pull-request by someone else except maintainers label Nov 4, 2019
@gavv gavv added this to the 0.2.0 milestone Nov 4, 2019
@gavv gavv added the review in progress Pull request is being reviewed label Nov 4, 2019
@gavv
Copy link
Member

gavv commented Nov 4, 2019

What value should we put for N for the Receiver (N defined by: the Receiver should accumulate N non-zero samples)

I'd prefer that unit tests for each module were taking no more than 200-500ms on an unloaded system. So in one test we can retrieve, say, about 100ms of samples. On 44100 Hz it would be 4410 samples. We likely also want it to be a multiple of packet length * FEC block size, so PacketSamples * SourcePackets * 3 or PacketSamples * SourcePackets * 4 would be a good value.

@gavv
Copy link
Member

gavv commented Nov 4, 2019

PS: I did not handle the possible overflow yet

We should think whether it can happen on floats in a reasonable time. If it can't, there is no need to handle it.

@gavv
Copy link
Member

gavv commented Nov 4, 2019

PS2: Does another mode than ROC_FRAME_ENCODING_PCM_FLOAT exists for roc_frame_encoding (I did not see another one in the doc) ?

Currently this is the only supported encoding. In future we will add more.

@gavv gavv added work in progress Pull request is still in progress and changing and removed review in progress Pull request is being reviewed labels Nov 4, 2019
@alexandremgo
Copy link
Contributor Author

During the test I often (especially when the samples that have to be received - N - is put to more than PacketSamples * SourcePackets * 3) have an incorrect sample. I'm not sure where it comes from. I think my samples array is correctly defined on the sender side. And the check and incrementation of the sample value on the receiver side is correct. I've put several log messages.

Moreover, in some cases (when displaying the log messages, or having a low N) I have the pure virtual method error I had once:

11:11:44.968 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:56809
11:11:44.992 [inf] roc_lib: roc_sender: closed sender
pure virtual method called
terminate called without an active exception

ERROR: caught SIGABRT

==19515== Thread 3:
==19515== Syscall param msync(start) points to uninitialised byte(s)
==19515==    at 0x5FCFB59: msync (msync.c:25)
==19515==    by 0x66D02F3: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D0A4B: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D3E76: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D453E: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D4A98: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D0E70: _ULx86_64_step (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x50A153F: roc::core::(anonymous namespace)::is_backtrace_available() (backtrace.cpp:57)
==19515==    by 0x50A186F: roc::core::print_emergency_backtrace() (backtrace.cpp:163)
==19515==    by 0x50A081B: roc::core::(anonymous namespace)::signal_handler(int, siginfo_t*, void*) (crash.cpp:76)
==19515==    by 0x5EF2F1F: ??? (in /lib/x86_64-linux-gnu/libc-2.27.so)
==19515==    by 0x5EF2E96: __libc_signal_restore_set (nptl-signals.h:80)
==19515==    by 0x5EF2E96: raise (raise.c:48)
==19515==  Address 0x810d050 is on thread 3's stack
==19515==  in frame #7, created by roc::core::(anonymous namespace)::is_backtrace_available() (backtrace.cpp:30)
==19515== 
==19515== Syscall param msync(start) points to unaddressable byte(s)
==19515==    at 0x5FCFB59: msync (msync.c:25)
==19515==    by 0x66D02F3: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D0A4B: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D3E76: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D453E: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D4A98: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D0E70: _ULx86_64_step (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x50A15E3: roc::core::(anonymous namespace)::backtrace_symbols(bool) (backtrace.cpp:95)
==19515==    by 0x50A187D: roc::core::print_emergency_backtrace() (backtrace.cpp:164)
==19515==    by 0x50A081B: roc::core::(anonymous namespace)::signal_handler(int, siginfo_t*, void*) (crash.cpp:76)
==19515==    by 0x5EF2F1F: ??? (in /lib/x86_64-linux-gnu/libc-2.27.so)
==19515==    by 0x5EF2E96: __libc_signal_restore_set (nptl-signals.h:80)
==19515==    by 0x5EF2E96: raise (raise.c:48)
==19515==  Address 0x810c000 is on thread 3's stack
==19515==  1984 bytes below stack pointer
==19515== 
#1: 0x50a187e _ZN3roc4core25print_emergency_backtraceEv+0x17
#2: 0x50a081c _ZN3roc4core12_GLOBAL__N_114signal_handlerEiP9siginfo_tPv+0x58
#3: 0x5ef2f20 killpg+0x40
#4: 0x5ef2e97 gsignal+0xc7
==19515== Syscall param msync(start) points to uninitialised byte(s)
==19515==    at 0x5FCFB59: msync (msync.c:25)
==19515==    by 0x66D02F3: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D4230: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D453E: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D4A98: ??? (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x66D0E70: _ULx86_64_step (in /usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==19515==    by 0x50A15E3: roc::core::(anonymous namespace)::backtrace_symbols(bool) (backtrace.cpp:95)
==19515==    by 0x50A187D: roc::core::print_emergency_backtrace() (backtrace.cpp:164)
==19515==    by 0x50A081B: roc::core::(anonymous namespace)::signal_handler(int, siginfo_t*, void*) (crash.cpp:76)
==19515==    by 0x5EF2F1F: ??? (in /lib/x86_64-linux-gnu/libc-2.27.so)
==19515==    by 0x5EF2E96: __libc_signal_restore_set (nptl-signals.h:80)
==19515==    by 0x5EF2E96: raise (raise.c:48)
==19515==    by 0x5EF4800: abort (abort.c:79)
==19515==  Address 0x810e000 is on thread 3's stack
==19515== 
#5: 0x5ef4801 abort+0x141
#6: 0x55b785e __cxa_throw_bad_array_new_length+0x4c7
#7: 0x55c34f6 _ZSt17rethrow_exceptionNSt15__exception_ptr13exception_ptrE+0x76
#8: 0x55c3541 _ZSt9terminatev+0x11
#9: 0x55c426f __cxa_pure_virtual+0x1f
#10: 0x12c33d _ZN3roc12_GLOBAL__N_15Proxy12send_packet_ERNS_6packet7IReaderEb+0x43
#11: 0x12c2bd _ZN3roc12_GLOBAL__N_15Proxy5writeERKNS_4core9SharedPtrINS_6packet6PacketENS2_15RefCntOwnershipEEE+0x1f5
#12: 0x508a3c9 _ZN3roc5netio15UDPReceiverPort8recv_cb_EP8uv_udp_slPK8uv_buf_tPK8sockaddrj+0x7a7
#13: 0x53114b3 uv_tty_reset_mode+0x5b3
#14: 0x5313340 uv__io_poll+0x400
#15: 0x5303cc8 uv_run+0x118
#16: 0x50861ba _ZN3roc5netio11Transceiver3runEv+0x46
#17: 0x50a1491 _ZN3roc4core6Thread14thread_runner_EPv+0x23
#18: 0x64b46db start_thread+0xdb
#19: 0x5fd588f clone+0x3f
==19515== 
==19515== Process terminating with default action of signal 6 (SIGABRT)
==19515==    at 0x5EF2E97: raise (raise.c:51)
==19515==    by 0x5EF4800: abort (abort.c:79)
==19515==    by 0x55B785D: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==19515==    by 0x55C34F5: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==19515==    by 0x55C3540: std::terminate() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==19515==    by 0x55C426E: __cxa_pure_virtual (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==19515==    by 0x12C33C: roc::(anonymous namespace)::Proxy::send_packet_(roc::packet::IReader&, bool) (test_sender_receiver.cpp:369)
==19515==    by 0x12C2BC: roc::(anonymous namespace)::Proxy::write(roc::core::SharedPtr<roc::packet::Packet, roc::core::RefCntOwnership> const&) (test_sender_receiver.cpp:357)
==19515==    by 0x508A3C8: roc::netio::UDPReceiverPort::recv_cb_(uv_udp_s*, long, uv_buf_t const*, sockaddr const*, unsigned int) (udp_receiver_port.cpp:274)
==19515==    by 0x53114B2: ??? (in /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0)
==19515==    by 0x531333F: uv__io_poll (in /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0)
==19515==    by 0x5303CC7: uv_run (in /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0)
==19515== 
==19515== HEAP SUMMARY:
==19515==     in use at exit: 3,126,158 bytes in 85 blocks
==19515==   total heap usage: 137 allocs, 52 frees, 3,210,984 bytes allocated
==19515== 
==19515== LEAK SUMMARY:
==19515==    definitely lost: 0 bytes in 0 blocks
==19515==    indirectly lost: 0 bytes in 0 blocks
==19515==      possibly lost: 1,712 bytes in 5 blocks
==19515==    still reachable: 3,124,446 bytes in 80 blocks
==19515==                       of which reachable via heuristic:
==19515==                         newarray           : 624 bytes in 3 blocks
==19515==         suppressed: 0 bytes in 0 blocks

But i have no error when running the test without valgrind

@alexandremgo
Copy link
Contributor Author

alexandremgo commented Nov 4, 2019

When using LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so bin/x86_64-pc-linux-gnu/roc-test-lib -v (that I put in a bash script to be able to call it with valgrind) to capture backtrace of the error, the test succeeds.

@gavv
Copy link
Member

gavv commented Nov 5, 2019

Great, so we have a backtrace. I've created #285.

@gavv
Copy link
Member

gavv commented Nov 5, 2019

During the test I often (especially when the samples that have to be received - N - is put to more than PacketSamples * SourcePackets * 3) have an incorrect sample. I'm not sure where it comes from. I think my samples array is correctly defined on the sender side. And the check and incrementation of the sample value on the receiver side is correct. I've put several log messages.

It would help if in case of failure you printed the two sample streams passed to sender and retrieved by receiver. Maybe at least the last 100 or 1000 samples. So we can see what is the problem: rounding error, shifted stream, garbage inside the stream, etc.

@alexandremgo
Copy link
Contributor Author

The sample step is 1 / 32768 0 which is about 0.000031

Logs from the receiver side: RECEIVER sample #num_correctly_received_sample / num_received_sample = received_value | original = theoretical_value

Example 1:

[...]
10:40:10.144 [inf] roc_test: RECEIVER sample #8387 / 8587 = 0.262085 | original = 0.262085
10:40:10.144 [inf] roc_test: RECEIVER sample #8388 / 8588 = 0.262115 | original = 0.262115
10:40:10.144 [inf] roc_test: RECEIVER sample #8389 / 8589 = 0.262146 | original = 0.262146
10:40:10.144 [inf] roc_test: RECEIVER sample #8390 / 8590 = 0.262177 | original = 0.262177
10:40:10.145 [inf] roc_test: RECEIVER sample #8391 / 8591 = 0.262207 | original = 0.262207
10:40:10.145 [inf] roc_test: RECEIVER sample #8392 / 8592 = 0.262238 | original = 0.262238
10:40:10.145 [inf] roc_test: RECEIVER sample #8393 / 8593 = 0.262268 | original = 0.262268
10:40:10.145 [inf] roc_test: RECEIVER sample #8394 / 8594 = 0.262299 | original = 0.262299
10:40:10.145 [inf] roc_test: RECEIVER sample #8395 / 8595 = 0.262329 | original = 0.262329
10:40:10.145 [inf] roc_test: RECEIVER sample #8396 / 8596 = 0.262360 | original = 0.262360
10:40:10.145 [inf] roc_test: RECEIVER sample #8397 / 8597 = 0.262390 | original = 0.262390
10:40:10.145 [inf] roc_test: RECEIVER sample #8398 / 8598 = 0.262421 | original = 0.262421
10:40:10.145 [inf] roc_test: RECEIVER sample #8399 / 8599 = 0.262451 | original = 0.262451
10:40:10.146 [dbg] roc_audio: latency monitor: latency out of bounds: latency=3050 max=3000
10:40:10.147 [inf] roc_pipeline: receiver: removing session
10:40:10.170 [inf] roc_test: RECEIVER sample #8400 / 8600 = 0.000000 | original = 0.262482
10:40:10.170 [inf] roc_test: RECEIVER sample #8400 / 8601 = 0.000000 | original = 0.262512
10:40:10.170 [inf] roc_test: RECEIVER sample #8400 / 8602 = 0.000000 | original = 0.262543
10:40:10.170 [inf] roc_test: RECEIVER sample #8400 / 8603 = 0.000000 | original = 0.262573
[... received only 0 with original incrementing ...]
10:40:10.848 [inf] roc_test: RECEIVER sample #8400 / 10797 = 0.000000 | original = 0.329529
10:40:10.848 [inf] roc_test: RECEIVER sample #8400 / 10798 = 0.000000 | original = 0.329559
10:40:10.848 [inf] roc_test: RECEIVER sample #8400 / 10799 = 0.000000 | original = 0.329590
10:40:10.849 [dbg] roc_packet: delayed reader: initial queue: delay=1500 queue=1500 packets=27
10:40:10.850 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:40:10.850 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:40:10.852 [dbg] roc_fec: fec reader: repair queue: dropped=25
10:40:10.852 [dbg] roc_audio: depacketizer: got first packet: zero_samples=900
10:40:10.852 [inf] roc_test: RECEIVER sample #8400 / 10800 = 0.448639 | original = 0.329620

src/tests/roc_lib/test_sender_receiver.cpp:280: error: roc_panic()

ERROR: roc_test: failed comparing sample #8400

frame_num: 342
original: 0.329620,	received: 0.448639

Example 2:

[...]
10:54:47.716 [inf] roc_test: RECEIVER sample #4079 / 6179 = 0.188599 | original = 0.188599
10:54:47.717 [inf] roc_test: RECEIVER sample #4080 / 6180 = 0.188629 | original = 0.188629
10:54:47.717 [inf] roc_test: RECEIVER sample #4081 / 6181 = 0.188660 | original = 0.188660
10:54:47.717 [inf] roc_test: RECEIVER sample #4082 / 6182 = 0.188690 | original = 0.188690
10:54:47.717 [inf] roc_test: RECEIVER sample #4083 / 6183 = 0.188721 | original = 0.188721
10:54:47.717 [inf] roc_test: RECEIVER sample #4084 / 6184 = 0.188751 | original = 0.188751
10:54:47.717 [inf] roc_test: RECEIVER sample #4085 / 6185 = 0.188782 | original = 0.188782
10:54:47.717 [inf] roc_test: RECEIVER sample #4086 / 6186 = 0.188812 | original = 0.188812
10:54:47.717 [inf] roc_test: RECEIVER sample #4087 / 6187 = 0.188843 | original = 0.188843
10:54:47.718 [inf] roc_test: RECEIVER sample #4088 / 6188 = 0.188873 | original = 0.188873
10:54:47.718 [inf] roc_test: RECEIVER sample #4089 / 6189 = 0.188904 | original = 0.188904
10:54:47.718 [inf] roc_test: RECEIVER sample #4090 / 6190 = 0.188934 | original = 0.188934
10:54:47.718 [inf] roc_test: RECEIVER sample #4091 / 6191 = 0.188965 | original = 0.188965
10:54:47.718 [inf] roc_test: RECEIVER sample #4092 / 6192 = 0.188995 | original = 0.188995
10:54:47.718 [inf] roc_test: RECEIVER sample #4093 / 6193 = 0.189026 | original = 0.189026
10:54:47.718 [inf] roc_test: RECEIVER sample #4094 / 6194 = 0.189056 | original = 0.189056
10:54:47.718 [inf] roc_test: RECEIVER sample #4095 / 6195 = 0.189087 | original = 0.189087
10:54:47.719 [inf] roc_test: RECEIVER sample #4096 / 6196 = 0.189117 | original = 0.189117
10:54:47.719 [inf] roc_test: RECEIVER sample #4097 / 6197 = 0.189148 | original = 0.189148
10:54:47.719 [inf] roc_test: RECEIVER sample #4098 / 6198 = 0.189178 | original = 0.189178
10:54:47.719 [inf] roc_test: RECEIVER sample #4099 / 6199 = 0.189209 | original = 0.189209
10:54:47.722 [dbg] roc_audio: latency monitor: latency out of bounds: latency=3200 max=3000
10:54:47.723 [inf] roc_pipeline: receiver: removing session
10:54:47.747 [inf] roc_test: RECEIVER sample #4100 / 6200 = 0.000000 | original = 0.189240
10:54:47.747 [inf] roc_test: RECEIVER sample #4100 / 6201 = 0.000000 | original = 0.189270
[... received 0 ...]
10:54:47.773 [inf] roc_test: RECEIVER sample #4100 / 6397 = 0.000000 | original = 0.195251
10:54:47.773 [inf] roc_test: RECEIVER sample #4100 / 6398 = 0.000000 | original = 0.195282
10:54:47.773 [inf] roc_test: RECEIVER sample #4100 / 6399 = 0.000000 | original = 0.195312
10:54:47.774 [inf] roc_pipeline: receiver: creating session: src_addr=127.0.0.1:40460 dst_addr=127.0.0.1:55470
10:54:47.774 [dbg] roc_packet: delayed reader: initializing: delay=1500
10:54:47.774 [dbg] roc_fec: of decoder: initializing: codec=rs m=8
10:54:47.774 [dbg] roc_audio: depacketizer: initializing: n_channels=2
10:54:47.775 [dbg] roc_audio: watchdog: initializing: max_blank_duration=30000 max_drops_duration=0 drop_detection_window=13230
10:54:47.775 [dbg] roc_audio: latency monitor: initializing: target_latency=1500 in_rate=44100 out_rate=44100
10:54:47.775 [dbg] roc_packet: router: detected new stream: source=1950798951 flags=0x8u
10:54:47.780 [dbg] roc_audio: depacketizer: ts=100 loss_ratio=0.00000
10:54:47.781 [inf] roc_test: RECEIVER sample #4100 / 6400 = 0.000000 | original = 0.195343
10:54:47.781 [inf] roc_test: RECEIVER sample #4100 / 6401 = 0.000000 | original = 0.195374
10:54:47.781 [inf] roc_test: RECEIVER sample #4100 / 6402 = 0.000000 | original = 0.195404
10:54:47.782 [inf] roc_test: RECEIVER sample #4100 / 6403 = 0.000000 | original = 0.195435
[... received 0 ...]
10:54:47.875 [inf] roc_test: RECEIVER sample #4100 / 6797 = 0.000000 | original = 0.207458
10:54:47.875 [inf] roc_test: RECEIVER sample #4100 / 6798 = 0.000000 | original = 0.207489
10:54:47.876 [inf] roc_test: RECEIVER sample #4100 / 6799 = 0.000000 | original = 0.207520
10:54:47.877 [dbg] roc_packet: router: detected new stream: source=0 flags=0x10u
10:54:47.885 [dbg] roc_packet: delayed reader: initial queue: delay=1500 queue=3100 packets=56
10:54:47.886 [dbg] roc_packet: delayed reader: trimmed queue: delay=1500 queue=1500 packets=27
10:54:47.888 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:54:47.888 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:54:47.889 [dbg] roc_audio: depacketizer: got first packet: zero_samples=200
10:54:47.889 [inf] roc_test: RECEIVER sample #4100 / 6800 = 0.482208 | original = 0.207550

src/tests/roc_lib/test_sender_receiver.cpp:280: error: roc_panic()

ERROR: roc_test: failed comparing sample #4100

frame_num: 436
original: 0.207550,	received: 0.482208

The problem seems to start with the [dbg] roc_audio: latency monitor: latency out of bounds: latency=3200 max=3000

@gavv
Copy link
Member

gavv commented Nov 5, 2019

Huh.

10:54:47.722 [dbg] roc_audio: latency monitor: latency out of bounds: latency=3200 max=3000
10:54:47.723 [inf] roc_pipeline: receiver: removing session

These two lines mean that the incoming queue size on the receiver became larger than 3000 samples and it dropped the session and started producing zeros because there were no sessions anymore. Then, shortly, the session was auto-created again, but since the stream was now shifted, you got an incorrect sample.

The minimum and maximum boundaries may be configured using max_latency_overrun and max_latency_underrun in roc_receiver_config. Currently this test uses default values. The default maximum is target_latency*2 which is usually a reasonable value.

The incoming queue, in average, should be about target_latency samples. If the incoming queue is larger than the target_latency*2, it means that the receiver reads samples slower than the sender sends them. We should understand why this happens in this test.

@alexandremgo
Copy link
Contributor Author

The minimum and maximum boundaries may be configured using max_latency_overrun and max_latency_underrun in roc_receiver_config. Currently this test uses default values. The default maximum is target_latency*2 which is usually a reasonable value.

The incoming queue, in average, should be about target_latency samples. If the incoming queue is larger than the target_latency*2, it means that the receiver reads samples slower than the sender sends them. We should understand why this happens in this test.

Currently the value of target_latency is 34013605 in the test. It is defined by receiver_conf.target_latency = Latency * 1000000000ul / SampleRate. Is the unit of this value in bit ?

In the Sender side, I send arrays of samples of size total_samples_ = 3000 in an (infinite) loop. The problem probably comes from that:

 while (!stopped_) {
            for (size_t i = 0; i < total_samples_; ++i) {
                samples[i] = sample_value;
                sample_value = increment_sample_value(sample_value, sample_step_);
            }

            for (size_t off = 0; off < total_samples_; off += frame_size_) {
                if (off + frame_size_ > total_samples_) {
                    off = total_samples_ - frame_size_;
                }

                roc_frame frame;
                memset(&frame, 0, sizeof(frame));

                frame.samples = samples + off;
                frame.samples_size = frame_size_ * sizeof(float);

                const int ret = roc_sender_write(sndr_, &frame);
                roc_panic_if_not(ret == 0);
            }
}

@gavv
Copy link
Member

gavv commented Nov 5, 2019

Is the unit of this value in bit ?

It's in nanoseconds: https://roc-project.github.io/roc/docs/api/reference.html#c.roc_receiver_config::target_latency

In the Sender side, I send arrays of samples of size total_samples_ = 3000 in an (infinite) loop. The problem probably comes from that:

At the first glance the code looks good.

@gavv
Copy link
Member

gavv commented Nov 6, 2019

You can temporary increase the maximum allowed latency (set it to some very big value) and monitor the incoming queue size on the receiver.

When resampler is disabled (as in our test) the queue size is reported here: https://github.com/roc-project/roc/blob/master/src/modules/roc_audio/latency_monitor.cpp#L214-L219

Currently it is reported every 5 seconds: https://github.com/roc-project/roc/blob/master/src/modules/roc_audio/latency_monitor.cpp#L18

But you can hack it to report more frequently. You can also hack your test to run longer.

Then we can inspect what is the trend. Maybe the queue size is constantly and slowly increasing. This would mean that the sender is faster than the receiver for some reason. Maybe it's just a fluctuation (e.g. caused by system load or valgrind) and the rate is OK in average but sometimes either sender or receiver are stuck for a while.

@alexandremgo
Copy link
Contributor Author

alexandremgo commented Nov 6, 2019

Monitoring the latency / receiver queue size (every milliseconds)

First ex: default maximum allowed latency x 10

[...]
10:42:32.660 [dbg] roc_packet: delayed reader: initial queue: delay=15000 queue=18350 packets=55
10:42:32.667 [dbg] roc_packet: delayed reader: trimmed queue: delay=15000 queue=15700 packets=7
10:42:32.669 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2100 dist=307
10:42:32.673 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:42:32.674 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:42:32.678 [dbg] roc_audio: depacketizer: got first packet: zero_samples=18400
10:42:32.683 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2102 dist=309
10:42:32.686 [inf] roc_test: FIRST received sample #0: 0.848419
10:42:32.690 [dbg] roc_audio: latency monitor: latency=15600 target=15000
10:42:32.691 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2103 dist=310
10:42:32.693 [dbg] roc_audio: latency monitor: latency=15550 target=15000
10:42:32.695 [inf] roc_test: @88 SENDER samples array of size 3000
10:42:32.697 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2104 dist=311
10:42:32.698 [dbg] roc_audio: latency monitor: latency=15450 target=15000
10:42:32.698 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2105 dist=312
10:42:32.701 [dbg] roc_audio: latency monitor: latency=15450 target=15000
10:42:32.701 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2106 dist=313
10:42:32.701 [dbg] roc_audio: latency monitor: latency=15350 target=15000
10:42:32.702 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2107 dist=314
10:42:32.702 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2108 dist=315
10:42:32.702 [dbg] roc_audio: latency monitor: latency=15150 target=15000
10:42:32.703 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2109 dist=316
10:42:32.704 [dbg] roc_audio: latency monitor: latency=15200 target=15000
10:42:32.705 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2110 dist=317
10:42:32.707 [dbg] roc_audio: latency monitor: latency=15100 target=15000
10:42:32.711 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2112 dist=319
10:42:32.712 [dbg] roc_audio: latency monitor: latency=15100 target=15000
10:42:32.717 [inf] roc_test: @89 SENDER samples array of size 3000
10:42:32.719 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2113 dist=320
10:42:32.722 [dbg] roc_audio: latency monitor: latency=15000 target=15000
10:42:32.723 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2114 dist=321
10:42:32.724 [dbg] roc_audio: latency monitor: latency=15050 target=15000
10:42:32.724 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2115 dist=322
10:42:32.726 [dbg] roc_audio: latency monitor: latency=14950 target=15000
10:42:32.727 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2116 dist=323
10:42:32.728 [dbg] roc_audio: latency monitor: latency=14900 target=15000
10:42:32.730 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2117 dist=324
10:42:32.730 [dbg] roc_audio: latency monitor: latency=14800 target=15000
10:42:32.732 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2118 dist=325
10:42:32.735 [dbg] roc_audio: watchdog: status: bbbbibbbbbbbbbbbbbbb
10:42:32.735 [dbg] roc_audio: latency monitor: latency=14700 target=15000
10:42:32.736 [dbg] roc_audio: latency monitor: latency=14600 target=15000
10:42:32.736 [dbg] roc_audio: latency monitor: latency=14500 target=15000
10:42:32.739 [dbg] roc_audio: latency monitor: latency=14400 target=15000
10:42:32.745 [inf] roc_test: @90 SENDER samples array of size 3000
10:42:32.748 [dbg] roc_audio: latency monitor: latency=14300 target=15000
10:42:32.751 [dbg] roc_audio: latency monitor: latency=14200 target=15000
10:42:32.753 [dbg] roc_audio: latency monitor: latency=14100 target=15000
10:42:32.754 [dbg] roc_audio: latency monitor: latency=14000 target=15000
10:42:32.756 [dbg] roc_audio: latency monitor: latency=13900 target=15000
10:42:32.757 [dbg] roc_audio: latency monitor: latency=13800 target=15000
10:42:32.761 [dbg] roc_audio: latency monitor: latency=13700 target=15000
10:42:32.763 [inf] roc_test: @91 SENDER samples array of size 3000
10:42:32.764 [dbg] roc_audio: latency monitor: latency=13600 target=15000
10:42:32.764 [dbg] roc_audio: latency monitor: latency=13500 target=15000
10:42:32.767 [dbg] roc_audio: latency monitor: latency=13400 target=15000
10:42:32.768 [dbg] roc_audio: latency monitor: latency=13300 target=15000
10:42:32.769 [dbg] roc_audio: latency monitor: latency=13200 target=15000
10:42:32.770 [dbg] roc_audio: latency monitor: latency=13100 target=15000
10:42:32.770 [dbg] roc_audio: latency monitor: latency=12800 target=15000
10:42:32.772 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.773 [dbg] roc_audio: latency monitor: latency=12700 target=15000
10:42:32.783 [dbg] roc_audio: latency monitor: latency=12600 target=15000
10:42:32.791 [inf] roc_test: @92 SENDER samples array of size 3000
10:42:32.792 [dbg] roc_audio: latency monitor: latency=12500 target=15000
10:42:32.798 [dbg] roc_audio: latency monitor: latency=12400 target=15000
10:42:32.800 [dbg] roc_audio: latency monitor: latency=12300 target=15000
10:42:32.800 [dbg] roc_audio: latency monitor: latency=12100 target=15000
10:42:32.801 [dbg] roc_audio: latency monitor: latency=12000 target=15000
10:42:32.804 [dbg] roc_audio: latency monitor: latency=11900 target=15000
10:42:32.804 [dbg] roc_audio: latency monitor: latency=11700 target=15000
10:42:32.805 [dbg] roc_audio: latency monitor: latency=11400 target=15000
10:42:32.807 [dbg] roc_audio: latency monitor: latency=11300 target=15000
10:42:32.808 [dbg] roc_audio: latency monitor: latency=11100 target=15000
10:42:32.809 [dbg] roc_audio: latency monitor: latency=11000 target=15000
10:42:32.811 [dbg] roc_audio: latency monitor: latency=10900 target=15000
10:42:32.812 [dbg] roc_audio: latency monitor: latency=10800 target=15000
10:42:32.812 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.815 [dbg] roc_audio: latency monitor: latency=10700 target=15000
10:42:32.815 [dbg] roc_audio: latency monitor: latency=10600 target=15000
10:42:32.816 [dbg] roc_audio: latency monitor: latency=10300 target=15000
10:42:32.817 [dbg] roc_audio: latency monitor: latency=10200 target=15000
10:42:32.818 [dbg] roc_audio: latency monitor: latency=9800 target=15000
10:42:32.820 [dbg] roc_audio: latency monitor: latency=9700 target=15000
10:42:32.820 [dbg] roc_audio: latency monitor: latency=9400 target=15000
10:42:32.821 [dbg] roc_audio: latency monitor: latency=9200 target=15000
10:42:32.823 [dbg] roc_audio: latency monitor: latency=8800 target=15000
10:42:32.823 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.829 [inf] roc_test: @93 SENDER samples array of size 3000
10:42:32.831 [dbg] roc_audio: latency monitor: latency=8700 target=15000
10:42:32.833 [dbg] roc_audio: latency monitor: latency=8600 target=15000
10:42:32.834 [dbg] roc_audio: latency monitor: latency=8500 target=15000
10:42:32.836 [dbg] roc_audio: latency monitor: latency=8400 target=15000
10:42:32.837 [dbg] roc_audio: latency monitor: latency=8300 target=15000
10:42:32.838 [dbg] roc_audio: latency monitor: latency=8200 target=15000
10:42:32.843 [dbg] roc_audio: latency monitor: latency=8100 target=15000
10:42:32.845 [dbg] roc_audio: latency monitor: latency=7800 target=15000
10:42:32.845 [dbg] roc_audio: latency monitor: latency=7700 target=15000
10:42:32.847 [dbg] roc_audio: latency monitor: latency=7600 target=15000
10:42:32.849 [dbg] roc_audio: latency monitor: latency=7500 target=15000
10:42:32.849 [dbg] roc_audio: latency monitor: latency=7400 target=15000
10:42:32.850 [dbg] roc_audio: latency monitor: latency=7200 target=15000
10:42:32.851 [dbg] roc_audio: latency monitor: latency=7000 target=15000
10:42:32.854 [dbg] roc_audio: latency monitor: latency=6900 target=15000
10:42:32.854 [dbg] roc_audio: latency monitor: latency=6800 target=15000
10:42:32.857 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.859 [dbg] roc_audio: latency monitor: latency=6700 target=15000
10:42:32.860 [inf] roc_test: @94 SENDER samples array of size 3000
10:42:32.860 [dbg] roc_audio: latency monitor: latency=6600 target=15000
10:42:32.862 [dbg] roc_audio: latency monitor: latency=6500 target=15000
10:42:32.863 [dbg] roc_audio: latency monitor: latency=6400 target=15000
10:42:32.863 [dbg] roc_audio: latency monitor: latency=6300 target=15000
10:42:32.868 [dbg] roc_audio: latency monitor: latency=6200 target=15000
10:42:32.872 [dbg] roc_audio: latency monitor: latency=6100 target=15000
10:42:32.873 [dbg] roc_audio: latency monitor: latency=6000 target=15000
10:42:32.874 [dbg] roc_audio: latency monitor: latency=5900 target=15000
10:42:32.876 [dbg] roc_audio: latency monitor: latency=5800 target=15000
10:42:32.879 [dbg] roc_audio: latency monitor: latency=5700 target=15000
10:42:32.880 [dbg] roc_audio: latency monitor: latency=5600 target=15000
10:42:32.883 [dbg] roc_audio: latency monitor: latency=5500 target=15000
10:42:32.884 [dbg] roc_audio: latency monitor: latency=5400 target=15000
10:42:32.885 [dbg] roc_audio: latency monitor: latency=5300 target=15000
10:42:32.886 [dbg] roc_audio: latency monitor: latency=5200 target=15000
10:42:32.887 [dbg] roc_audio: latency monitor: latency=5100 target=15000
10:42:32.887 [dbg] roc_audio: latency monitor: latency=5000 target=15000
10:42:32.890 [dbg] roc_audio: latency monitor: latency=4800 target=15000
10:42:32.891 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.893 [inf] roc_test: @95 SENDER samples array of size 3000
10:42:32.894 [dbg] roc_audio: latency monitor: latency=4700 target=15000
10:42:32.895 [dbg] roc_audio: latency monitor: latency=4600 target=15000
10:42:32.896 [dbg] roc_audio: latency monitor: latency=4500 target=15000
10:42:32.897 [dbg] roc_audio: latency monitor: latency=4400 target=15000
10:42:32.898 [dbg] roc_audio: latency monitor: latency=4300 target=15000
10:42:32.900 [dbg] roc_audio: latency monitor: latency=4200 target=15000
10:42:32.903 [dbg] roc_audio: latency monitor: latency=4100 target=15000
10:42:32.907 [dbg] roc_audio: latency monitor: latency=4000 target=15000
10:42:32.907 [dbg] roc_audio: latency monitor: latency=3900 target=15000
10:42:32.910 [dbg] roc_audio: latency monitor: latency=3700 target=15000
10:42:32.917 [dbg] roc_audio: latency monitor: latency=3600 target=15000
10:42:32.918 [dbg] roc_audio: latency monitor: latency=3500 target=15000
10:42:32.919 [dbg] roc_audio: latency monitor: latency=3400 target=15000
10:42:32.920 [dbg] roc_audio: latency monitor: latency=3100 target=15000
10:42:32.922 [dbg] roc_audio: latency monitor: latency=3000 target=15000
10:42:32.923 [dbg] roc_audio: latency monitor: latency=2900 target=15000
10:42:32.924 [dbg] roc_audio: latency monitor: latency=2800 target=15000
10:42:32.924 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.925 [dbg] roc_audio: latency monitor: latency=2700 target=15000
10:42:32.927 [inf] roc_test: @96 SENDER samples array of size 3000
10:42:32.930 [dbg] roc_audio: latency monitor: latency=2600 target=15000
10:42:32.932 [dbg] roc_audio: latency monitor: latency=2500 target=15000
10:42:32.939 [dbg] roc_audio: latency monitor: latency=2400 target=15000
10:42:32.940 [dbg] roc_audio: latency monitor: latency=2300 target=15000
10:42:32.943 [dbg] roc_audio: latency monitor: latency=2200 target=15000
10:42:32.944 [dbg] roc_audio: latency monitor: latency=2100 target=15000
10:42:32.945 [dbg] roc_audio: latency monitor: latency=1600 target=15000
10:42:32.947 [dbg] roc_audio: latency monitor: latency=1500 target=15000
10:42:32.947 [dbg] roc_audio: latency monitor: latency=1300 target=15000
10:42:32.949 [dbg] roc_audio: latency monitor: latency=1200 target=15000
10:42:32.951 [dbg] roc_audio: latency monitor: latency=1100 target=15000
10:42:32.956 [dbg] roc_audio: latency monitor: latency=1000 target=15000
10:42:32.961 [inf] roc_test: @97 SENDER samples array of size 3000
10:42:32.966 [dbg] roc_audio: latency monitor: latency=900 target=15000
10:42:32.968 [dbg] roc_audio: latency monitor: latency=800 target=15000
10:42:32.970 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:32.970 [dbg] roc_audio: latency monitor: latency=700 target=15000
10:42:32.972 [dbg] roc_audio: latency monitor: latency=600 target=15000
10:42:32.973 [dbg] roc_audio: latency monitor: latency=500 target=15000
10:42:32.974 [dbg] roc_audio: latency monitor: latency=400 target=15000
10:42:32.976 [dbg] roc_audio: latency monitor: latency=300 target=15000
10:42:32.976 [dbg] roc_audio: latency monitor: latency=200 target=15000
10:42:32.979 [dbg] roc_audio: latency monitor: latency=0 target=15000
10:42:32.986 [dbg] roc_audio: latency monitor: latency=4294967196 target=15000
10:42:32.986 [dbg] roc_audio: latency monitor: latency=4294967096 target=15000
10:42:32.992 [dbg] roc_audio: latency monitor: latency=4294966996 target=15000
10:42:32.993 [dbg] roc_audio: latency monitor: latency=4294966796 target=15000
10:42:32.996 [inf] roc_test: @98 SENDER samples array of size 3000
10:42:32.997 [dbg] roc_audio: latency monitor: latency=4294966696 target=15000
10:42:32.998 [dbg] roc_audio: latency monitor: latency=4294966596 target=15000
10:42:33.002 [dbg] roc_audio: latency monitor: latency=4294966496 target=15000
10:42:33.003 [dbg] roc_audio: latency monitor: latency=4294966396 target=15000
10:42:33.005 [dbg] roc_audio: latency monitor: latency=4294966296 target=15000
10:42:33.005 [dbg] roc_audio: latency monitor: latency=4294966096 target=15000
10:42:33.006 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.009 [dbg] roc_audio: latency monitor: latency=4294965996 target=15000
10:42:33.011 [dbg] roc_audio: latency monitor: latency=4294965896 target=15000
10:42:33.011 [dbg] roc_audio: latency monitor: latency=4294965696 target=15000
10:42:33.012 [dbg] roc_audio: latency monitor: latency=4294965496 target=15000
10:42:33.020 [dbg] roc_audio: latency monitor: latency=4294964996 target=15000
10:42:33.022 [dbg] roc_audio: latency monitor: latency=4294964896 target=15000
10:42:33.024 [dbg] roc_audio: latency monitor: latency=4294964796 target=15000
10:42:33.024 [dbg] roc_audio: latency monitor: latency=4294964596 target=15000
10:42:33.026 [dbg] roc_audio: latency monitor: latency=4294964496 target=15000
10:42:33.030 [inf] roc_test: @99 SENDER samples array of size 3000
10:42:33.033 [dbg] roc_audio: latency monitor: latency=4294964396 target=15000
10:42:33.038 [dbg] roc_audio: latency monitor: latency=4294964296 target=15000
10:42:33.038 [dbg] roc_audio: latency monitor: latency=4294964196 target=15000
10:42:33.042 [dbg] roc_audio: latency monitor: latency=4294964096 target=15000
10:42:33.043 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.044 [dbg] roc_audio: latency monitor: latency=4294963996 target=15000
10:42:33.044 [dbg] roc_audio: latency monitor: latency=4294963896 target=15000
10:42:33.046 [dbg] roc_audio: latency monitor: latency=4294963596 target=15000
10:42:33.049 [dbg] roc_audio: latency monitor: latency=4294963496 target=15000
10:42:33.052 [dbg] roc_audio: latency monitor: latency=4294963396 target=15000
10:42:33.053 [dbg] roc_audio: latency monitor: latency=4294963296 target=15000
10:42:33.057 [dbg] roc_audio: latency monitor: latency=4294963196 target=15000
10:42:33.058 [dbg] roc_audio: latency monitor: latency=4294963096 target=15000
10:42:33.060 [dbg] roc_audio: latency monitor: latency=4294962996 target=15000
10:42:33.064 [inf] roc_test: @100 SENDER samples array of size 3000
10:42:33.064 [dbg] roc_audio: latency monitor: latency=4294962896 target=15000
10:42:33.067 [dbg] roc_audio: latency monitor: latency=4294962796 target=15000
10:42:33.069 [dbg] roc_audio: latency monitor: latency=4294962696 target=15000
10:42:33.071 [dbg] roc_audio: latency monitor: latency=4294962596 target=15000
10:42:33.072 [dbg] roc_audio: latency monitor: latency=4294962496 target=15000
10:42:33.076 [dbg] roc_audio: latency monitor: latency=4294962396 target=15000
10:42:33.080 [dbg] roc_audio: latency monitor: latency=4294962296 target=15000
10:42:33.081 [dbg] roc_audio: latency monitor: latency=4294962196 target=15000
10:42:33.082 [dbg] roc_audio: latency monitor: latency=4294962096 target=15000
10:42:33.083 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.084 [dbg] roc_audio: latency monitor: latency=4294961996 target=15000
10:42:33.089 [dbg] roc_audio: latency monitor: latency=4294961896 target=15000
10:42:33.090 [dbg] roc_audio: latency monitor: latency=4294961796 target=15000
10:42:33.092 [dbg] roc_audio: latency monitor: latency=4294961596 target=15000
10:42:33.094 [dbg] roc_audio: latency monitor: latency=4294961496 target=15000
10:42:33.097 [inf] roc_test: @101 SENDER samples array of size 3000
10:42:33.098 [dbg] roc_audio: latency monitor: latency=4294961396 target=15000
10:42:33.099 [dbg] roc_audio: latency monitor: latency=4294961296 target=15000
10:42:33.101 [dbg] roc_audio: latency monitor: latency=4294961196 target=15000
10:42:33.103 [dbg] roc_audio: latency monitor: latency=4294961096 target=15000
10:42:33.105 [dbg] roc_audio: latency monitor: latency=4294960996 target=15000
10:42:33.109 [dbg] roc_audio: latency monitor: latency=4294960896 target=15000
10:42:33.110 [dbg] roc_audio: latency monitor: latency=4294960796 target=15000
10:42:33.112 [dbg] roc_audio: latency monitor: latency=4294960696 target=15000
10:42:33.115 [dbg] roc_audio: latency monitor: latency=4294960596 target=15000
10:42:33.118 [dbg] roc_audio: latency monitor: latency=4294960496 target=15000
10:42:33.121 [dbg] roc_audio: latency monitor: latency=4294960396 target=15000
10:42:33.122 [dbg] roc_audio: latency monitor: latency=4294960296 target=15000
10:42:33.123 [dbg] roc_audio: latency monitor: latency=4294960196 target=15000
10:42:33.129 [dbg] roc_audio: latency monitor: latency=4294960096 target=15000
10:42:33.129 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.135 [inf] roc_test: @102 SENDER samples array of size 3000
10:42:33.135 [dbg] roc_audio: latency monitor: latency=4294959996 target=15000
10:42:33.138 [dbg] roc_audio: latency monitor: latency=4294959896 target=15000
10:42:33.151 [dbg] roc_audio: latency monitor: latency=4294959796 target=15000
10:42:33.167 [dbg] roc_audio: latency monitor: latency=4294959696 target=15000
10:42:33.171 [dbg] roc_audio: latency monitor: latency=4294959596 target=15000
10:42:33.176 [inf] roc_test: @103 SENDER samples array of size 3000
10:42:33.177 [dbg] roc_audio: latency monitor: latency=4294959496 target=15000
10:42:33.179 [dbg] roc_audio: latency monitor: latency=4294959396 target=15000
10:42:33.180 [dbg] roc_audio: latency monitor: latency=4294959296 target=15000
10:42:33.183 [dbg] roc_audio: latency monitor: latency=4294959196 target=15000
10:42:33.184 [dbg] roc_audio: latency monitor: latency=4294958996 target=15000
10:42:33.186 [dbg] roc_audio: latency monitor: latency=4294958896 target=15000
10:42:33.189 [dbg] roc_audio: latency monitor: latency=4294958796 target=15000
10:42:33.230 [inf] roc_test: @104 SENDER samples array of size 3000
10:42:33.241 [dbg] roc_audio: latency monitor: latency=4294958696 target=15000
10:42:33.242 [dbg] roc_audio: latency monitor: latency=4294958596 target=15000
10:42:33.245 [dbg] roc_audio: latency monitor: latency=4294958496 target=15000
10:42:33.251 [dbg] roc_audio: latency monitor: latency=4294958396 target=15000
10:42:33.253 [dbg] roc_audio: latency monitor: latency=4294958296 target=15000
10:42:33.254 [dbg] roc_audio: latency monitor: latency=4294958246 target=15000
10:42:33.255 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2119 dist=326
10:42:33.259 [inf] roc_test: @105 SENDER samples array of size 3000
10:42:33.263 [dbg] roc_audio: latency monitor: latency=4294958496 target=15000
10:42:33.265 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2120 dist=327
10:42:33.266 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.268 [dbg] roc_audio: latency monitor: latency=4294958546 target=15000
10:42:33.269 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2122 dist=329
10:42:33.271 [dbg] roc_audio: latency monitor: latency=4294958446 target=15000
10:42:33.271 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2123 dist=330
10:42:33.278 [inf] roc_test: @106 SENDER samples array of size 3000
10:42:33.281 [dbg] roc_audio: latency monitor: latency=5600 target=15000
10:42:33.285 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2124 dist=331
10:42:33.286 [dbg] roc_audio: latency monitor: latency=5550 target=15000
10:42:33.286 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2125 dist=332
10:42:33.291 [dbg] roc_audio: latency monitor: latency=5450 target=15000
10:42:33.291 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2126 dist=333
10:42:33.293 [dbg] roc_audio: latency monitor: latency=5350 target=15000
10:42:33.294 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2127 dist=334
10:42:33.300 [dbg] roc_audio: latency monitor: latency=5250 target=15000
10:42:33.302 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2128 dist=335
10:42:33.304 [dbg] roc_audio: latency monitor: latency=5150 target=15000
10:42:33.307 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2129 dist=336
10:42:33.307 [dbg] roc_audio: latency monitor: latency=5050 target=15000
10:42:33.307 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2130 dist=337
10:42:33.308 [dbg] roc_audio: latency monitor: latency=4950 target=15000
10:42:33.309 [inf] roc_test: @107 SENDER samples array of size 3000
10:42:33.310 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2132 dist=339
10:42:33.312 [dbg] roc_audio: latency monitor: latency=4850 target=15000
10:42:33.313 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2133 dist=340
10:42:33.321 [dbg] roc_audio: latency monitor: latency=4750 target=15000
10:42:33.322 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2134 dist=341
10:42:33.322 [dbg] roc_audio: latency monitor: latency=4650 target=15000
10:42:33.322 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2135 dist=342
10:42:33.324 [dbg] roc_audio: latency monitor: latency=4550 target=15000
10:42:33.325 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2136 dist=343
10:42:33.325 [dbg] roc_audio: latency monitor: latency=4450 target=15000
10:42:33.326 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2137 dist=344
10:42:33.327 [dbg] roc_audio: latency monitor: latency=4350 target=15000
10:42:33.327 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2138 dist=345
10:42:33.328 [dbg] roc_audio: latency monitor: latency=4250 target=15000
10:42:33.329 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2139 dist=346
10:42:33.335 [inf] roc_test: @108 SENDER samples array of size 3000
10:42:33.340 [dbg] roc_audio: latency monitor: latency=4150 target=15000
10:42:33.340 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2140 dist=347
10:42:33.341 [dbg] roc_audio: latency monitor: latency=4050 target=15000
10:42:33.342 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2142 dist=349
10:42:33.345 [dbg] roc_audio: latency monitor: latency=3950 target=15000
10:42:33.345 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2143 dist=350
10:42:33.349 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.349 [dbg] roc_audio: latency monitor: latency=3850 target=15000
10:42:33.350 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2144 dist=351
10:42:33.351 [dbg] roc_audio: latency monitor: latency=3750 target=15000
10:42:33.351 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2145 dist=352
10:42:33.351 [dbg] roc_audio: latency monitor: latency=3650 target=15000
10:42:33.352 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2146 dist=353
10:42:33.352 [dbg] roc_audio: latency monitor: latency=3550 target=15000
10:42:33.353 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2413 dist=620
10:42:33.353 [dbg] roc_audio: latency monitor: latency=3450 target=15000
10:42:33.354 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2414 dist=621
10:42:33.360 [dbg] roc_audio: latency monitor: latency=3350 target=15000
10:42:33.360 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2415 dist=622
10:42:33.366 [dbg] roc_audio: latency monitor: latency=3250 target=15000
10:42:33.366 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2417 dist=624
10:42:33.369 [inf] roc_test: @109 SENDER samples array of size 3000
10:42:33.370 [dbg] roc_audio: latency monitor: latency=3150 target=15000
10:42:33.371 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2418 dist=625
10:42:33.371 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2419 dist=626
10:42:33.373 [dbg] roc_audio: latency monitor: latency=2950 target=15000
10:42:33.373 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2420 dist=627
10:42:33.374 [dbg] roc_audio: latency monitor: latency=2850 target=15000
10:42:33.374 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2421 dist=628
10:42:33.375 [dbg] roc_audio: latency monitor: latency=2750 target=15000
10:42:33.376 [dbg] roc_audio: latency monitor: latency=2650 target=15000
10:42:33.379 [dbg] roc_audio: latency monitor: latency=2450 target=15000
10:42:33.382 [dbg] roc_audio: latency monitor: latency=2350 target=15000
10:42:33.383 [dbg] roc_audio: latency monitor: latency=2250 target=15000
10:42:33.384 [dbg] roc_audio: latency monitor: latency=2150 target=15000
10:42:33.385 [dbg] roc_audio: latency monitor: latency=2050 target=15000
10:42:33.387 [dbg] roc_audio: latency monitor: latency=1950 target=15000
10:42:33.387 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.388 [dbg] roc_audio: latency monitor: latency=1850 target=15000
10:42:33.389 [dbg] roc_audio: latency monitor: latency=1650 target=15000
10:42:33.390 [dbg] roc_audio: latency monitor: latency=1450 target=15000
10:42:33.391 [dbg] roc_audio: watchdog: blank timeout reached: every frame was blank during timeout: curr_read_pos=48500 last_pos_before_blank=18500 max_blank_duration=30000
10:42:33.391 [dbg] roc_audio: watchdog: status: bbbbb
10:42:33.393 [inf] roc_pipeline: receiver: removing session
10:42:33.403 [inf] roc_test: @110 SENDER samples array of size 3000
10:42:33.451 [inf] roc_test: @111 SENDER samples array of size 3000
10:42:33.476 [inf] roc_test: @112 SENDER samples array of size 3000
10:42:33.505 [inf] roc_test: @113 SENDER samples array of size 3000
10:42:33.540 [inf] roc_test: @114 SENDER samples array of size 3000
10:42:33.573 [inf] roc_test: @115 SENDER samples array of size 3000
10:42:33.608 [inf] roc_test: @116 SENDER samples array of size 3000
10:42:33.642 [inf] roc_test: @117 SENDER samples array of size 3000
10:42:33.675 [inf] roc_test: @118 SENDER samples array of size 3000
10:42:33.713 [inf] roc_test: @119 SENDER samples array of size 3000
10:42:33.751 [inf] roc_test: @120 SENDER samples array of size 3000
10:42:33.802 [inf] roc_pipeline: receiver: creating session: src_addr=127.0.0.1:53995 dst_addr=127.0.0.1:45265
10:42:33.803 [dbg] roc_packet: delayed reader: initializing: delay=15000
10:42:33.806 [dbg] roc_fec: of decoder: initializing: codec=rs m=8
10:42:33.806 [dbg] roc_audio: depacketizer: initializing: n_channels=2
10:42:33.807 [dbg] roc_audio: watchdog: initializing: max_blank_duration=30000 max_drops_duration=0 drop_detection_window=13230
10:42:33.811 [dbg] roc_audio: latency monitor: initializing: target_latency=15000 in_rate=44100 out_rate=44100
10:42:33.811 [dbg] roc_packet: router: detected new stream: source=1472254063 flags=0x8u
10:42:33.811 [dbg] roc_audio: depacketizer: ts=100 loss_ratio=0.00000
10:42:33.813 [inf] roc_test: @121 SENDER samples array of size 3000
10:42:33.833 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.840 [inf] roc_test: @122 SENDER samples array of size 3000
10:42:33.859 [inf] roc_test: @123 SENDER samples array of size 3000
10:42:33.875 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.880 [inf] roc_test: @124 SENDER samples array of size 3000
10:42:33.887 [dbg] roc_packet: router: detected new stream: source=0 flags=0x10u
10:42:33.907 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.913 [inf] roc_test: @125 SENDER samples array of size 3000
10:42:33.948 [inf] roc_test: @126 SENDER samples array of size 3000
10:42:33.950 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:33.982 [inf] roc_test: @127 SENDER samples array of size 3000
10:42:33.995 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.015 [inf] roc_test: @128 SENDER samples array of size 3000
10:42:34.041 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.054 [inf] roc_test: @129 SENDER samples array of size 3000
10:42:34.086 [inf] roc_test: @130 SENDER samples array of size 3000
10:42:34.089 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.118 [inf] roc_test: @131 SENDER samples array of size 3000
10:42:34.130 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.155 [inf] roc_test: @132 SENDER samples array of size 3000
10:42:34.176 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.190 [inf] roc_test: @133 SENDER samples array of size 3000
10:42:34.220 [inf] roc_test: @134 SENDER samples array of size 3000
10:42:34.223 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.254 [inf] roc_test: @135 SENDER samples array of size 3000
10:42:34.267 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.287 [inf] roc_test: @136 SENDER samples array of size 3000
10:42:34.316 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.322 [inf] roc_test: @137 SENDER samples array of size 3000
10:42:34.357 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.360 [inf] roc_test: @138 SENDER samples array of size 3000
10:42:34.409 [inf] roc_test: @139 SENDER samples array of size 3000
10:42:34.457 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:42:34.458 [dbg] roc_packet: delayed reader: initial queue: delay=15000 queue=32350 packets=35
10:42:34.460 [dbg] roc_packet: delayed reader: trimmed queue: delay=15000 queue=29650 packets=2
10:42:34.460 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=2476 next=3068 dist=592
10:42:34.461 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:42:34.463 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:42:34.465 [dbg] roc_fec: fec reader: repair queue: dropped=33
10:42:34.471 [dbg] roc_audio: depacketizer: got first packet: zero_samples=28100

src/tests/roc_lib/test_sender_receiver.cpp:274: error: roc_panic()

ERROR: roc_test: failed comparing sample #100

frame_num: 2118
original: 0.731384,	received: 0.932831

The Sender already sent 88 arrays of samples before the Receiver receive its first sample.
The part:

10:42:32.976 [dbg] roc_audio: latency monitor: latency=200 target=15000
10:42:32.979 [dbg] roc_audio: latency monitor: latency=0 target=15000
10:42:32.986 [dbg] roc_audio: latency monitor: latency=4294967196 target=15000
10:42:32.986 [dbg] roc_audio: latency monitor: latency=4294967096 target=15000

is really interesting

2nd example: default maximum allowed latency

10:58:13.956 [dbg] roc_packet: delayed reader: initial queue: delay=1500 queue=1650 packets=29
10:58:13.960 [dbg] roc_packet: delayed reader: trimmed queue: delay=1500 queue=1500 packets=27
10:58:13.968 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:58:13.970 [inf] roc_test: @26 SENDER samples array of size 3000
10:58:13.974 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:58:13.977 [dbg] roc_audio: depacketizer: got first packet: zero_samples=3300
10:58:13.994 [inf] roc_test: FIRST received sample #0: 0.070221
10:58:13.997 [dbg] roc_audio: latency monitor: latency=1550 target=1500
10:58:13.998 [dbg] roc_audio: latency monitor: latency=1450 target=1500
10:58:14.000 [dbg] roc_audio: latency monitor: latency=1350 target=1500
10:58:14.001 [dbg] roc_fec: fec reader: got first packet in a block, start decoding: n_packets_before=7 sbn=37317
10:58:14.007 [dbg] roc_audio: latency monitor: latency=1300 target=1500
10:58:14.011 [dbg] roc_packet: router: detected new stream: source=0 flags=0x10u
10:58:14.012 [dbg] roc_audio: latency monitor: latency=1200 target=1500
10:58:14.016 [dbg] roc_fec: fec reader: repair queue: fetched=1 added=0 dropped=1
10:58:14.019 [dbg] roc_audio: latency monitor: latency=1100 target=1500
10:58:14.025 [dbg] roc_fec: fec reader: update repair block size: cur_sblen=10 cur_rblen=0 new_rblen=245
10:58:14.028 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbb....i..
10:58:14.030 [dbg] roc_audio: latency monitor: latency=1000 target=1500
10:58:14.031 [dbg] roc_audio: latency monitor: latency=900 target=1500
10:58:14.032 [inf] roc_test: @27 SENDER samples array of size 3000
10:58:14.038 [dbg] roc_audio: latency monitor: latency=800 target=1500
10:58:14.066 [dbg] roc_fec: of decoder: repaired 1/1/255 .r........ ....
10:58:14.076 [dbg] roc_audio: latency monitor: latency=700 target=1500
10:58:14.077 [dbg] roc_audio: latency monitor: latency=600 target=1500
10:58:14.084 [dbg] roc_audio: latency monitor: latency=500 target=1500
10:58:14.085 [dbg] roc_audio: latency monitor: latency=400 target=1500
10:58:14.089 [dbg] roc_audio: latency monitor: latency=300 target=1500
10:58:14.092 [dbg] roc_fec: of decoder: repaired 4/4/255 .r.....rrr ....
10:58:14.096 [inf] roc_test: @28 SENDER samples array of size 3000
10:58:14.097 [dbg] roc_audio: latency monitor: latency=200 target=1500
10:58:14.112 [dbg] roc_audio: latency monitor: latency=100 target=1500
10:58:14.115 [dbg] roc_audio: latency monitor: latency=0 target=1500
10:58:14.115 [inf] roc_test: @29 SENDER samples array of size 3000
10:58:14.120 [dbg] roc_audio: latency monitor: latency=4294967196 target=1500
10:58:14.126 [dbg] roc_fec: of decoder: repaired 0/10/255 XXXXXXXXXX ....
10:58:14.128 [dbg] roc_audio: latency monitor: latency=4294967096 target=1500
10:58:14.132 [dbg] roc_audio: latency monitor: latency=4294966996 target=1500
10:58:14.134 [dbg] roc_audio: latency monitor: latency=4294966896 target=1500
10:58:14.136 [dbg] roc_audio: latency monitor: latency=4294966796 target=1500
10:58:14.139 [dbg] roc_audio: latency monitor: latency=4294966696 target=1500
10:58:14.140 [dbg] roc_audio: latency monitor: latency=4294966596 target=1500
10:58:14.142 [inf] roc_test: @30 SENDER samples array of size 3000
10:58:14.145 [dbg] roc_audio: latency monitor: latency=4294966496 target=1500
10:58:14.149 [dbg] roc_audio: latency monitor: latency=4294966396 target=1500
10:58:14.151 [dbg] roc_audio: watchdog: status: ...........ibbbbbbbb
10:58:14.157 [inf] roc_test: @31 SENDER samples array of size 3000
10:58:14.158 [dbg] roc_audio: latency monitor: latency=4294966296 target=1500
10:58:14.173 [inf] roc_test: @32 SENDER samples array of size 3000
10:58:14.173 [dbg] roc_audio: latency monitor: latency=4294966196 target=1500
10:58:14.177 [dbg] roc_audio: latency monitor: latency=4294966096 target=1500
10:58:14.181 [dbg] roc_audio: latency monitor: latency=4294965996 target=1500
10:58:14.185 [dbg] roc_audio: latency monitor: latency=4294965896 target=1500
10:58:14.186 [dbg] roc_audio: latency monitor: latency out of bounds: latency=-1600 min=-1500
10:58:14.187 [inf] roc_pipeline: receiver: removing session
10:58:14.198 [inf] roc_test: @33 SENDER samples array of size 3000
10:58:14.221 [inf] roc_test: @34 SENDER samples array of size 3000
10:58:14.257 [inf] roc_test: @35 SENDER samples array of size 3000
10:58:14.288 [inf] roc_test: @36 SENDER samples array of size 3000
10:58:14.322 [inf] roc_test: @37 SENDER samples array of size 3000
10:58:14.359 [inf] roc_test: @38 SENDER samples array of size 3000
10:58:14.393 [inf] roc_test: @39 SENDER samples array of size 3000
10:58:14.426 [inf] roc_test: @40 SENDER samples array of size 3000
10:58:14.493 [inf] roc_pipeline: receiver: creating session: src_addr=127.0.0.1:60396 dst_addr=127.0.0.1:35077
10:58:14.495 [dbg] roc_packet: delayed reader: initializing: delay=1500
10:58:14.495 [dbg] roc_fec: of decoder: initializing: codec=rs m=8
10:58:14.496 [dbg] roc_audio: depacketizer: initializing: n_channels=2
10:58:14.496 [dbg] roc_audio: watchdog: initializing: max_blank_duration=30000 max_drops_duration=0 drop_detection_window=13230
10:58:14.497 [dbg] roc_audio: latency monitor: initializing: target_latency=1500 in_rate=44100 out_rate=44100
10:58:14.497 [dbg] roc_packet: router: detected new stream: source=998812966 flags=0x8u
10:58:14.497 [dbg] roc_audio: depacketizer: ts=100 loss_ratio=0.00000
10:58:14.506 [inf] roc_test: @41 SENDER samples array of size 3000
10:58:14.519 [dbg] roc_audio: watchdog: status: bbbbbbbbbbbbbbbbbbbb
10:58:14.529 [inf] roc_test: @42 SENDER samples array of size 3000
10:58:14.534 [dbg] roc_packet: delayed reader: initial queue: delay=1500 queue=1500 packets=27
10:58:14.535 [dbg] roc_fec: fec reader: update payload size: next_esi=0 cur_size=0 new_size=212
10:58:14.536 [dbg] roc_fec: fec reader: update source block size: cur_sblen=0 cur_rblen=0 new_sblen=10
10:58:14.537 [dbg] roc_audio: depacketizer: got first packet: zero_samples=2500

src/tests/roc_lib/test_sender_receiver.cpp:274: error: roc_panic()

ERROR: roc_test: failed comparing sample #3600

frame_num: 649
original: 0.535095,	received: 0.173981

We can see the same behavior:

10:58:14.097 [dbg] roc_audio: latency monitor: latency=200 target=1500
10:58:14.112 [dbg] roc_audio: latency monitor: latency=100 target=1500
10:58:14.115 [dbg] roc_audio: latency monitor: latency=0 target=1500
10:58:14.115 [inf] roc_test: @29 SENDER samples array of size 3000
10:58:14.120 [dbg] roc_audio: latency monitor: latency=4294967196 target=1500
10:58:14.126 [dbg] roc_fec: of decoder: repaired 0/10/255 XXXXXXXXXX ....
10:58:14.128 [dbg] roc_audio: latency monitor: latency=4294967096 target=1500

Am I doing something wrong ? Or is the queue size inversely proportional to the latency ?

@gavv
Copy link
Member

gavv commented Nov 9, 2019

@alexandremgo Hi, sorry for late replay. I'm freelancing this month so have a little free time...

Thanks for this experiment! Let's see what is happening here.

First, you have found a bug in latency reporting code:

10:42:32.986 [dbg] roc_audio: latency monitor: latency=4294967196 target=15000
...

4294967196 is an overflowed negative value. Here is a fix:

diff --git a/src/modules/roc_audio/latency_monitor.cpp b/src/modules/roc_audio/latency_monitor.cpp
index 14f9c356..54cd430d 100644
--- a/src/modules/roc_audio/latency_monitor.cpp
+++ b/src/modules/roc_audio/latency_monitor.cpp
@@ -103,7 +103,7 @@ bool LatencyMonitor::update(packet::timestamp_t pos) {
             return false;
         }
     } else {
-        report_latency_((packet::timestamp_t)latency);
+        report_latency_(latency);
     }
 
     return true;
@@ -211,10 +211,10 @@ bool LatencyMonitor::update_resampler_(packet::timestamp_t pos,
     return true;
 }
 
-void LatencyMonitor::report_latency_(packet::timestamp_t latency) {
+void LatencyMonitor::report_latency_(packet::timestamp_diff_t latency) {
     if (rate_limiter_.allow()) {
-        roc_log(LogDebug, "latency monitor: latency=%lu target=%lu",
-                (unsigned long)latency, (unsigned long)target_latency_);
+        roc_log(LogDebug, "latency monitor: latency=%ld target=%lu",
+                (long)latency, (unsigned long)target_latency_);
     }
 }
 
diff --git a/src/modules/roc_audio/latency_monitor.h b/src/modules/roc_audio/latency_monitor.h
index 21380d05..85c173d7 100644
--- a/src/modules/roc_audio/latency_monitor.h
+++ b/src/modules/roc_audio/latency_monitor.h
@@ -93,7 +93,7 @@ private:
     bool init_resampler_(size_t input_sample_rate, size_t output_sample_rate);
     bool update_resampler_(packet::timestamp_t time, packet::timestamp_t latency);
 
-    void report_latency_(packet::timestamp_t latency);
+    void report_latency_(packet::timestamp_diff_t latency);
 
     const packet::SortedQueue& queue_;
     const Depacketizer& depacketizer_;

Second, we can see that the watchdog was triggered:

10:42:33.391 [dbg] roc_audio: watchdog: blank timeout reached: every frame was blank during timeout: curr_read_pos=48500 last_pos_before_blank=18500 max_blank_duration=30000

...and dropped the session. This means that during last 30000 samples all packets were dropped and thus all samples were blank. Then the session was restarted, the stream was shifted, and we got the same panic as before.

(The watchdog parameters can be configured via API as well. See roc_receiver_config).

Also we can see that the rtp validator is triggered:

10:42:33.340 [dbg] roc_rtp: rtp validator: too long seqnum jump: prev=1793 next=2140 dist=347

This means that it detected a stream jump: the previous packet had sequence number N, but the next packet had sequence number > N+100. When such a jump is detected, rtp validator drops the packet.

I've checked out your branch and tried to entirely disable latency monitor (audio::LatencyMonitor::update), watchdog (audio::Watchdog::update), and rtp validator (rtp::Validator::read).

After doing this, the test stopped panicking and now runs forever.

Here is how the queue size (the "latency") is changing:

Figure_1

So the queue size decreased dramatically on the beginning and then was slowly increasing.

The logs are full of these messages:

16:42:04.376 [dbg] roc_audio: depacketizer: dropping late packet: ts=1189826907 pkt_ts=1189818707
16:42:04.377 [dbg] roc_audio: depacketizer: dropping late packet: ts=1189826907 pkt_ts=1189818757
16:42:04.378 [dbg] roc_audio: depacketizer: dropping late packet: ts=1189826907 pkt_ts=1189818807
16:42:04.378 [dbg] roc_audio: depacketizer: dropping late packet: ts=1189826907 pkt_ts=1189818907
16:42:04.378 [dbg] roc_audio: depacketizer: dropping late packet: ts=1189826907 pkt_ts=1189818957
16:42:04.378 [dbg] roc_audio: depacketizer: fetched=0 dropped=5

Now let's put all these stuff together.

It seems that the sender thread was stuck for a while (likely because of the valgrind), and the receiver stream position went ahead of the sender stream position.

This led to the situation when the sender is always behind the receiver and its packets are always outdated for the receiver. The receiver, in turn, always have to drop the packets and produces zero samples.

Normally this situation is detected by the latency monitor or watchdog and the session is restarted. We tried to disable them and the session was stuck in this half-dead state.

Conclusions:

  • Related to this test. It seems that we can't assume that the stream will not be shifted because, under valgrind, the sender can stuck/delay for a while. Thus I suggest to keep watchdog and latency monitor enabled and relax the test check even further. It should now allow stream shifts.

    The check may be rather simple, something like this: If the previous sample is non-zero, the next sample should be incremented by one. If the previous sample is zero, stream jumps are allowed and the next sample may be incremented by an arbitrary value.

  • In general, we should think whether we could detect this half-dead session state on sender. Currently, after the sender is stuck for a while, it blindly continues to send packets and doesn't care if this doesn't make sense anymore. We probably should detect such situations on sender and forcibly reset the stream position when necessary or maybe report error.

@alexandremgo
Copy link
Contributor Author

alexandremgo commented Nov 11, 2019

Thanks for the explanations @gavv, and no pb ;)

I've added your fix for the latency overflowed negative value, and relaxed the test by allowing stream shifts.

After that, the test was successful, but I was ending up again with the pure virtual method call error of issue #285. So I've re-ordered the Proxy field as advised. It seems to fix the problem.

Without valgrind, the test works correctly. But with valgrind, the test never terminates. We receive enough samples, and the Sender does join. But then the test is stuck:

11:17:43.170 [dbg] roc_audio: latency monitor: latency=1400 target=1500
11:17:43.171 [dbg] roc_fec: fec reader: got first packet in a block, start decoding: n_packets_before=3 sbn=22961
11:17:43.172 [inf] roc_test: RECEIVED ALL THE SAMPLES
11:17:43.172 [inf] roc_test: THE RECEIVER HAS RUN
11:17:43.173 [inf] roc_test: THE SENDER HAS STOPPED
11:17:43.189 [inf] roc_test: THE SENDER HAS JOINED
11:17:43.365 [dbg] roc_netio: transceiver: removing port 127.0.0.1:45000
11:17:43.432 [inf] roc_netio: udp sender: closing port 127.0.0.1:45000
11:17:43.450 [inf] roc_netio: udp sender: closed port 127.0.0.1:45000
11:17:43.451 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:45000
11:17:43.466 [inf] roc_lib: roc_sender: closed sender
11:17:43.475 [inf] roc_netio: udp receiver: closing port 127.0.0.1:51452
11:17:43.477 [inf] roc_netio: udp receiver: closing port 127.0.0.1:44799
11:17:43.481 [inf] roc_netio: udp receiver: closed port 127.0.0.1:44799
11:17:43.482 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:44799
11:17:43.483 [inf] roc_netio: udp receiver: closed port 127.0.0.1:51452
11:17:43.483 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:51452
11:17:43.496 [inf] roc_netio: udp sender: closing port 127.0.0.1:42250
11:17:43.496 [inf] roc_netio: udp sender: closed port 127.0.0.1:42250
11:17:43.496 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:42250
11:17:43.497 [dbg] roc_netio: transceiver: finishing event loop

[nothing happens after]

As the Sender seems to join, I don't understand why the test does not terminate.

@alexandremgo
Copy link
Contributor Author

alexandremgo commented Nov 12, 2019

On a successful test from the branch develop, we have:

09:52:25.986 [dbg] roc_netio: transceiver: removing port 127.0.0.1:43129
09:52:25.987 [inf] roc_netio: udp sender: closing port 127.0.0.1:43129
09:52:25.987 [inf] roc_netio: udp sender: closed port 127.0.0.1:43129
09:52:25.987 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:43129
09:52:25.987 [inf] roc_lib: roc_sender: closed sender
09:52:25.988 [dbg] roc_netio: transceiver: removing port 127.0.0.1:43097
09:52:25.988 [inf] roc_netio: udp receiver: closing port 127.0.0.1:43097
09:52:25.989 [inf] roc_netio: udp receiver: closed port 127.0.0.1:43097
09:52:25.989 [dbg] roc_netio: transceiver: asynchronous close finished: port 127.0.0.1:43097
09:52:25.990 [inf] roc_lib: roc_receiver: closed receiver
09:52:25.990 [dbg] roc_netio: transceiver: finishing event loop
09:52:25.991 [inf] roc_lib: roc_context: closed context

Compared to the logs i've posted on the previous comment, it seems that on my branch, the roc_receiver does not close. And therefore the roc_context does not close neither.

[update]
After doing several tests, it seems that the roc_receiver does not close when there are still samples that have been sent, but have not been read while the function receiver.run() was called.

For now i've added a hack: a stop function for the Receiver that reads an arbitrary number of frames. And it does make the tests successful

What would be a cleaner way to fix that ?

@gavv
Copy link
Member

gavv commented Nov 13, 2019

Here is the backtrace of the stucked test (it is printed if we send SIGTERM to it):

==26906== Process terminating with default action of signal 15 (SIGTERM)
==26906==    at 0x499914C: futex_wait_cancelable (futex-internal.h:88)
==26906==    by 0x499914C: __pthread_cond_wait_common (pthread_cond_wait.c:502)
==26906==    by 0x499914C: pthread_cond_wait@@GLIBC_2.3.2 (pthread_cond_wait.c:655)
==26906==    by 0x496CF28: uv_cond_wait (in /usr/lib64/libuv.so.1.0.0)
==26906==    by 0x487E298: roc::core::Cond::wait() const (cond.h:42)
==26906==    by 0x4889878: roc::netio::Transceiver::run_task_(roc::netio::Transceiver::Task&) (transceiver.cpp:242)
==26906==    by 0x4889D51: roc::netio::Transceiver::remove_port(roc::address::SocketAddr) (transceiver.cpp:151)
==26906==    by 0x487A16E: (anonymous namespace)::receiver_close_port(void*, roc::pipeline::PortConfig const&) (receiver.cpp:22)
==26906==    by 0x487CDA9: roc::pipeline::Receiver::iterate_ports(void (*)(void*, roc::pipeline::PortConfig const&), void*) const (receiver.cpp:84)
==26906==    by 0x487A06F: roc_receiver_close (receiver.cpp:163)
==26906==    by 0x41A4E7: roc::(anonymous namespace)::Receiver::~Receiver() (test_sender_receiver.cpp:203)
==26906==    by 0x41A92F: roc::TEST_sender_receiver_fec_with_losses_Test::testBody() (test_sender_receiver.cpp:535)
==26906==    by 0x42BCC3: helperDoTestBody(void*) (in /home/victor/dev/roc-project/roc/bin/x86_64-pc-linux-gnu/roc-test-lib)
==26906==    by 0x42C825: PlatformSpecificSetJmp (in /home/victor/dev/roc-project/roc/bin/x86_64-pc-linux-gnu/roc-test-lib)

@gavv
Copy link
Member

gavv commented Nov 13, 2019

It seems it is the same bug in Transceiver as described here: #277.

@gavv
Copy link
Member

gavv commented Nov 13, 2019

@alexandremgo After reading your comment and experimenting with your branch it became clear what is the source of the problem in #277 and how we can fix it. See my last comment there.

So the proper way to fix this test is to fix #277.

If you wish, you can pick that issue up. Currently nobody is working on it. Or we can merge this PR without the workaround and just don't enable valgrind on travis until we will fix the bug.

@alexandremgo
Copy link
Contributor Author

@gavv I can try to fix #277 then ;)

@alexandremgo alexandremgo changed the title WIP Relaxing roc_lib test Relaxing roc_lib test Nov 22, 2019
@alexandremgo
Copy link
Contributor Author

The PR is ready for review ;)

@gavv gavv added ready for review Pull request can be reviewed and removed work in progress Pull request is still in progress and changing labels Nov 28, 2019
@gavv
Copy link
Member

gavv commented Nov 28, 2019

LGTM! (except one nitpick above).

Tested it locally. Works good, even when running 10 concurrent instances (earlier it failed already on 6 concurrent instances).

@alexandremgo Could you also try to enable roc-lib-test in valgrind travis checks? It is disabled here:

https://github.com/roc-project/roc/blob/develop/scripts/travis/linux-runtime-checks/valgrind-debug.sh#L8

https://github.com/roc-project/roc/blob/develop/scripts/travis/linux-runtime-checks/valgrind-release.sh#L8

@gavv gavv added needs revision Pull request should be revised by its author and removed ready for review Pull request can be reviewed labels Nov 28, 2019
@gavv
Copy link
Member

gavv commented Nov 30, 2019

It would be also nice to squash all test-related commits into a single one. Sorry, forgot to mention it before.

Indefinitely read samples until we accumulate N non-zero samples
Enable roc-lib-test in valgrind travis checks
@gavv gavv removed the needs revision Pull request should be revised by its author label Dec 1, 2019
@gavv gavv merged commit 4aeacee into roc-streaming:develop Dec 1, 2019
@gavv
Copy link
Member

gavv commented Dec 1, 2019

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contribution A pull-request by someone else except maintainers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants