Commit graph

1077 commits

Author SHA1 Message Date
Havard Graff
87457a862d rtpjitterbuffer: make sure not to drop packets based on skew
One of the jitterbuffers functions is to try and make sense of weird
network behavior.

It is quite unhelpful for the jitterbuffer to start dropping packets
itself when what you are trying to achieve is better network resilience.

In the case of a skew, this could often mean the sender has restarted
in some fashion, and then dropping the very first buffer of this "new"
stream could often mean missing valuable information, like in the case
of video and I-frames.

This patch simply reverts back to the old behavior, prior to 8d955fc32b
and includes the simplest test I could write to demonstrate the behavior,
where a single packet arrives "perfectly", then a 50ms gap happens,
and then two more packets arrive in perfect order after that.

# Conflicts:
#	tests/check/elements/rtpjitterbuffer.c
2019-11-02 23:05:32 +00:00
Tim-Philipp Müller
c9a47c0c8d Remove autotools build system 2019-10-14 11:04:18 +01:00
Aaron Boxer
46989dca96 documentation: fix a number of typos 2019-10-05 22:38:11 +00:00
Simon Arnling Bååth
8173596ed2 gstrtpjitterbuffer: Custom messages when dropping packets
This commit adds custom element messages for when gstrtpjitterbuffer
drops an incoming rtp packets due to for example arriving too late.
Applications can listen to these messages on the bus which enables
actions to be taken when packets are dropped due to for example high
network jitter.

Two properties has been added, one to enable posting drop messages and
one to set a minimum time between each message to enable throttling the
posting of messages as high drop rates.
2019-10-04 20:31:56 +00:00
Olivier Crête
a24596423a rtpjitterbuffer: Cancel timers instead of just unlocking loop thread
When the queue is full (and adding more packets would risk a seqnum
roll-over), the best approach is to just start pushing out packets
from the other side.  Just pushing out the packets results in the
timers being left hanging with old seqnums, so it's safer to just
execute them immediately in this case. It does limit the timer space
to the time it takes to receiver about 32k packets, but without
extended sequence number, this is the best RTP can do.

This also results in the test no longer needed to have timeouts or
timers as pushing packets in drives everything.

Fixes #619
2019-09-28 07:47:54 -04:00
Nicolas Dufresne
d4c6c335c5 rtpjitterbuffer: No need to wake the timer thread on head changes
If the jitterbuffer head change, there is no need to systematically
wakeup the timer thread. The timer thread will be waken up on if
an earlier timeout has been pushed. This prevent some more spurious
wakeup when the system is loaded. As a side effect, cranking the clock
may set the clock at an earlier position.
2019-09-27 17:34:04 -04:00
Nicolas Dufresne
37742cd36d rtptimerqueue: Consolidate a data structure for timers
Implement a single timer queue for all timers. The goal is to always use
ordered queues for storing timers. This way, extracting timers for
execution becomes O(1). This also allow separating the clock wait
scheduling from the timer itself and ensure that we only wake up the
timer thread when strictly needed.

The knew data structure is still O(n) on insertions and reschedule,
but we now use proximity optimization so that normal cases should be
really fast. The GList structure is also embeded intot he RtpTimer
structure to reduce the number of allocations.
2019-09-27 17:34:04 -04:00
Nicolas Dufresne
a53ffb6e11 tests: jitterbuffer: Demacroify some helpers
There is no reason for these to be macros anymore. This makes the
test helper much more readable.
2019-09-27 13:02:16 -04:00
Jan Schmidt
31be44c47f splitmux: Add muxer-pad-map property
Add a property which explicitly maps splitmuxsink pads to the
muxer pads they should connect to, overriding the implicit logic
that tries to match pads but yields arbitrary names.
2019-09-06 12:38:56 +00:00
Mathieu Duponchelle
e58ca79741 valgrind: suppress Cond error coming from gnutls
taken from fb4a8dda21
2019-08-08 14:39:17 +00:00
Antonio Ospite
1c5c90ea23 test: rtpbin_buffer_list: add a test for invalid packets in buffer list
Upstream elements can send all kinds of data in a buffer list, so cover
the case of an invalid RTP packet mixed with valid RTP packets.
2019-08-07 15:32:30 -04:00
Antonio Ospite
12b420168c test: rtpbin_buffer_list: add a test for multiplexed RTP and RTCP
RTP and RTCP packets can be muxed together on the same channel (see
RFC5761) and can arrive in the same buffer list.

The GStreamer rtpsession element support RFC5761, so add a test to cover
this case for buffer lists too.
2019-08-07 15:32:30 -04:00
Antonio Ospite
6a5f38a325 test: rtpbin_buffer_list: add a test for different timestamps in buffer list
Buffers with different timestamps (e.g. packets belonging to different
frames) can arrive together in the same buffer list,

