MT#56861 support RTP seq no adjustments in kernel

DTMF requires the "end" event to be sent multiple times, requiring
sequence number adjustments after DTMF injection has finished. Add
support for this to the kernel module.

Change-Id: Ie5c8f18eda39553a6ebbdd35ef2341be01f2a59f
pull/1657/head
Richard Fuchs 2 years ago
parent 67590c2b59
commit 8fc168784f

@ -1545,9 +1545,13 @@ output:
__re_address_translate_ep(&redi->output.dst_addr, &sink->endpoint); __re_address_translate_ep(&redi->output.dst_addr, &sink->endpoint);
__re_address_translate_ep(&redi->output.src_addr, &sink->selected_sfd->socket.local); __re_address_translate_ep(&redi->output.src_addr, &sink->selected_sfd->socket.local);
if (redi->output.ssrc_subst) {
if (reti->track_ssrc) {
for (unsigned int u = 0; u < G_N_ELEMENTS(stream->ssrc_in); u++) { for (unsigned int u = 0; u < G_N_ELEMENTS(stream->ssrc_in); u++) {
if (stream->ssrc_in[u]) if (sink->ssrc_out[u])
redi->output.seq_offset[u] = sink->ssrc_out[u]->parent->seq_diff;
if (redi->output.ssrc_subst && stream->ssrc_in[u])
redi->output.ssrc_out[u] = htonl(stream->ssrc_in[u]->ssrc_map_out); redi->output.ssrc_out[u] = htonl(stream->ssrc_in[u]->ssrc_map_out);
} }
} }

@ -1708,17 +1708,14 @@ static int proc_list_show(struct seq_file *f, void *v) {
(unsigned long long) atomic64_read(&o->stats_out.packets), (unsigned long long) atomic64_read(&o->stats_out.packets),
(unsigned long long) atomic64_read(&o->stats_out.errors)); (unsigned long long) atomic64_read(&o->stats_out.errors));
if (o->output.ssrc_subst) { seq_printf(f, " SSRC out:");
seq_printf(f, " SSRC out:"); for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) {
for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) { seq_printf(f, "%s %lx [seq +%u]",
if (!o->output.ssrc_out[j]) (j == 0) ? "" : ",",
break; (unsigned long) ntohl(o->output.ssrc_out[j]),
seq_printf(f, "%s %lx", (unsigned int) o->output.seq_offset[j]);
(j == 0) ? "" : ",",
(unsigned long) ntohl(o->output.ssrc_out[j]));
}
seq_printf(f, "\n");
} }
seq_printf(f, "\n");
for (j = 0; j < g->target.num_payload_types; j++) { for (j = 0; j < g->target.num_payload_types; j++) {
if (o->output.pt_output[j].replace_pattern_len) if (o->output.pt_output[j].replace_pattern_len)
@ -4857,9 +4854,13 @@ no_intercept:
} }
if (rtp2.ok) { if (rtp2.ok) {
// SSRC substitution // SSRC substitution and seq manipulation
if (o->output.ssrc_subst && ssrc_idx != -1 && o->output.ssrc_out[ssrc_idx]) if (ssrc_idx != -1) {
rtp2.header->ssrc = o->output.ssrc_out[ssrc_idx]; rtp2.header->seq_num = htons(ntohs(rtp2.header->seq_num)
+ o->output.seq_offset[ssrc_idx]);
if (o->output.ssrc_subst && o->output.ssrc_out[ssrc_idx])
rtp2.header->ssrc = o->output.ssrc_out[ssrc_idx];
}
pkt_idx = packet_index(&o->encrypt, &o->output.encrypt, rtp2.header, ssrc_idx); pkt_idx = packet_index(&o->encrypt, &o->output.encrypt, rtp2.header, ssrc_idx);
pllen = rtp2.payload_len; pllen = rtp2.payload_len;

@ -134,6 +134,7 @@ struct rtpengine_output_info {
struct rtpengine_srtp encrypt; struct rtpengine_srtp encrypt;
uint32_t ssrc_out[RTPE_NUM_SSRC_TRACKING]; // Rewrite SSRC uint32_t ssrc_out[RTPE_NUM_SSRC_TRACKING]; // Rewrite SSRC
uint32_t seq_offset[RTPE_NUM_SSRC_TRACKING]; // Rewrite output seq
struct rtpengine_pt_output pt_output[RTPE_NUM_PAYLOAD_TYPES]; // same indexes as pt_input struct rtpengine_pt_output pt_output[RTPE_NUM_PAYLOAD_TYPES]; // same indexes as pt_input
unsigned char tos; unsigned char tos;

Loading…
Cancel
Save