<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">It would be much appreciated to have some advice on following
<span style="color:black">use case</span>.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">We establish a call on a Freeswitch <span style="color:black">
by</span> creat<span style="color:black">ing</span> two call legs separately and then bridged them together:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Client &lt;--Call Leg A--&gt; Freeswtich &lt;--Call Leg B--&gt; Gstreamer<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">During a call there are packet losses on Call Leg A between Client and Freeswitch and we have appropriate notifications in a Freeswitch debug logs. As well as it's clear from the pcap logs taken from a Freeswitch that
 RTP packets are missing with certain sequence number.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Since Client and Gstreamer using same Opus codec Freeswitch just sends packets straightly with same payload and timestamp to Gstreamer. The only thing is changed in RTP packets are SSRC and Sequence Numbers.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In a case when RTP packet is lost sequence numbers are not preserved between Call Leg A and Call Leg B. So Call Leg B just got packets which are make it up to Freeswitch. That means that Call Leg B gets for all received
 on a Freeswitch RTP packets consecutive sequence numbers (unfortunately lost packets are not count) and so Gstreamer is not aware of the packet loss which took precedence on a previous Call Leg A.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Due to this since all RTP packets are consecutive on Call Leg B Gstreamer have no notion of a lost packet. So it is not starting a procedure of Forward Error Correction (FEC) on a lost packet and eventually we got audio
 drops which are not handled. As well as Freeswitch is not decoding payload so it doesn't do FEC on Opus side.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">That's why we are wondering what could be a solution for that? From first glance into RTP RFC it seems ok to have such behavior, i.e. not take into account previous sequence numbers for a packet loss. But maybe it's just
 not considering such cases. Is there other RFCs which cover such situations?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">We thinking maybe it make sense to have a patch to FS so that we would receive if not the same but at least have the same gaps in the sequence numbers as on Call Leg A?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Or maybe some other solution to that problem which is available on a Freeswitch?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If you need us to share any FS logs will be happy to provide.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I&#8217;ll attach pcap logs for the time being.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">188.130.168.205 - Client<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">10.240.0.12 &#8211; Freeswitch<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">10.240.0.7 &#8211; Gstreamer<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Please take a look at following filter. Where 24632 is missing packet on Call leg A:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">rtp.seq== 24631 || rtp.seq== 24632 || rtp.seq== 24633 || rtp.seq == 56583 || rtp.seq == 56582<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:RU">___________<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:RU">Best Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:RU">Dmitriy Ageev<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
</div>
</body>
</html>