Chromium Code Reviews| Index: media/filters/audio_file_reader.cc |
| diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc |
| index 58c4501b43f62b74d4a8021e64ab72708e4565a7..c332eceb398f38eae3e050fac1ff70cab4049cef 100644 |
| --- a/media/filters/audio_file_reader.cc |
| +++ b/media/filters/audio_file_reader.cc |
| @@ -15,21 +15,16 @@ namespace media { |
| AudioFileReader::AudioFileReader(FFmpegURLProtocol* protocol) |
| : codec_context_(NULL), |
| stream_index_(0), |
| - protocol_(protocol) { |
| + protocol_(protocol), |
| + channels_(0), |
| + sample_rate_(0), |
| + av_sample_format_(0) { |
| } |
| AudioFileReader::~AudioFileReader() { |
| Close(); |
| } |
| -int AudioFileReader::channels() const { |
| - return codec_context_->channels; |
| -} |
| - |
| -int AudioFileReader::sample_rate() const { |
| - return codec_context_->sample_rate; |
| -} |
| - |
| base::TimeDelta AudioFileReader::duration() const { |
| const AVRational av_time_base = {1, AV_TIME_BASE}; |
| @@ -110,6 +105,11 @@ bool AudioFileReader::Open() { |
| return false; |
| } |
| + // Store initial values to guard against mid-frame configuration changes. |
| + channels_ = codec_context_->channels; |
| + sample_rate_ = codec_context_->sample_rate; |
| + av_sample_format_ = codec_context_->sample_fmt; |
| + |
| return true; |
| } |
| @@ -179,6 +179,22 @@ int AudioFileReader::Read(AudioBus* audio_bus) { |
| break; |
| } |
| + if (av_frame->sample_rate != sample_rate_ || |
| + av_frame->channels != channels_ || |
| + av_frame->format != av_sample_format_) { |
| + DLOG(ERROR) << "Unsupported mid-frame configuration change!" |
|
scherkus (not reviewing)
2013/02/12 02:16:56
consistent terminology nit: s/mid-frame/mid-stream
DaleCurtis
2013/02/12 02:41:24
Done.
|
| + << " Sample Rate: " << av_frame->sample_rate << " vs " |
| + << sample_rate_ |
| + << ", Channels: " << av_frame->channels << " vs " |
| + << channels_ |
| + << ", Sample Format: " << av_frame->format << " vs " |
| + << av_sample_format_; |
| + |
| + // This is an unrecoverable error, so bail out. |
| + continue_decoding = false; |
| + break; |
| + } |
| + |
| // Truncate, if necessary, if the destination isn't big enough. |
| if (current_frame + frames_read > audio_bus->frames()) |
| frames_read = audio_bus->frames() - current_frame; |