Skip to content

Commit a4c8d6c

Browse files
committed
Changed stream list to arrays and optimized stream lookup with SSE2.
The stream list in the SRTP context is now implemented with two arrays: an array of SSRCs and an array of pointers to the streams corresponding to the SSRCs. The streams no longer form a single linked list. Stream lookup by SSRC is now performed over the array of SSRCs, which is considerably faster because it is more cache-friendly. Additionally, the lookup is optimized for SSE2, which provides an additional massive speedup with many streams in the list. Although the lookup still has linear complexity, its absolute times are reduced and with tens to hundreds elements are lower or comparable with a typical rb-tree equivalent. Expected speedup of SSE2 version over the previous implementation: SSRCs speedup (scalar) speedup (SSE2) 1 0.39x 0.22x 3 0.57x 0.23x 5 0.69x 0.62x 10 0.77x 1.43x 20 0.86x 2.38x 30 0.87x 3.44x 50 1.13x 6.21x 100 1.25x 8.51x 200 1.30x 9.83x At small numbers of SSRCs the new algorithm is somewhat slower, but given that the absolute and relative times of the lookup are very small, that slowdown is not very significant.
1 parent 7d351de commit a4c8d6c

File tree

3 files changed

+356
-130
lines changed

3 files changed

+356
-130
lines changed

include/srtp_priv.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,26 @@ typedef struct srtp_stream_ctx_t_ {
151151
int *enc_xtn_hdr;
152152
int enc_xtn_hdr_count;
153153
uint32_t pending_roc;
154-
struct srtp_stream_ctx_t_ *next; /* linked list of streams */
155154
} strp_stream_ctx_t_;
156155

156+
/*
157+
* An srtp_stream_list_t is a list of streams searchable by SSRC.
158+
*
159+
* Pointers to streams and their respective SSRCs are stored in two arrays, where
160+
* the stream pointer and the SSRC at the same index correspond to each other.
161+
*/
162+
typedef struct srtp_stream_list_t {
163+
srtp_stream_ctx_t **streams;
164+
uint32_t *ssrcs;
165+
uint32_t size;
166+
uint32_t capacity;
167+
} srtp_stream_list_t;
168+
157169
/*
158170
* an srtp_ctx_t holds a stream list and a service description
159171
*/
160172
typedef struct srtp_ctx_t_ {
161-
struct srtp_stream_ctx_t_ *stream_list; /* linked list of streams */
173+
srtp_stream_list_t stream_list; /* list of streams */
162174
struct srtp_stream_ctx_t_ *stream_template; /* act as template for other */
163175
/* streams */
164176
void *user_data; /* user custom data */

0 commit comments

Comments
 (0)