shithub: opus

Download patch

ref: 9a3f87391a537baaa29c8ba22f41e5488cfe9a1c
parent: 54ea26241c54988ab90359badd67d4a033e0f015
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Mon Dec 12 21:31:40 EST 2022

Adds -lossfile option to opus_demo

--- a/src/opus_demo.c
+++ b/src/opus_demo.c
@@ -62,7 +62,8 @@
     fprintf(stderr, "-inbandfec           : enable SILK inband FEC\n" );
     fprintf(stderr, "-forcemono           : force mono encoding, even for stereo input\n" );
     fprintf(stderr, "-dtx                 : enable SILK DTX\n" );
-    fprintf(stderr, "-loss <perc>         : simulate packet loss, in percent (0-100); default: 0\n" );
+    fprintf(stderr, "-loss <perc>         : optimize for loss percentage and simulate packet loss, in percent (0-100); default: 0\n" );
+    fprintf(stderr, "-lossfile <file>     : simulate packet loss, reading loss from file\n" );
 }
 
 static void int_to_char(opus_uint32 i, unsigned char ch[4])
@@ -264,6 +265,7 @@
     int delayed_decision=0;
     int ret = EXIT_FAILURE;
     int lost_count=0;
+    FILE *packet_loss_file=NULL;
 
     if (argc < 5 )
     {
@@ -422,6 +424,13 @@
         } else if( strcmp( argv[ args ], "-loss" ) == 0 ) {
             packet_loss_perc = atoi( argv[ args + 1 ] );
             args += 2;
+        } else if( strcmp( argv[ args ], "-lossfile" ) == 0 ) {
+            packet_loss_file = fopen( argv[ args + 1 ], "r" );
+            if (packet_loss_file == NULL) {
+                fprintf(stderr, "failed to open loss file %s\n", argv[ args + 1 ] );
+                exit(1);
+            }
+            args += 2;
         } else if( strcmp( argv[ args ], "-sweep" ) == 0 ) {
             check_encoder_option(decode_only, "-sweep");
             sweep_bps = atoi( argv[ args + 1 ] );
@@ -760,7 +769,14 @@
         } else {
             int fr;
             int run_decoder;
-            lost = len==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc);
+            if (packet_loss_file != NULL) {
+                if ( fscanf(packet_loss_file, "%d", &lost) != 1) {
+                    lost = 0;
+                }
+            } else {
+              lost = (packet_loss_perc>0) && (rand()%100 < packet_loss_perc);
+            }
+            if (len == 0) lost = 1;
             if (lost)
             {
                lost_count++;
--