diff --git a/daemon/media_socket.c b/daemon/media_socket.c index e3d32d81a..34101da6e 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -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); } } diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 979a82b9c..fb6121c7e 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -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; diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index a892a268b..c6c96c34c 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -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;