Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(722)

Unified Diff: media/filters/decrypting_audio_decoder.cc

Issue 141243003: Add AudioBufferStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@decoderstream_rebased
Patch Set: even more cleanup! Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/decrypting_audio_decoder.cc
diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc
index 6a2dd3b7b741e45c0bc8a7ae12adec4b935e944d..fab21d0d2e4848ca352192cd04459cd96266c193 100644
--- a/media/filters/decrypting_audio_decoder.cc
+++ b/media/filters/decrypting_audio_decoder.cc
@@ -40,7 +40,6 @@ DecryptingAudioDecoder::DecryptingAudioDecoder(
: task_runner_(task_runner),
weak_factory_(this),
state_(kUninitialized),
- demuxer_stream_(NULL),
set_decryptor_ready_cb_(set_decryptor_ready_cb),
decryptor_(NULL),
key_added_while_decode_pending_(false),
@@ -49,19 +48,15 @@ DecryptingAudioDecoder::DecryptingAudioDecoder(
samples_per_second_(0) {
}
-void DecryptingAudioDecoder::Initialize(
- DemuxerStream* stream,
- const PipelineStatusCB& status_cb,
- const StatisticsCB& statistics_cb) {
+void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config,
+ const PipelineStatusCB& status_cb) {
DVLOG(2) << "Initialize()";
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK_EQ(state_, kUninitialized) << state_;
- DCHECK(stream);
weak_this_ = weak_factory_.GetWeakPtr();
init_cb_ = BindToCurrentLoop(status_cb);
- const AudioDecoderConfig& config = stream->audio_decoder_config();
if (!config.IsValidConfig()) {
DLOG(ERROR) << "Invalid audio stream config.";
base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_DECODE);
@@ -74,38 +69,39 @@ void DecryptingAudioDecoder::Initialize(
return;
}
- DCHECK(!demuxer_stream_);
- demuxer_stream_ = stream;
- statistics_cb_ = statistics_cb;
+ config_ = config;
state_ = kDecryptorRequested;
set_decryptor_ready_cb_.Run(BindToCurrentLoop(
base::Bind(&DecryptingAudioDecoder::SetDecryptor, weak_this_)));
}
-void DecryptingAudioDecoder::Read(const ReadCB& read_cb) {
- DVLOG(3) << "Read()";
+void DecryptingAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
+ const DecodeCB& decode_cb) {
+ DVLOG(3) << "Decode()";
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(state_ == kIdle || state_ == kDecodeFinished) << state_;
- DCHECK(!read_cb.is_null());
- CHECK(read_cb_.is_null()) << "Overlapping decodes are not supported.";
+ DCHECK(!decode_cb.is_null());
+ CHECK(decode_cb_.is_null()) << "Overlapping decodes are not supported.";
- read_cb_ = BindToCurrentLoop(read_cb);
+ decode_cb_ = BindToCurrentLoop(decode_cb);
// Return empty (end-of-stream) frames if decoding has finished.
if (state_ == kDecodeFinished) {
- base::ResetAndReturn(&read_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer());
+ base::ResetAndReturn(&decode_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer());
return;
}
if (!queued_audio_frames_.empty()) {
- base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front());
+ DCHECK(!buffer);
+ base::ResetAndReturn(&decode_cb_).Run(kOk, queued_audio_frames_.front());
queued_audio_frames_.pop_front();
return;
}
- state_ = kPendingDemuxerRead;
- ReadFromDemuxerStream();
+ pending_buffer_to_decode_ = buffer;
+ state_ = kPendingDecode;
+ DecodePendingBuffer();
}
void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
@@ -128,20 +124,18 @@ void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
// Defer the resetting process in this case. The |reset_cb_| will be fired
// after the read callback is fired - see DecryptAndDecodeBuffer() and
// DeliverFrame().
- if (state_ == kPendingConfigChange ||
- state_ == kPendingDemuxerRead ||
- state_ == kPendingDecode) {
- DCHECK(!read_cb_.is_null());
+ if (state_ == kPendingConfigChange || state_ == kPendingDecode) {
+ DCHECK(!decode_cb_.is_null());
return;
}
if (state_ == kWaitingForKey) {
- DCHECK(!read_cb_.is_null());
+ DCHECK(!decode_cb_.is_null());
pending_buffer_to_decode_ = NULL;
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL);
}
- DCHECK(read_cb_.is_null());
+ DCHECK(decode_cb_.is_null());
DoReset();
}
@@ -159,8 +153,8 @@ void DecryptingAudioDecoder::Stop(const base::Closure& closure) {
pending_buffer_to_decode_ = NULL;
if (!init_cb_.is_null())
base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
- if (!read_cb_.is_null())
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
+ if (!decode_cb_.is_null())
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL);
if (!reset_cb_.is_null())
base::ResetAndReturn(&reset_cb_).Run();
state_ = kStopped;
@@ -182,6 +176,10 @@ int DecryptingAudioDecoder::samples_per_second() {
return samples_per_second_;
}
+bool DecryptingAudioDecoder::HasQueuedData() const {
+ return !queued_audio_frames_.empty();
+}
+
DecryptingAudioDecoder::~DecryptingAudioDecoder() {
DCHECK(state_ == kUninitialized || state_ == kStopped) << state_;
}
@@ -208,23 +206,9 @@ void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) {
decryptor_ = decryptor;
- const AudioDecoderConfig& input_config =
- demuxer_stream_->audio_decoder_config();
- AudioDecoderConfig config;
- config.Initialize(input_config.codec(),
- kSampleFormatS16,
- input_config.channel_layout(),
- input_config.samples_per_second(),
- input_config.extra_data(),
- input_config.extra_data_size(),
- input_config.is_encrypted(),
- false,
- base::TimeDelta(),
- base::TimeDelta());
-
state_ = kPendingDecoderInit;
decryptor_->InitializeAudioDecoder(
- config,
+ config_,
BindToCurrentLoop(base::Bind(
&DecryptingAudioDecoder::FinishInitialization, weak_this_)));
}
@@ -239,7 +223,7 @@ void DecryptingAudioDecoder::FinishInitialization(bool success) {
DCHECK_EQ(state_, kPendingDecoderInit) << state_;
DCHECK(!init_cb_.is_null());
DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished.
- DCHECK(read_cb_.is_null()); // No Read() before initialization finished.
+ DCHECK(decode_cb_.is_null()); // No Decode() before initialization finished.
if (!success) {
base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
@@ -258,102 +242,6 @@ void DecryptingAudioDecoder::FinishInitialization(bool success) {
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
}
-void DecryptingAudioDecoder::FinishConfigChange(bool success) {
- DVLOG(2) << "FinishConfigChange()";
- DCHECK(task_runner_->BelongsToCurrentThread());
- DCHECK_EQ(state_, kPendingConfigChange) << state_;
- DCHECK(!read_cb_.is_null());
-
- if (!success) {
- base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL);
- state_ = kDecodeFinished;
- if (!reset_cb_.is_null())
- base::ResetAndReturn(&reset_cb_).Run();
- return;
- }
-
- // Config change succeeded.
- UpdateDecoderConfig();
-
- if (!reset_cb_.is_null()) {
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
- DoReset();
- return;
- }
-
- state_ = kPendingDemuxerRead;
- ReadFromDemuxerStream();
-}
-
-void DecryptingAudioDecoder::ReadFromDemuxerStream() {
- DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
- DCHECK(!read_cb_.is_null());
-
- demuxer_stream_->Read(
- base::Bind(&DecryptingAudioDecoder::DecryptAndDecodeBuffer, weak_this_));
-}
-
-void DecryptingAudioDecoder::DecryptAndDecodeBuffer(
- DemuxerStream::Status status,
- const scoped_refptr<DecoderBuffer>& buffer) {
- DVLOG(3) << "DecryptAndDecodeBuffer()";
- DCHECK(task_runner_->BelongsToCurrentThread());
- DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
- DCHECK(!read_cb_.is_null());
- DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status;
-
- if (status == DemuxerStream::kConfigChanged) {
- DVLOG(2) << "DecryptAndDecodeBuffer() - kConfigChanged";
-
- const AudioDecoderConfig& input_config =
- demuxer_stream_->audio_decoder_config();
- AudioDecoderConfig config;
- config.Initialize(input_config.codec(),
- kSampleFormatS16,
- input_config.channel_layout(),
- input_config.samples_per_second(),
- input_config.extra_data(),
- input_config.extra_data_size(),
- input_config.is_encrypted(),
- false,
- base::TimeDelta(),
- base::TimeDelta());
-
- state_ = kPendingConfigChange;
- decryptor_->DeinitializeDecoder(Decryptor::kAudio);
- decryptor_->InitializeAudioDecoder(
- config, BindToCurrentLoop(base::Bind(
- &DecryptingAudioDecoder::FinishConfigChange, weak_this_)));
- return;
- }
-
- if (!reset_cb_.is_null()) {
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
- DoReset();
- return;
- }
-
- if (status == DemuxerStream::kAborted) {
- DVLOG(2) << "DecryptAndDecodeBuffer() - kAborted";
- state_ = kIdle;
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
- return;
- }
-
- DCHECK_EQ(status, DemuxerStream::kOk);
-
- // Initialize the |next_output_timestamp_| to be the timestamp of the first
- // non-EOS buffer.
- if (timestamp_helper_->base_timestamp() == kNoTimestamp() &&
- !buffer->end_of_stream()) {
- timestamp_helper_->SetBaseTimestamp(buffer->timestamp());
- }
-
- pending_buffer_to_decode_ = buffer;
- state_ = kPendingDecode;
- DecodePendingBuffer();
-}
-
void DecryptingAudioDecoder::DecodePendingBuffer() {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK_EQ(state_, kPendingDecode) << state_;
@@ -380,7 +268,7 @@ void DecryptingAudioDecoder::DeliverFrame(
return;
DCHECK_EQ(state_, kPendingDecode) << state_;
- DCHECK(!read_cb_.is_null());
+ DCHECK(!decode_cb_.is_null());
DCHECK(pending_buffer_to_decode_.get());
DCHECK(queued_audio_frames_.empty());
@@ -392,7 +280,7 @@ void DecryptingAudioDecoder::DeliverFrame(
pending_buffer_to_decode_ = NULL;
if (!reset_cb_.is_null()) {
- base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL);
DoReset();
return;
}
@@ -401,8 +289,8 @@ void DecryptingAudioDecoder::DeliverFrame(
if (status == Decryptor::kError) {
DVLOG(2) << "DeliverFrame() - kError";
- state_ = kDecodeFinished;
- base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL);
+ state_ = kDecodeFinished; // TODO add kError state
+ base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL);
return;
}
@@ -433,12 +321,13 @@ void DecryptingAudioDecoder::DeliverFrame(
DVLOG(2) << "DeliverFrame() - kNeedMoreData";
if (scoped_pending_buffer_to_decode->end_of_stream()) {
state_ = kDecodeFinished;
- base::ResetAndReturn(&read_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer());
+ base::ResetAndReturn(&decode_cb_)
+ .Run(kOk, AudioBuffer::CreateEOSBuffer());
return;
}
- state_ = kPendingDemuxerRead;
- ReadFromDemuxerStream();
+ state_ = kIdle;
+ base::ResetAndReturn(&decode_cb_).Run(kNotEnoughData, NULL);
return;
}
@@ -447,7 +336,7 @@ void DecryptingAudioDecoder::DeliverFrame(
EnqueueFrames(frames);
state_ = kIdle;
- base::ResetAndReturn(&read_cb_).Run(kOk, queued_audio_frames_.front());
+ base::ResetAndReturn(&decode_cb_).Run(kOk, queued_audio_frames_.front());
queued_audio_frames_.pop_front();
}
@@ -467,17 +356,16 @@ void DecryptingAudioDecoder::OnKeyAdded() {
void DecryptingAudioDecoder::DoReset() {
DCHECK(init_cb_.is_null());
- DCHECK(read_cb_.is_null());
+ DCHECK(decode_cb_.is_null());
timestamp_helper_->SetBaseTimestamp(kNoTimestamp());
state_ = kIdle;
base::ResetAndReturn(&reset_cb_).Run();
}
void DecryptingAudioDecoder::UpdateDecoderConfig() {
- const AudioDecoderConfig& config = demuxer_stream_->audio_decoder_config();
bits_per_channel_ = kSupportedBitsPerChannel;
- channel_layout_ = config.channel_layout();
- samples_per_second_ = config.samples_per_second();
+ channel_layout_ = config_.channel_layout();
+ samples_per_second_ = config_.samples_per_second();
timestamp_helper_.reset(new AudioTimestampHelper(samples_per_second_));
}

Powered by Google App Engine
This is Rietveld 408576698