Index: media/base/audio_buffer.cc |
diff --git a/media/base/audio_buffer.cc b/media/base/audio_buffer.cc |
index d921a8a39d7d5752174bb3f08edc4f770ce71a6a..d563539ba07aac679662baba47b49db456208f8f 100644 |
--- a/media/base/audio_buffer.cc |
+++ b/media/base/audio_buffer.cc |
@@ -49,6 +49,7 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
int frame_count, |
bool create_buffer, |
const uint8_t* const* data, |
+ const size_t data_size, |
const base::TimeDelta timestamp, |
scoped_refptr<AudioBufferMemoryPool> pool) |
: sample_format_(sample_format), |
@@ -61,7 +62,7 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
duration_(end_of_stream_ |
? base::TimeDelta() |
: CalculateDuration(adjusted_frame_count_, sample_rate_)), |
- data_size_(0), |
+ data_size_(data_size), |
pool_(std::move(pool)) { |
CHECK_GE(channel_count_, 0); |
CHECK_LE(channel_count_, limits::kMaxChannels); |
@@ -78,6 +79,7 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
int data_size_per_channel = frame_count * bytes_per_channel; |
if (IsPlanar(sample_format)) { |
+ DCHECK(!IsBitstreamFormat()) << 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 = |
@@ -108,7 +110,10 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format, |
DCHECK(IsInterleaved(sample_format)) << sample_format_; |
// Allocate our own buffer and copy the supplied data into it. Buffer must |
// contain the data for all channels. |
- data_size_ = data_size_per_channel * channel_count_; |
+ if (!IsBitstreamFormat()) |
+ data_size_ = data_size_per_channel * channel_count_; |
+ else |
+ DCHECK(data_size_ > 0); |
if (pool_) { |
data_ = pool_->CreateBuffer(data_size_); |
@@ -143,7 +148,26 @@ scoped_refptr<AudioBuffer> AudioBuffer::CopyFrom( |
CHECK(data[0]); |
return make_scoped_refptr( |
new AudioBuffer(sample_format, channel_layout, channel_count, sample_rate, |
- frame_count, true, data, timestamp, std::move(pool))); |
+ frame_count, true, data, 0, timestamp, std::move(pool))); |
+} |
+ |
+// static |
+scoped_refptr<AudioBuffer> AudioBuffer::CopyBitstreamFrom( |
+ SampleFormat sample_format, |
+ ChannelLayout channel_layout, |
+ int channel_count, |
+ int sample_rate, |
+ int frame_count, |
+ const uint8_t* const* data, |
+ const size_t data_size, |
+ const base::TimeDelta timestamp, |
+ scoped_refptr<AudioBufferMemoryPool> pool) { |
+ // If you hit this CHECK you likely have a bug in a demuxer. Go fix it. |
+ CHECK_GT(frame_count, 0); // Otherwise looks like an EOF buffer. |
+ CHECK(data[0]); |
+ return make_scoped_refptr(new AudioBuffer( |
+ sample_format, channel_layout, channel_count, sample_rate, frame_count, |
+ true, data, data_size, timestamp, std::move(pool))); |
} |
// static |
@@ -157,7 +181,22 @@ scoped_refptr<AudioBuffer> AudioBuffer::CreateBuffer( |
CHECK_GT(frame_count, 0); // Otherwise looks like an EOF buffer. |
return make_scoped_refptr(new AudioBuffer( |
sample_format, channel_layout, channel_count, sample_rate, frame_count, |
- true, nullptr, kNoTimestamp, std::move(pool))); |
+ true, nullptr, 0, kNoTimestamp, std::move(pool))); |
+} |
+ |
+// static |
+scoped_refptr<AudioBuffer> AudioBuffer::CreateBitstreamBuffer( |
+ SampleFormat sample_format, |
+ ChannelLayout channel_layout, |
+ int channel_count, |
+ int sample_rate, |
+ int frame_count, |
+ size_t data_size, |
+ scoped_refptr<AudioBufferMemoryPool> pool) { |
+ CHECK_GT(frame_count, 0); // Otherwise looks like an EOF buffer. |
+ return make_scoped_refptr(new AudioBuffer( |
+ sample_format, channel_layout, channel_count, sample_rate, frame_count, |
+ true, nullptr, data_size, kNoTimestamp, std::move(pool))); |
} |
// static |
@@ -171,14 +210,14 @@ scoped_refptr<AudioBuffer> AudioBuffer::CreateEmptyBuffer( |
// Since data == nullptr, format doesn't matter. |
return make_scoped_refptr(new AudioBuffer( |
kSampleFormatF32, channel_layout, channel_count, sample_rate, frame_count, |
- false, nullptr, timestamp, nullptr)); |
+ false, nullptr, 0, timestamp, nullptr)); |
} |
// static |
scoped_refptr<AudioBuffer> AudioBuffer::CreateEOSBuffer() { |
return make_scoped_refptr(new AudioBuffer(kUnknownSampleFormat, |
CHANNEL_LAYOUT_NONE, 0, 0, 0, false, |
- nullptr, kNoTimestamp, nullptr)); |
+ nullptr, 0, kNoTimestamp, nullptr)); |
} |
// Convert int16_t values in the range [INT16_MIN, INT16_MAX] to [-1.0, 1.0]. |
@@ -205,6 +244,12 @@ void AudioBuffer::ReadFrames(int frames_to_copy, |
DCHECK(!end_of_stream()); |
DCHECK_EQ(dest->channels(), channel_count_); |
DCHECK_LE(source_frame_offset + frames_to_copy, adjusted_frame_count_); |
+ |
+ if (IsBitstreamFormat()) { |
+ // TODO(tsunghung): Implement it along with AudioBus changes. |
+ NOTREACHED() << "Invalid sample format!"; |
+ } |
+ |
DCHECK_LE(dest_frame_offset + frames_to_copy, dest->frames()); |
if (!data_) { |
@@ -270,6 +315,11 @@ void AudioBuffer::TrimStart(int frames_to_trim) { |
CHECK_GE(frames_to_trim, 0); |
CHECK_LE(frames_to_trim, adjusted_frame_count_); |
+ if (IsBitstreamFormat()) { |
+ LOG(ERROR) << "Not allowed to trim an audio bitstream buffer."; |
+ return; |
+ } |
+ |
TrimRange(0, frames_to_trim); |
} |
@@ -277,6 +327,11 @@ void AudioBuffer::TrimEnd(int frames_to_trim) { |
CHECK_GE(frames_to_trim, 0); |
CHECK_LE(frames_to_trim, adjusted_frame_count_); |
+ if (IsBitstreamFormat()) { |
+ LOG(ERROR) << "Not allowed to trim an audio bitstream buffer."; |
+ return; |
+ } |
+ |
// Adjust the number of frames and duration for this buffer. |
adjusted_frame_count_ -= frames_to_trim; |
duration_ = CalculateDuration(adjusted_frame_count_, sample_rate_); |
@@ -286,6 +341,11 @@ void AudioBuffer::TrimRange(int start, int end) { |
CHECK_GE(start, 0); |
CHECK_LE(end, adjusted_frame_count_); |
+ if (IsBitstreamFormat()) { |
+ LOG(ERROR) << "Not allowed to trim an audio bitstream buffer."; |
+ return; |
+ } |
+ |
const int frames_to_trim = end - start; |
CHECK_GE(frames_to_trim, 0); |
CHECK_LE(frames_to_trim, adjusted_frame_count_); |
@@ -329,4 +389,8 @@ void AudioBuffer::TrimRange(int start, int end) { |
TrimEnd(frames_to_trim); |
} |
+bool AudioBuffer::IsBitstreamFormat() { |
+ return IsBitstream(sample_format_); |
+} |
+ |
} // namespace media |