Index: media/base/audio_buffer.cc |
diff --git a/media/base/audio_buffer.cc b/media/base/audio_buffer.cc |
index 4b972b90a1abda47c363b0cd46c7c8362ca60ee2..61d73a322a41d71ddf9453851ec2b148f0ebe662 100644 |
--- a/media/base/audio_buffer.cc |
+++ b/media/base/audio_buffer.cc |
@@ -275,4 +275,40 @@ void AudioBuffer::TrimEnd(int frames_to_trim) { |
adjusted_frame_count_ -= frames_to_trim; |
} |
+void AudioBuffer::TrimRange(int start, int end) { |
+ const int frames_to_trim = end - start; |
+ CHECK_GE(frames_to_trim, 0); |
+ CHECK_LE(frames_to_trim, adjusted_frame_count_); |
+ |
+ const int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format_); |
+ const int frames_to_copy = adjusted_frame_count_ - frames_to_trim; |
+ switch (sample_format_) { |
+ case kSampleFormatPlanarS16: |
+ case kSampleFormatPlanarF32: |
+ // Planar data must be shifted per channel. |
+ for (int ch = 0; ch < channel_count_; ++ch) { |
+ memcpy(channel_data_[ch] + start * bytes_per_channel, |
+ channel_data_[ch] + end * bytes_per_channel, |
+ bytes_per_channel * frames_to_copy); |
+ } |
+ break; |
+ case kSampleFormatU8: |
+ case kSampleFormatS16: |
+ case kSampleFormatS32: |
+ case kSampleFormatF32: { |
+ // Interleaved data can be shifted all at once. |
+ const int frame_size = channel_count_ * bytes_per_channel; |
+ memcpy(channel_data_[0] + start * frame_size, |
+ channel_data_[0] + end * frame_size, |
+ frame_size * frames_to_copy); |
+ break; |
+ } |
+ case kUnknownSampleFormat: |
+ NOTREACHED() << "Invalid sample format!"; |
+ } |
+ |
+ // Trim the leftover data off the end of the buffer and update duration. |
+ TrimEnd(frames_to_trim); |
+} |
+ |
} // namespace media |