shithub: opus

Download patch

ref: af50ce9200235158e54399c7f9cb8c2c5dab8008
parent: c63cc1223207d71d22283b964ddbd812010c0def
author: Jean-Marc Valin <[email protected]>
date: Sun Sep 11 16:13:47 EDT 2011

Implements OPUS_MULTISTREAM_{EN|DE}CODER_GET_STATE

Untested

--- a/src/opus_multistream.c
+++ b/src/opus_multistream.c
@@ -443,6 +443,25 @@
       }
    }
    break;
+   case OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST:
+   {
+      int s;
+      opus_int32 stream_id;
+      OpusEncoder **value;
+      stream_id = va_arg(ap, opus_int32);
+      if (stream_id<0 || stream_id >= st->layout.nb_streams)
+         ret = OPUS_BAD_ARG;
+      value = va_arg(ap, OpusEncoder**);
+      for (s=0;s<stream_id;s++)
+      {
+         if (s < st->layout.nb_coupled_streams)
+            ptr += align(coupled_size);
+         else
+            ptr += align(mono_size);
+      }
+      *value = (OpusEncoder*)ptr;
+   }
+      break;
    default:
       ret = OPUS_UNIMPLEMENTED;
       break;
@@ -728,7 +747,6 @@
        case OPUS_GET_FINAL_RANGE_REQUEST:
        {
           int s;
-          /* This only works for int32* params, but that's all we have right now */
           opus_uint32 *value = va_arg(ap, opus_uint32*);
           for (s=0;s<st->layout.nb_streams;s++)
           {
@@ -748,7 +766,6 @@
        case OPUS_RESET_STATE:
        {
           int s;
-          /* This only works for int32* params, but that's all we have right now */
           for (s=0;s<st->layout.nb_streams;s++)
           {
              OpusDecoder *dec;
@@ -764,6 +781,25 @@
           }
        }
        break;
+       case OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST:
+       {
+          int s;
+          opus_int32 stream_id;
+          OpusDecoder **value;
+          stream_id = va_arg(ap, opus_int32);
+          if (stream_id<0 || stream_id >= st->layout.nb_streams)
+             ret = OPUS_BAD_ARG;
+          value = va_arg(ap, OpusDecoder**);
+          for (s=0;s<stream_id;s++)
+          {
+             if (s < st->layout.nb_coupled_streams)
+                ptr += align(coupled_size);
+             else
+                ptr += align(mono_size);
+          }
+          *value = (OpusDecoder*)ptr;
+       }
+          break;
        default:
           ret = OPUS_UNIMPLEMENTED;
        break;
--- a/src/opus_multistream.h
+++ b/src/opus_multistream.h
@@ -38,6 +38,15 @@
 typedef struct OpusMSEncoder OpusMSEncoder;
 typedef struct OpusMSDecoder OpusMSDecoder;
 
+#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))
+#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))
+
+#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120
+#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122
+
+#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y)
+#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y)
+
 OPUS_EXPORT OpusMSEncoder *opus_multistream_encoder_create(
       opus_int32 Fs,                     /**< Sampling rate of input signal (Hz) */
       int channels,               /**< Number of channels (1/2) in input signal */