aboutsummaryrefslogtreecommitdiff
path: root/src/opus_multistream_encoder.c
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2013-10-28 16:11:53 -0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2013-10-28 16:12:24 -0400
commit811db62ead34b114244892d1d594bb3564211e6e (patch)
tree69757fdf7784d970ab96ce47d0fc050178df5033 /src/opus_multistream_encoder.c
parent60429d366fba6f3176d91af7d1d0a67c15b897d7 (diff)
downloadlibopus-811db62ead34b114244892d1d594bb3564211e6e.tar.gz
Implements OPUS_RESET_STATE for multi-stream encoder
Diffstat (limited to 'src/opus_multistream_encoder.c')
-rw-r--r--src/opus_multistream_encoder.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/opus_multistream_encoder.c b/src/opus_multistream_encoder.c
index 82594eb6..f711e267 100644
--- a/src/opus_multistream_encoder.c
+++ b/src/opus_multistream_encoder.c
@@ -1131,6 +1131,29 @@ int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
*value = st->variable_duration;
}
break;
+ case OPUS_RESET_STATE:
+ {
+ int s;
+ st->subframe_mem[0] = st->subframe_mem[1] = st->subframe_mem[2] = 0;
+ if (st->surround)
+ {
+ OPUS_CLEAR(ms_get_preemph_mem(st), st->layout.nb_channels);
+ OPUS_CLEAR(ms_get_window_mem(st), st->layout.nb_channels*120);
+ }
+ for (s=0;s<st->layout.nb_streams;s++)
+ {
+ OpusEncoder *enc;
+ enc = (OpusEncoder*)ptr;
+ if (s < st->layout.nb_coupled_streams)
+ ptr += align(coupled_size);
+ else
+ ptr += align(mono_size);
+ ret = opus_encoder_ctl(enc, OPUS_RESET_STATE);
+ if (ret != OPUS_OK)
+ break;
+ }
+ }
+ break;
default:
ret = OPUS_UNIMPLEMENTED;
break;