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.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++) {
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);
}
}

@ -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.errors));
if (o->output.ssrc_subst) {
seq_printf(f, " SSRC out:");
for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) {
if (!o->output.ssrc_out[j])
break;
seq_printf(f, "%s %lx",
(j == 0) ? "" : ",",
(unsigned long) ntohl(o->output.ssrc_out[j]));
}
seq_printf(f, "\n");
seq_printf(f, " SSRC out:");
for (j = 0; j < ARRAY_SIZE(o->output.ssrc_out); j++) {
seq_printf(f, "%s %lx [seq +%u]",
(j == 0) ? "" : ",",
(unsigned long) ntohl(o->output.ssrc_out[j]),
(unsigned int) o->output.seq_offset[j]);
}
seq_printf(f, "\n");
for (j = 0; j < g->target.num_payload_types; j++) {
if (o->output.pt_output[j].replace_pattern_len)
@ -4857,9 +4854,13 @@ no_intercept:
}
if (rtp2.ok) {
// SSRC substitution
if (o->output.ssrc_subst && ssrc_idx != -1 && o->output.ssrc_out[ssrc_idx])
rtp2.header->ssrc = o->output.ssrc_out[ssrc_idx];
// SSRC substitution and seq manipulation
if (ssrc_idx != -1) {
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);
pllen = rtp2.payload_len;

@ -134,6 +134,7 @@ struct rtpengine_output_info {
struct rtpengine_srtp encrypt;
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
unsigned char tos;

Loading…
Cancel
Save