Add a test to cover this case.
2019-08-07 15:32:30 -04:00
Antonio Ospite
b158be0d98 test: rtpbin_buffer_list: add function to check timestamp 2019-08-07 15:32:30 -04:00
Antonio Ospite
31f221f89d test: rtpbin_buffer_list: add a test about reordered or duplicated seqnums 2019-08-07 15:32:30 -04:00
Antonio Ospite
1d337b704e test: rtpbin_buffer_list: add a test for lange jump in seqnums with recovery 2019-08-07 15:32:30 -04:00
Antonio Ospite
ae5d4b8cf0 test: rtpbin_buffer_list: add a test for large jump in sequence numbers 2019-08-07 15:32:30 -04:00
Antonio Ospite
fb46c6bf08 test: rtpbin_buffer_list: add a test for wrapping sequence numbers 2019-08-07 15:32:30 -04:00
Antonio Ospite
d9d0461aeb test: rtpbin_buffer_list: add a test for permissible gap in sequence numbers 2019-08-07 15:32:30 -04:00
Antonio Ospite
92be4121e8 test: rtpbin_buffer_list: add a test for the case of failed probation
When a new source fails to pass the probation period (i.e. new packets
have non-consecutive sequence numbers), then no buffer shall be pushed
downstream. Add a test to validate this case.
2019-08-07 15:32:30 -04:00
Antonio Ospite
0537925c3a test: rtpbin_buffer_list: add function to check sequence number 2019-08-07 15:32:30 -04:00
Antonio Ospite
ec56e2fb78 test: rtpbin_buffer_list: add test to verify that receiving stats are correct
Add a test to verify that stats about received packets are correct when
using buffer lists in the rtpsession receive path.

Split get_session_source_stats() in two to be able to get stats from
a GstRtpSession object directly.
2019-08-07 15:32:30 -04:00
Antonio Ospite
80daea90f0 test: rtpbin_buffer_list: add a test for buffer lists on the recv path 2019-08-07 15:32:30 -04:00
Jan Schmidt
436d33b288 splitmuxsink: add the ability to mux auxilliary video streams
The primary video stream is used to select fragment cut points
at keyframe boundaries. Auxilliary video streams may be
broken up at any packet - so fragments may not start with a keyframe
for those streams.
2019-07-15 11:46:36 +00:00
Olivier Crête
efed059b9a rtp session: Add test for collision loopback detection
Ignore further collisions if the remote SSRC change with ours, it's
probably because someone is sending us back the packets we send out.
2019-07-06 14:23:20 +00:00
Olivier Crête
b5faed910e rtpsession tests: Add test for third-party collision detection
Add tests to validate the code that ignores the same packets coming
from 2 different sources (an third-party collision).
2019-07-06 14:23:20 +00:00
Olivier Crête
3574e6c176 rtpsession: Add test for collision on incoming packets
Make sure that the collision is properly detected on incoming packets.
2019-07-06 14:23:20 +00:00
Olivier Crête
4e18567863 rtpsession test: Verify that on-ssrc-collision message is emitted 2019-07-06 14:23:20 +00:00
Olivier Crête
9d9d543d5c rtpsession: Also send conflict event when sending packet
If the conflict is detected when sending a packet, then also send an
upstream event to tell the source to reconfigure itself.

Also ignore the collision if we see more than one collision from the same
remote source to avoid problems on loops.
2019-07-06 14:23:20 +00:00
Olivier Crête
061afa33ee rtph265pay: Also immediately send packet if it is a suffix NAL
Immediately send packet if it contains any suffix NAL, this is required
in case they come after the VCL nal to not have to wait until the next frame.
2019-07-03 19:05:29 +00:00
Olivier Crête
97f2fb4cc8 rtph26xpay: Wait until there is a VCL or suffix NAL to send
With unit tests.
2019-07-03 19:05:29 +00:00
Olivier Crête
4810c93222 rtph265pay test: Add unit tests for aggregation 2019-07-03 19:05:29 +00:00
Olivier Crête
1b32cb1eae rtph265pay: Implement Aggregation packets
Align with rtph264pay
2019-07-03 19:05:29 +00:00
Olivier Crête
42d775dfbe rtph264pay test: Add unit tests for aggregation 2019-07-03 19:05:29 +00:00
Olivier Crête
cede4f993d rtph264pay: Default to not adding latency when aggregating
Send the bundle as soon as there is one VCL unit in the packet at
the end of an incoming buffer.

The DELTA_UNIT flag is not reliable, so ignore it.
2019-07-03 19:05:29 +00:00
Olivier Crête
0c094612be rtp-payloading test: Fix working to 1.0 buffers instead of groups 2019-07-03 19:05:29 +00:00
Jan Alexander Steffens (heftig)
b46dab13d2 rtph264pay: Support STAP-A bundling
Add a new property "do-aggregate"* to the H.264 RTP payloader which
enables STAP-A aggregation as per [RFC-6184][1]. With aggregation enabled,
packets are bundled instead of sent immediately, up until the MTU size.
Bundles also end at access unit boundaries or when packets have to be
fragmented.

*: The property-name is kept generic since it might apply more widely,
   e.g. STAP-B or MTAP.
[1]: https://tools.ietf.org/html/rfc6184#section-5.7

