Skip to content

Commit

Permalink
[media] Fix OpusAudioDecoder::Reset() on PartialAudio tests
Browse files Browse the repository at this point in the history
This PR (#2501) recreating OpusAUdioDecoder in Reset(). Change to reset a previously initialized state using the #OPUS_RESET_STATE CTL as stated in the opus document.

b/327281974
  • Loading branch information
borongc committed Apr 11, 2024
1 parent 7798507 commit 45a715d
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions starboard/shared/opus/opus_audio_decoder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down Expand Up @@ -218,8 +221,9 @@ void OpusAudioDecoder::InitializeCodec() {
}

void OpusAudioDecoder::TeardownCodec() {
if (decoder_) {
if (is_valid()) {
opus_multistream_decoder_destroy(decoder_);
decoder_ = NULL;
}
}

Expand All @@ -241,9 +245,19 @@ scoped_refptr<OpusAudioDecoder::DecodedAudio> 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 OpusAudioDecoder 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();
Expand Down

0 comments on commit 45a715d

Please sign in to comment.