shithub: opus

Download patch

ref: 98726c4ca61ddfb691e7fc2dff26d9e51e7fffaa
parent: cbd3a80552a918e71ced43e7e2af35092a170629
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Sat Oct 14 19:19:28 EDT 2023

Fix PLC in opus_demo when DRED is not present

--- a/src/opus_demo.c
+++ b/src/opus_demo.c
@@ -835,6 +835,7 @@
         } else {
             int fr;
             int run_decoder;
+            int dred_input=0;
             if (packet_loss_file != NULL) {
                 if ( fscanf(packet_loss_file, "%d", &lost) != 1) {
                     lost = 0;
@@ -854,11 +855,11 @@
                 run_decoder += lost_count;
             if (!lost && lost_count > 0) {
                 opus_int32 output_samples=0;
-                int dred_input;
                 opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
                 dred_input = lost_count*output_samples;
                 /* Only decode the amount we need to fill in the gap. */
-                opus_dred_parse(dred_dec, dred, data, len, IMIN(48000, IMAX(0, dred_input)), sampling_rate, 0);
+                ret = opus_dred_parse(dred_dec, dred, data, len, IMIN(48000, IMAX(0, dred_input)), sampling_rate, 0);
+                dred_input = ret > 0 ? ret : 0;
             }
             /* FIXME: Figure out how to trigger the decoder when the last packet of the file is lost. */
             for (fr=0;fr<run_decoder;fr++) {
@@ -868,7 +869,10 @@
                    output_samples = opus_decode(dec, data, len, out, output_samples, 1);
                 } else if (fr < lost_count) {
                    opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
-                   output_samples = opus_decoder_dred_decode(dec, dred, (lost_count-fr)*output_samples, out, output_samples);
+                   if (dred_input > 0)
+                      output_samples = opus_decoder_dred_decode(dec, dred, (lost_count-fr)*output_samples, out, output_samples);
+                   else
+                      output_samples = opus_decode(dec, NULL, 0, out, output_samples, 0);
                 } else {
                    output_samples = max_frame_size;
                    output_samples = opus_decode(dec, data, len, out, output_samples, 0);
--