shithub: opus

Download patch

ref: dbc83d316c2c221f9790e6162c9942082db8362a
parent: 970d0529eeaa97f7c06fb37d6bd1b5658ad1e68f
author: Jean-Marc Valin <[email protected]>
date: Fri Oct 11 16:41:30 EDT 2013

Cleaning up multistream packet validation

--- a/src/opus_multistream_decoder.c
+++ b/src/opus_multistream_decoder.c
@@ -153,7 +153,7 @@
 );
 
 static int opus_multistream_packet_validate(const unsigned char *data,
-      opus_int32 len, int nb_streams)
+      opus_int32 len, int nb_streams, opus_int32 Fs)
 {
    int s;
    int i;
@@ -173,7 +173,7 @@
          return count;
       for (i=0;i<count;i++)
          offset += size[i];
-      tmp_samples = opus_packet_get_nb_samples(data, offset, 48000);
+      tmp_samples = opus_packet_get_nb_samples(data, offset, Fs);
       if (s!=0 && samples != tmp_samples)
          return OPUS_INVALID_PACKET;
       samples = tmp_samples;
@@ -180,7 +180,7 @@
       data += offset;
       len -= offset;
    }
-   return OPUS_OK;
+   return samples;
 }
 
 static int opus_multistream_decode_native(
@@ -225,11 +225,15 @@
    }
    if (!do_plc)
    {
-      int ret = opus_multistream_packet_validate(data, len, st->layout.nb_coupled_streams);
+      int ret = opus_multistream_packet_validate(data, len, st->layout.nb_coupled_streams, Fs);
       if (ret < 0)
       {
          RESTORE_STACK;
          return ret;
+      } else if (ret > frame_size)
+      {
+         RESTORE_STACK;
+         return OPUS_BUFFER_TOO_SMALL;
       }
    }
    for (s=0;s<st->layout.nb_streams;s++)
@@ -243,22 +247,12 @@
       if (!do_plc && len<=0)
       {
          RESTORE_STACK;
-         return OPUS_INVALID_PACKET;
+         return OPUS_INTERNAL_ERROR;
       }
       packet_offset = 0;
       ret = opus_decode_native(dec, data, len, buf, frame_size, decode_fec, s!=st->layout.nb_streams-1, &packet_offset, soft_clip);
       data += packet_offset;
       len -= packet_offset;
-      if (ret > frame_size)
-      {
-         RESTORE_STACK;
-         return OPUS_BUFFER_TOO_SMALL;
-      }
-      if (s>0 && ret != frame_size)
-      {
-         RESTORE_STACK;
-         return OPUS_INVALID_PACKET;
-      }
       if (ret <= 0)
       {
          RESTORE_STACK;