diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-10-28 16:11:53 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-10-28 16:12:24 -0400 |
commit | 811db62ead34b114244892d1d594bb3564211e6e (patch) | |
tree | 69757fdf7784d970ab96ce47d0fc050178df5033 /src/opus_multistream_encoder.c | |
parent | 60429d366fba6f3176d91af7d1d0a67c15b897d7 (diff) | |
download | libopus-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.c | 23 |
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; |