Index: media/filters/ffmpeg_audio_decoder.cc |
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc |
index 86f8d580a54a15daa580606c161728bbebb3bb71..e3560ff1b8bcf9d359f2a7c0ab06147b8e6b4e3f 100644 |
--- a/media/filters/ffmpeg_audio_decoder.cc |
+++ b/media/filters/ffmpeg_audio_decoder.cc |
@@ -392,18 +392,6 @@ bool FFmpegAudioDecoder::ConfigureDecoder() { |
// Release existing decoder resources if necessary. |
ReleaseFFmpegResources(); |
- // Use OpusAudioDecoder for Opus for now, even if FFmpeg claims to support |
- // Opus decode. Failure to configure here should lead to fall-back to |
- // OpusAudioDecoder. |
- // TODO(wolenetz,dalecurtis): Remove OpusAudioDecoder and use |
- // FFmpegAudioDecoder instead for Opus. |
- if (config_.codec() == kCodecOpus) { |
- MEDIA_LOG(DEBUG, media_log_) |
- << "Opus decode via FFmpegAudioDecoder is disabled"; |
- state_ = kUninitialized; |
- return false; |
- } |
- |
// Initialize AVCodecContext structure. |
codec_context_.reset(avcodec_alloc_context3(NULL)); |
AudioDecoderConfigToAVCodecContext(config_, codec_context_.get()); |
@@ -412,6 +400,9 @@ bool FFmpegAudioDecoder::ConfigureDecoder() { |
codec_context_->get_buffer2 = GetAudioBuffer; |
codec_context_->refcounted_frames = 1; |
+ if (config_.codec() == kCodecOpus) |
+ codec_context_->request_sample_fmt = AV_SAMPLE_FMT_FLT; |
+ |
AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); |
if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { |
DLOG(ERROR) << "Could not initialize audio decoder: " |
@@ -441,9 +432,13 @@ bool FFmpegAudioDecoder::ConfigureDecoder() { |
} |
void FFmpegAudioDecoder::ResetTimestampState() { |
- discard_helper_.reset(new AudioDiscardHelper(config_.samples_per_second(), |
- config_.codec_delay())); |
- discard_helper_->Reset(config_.codec_delay()); |
+ // Opus codec delay is handled by ffmpeg. |
+ const int codec_delay = |
+ config_.codec() == kCodecOpus ? 0 : config_.codec_delay(); |
+ discard_helper_.reset( |
+ new AudioDiscardHelper(config_.samples_per_second(), codec_delay, |
+ config_.codec() == kCodecVorbis)); |
+ discard_helper_->Reset(codec_delay); |
} |
} // namespace media |