if (lost) opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples)); else output_samples =3D max_frame_size; But FEC is performed when lost_prev =3D=3D 1 (not when lost =3D=3D 1), this means that the following call to opus_decode (that decodes FEC) will have output_samples =3D=3D max_frame_size. I suggest to change the code above to: (only the first line is changed) if ((!use_inbandfec && lost) || (use_inbandfec && lost_prev)) opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples)); else output_samples =3D max_frame_size; This should work with and without FEC. This has been tested with libopus 1.0.2, but I think the bug is still there in git HEAD. Thanks, Gustaf Ullberg --_000_59F240892E54454ABE5A9F29A2DD230CBE7761DB3EX14MBXC304eur_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable <html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-microsoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dus-ascii"> <meta name=3D"Generator" content=3D"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;} @font-face {font-family:Consolas; panose-1:2 11 6 9 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;} span.EmailStyle17 {mso-style-type:personal-compose; font-family:"Calibri","sans-serif"; color:windowtext;} .MsoChpDefault {mso-style-type:export-only; font-family:"Calibri","sans-serif"; mso-fareast-language:EN-US;} @page WordSection1 {size:612.0pt 792.0pt; margin:70.85pt 70.85pt 70.85pt 70.85pt;} div.WordSection1 {page:WordSection1;} --></style><!--[if gte mso 9]><xml> <o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" /> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext=3D"edit"> <o:idmap v:ext=3D"edit" data=3D"1" /> </o:shapelayout></xml><![endif]--> </head> <body lang=3D"SV" link=3D"#0563C1" vlink=3D"#954F72"> <div class=3D"WordSection1"> <p class=3D"MsoNormal"><span lang=3D"EN-US">Hi,<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">When running opus_demo with FEC enabled, there is a bug related to the length of FEC frames. The FEC frames will be decoded with a length of max_frame_size and the resulting output file will be much longer than the input file.<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">From opus_demo.c:<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white">if</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> (lost)<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> opus_decoder_ctl(dec, </span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:#6F008A;background:white;mso-highlight:white">OPUS_GET_LAST_PACKET_DURATION</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white">(&output_samples));<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-size:7.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white">else</span><span style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"><o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> output_samples =3D max_frame_size;</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">But FEC is performed when lost_prev =3D=3D 1 (not when lost =3D=3D 1), this means that the following call to opus_decode (that decodes FEC) will have output_samples =3D=3D max_frame_size.<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">I suggest to change the code above to: (only the first line is changed)<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white">if</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> ((!use_inbandfec && lost) || (use_inbandfec && lost_prev))<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> opus_decoder_ctl(dec, </span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:#6F008A;background:white;mso-highlight:white">OPUS_GET_LAST_PACKET_DURATION</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white">(&output_samples));<o:p></o:p></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-size:7.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white">else</span><span style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"><o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white"> output_samples =3D max_frame_size;</span><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black"><o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US" style=3D"font-size:7.5pt;font-family:Consolas;color:black"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">This should work with and without FEC.<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">This has been tested with libopus 1.0.2, but I think the bug is still there in git HEAD.<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p> </o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">Thanks,<o:p></o:p></span></p> <p class=3D"MsoNormal"><span lang=3D"EN-US">Gustaf Ullberg<o:p></o:p></span></p> </div> </body> </html> --_000_59F240892E54454ABE5A9F29A2DD230CBE7761DB3EX14MBXC304eur_--