TT#132251 refactor kernel payload type tracking

Change-Id: Ibdf58347a130f1c07cefca55162c841c71092201
pull/1346/head
Richard Fuchs 4 years ago
parent a615a9ca6a
commit c2b78aa9cd

@ -630,7 +630,7 @@ static void call_timer(void *ptr) {
atomic64_set(&ps->kernel_stats.errors, ke->stats.errors);
for (j = 0; j < ke->target.num_payload_types; j++) {
pt = ke->target.payload_types[j];
pt = ke->target.payload_types[j].pt_num;
rs = g_hash_table_lookup(ps->rtp_stats, GINT_TO_POINTER(pt));
if (!rs)
continue;

@ -1204,7 +1204,7 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out
values = g_list_sort(values, __rtp_stats_pt_sort);
for (l = values; l; l = l->next) {
if (reti->num_payload_types >= G_N_ELEMENTS(reti->payload_types)) {
ilog(LOG_WARNING, "Too many RTP payload types for kernel module");
ilog(LOG_WARNING | LOG_FLAG_LIMIT, "Too many RTP payload types for kernel module");
break;
}
rs = l->data;
@ -1224,9 +1224,9 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out
}
if (!can_kernelize)
continue;
reti->payload_types[reti->num_payload_types] = rs->payload_type;
reti->clock_rates[reti->num_payload_types] = clockrate;
reti->num_payload_types++;
struct rtpengine_payload_type *rpt = &reti->payload_types[reti->num_payload_types++];
rpt->pt_num = rs->payload_type;
rpt->clock_rate = clockrate;
}
g_list_free(values);
}

@ -1631,7 +1631,7 @@ static int proc_list_show(struct seq_file *f, void *v) {
(unsigned long long) atomic64_read(&g->stats.errors));
for (i = 0; i < g->target.num_payload_types; i++)
seq_printf(f, " RTP payload type %3u: %20llu bytes, %20llu packets\n",
g->target.payload_types[i],
g->target.payload_types[i].pt_num,
(unsigned long long) atomic64_read(&g->rtp_stats[i].bytes),
(unsigned long long) atomic64_read(&g->rtp_stats[i].packets));
if (g->target.ssrc)
@ -4165,26 +4165,26 @@ static inline int is_dtls(struct sk_buff *skb) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
static int rtp_payload_match(const void *a, const void *b) {
const unsigned char *A = a, *B = b;
const struct rtpengine_payload_type *A = a, *B = b;
if (*A < *B)
if (A->pt_num < B->pt_num)
return -1;
if (*A > *B)
if (A->pt_num > B->pt_num)
return 1;
return 0;
}
#endif
static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rtpengine_target_info *tg) {
unsigned char pt;
const unsigned char *match;
struct rtpengine_payload_type pt;
const struct rtpengine_payload_type *match;
pt = hdr->m_pt & 0x7f;
pt.pt_num = hdr->m_pt & 0x7f;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
match = bsearch(&pt, tg->payload_types, tg->num_payload_types, sizeof(pt), rtp_payload_match);
#else
for (match = tg->payload_types; match < tg->payload_types + tg->num_payload_types; match++) {
if (*match == pt)
if (match->pt_num == pt.pt_num)
goto found;
}
match = NULL;
@ -4307,7 +4307,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
// jitter
// RFC 3550 A.8
clockrate = g->target.clock_rates[pt_idx];
clockrate = g->target.payload_types[pt_idx].clock_rate;
transit = ((uint32_t) (div64_s64(arrival_time, 1000) * clockrate) / 1000) - ts;
d = 0;
if (s->transit)

@ -92,6 +92,11 @@ enum rtpengine_src_mismatch {
MSM_PROPAGATE, /* propagate to userspace daemon */
};
struct rtpengine_payload_type {
unsigned char pt_num;
uint32_t clock_rate;
};
struct rtpengine_target_info {
struct re_address local;
struct re_address expected_src; /* for incoming packets */
@ -102,8 +107,7 @@ struct rtpengine_target_info {
struct rtpengine_srtp decrypt;
uint32_t ssrc; // Expose the SSRC to userspace when we resync.
unsigned char payload_types[NUM_PAYLOAD_TYPES]; /* must be sorted */
uint32_t clock_rates[NUM_PAYLOAD_TYPES];
struct rtpengine_payload_type payload_types[NUM_PAYLOAD_TYPES]; /* must be sorted */
unsigned int num_payload_types;
unsigned int rtcp_mux:1,

Loading…
Cancel
Save