Chromium Code Reviews| Index: media/base/audio_buffer.cc |
| diff --git a/media/base/audio_buffer.cc b/media/base/audio_buffer.cc |
| index 564cff156bbb7f5defa7067439731a1efa44c500..a4119ba248b0ede28bd874a2cbde013c7a051e36 100644 |
| --- a/media/base/audio_buffer.cc |
| +++ b/media/base/audio_buffer.cc |
| @@ -37,7 +37,8 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
| timestamp_(timestamp), |
| duration_(end_of_stream_ |
| ? base::TimeDelta() |
| - : CalculateDuration(adjusted_frame_count_, sample_rate_)) { |
| + : CalculateDuration(adjusted_frame_count_, sample_rate_)), |
| + data_size_(0) { |
| CHECK_GE(channel_count_, 0); |
| CHECK_LE(channel_count_, limits::kMaxChannels); |
| CHECK_GE(frame_count, 0); |
| @@ -46,31 +47,31 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
| int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format); |
| DCHECK_LE(bytes_per_channel, kChannelAlignment); |
| - int data_size = frame_count * bytes_per_channel; |
| // Empty buffer? |
| if (!create_buffer) |
| return; |
| - if (sample_format == kSampleFormatPlanarF32 || |
| - sample_format == kSampleFormatPlanarS16 || |
| - sample_format == kSampleFormatPlanarS32) { |
| + int data_size_per_channel = frame_count * bytes_per_channel; |
| + if (IsPlanar(sample_format)) { |
| // Planar data, so need to allocate buffer for each channel. |
| // Determine per channel data size, taking into account alignment. |
| int block_size_per_channel = |
| - (data_size + kChannelAlignment - 1) & ~(kChannelAlignment - 1); |
| - DCHECK_GE(block_size_per_channel, data_size); |
| + (data_size_per_channel + kChannelAlignment - 1) & |
| + ~(kChannelAlignment - 1); |
| + DCHECK_GE(block_size_per_channel, data_size_per_channel); |
| // Allocate a contiguous buffer for all the channel data. |
| - data_.reset(static_cast<uint8*>(base::AlignedAlloc( |
| - channel_count_ * block_size_per_channel, kChannelAlignment))); |
| + data_size_ = channel_count_ * block_size_per_channel; |
| + data_.reset( |
| + static_cast<uint8*>(base::AlignedAlloc(data_size_, kChannelAlignment))); |
| channel_data_.reserve(channel_count_); |
| // Copy each channel's data into the appropriate spot. |
| for (int i = 0; i < channel_count_; ++i) { |
| channel_data_.push_back(data_.get() + i * block_size_per_channel); |
| if (data) |
| - memcpy(channel_data_[i], data[i], data_size); |
| + memcpy(channel_data_[i], data[i], data_size_per_channel); |
| } |
| return; |
| } |
| @@ -82,13 +83,13 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
| sample_format_ == kSampleFormatF32) << sample_format_; |
|
xhwang
2015/11/24 05:59:13
!IsPlanar()?
Actually we could also have kUnknown
jrummell
2015/11/24 20:51:05
Done.
|
| // Allocate our own buffer and copy the supplied data into it. Buffer must |
| // contain the data for all channels. |
| - data_size *= channel_count_; |
| + data_size_ = data_size_per_channel * channel_count_; |
| data_.reset( |
| - static_cast<uint8*>(base::AlignedAlloc(data_size, kChannelAlignment))); |
| + static_cast<uint8*>(base::AlignedAlloc(data_size_, kChannelAlignment))); |
| channel_data_.reserve(1); |
| channel_data_.push_back(data_.get()); |
| if (data) |
| - memcpy(data_.get(), data[0], data_size); |
| + memcpy(data_.get(), data[0], data_size_); |
| } |
| AudioBuffer::~AudioBuffer() {} |