diff --git a/starboard/shared/opus/opus_audio_decoder.cc b/starboard/shared/opus/opus_audio_decoder.cc index 85ba47e6eb1f..7bf5555cb468 100644 --- a/starboard/shared/opus/opus_audio_decoder.cc +++ b/starboard/shared/opus/opus_audio_decoder.cc @@ -51,6 +51,9 @@ OpusAudioDecoder::OpusAudioDecoder(const AudioStreamInfo& audio_stream_info) } OpusAudioDecoder::~OpusAudioDecoder() { + if (is_valid()) { + opus_multistream_decoder_ctl(decoder_, OPUS_RESET_STATE); + } TeardownCodec(); } @@ -218,8 +221,9 @@ void OpusAudioDecoder::InitializeCodec() { } void OpusAudioDecoder::TeardownCodec() { - if (decoder_) { + if (is_valid()) { opus_multistream_decoder_destroy(decoder_); + decoder_ = NULL; } } @@ -241,9 +245,19 @@ scoped_refptr OpusAudioDecoder::Read( void OpusAudioDecoder::Reset() { SB_DCHECK(BelongsToCurrentThread()); - TeardownCodec(); - InitializeCodec(); + if (is_valid()) { + int error = opus_multistream_decoder_ctl(decoder_, OPUS_RESET_STATE); + if (error != OPUS_OK) { + SB_LOG(ERROR) << "Failed to reset decoder with error: " + << opus_strerror(error); + + // If fail to reset opus decoder, re-create it. + TeardownCodec(); + InitializeCodec(); + } + } + frames_per_au_ = kMaxOpusFramesPerAU; stream_ended_ = false; while (!decoded_audios_.empty()) { decoded_audios_.pop();