--- res/res_srtp.c (Asterisk 13.38.3) +++ res/res_srtp.c 2021-03-10 10:55:00.767873340 +0100 @@ -478,6 +478,19 @@ static int ast_srtp_protect(struct ast_s return -1; } + if (!rtcp) { + uint32_t roc; + struct ast_rtp_engine *engine = ast_rtp_instance_get_engine(srtp->rtp); + unsigned int local_ssrc = engine->ssrc(srtp->rtp); + srtp_err_status_t error = srtp_get_stream_roc(srtp->session, local_ssrc, &roc); + if (!error && roc) { + unsigned short seqno = engine->seqno(srtp->rtp); + if (100 < seqno && seqno < 300) { // 2 sec wait, 4 sec break + localbuf[*len - 3] = 0x00; + } + } + } + *buf = localbuf; return *len; } --- res/res_rtp_asterisk.c (Asterisk 13.38.3) +++ res/res_rtp_asterisk.c 2021-03-10 10:55:00.767873340 +0100 @@ -529,2 +529,4 @@ static void ast_rtp_stun_request(struct static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char* desc); +static unsigned short ast_rtp_seqno(struct ast_rtp_instance *instance); +static unsigned int ast_rtp_ssrc(struct ast_rtp_instance *instance); static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level); @@ -2095,2 +2097,4 @@ static struct ast_rtp_engine asterisk_rt .qos = ast_rtp_qos_set, + .ssrc = ast_rtp_ssrc, + .seqno = ast_rtp_seqno, .sendcng = ast_rtp_sendcng, @@ -3345,1 +3349,1 @@ static int ast_rtp_new(struct ast_rtp_in - rtp->seqno = ast_random() & 0x7fff; + rtp->seqno = 0xffff - 100; @@ -6487,6 +6491,18 @@ static int ast_rtp_qos_set(struct a return ast_set_qos(rtp->s, tos, cos, desc); } +static unsigned short ast_rtp_seqno(struct ast_rtp_instance *instance) +{ + struct ast_rtp *rtp = ast_rtp_instance_get_data(instance); + return rtp->seqno; +} + +static unsigned int ast_rtp_ssrc(struct ast_rtp_instance *instance) +{ + struct ast_rtp *rtp = ast_rtp_instance_get_data(instance); + return rtp->ssrc; +} + /*! * \brief generate comfort noice (CNG) * --- include/asterisk/rtp_engine.h (Asterisk 13.38.3) +++ include/asterisk/rtp_engine.h 2021-03-10 10:55:00.767873340 +0100 @@ -591,2 +591,4 @@ struct ast_rtp_engine { void (*available_formats)(struct ast_rtp_instance *instance, struct ast_format_cap *to_endpoint, struct ast_format_cap *to_asterisk, struct ast_format_cap *result); + unsigned short (*seqno)(struct ast_rtp_instance *instance); + unsigned int (*ssrc)(struct ast_rtp_instance *instance); /*! Callback to send CNG */