Protect selected_sfd with in_lock.
Protect RTCP sending with in_lock and out_lock as appropriate.
Has the odd side effect of RTCP reports expected in tests to be sent one
packet later than before.
Closes#1966
Probably fixes#1927
Change-Id: I225b43dff8e8fbb938d3be6aad50249997615d77
Add the ptime into the hash function so that cached player using
different ptimes use distinct entries.
Closes#1963
Change-Id: Ib118cd2ce14525d524a2d63c0506af8ae8ae929f
... from packetizer function instead of putting it into the AVPacket.
Remove AVPacket from callback function arguments.
Fix up PTS/duration adjustments where they were missing.
Closes#1963
Change-Id: Ib36b36bb6648b0579dd83155c7217317dda29cc3
Fixes:
../lib/loglib.h:54:17: warning: ‘err’ may be used uninitialized in this function [-Wmaybe-uninitialized]
54 | __ilog(prio, "[%s] " fmt, log_level_names[system], ##__VA_ARGS__); \
| ^~~~~~
sdp.c:613:21: note: ‘err’ was declared here
613 | const char *err;
| ^~~
sdp.c:734:9: warning: ‘err’ may be used uninitialized in this function [-Wmaybe-uninitialized]
734 | ilog(LOG_ERROR, "Failed to parse a=crypto attribute, ignoring: %s", err);
| ^
sdp.c:613:21: note: ‘err’ was declared here
613 | const char *err;
| ^
Change-Id: I18c3c1d6f2d6d5643a61ef864116e1f3d5e1db95
Fixes:
main.c: In function ‘options’:
main.c:1055:9: warning: ‘static’ is not at beginning of declaration [-Wold-style-declaration]
1055 | const static size_t max_buf_size =
| ^~~~~
Change-Id: I500785e712d94ff0969317edf3d7a256dc4e3182
Add `EXTRACT_NETWORK_ADDRESS_ATTR`
for proper error alias handling,
otherwise just quits with no attr type change.
Change-Id: Iacea9350503b68962a3c233df9126102b67d3b8b
If dummy definition with no tag, algo etc.
just ignore it, otherwise not excluded
and is dangling in outgoing SDP.
Also add according test.
Change-Id: Ib7c981ee66b1ce8cb363a9cc181231c68baa69cd
Using `l->next` as a test for whether only one element is left in the
list is not reliable. Use the actual list length instead.
Update one affected test.
Closes#1961
Change-Id: I5773715700220cd762e61090bac941ddd33afd9b
Allow restarting the DTX buffer upon reception of a packet iff shutdown
occurred due to the max-dtx time being exceeded.
Change-Id: I9cbb9e946e6f495526cbef8f468f4e0a5aff0096
SDP attributes have been moved to the call's memory arena in 5115fe000.
Make sure the redis restore code uses the same.
Remove some redundant null checks as well.
Closes#1959
Change-Id: I2f37869f5f2c95999d028c811c6a0eb10215f576
Multiple writers may operate on a single WS connection simultaneously.
Make sure they don't get in each other's way while constructing their
messages/responses by holding the lock from the beginning of the
response until the point when it's fully ready. This fixes a problem of
parts of multiple messages getting mixed up with each other.
Change-Id: If84224fc06b423cd65c12981a5b09ee99b121df2
Looks like partial writes are handled automatically internally, but add
a request for a "writeable" callback anyway so we know when we can write
more.
Closes#1943
Change-Id: I86a8e1924febc0524b90dc6559753e12e0de9dfb
this fixes an edge case where `DTMF-security=silence`, `block-media`
is enabled and the endpoint sends silence packets in between each RTP
event packet of a single DTMF hit. When that happens, the DTMF doesn't
get processed as `packet_sequencer_next_packet` returns NULL, and the
while loop is broken due to the ts_diff being 0
By checking if media is currently blocked and that the current packet
is a supplemental DTMF, we can force the packet to be processed so the
dropped packet is considered lost and we don't lose the DTMF event
Change-Id: I78bc8e273e872b3ab88f7a84e26a79fad1793476
A simple mechanism to track whether a given media endpoint has been
advertised to the public. If it hasn't, then any media received on it is
considered suspicious, and source addresses are ignored for learning
purposes.
Change-Id: I76a08e3f442f263dad192ff496a5d734a9349d26
The internally used VALID flag doesn't reflect the "valid" state from
the RFC, possibly leading to legitimate packets (DTLS etc) to be
ignored. Introduce a new flag to track which ICE pairs have been
authenticated through requests or responses.
Change-Id: I11b8e2bb6a7638ab9405304c6f45c29b20d3739c
If DTX audio has already been produced for a particular timestamp and a
late packet matching that timestamp is encountered, we should just
discard the packet instead of immediately doing a timestamp reset. This
prevents unwanted TS resets. Only do a timestamp reset if this happens
multiple times in a row, as we don't want to have to discard too much
audio.
Change-Id: I46c8c20b08787f7e45145bd88463bb6878f36f15
if a delay buffer is enabled, the packets get scheduled in the future,
but media playback packets are scheduled immediately. this results
in choppy playback due to the packets coming in at the same time.
This change adds a new bool to chu_args that gets enabled when
play-media is called and passed in to codec_handlers_stop so the delay
buffer queue is cleared instead of flushed
Change-Id: Id534f9087d934481f17341bc577099dc2362f8e1
when DTMF-security is set to an option that results in a transcode,
the packets go into handler_func_transcode. This returns immediately
when handler_silence_block returns false due to block-media, resulting
in the events not being processed for sending on log-DTMF etc.
This change only uses the transcode function for transcoded DTMF if
we're not blocking media (and logically, blocking media should mean
_all_ media). It instead goes into __handler_func_supplemental as normal
so packet_dtmf can process the packet, but drop it if its in one of
these modes and media is blocked
Change-Id: I19901877f6018f3916b22ff60799e8c74d02e065
when media playback happens, all packets get scheduled at the same
time with a send time in the future. however, this results in the
output_skew calculation triggering an unnecessary shift in the send
timer, which can cause choppy playback
Change-Id: I449f221a4d348eb615c2af1dca30bec163aa4fc6
These are normally held per thread, but in cases of threads not having
dedicated init/cleanup functions (GLib thread pool), we can use a global
one as fallback.
Fixes#1936
Change-Id: Ia2ff3523e6079baa73e0721862100ec2f8b66c88
Replace with hand-rolled requests made via libcurl.
Background: libxmlrpc-core-c3-dev packaging is currently broken in
Debian Sid and this is a good opportunity to move away from it.
Ref: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1102554
Change-Id: I8a09452220993afdac19654edf13d7f3f6ba64c9
In case stray audio is receveived before the DTMF event is fully
finished, retain the internal state from the beginning of the event to
make sure that the output is consistent. This fixes both DTMF timestamps
jumping during the end event, and audio timestamps being off after the
end event.
Closes#1929
Change-Id: I4e675b15153e35a8d1546b947e4b82879c1577b4
If recording-method is pcap, then proc is zero-initialized, so
meta_filepath is empty. This shows many logs such as:
[core] Failed to open recording metadata file '(null)' for writing: Bad address
Prevent them by returning earlier.
Fixes#1889 for real this time.
Amends commit 759fd72dc6.
Closes#1924
Change-Id: I25c9acefba9ee129354fd799ef493af86b9eab2c
Switch from thread-local allocated string object to a stack allocated
one. Use auto cleanup to manage storage duration and final logging.
Fixes intermittent random failures of the leak checker.
Change-Id: Ie6afb27e6fd1accbe641fc62175d553a0558de0d
Remove the actual hash and just keep a linked list. Always move most
recently used entries to the front of the list, which also obsoletes
tracking the last used time stamp.
Change-Id: Id277499228b538dd013a4442e9b5c5a4d247ff15
Keep outgoing RTP timestamps consistent between different instances of
the DTX buffer. Update affected tests.
Change-Id: I6cf03ab32f5c510bd781063a9e7241d1187c202b
If the last used PT was a different one, check if it was an unknown PT.
If it was, then DTX can remain active, as the packet would have been
blocked.
Change-Id: Icc8bf195c30a2252b392bbccfeef34b91078ddd6
The stub is used for unknown payload types. Specialise the handler
function for it with an extra check for DTX usage. This effectively
blocks RTP packets with unknown payload types if DTX has been
configured. Forwarding RTP packets with unknown payload types can
interfere with a clean output stream generated by the DTX buffer.
Change-Id: I6f0aa9654946d2877b963cd13cec7c3f5c8b1c54
Shutting down a DTX buffer means that it may restart at an unknown later
time. Reset TS tracking when shutting it down so that if it does
restart, it receives a fresh TS state, instead of continuing on the
previous timestamps, which may then be wrong.
Change-Id: I9c7978e2f335eab32982c4739917ca5ce0c27eb6
Extend PT tracker to not just track the most used PT, but also which PT
has been used last. Use a simple circular array.
Use this new tracking to determine whether a DTX buffer should remain
active. The "most used PT" approach isn't reliable for this, as it leads
to a DTX buffer restarting only after the PT has become the "most used,"
so only after about 10 packets. Meanwhile a newly appearing SSRC would
have a new DTX buffer active immediately. Being strict about which PT
was used last resolves this inconsistency.
Change-Id: If912e4d10e6737a82f6adc0b19d502075aa18a93
If a packet is received for a codec that should have an active DTX but
doesn't, drop the packet instead of forwarding it without being
processed. In this case we expect that some other codec has an active
DTX buffer, and forwarding the packet would interfere with a clean
output stream.
Change-Id: I162ba6f314b804123a6a3957feb7435a319ad2b9
The GLib slice allocator has been obsoleted. Having a mixture of two
allocators can lead to hidden issues on systems that use different
implementations. Take the leap and replace everything with g_new/g_free.
Change-Id: I025c8383ef47b2c2472573360407fd6a6ca339b3
Media IDs are supposed to be unique. Non-RFC OSRTP may however lead to
duplicated media sections with the same media ID. Use a hash table to
track which media IDs have already been seen, and ignore any duplicates.
Change-Id: I9de5fdf3165fc4326862af708aec3d4f6736cb12
This mode is only supposed to be used by cases when:
- in-dialog offerer doesn't have own MoH capabilities; and
- still want the recipient to hear the MoH music; hence
- an offerer checks whether a recipient is capable of MoH,
and launches a player based on given capabilities;
- the rest functions the same as with usual MoH hold;
Other information:
- `mode=reflect` is only to be used within dialog,
so, it's not meant for a session origination,
and hence stands alone from other MoH option flags
that actually give a metadata (e.g. blob data)
- `mode=reflect` hence contradicts with `mode=sendrecv`
which in its turn serves another purpose
Usage:
- `moh => { mode => 'reflect' }`
Change-Id: I8d0d55f2711c6b47bfca17691582c1ffe66eae3d
Decoding and encoding may have taken some time. Grab an updated "now"
before scheduling a packet to send.
Change-Id: I9380cb01d77519cf082d87f3a6c6cfc18b8213f8
With reuse-codecs, we still need to place the codec from the SDP into
our prefs list, even if it's already present, as the format options may
have changed. Update one affected test case.
Closes#1921
Change-Id: I688c57a8c45ec4c3bf159fe2193a0e00bbceeda2