| Index: media/filters/ffmpeg_audio_decoder.cc | 
| diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc | 
| index e6673308a16060e04165f30b919fc5041bd4ef50..c8f8f50a1a7bf574664645c44b2f29782d36febd 100644 | 
| --- a/media/filters/ffmpeg_audio_decoder.cc | 
| +++ b/media/filters/ffmpeg_audio_decoder.cc | 
| @@ -128,10 +128,6 @@ FFmpegAudioDecoder::FFmpegAudioDecoder( | 
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) | 
| : task_runner_(task_runner), | 
| state_(kUninitialized), | 
| -      bytes_per_channel_(0), | 
| -      channel_layout_(CHANNEL_LAYOUT_NONE), | 
| -      channels_(0), | 
| -      samples_per_second_(0), | 
| av_sample_format_(0), | 
| last_input_timestamp_(kNoTimestamp()), | 
| output_frames_to_drop_(0) {} | 
| @@ -197,21 +193,6 @@ scoped_refptr<AudioBuffer> FFmpegAudioDecoder::GetDecodeOutput() { | 
| return out; | 
| } | 
|  | 
| -int FFmpegAudioDecoder::bits_per_channel() { | 
| -  DCHECK(task_runner_->BelongsToCurrentThread()); | 
| -  return bytes_per_channel_ * 8; | 
| -} | 
| - | 
| -ChannelLayout FFmpegAudioDecoder::channel_layout() { | 
| -  DCHECK(task_runner_->BelongsToCurrentThread()); | 
| -  return channel_layout_; | 
| -} | 
| - | 
| -int FFmpegAudioDecoder::samples_per_second() { | 
| -  DCHECK(task_runner_->BelongsToCurrentThread()); | 
| -  return samples_per_second_; | 
| -} | 
| - | 
| void FFmpegAudioDecoder::Reset(const base::Closure& closure) { | 
| DCHECK(task_runner_->BelongsToCurrentThread()); | 
|  | 
| @@ -286,8 +267,8 @@ void FFmpegAudioDecoder::DecodeBuffer( | 
| buffer->timestamp() < base::TimeDelta()) { | 
| // Dropping frames for negative timestamps as outlined in section A.2 | 
| // in the Vorbis spec. http://xiph.org/vorbis/doc/Vorbis_I_spec.html | 
| -      output_frames_to_drop_ = floor( | 
| -          0.5 + -buffer->timestamp().InSecondsF() * samples_per_second_); | 
| +      output_frames_to_drop_ = floor(0.5 + -buffer->timestamp().InSecondsF() * | 
| +                                               config_.samples_per_second()); | 
| } else { | 
| if (last_input_timestamp_ != kNoTimestamp() && | 
| buffer->timestamp() < last_input_timestamp_) { | 
| @@ -392,17 +373,14 @@ bool FFmpegAudioDecoder::FFmpegDecode( | 
| int original_frames = 0; | 
| int channels = DetermineChannels(av_frame_.get()); | 
| if (frame_decoded) { | 
| - | 
| -      // TODO(rileya) Remove this check once we properly support midstream audio | 
| -      // config changes. | 
| if (av_frame_->sample_rate != config_.samples_per_second() || | 
| -          channels != channels_ || | 
| +          channels != ChannelLayoutToChannelCount(config_.channel_layout()) || | 
| av_frame_->format != av_sample_format_) { | 
| DLOG(ERROR) << "Unsupported midstream configuration change!" | 
| << " Sample Rate: " << av_frame_->sample_rate << " vs " | 
| -                    << samples_per_second_ | 
| +                    << config_.samples_per_second() | 
| << ", Channels: " << channels << " vs " | 
| -                    << channels_ | 
| +                    << ChannelLayoutToChannelCount(config_.channel_layout()) | 
| << ", Sample Format: " << av_frame_->format << " vs " | 
| << av_sample_format_; | 
|  | 
| @@ -417,7 +395,8 @@ bool FFmpegAudioDecoder::FFmpegDecode( | 
| output = reinterpret_cast<AudioBuffer*>( | 
| av_buffer_get_opaque(av_frame_->buf[0])); | 
|  | 
| -      DCHECK_EQ(channels_, output->channel_count()); | 
| +      DCHECK_EQ(ChannelLayoutToChannelCount(config_.channel_layout()), | 
| +                output->channel_count()); | 
| original_frames = av_frame_->nb_samples; | 
| int unread_frames = output->frame_count() - original_frames; | 
| DCHECK_GE(unread_frames, 0); | 
| @@ -480,21 +459,6 @@ bool FFmpegAudioDecoder::ConfigureDecoder() { | 
| return false; | 
| } | 
|  | 
| -  // TODO(rileya) Remove this check once we properly support midstream audio | 
| -  // config changes. | 
| -  if (codec_context_.get() && | 
| -      (channel_layout_ != config_.channel_layout() || | 
| -       samples_per_second_ != config_.samples_per_second())) { | 
| -    DVLOG(1) << "Unsupported config change :"; | 
| -    DVLOG(1) << "\tbytes_per_channel : " << bytes_per_channel_ | 
| -             << " -> " << config_.bytes_per_channel(); | 
| -    DVLOG(1) << "\tchannel_layout : " << channel_layout_ | 
| -             << " -> " << config_.channel_layout(); | 
| -    DVLOG(1) << "\tsample_rate : " << samples_per_second_ | 
| -             << " -> " << config_.samples_per_second(); | 
| -    return false; | 
| -  } | 
| - | 
| // Release existing decoder resources if necessary. | 
| ReleaseFFmpegResources(); | 
|  | 
| @@ -517,27 +481,21 @@ bool FFmpegAudioDecoder::ConfigureDecoder() { | 
|  | 
| // Success! | 
| av_frame_.reset(av_frame_alloc()); | 
| -  channel_layout_ = config_.channel_layout(); | 
| -  samples_per_second_ = config_.samples_per_second(); | 
| output_timestamp_helper_.reset( | 
| new AudioTimestampHelper(config_.samples_per_second())); | 
|  | 
| -  // Store initial values to guard against midstream configuration changes. | 
| -  channels_ = codec_context_->channels; | 
| -  if (channels_ != ChannelLayoutToChannelCount(channel_layout_)) { | 
| +  av_sample_format_ = codec_context_->sample_fmt; | 
| + | 
| +  if (codec_context_->channels != | 
| +      ChannelLayoutToChannelCount(config_.channel_layout())) { | 
| DLOG(ERROR) << "Audio configuration specified " | 
| -                << ChannelLayoutToChannelCount(channel_layout_) | 
| +                << ChannelLayoutToChannelCount(config_.channel_layout()) | 
| << " channels, but FFmpeg thinks the file contains " | 
| -                << channels_ << " channels"; | 
| +                << codec_context_->channels << " channels"; | 
| ReleaseFFmpegResources(); | 
| state_ = kUninitialized; | 
| return false; | 
| } | 
| -  av_sample_format_ = codec_context_->sample_fmt; | 
| -  sample_format_ = AVSampleFormatToSampleFormat( | 
| -      static_cast<AVSampleFormat>(av_sample_format_)); | 
| -  bytes_per_channel_ = SampleFormatToBytesPerChannel(sample_format_); | 
| - | 
| return true; | 
| } | 
|  | 
|  |