Closes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/issues/434
2019-07-03 19:05:29 +00:00
Havard Graff
4d4e8f99b9 rtpjitterbuffer: Add unit test for unsolicited rtx affecting skew 2019-07-03 06:23:07 -06:00
Thomas Bluemel
8d955fc32b rtpjitterbuffer: Only calculate skew or reset if no gap.
In the case of reordered packets, calculating skew would cause
pts values to be off. Only calculate skew when packets come
in as expected. Also, late RTX packets should not trigger
clock skew adjustments.

Fixes #612
2019-07-03 06:23:07 -06:00
Jan Alexander Steffens (heftig)
91e858dcbe
test: flvmux: Test changing caps with one sinkpad
These tests segfault without the preceding crash fix.
2019-06-19 14:36:21 +02:00
Jan Alexander Steffens (heftig)
daafce54ac
test: flvmux: Use gst_harness_sink_push_many
And check its return value.
2019-06-19 14:36:21 +02:00
Mathieu Duponchelle
ebe2756434 jitterbuffer: unset DTS on output buffers 2019-06-14 16:02:59 +02:00
Mikhail Fludkov
ec5fa49631 rtpjitterbuffer: late packets shouldn't affect PTS of the following packet
If, say, a rtx-packet arrives really late, this can have a dramatic
effect on the jitterbuffer clock-skew logic, having it being reset
and losing track of the current dts-to-pts calculations, directly affecting
the packets that arrive later.

This is demonstrated in the test, where a RTX packet is pushed in really
late, and without this patch the last packet will have its PTS affected
by this, where as a late RTX packet should be redundant information, and
not affect anything.
2019-06-13 11:55:10 +02:00
Mikhail Fludkov
b9c3e354ee rtpjitterbuffer: fix rtx delay calulation when large packet spacing 2019-06-12 11:39:32 +02:00
Stian Selnes
6269ed49ab rtpjitterbuffer: Fix delay for EXPECTED timers added by gaps
This patch corrects the delay set on EXPECTED timers that are added when
processing gaps. Previously the delay could be too small so that
'timout + delay' was much less than 'now', causing the following retries
to be scheduled too early. (They were sent earlier than
rtx-retry-timeout after the previous timeout.)
2019-06-12 11:39:32 +02:00
Havard Graff
8ed7ab178b rtpjitterbuffer: don't try and calculate packet-rate if seqnum are jumping
Turns out that the "big-gap"-logic of the jitterbuffer has been horribly
broken.

For people using lost-events, an RTP-stream with a gap in sequencenumbers,
would produce exactly that many lost-events immediately.
So if your sequence-numbers jumped 20000, you would get 20000 lost-events
in your pipeline...

The test that looks after this logic "test_push_big_gap", basically
incremented the DTS of the buffer equal to the gap that was introduced,
so that in fact this would be more of a "large pause" test, than an
actual gap/discontinuity in the sequencenumbers.

Once the test was modified to not increment DTS (buffer arrival time) with
a similar gap, all sorts of crazy started happening, including adding
thousands of timers, and the logic that should have kicked in, the
"handle_big_gap_buffer"-logic, was not called at all, why?

Because the number max_dropout is calculated using the packet-rate, and
the packet-rate logic would, in this particular test, report that
the new packet rate was over 400000 packets per second!!!

I believe the right fix is to don't try and update the packet-rate if
there is any jumps in the sequence-numbers, and only do these calculations
for nice, sequential streams.
2019-06-12 11:39:31 +02:00
Havard Graff
dd422f0b7f rtpjitterbuffer: fix unused variables 2019-06-12 11:39:31 +02:00
Nicolas Dufresne
f227f65947 supp: Ignore leaks caused by shout/sethostent
sethostent() seems to be using a global state and we endup with leaks from
that API when called through shout_init(). We had the option to only
ignore the shout case, but the impression is that if we have shout and
another sethostend user, as it's a global state, we may endup with a
different stack trace for the same leak. So in the end, we just ignore
memory allocated by sethostent in general.
2019-06-04 13:41:30 -04:00
Nicolas Dufresne
f7c712d0b8 rtpssrcdemux: Avoid taking streamlock out-of-band
In this change we now protect the internal srcpads list using the
stream lock and limit usage of the internal stream lock to
preventing data flowing on the other src pad type while creating
and signalling the new pad.

This fixes a deadlock with RTPBin shutdown lock. These two locks would
end up being taken in two different order, which caused a deadlock. More
generally, we should not rely on a streamlock when handling out-of-band
data, so as a side effect, we should not take a stream lock when
iterating internal links.
2019-06-04 09:26:06 -04:00
Nicolas Dufresne
947a37f3c8 rtpsession: Always keep at least one NACK on early RTCP
We recently added code to remove outdate NACK to avoid using bandwidth
for packet that have no chance of arriving on time. Though, this had a
side effect, which is that it was to get an early RTCP packet with no
feedback into it. This was pretty useless but also had a side effect,
which is that the RTX RTT value would never be updated. So we we stared
having late RTX request due to high RTT, we'd never manage to recover.

This fixes the regression by making sure we keep at least one NACK in
this situation. This is really light on the bandwidth and allow for
quick recover after the RTT have spiked higher then the jitterbuffer
capacity.
2019-05-17 19:13:22 +00:00