Commit bb207f67 authored by Sergey Ulanov's avatar Sergey Ulanov Committed by Commit Bot

[Fuchsia] Handle config changes in FuchsiaAudioRenderer

Now FuchsiaAudioRenderer can handle mid-stream configuration changes.

Bug: 1047537
Change-Id: I93b61f56fd1a9e84b2a5a1c82dc3fc0c5f660e3a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2029455
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: default avatarDavid Dorwin <ddorwin@chromium.org>
Auto-Submit: Sergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737215}
parent e6e5af14
...@@ -105,7 +105,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream, ...@@ -105,7 +105,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
DCHECK(!init_cb_); DCHECK(!init_cb_);
init_cb_ = std::move(init_cb); init_cb_ = std::move(init_cb);
demuxer_stream_ = stream;
client_ = client; client_ = client;
audio_consumer_.Bind(std::move(audio_consumer_handle_)); audio_consumer_.Bind(std::move(audio_consumer_handle_));
...@@ -117,6 +116,32 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream, ...@@ -117,6 +116,32 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
audio_consumer_.events().OnEndOfStream = [this]() { OnEndOfStream(); }; audio_consumer_.events().OnEndOfStream = [this]() { OnEndOfStream(); };
RequestAudioConsumerStatus(); RequestAudioConsumerStatus();
InitializeStreamSync(stream->audio_decoder_config());
// DecryptingDemuxerStream handles both encrypted and clear streams, so
// initialize it long as we have cdm_context.
if (cdm_context) {
WaitingCB waiting_cb = base::BindRepeating(&RendererClient::OnWaiting,
base::Unretained(client_));
decrypting_demuxer_stream_ = std::make_unique<DecryptingDemuxerStream>(
base::ThreadTaskRunnerHandle::Get(), media_log_, waiting_cb);
decrypting_demuxer_stream_->Initialize(
stream, cdm_context,
base::BindRepeating(&FuchsiaAudioRenderer::OnDecryptorInitialized,
base::Unretained(this)));
return;
}
demuxer_stream_ = stream;
std::move(init_cb_).Run(PIPELINE_OK);
}
void FuchsiaAudioRenderer::InitializeStreamSync(
const AudioDecoderConfig& config) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!stream_sink_);
// Allocate input buffers for the StreamSink. // Allocate input buffers for the StreamSink.
stream_sink_buffers_.resize(kNumBuffers); stream_sink_buffers_.resize(kNumBuffers);
std::vector<zx::vmo> vmos_for_stream_sink; std::vector<zx::vmo> vmos_for_stream_sink;
...@@ -141,8 +166,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream, ...@@ -141,8 +166,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
vmos_for_stream_sink.push_back(std::move(readonly_vmo)); vmos_for_stream_sink.push_back(std::move(readonly_vmo));
} }
AudioDecoderConfig config = demuxer_stream_->audio_decoder_config();
auto compression = GetFuchsiaCompressionFromAudioCodec(config.codec()); auto compression = GetFuchsiaCompressionFromAudioCodec(config.codec());
if (!compression) { if (!compression) {
LOG(ERROR) << "Unsupported audio codec: " << GetCodecName(config.codec()); LOG(ERROR) << "Unsupported audio codec: " << GetCodecName(config.codec());
...@@ -174,21 +197,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream, ...@@ -174,21 +197,6 @@ void FuchsiaAudioRenderer::Initialize(DemuxerStream* stream,
audio_consumer_->CreateStreamSink( audio_consumer_->CreateStreamSink(
std::move(vmos_for_stream_sink), std::move(stream_type), std::move(vmos_for_stream_sink), std::move(stream_type),
std::move(compression).value(), stream_sink_.NewRequest()); std::move(compression).value(), stream_sink_.NewRequest());
// If the stream is encrypted then initialize |decrypting_demuxer_stream_|.
if (demuxer_stream_->audio_decoder_config().is_encrypted() && cdm_context) {
WaitingCB waiting_cb = base::BindRepeating(&RendererClient::OnWaiting,
base::Unretained(client_));
decrypting_demuxer_stream_ = std::make_unique<DecryptingDemuxerStream>(
base::ThreadTaskRunnerHandle::Get(), media_log_, waiting_cb);
decrypting_demuxer_stream_->Initialize(
demuxer_stream_, cdm_context,
base::BindRepeating(&FuchsiaAudioRenderer::OnDecryptorInitialized,
base::Unretained(this)));
return;
}
std::move(init_cb_).Run(PIPELINE_OK);
} }
TimeSource* FuchsiaAudioRenderer::GetTimeSource() { TimeSource* FuchsiaAudioRenderer::GetTimeSource() {
...@@ -334,8 +342,11 @@ void FuchsiaAudioRenderer::OnError(PipelineStatus status) { ...@@ -334,8 +342,11 @@ void FuchsiaAudioRenderer::OnError(PipelineStatus status) {
void FuchsiaAudioRenderer::OnDecryptorInitialized(PipelineStatus status) { void FuchsiaAudioRenderer::OnDecryptorInitialized(PipelineStatus status) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!init_cb_) // |init_cb_| may be cleared in OnError(), e.g. if AudioConsumer was
// disconnected.
if (!init_cb_) {
return; return;
}
if (status == PIPELINE_OK) { if (status == PIPELINE_OK) {
demuxer_stream_ = decrypting_demuxer_stream_.get(); demuxer_stream_ = decrypting_demuxer_stream_.get();
...@@ -437,6 +448,8 @@ void FuchsiaAudioRenderer::ScheduleReadDemuxerStream() { ...@@ -437,6 +448,8 @@ void FuchsiaAudioRenderer::ScheduleReadDemuxerStream() {
void FuchsiaAudioRenderer::ReadDemuxerStream() { void FuchsiaAudioRenderer::ReadDemuxerStream() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(demuxer_stream_);
demuxer_stream_->Read( demuxer_stream_->Read(
base::BindOnce(&FuchsiaAudioRenderer::OnDemuxerStreamReadDone, base::BindOnce(&FuchsiaAudioRenderer::OnDemuxerStreamReadDone,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
...@@ -451,9 +464,9 @@ void FuchsiaAudioRenderer::OnDemuxerStreamReadDone( ...@@ -451,9 +464,9 @@ void FuchsiaAudioRenderer::OnDemuxerStreamReadDone(
if (read_status == DemuxerStream::kError) { if (read_status == DemuxerStream::kError) {
OnError(PIPELINE_ERROR_READ); OnError(PIPELINE_ERROR_READ);
} else if (read_status == DemuxerStream::kConfigChanged) { } else if (read_status == DemuxerStream::kConfigChanged) {
LOG(ERROR) stream_sink_.Unbind();
<< "FuchsiaAudioRenderer doesn't support mid-stream config change."; InitializeStreamSync(demuxer_stream_->audio_decoder_config());
OnError(PIPELINE_ERROR_READ); ScheduleReadDemuxerStream();
} else { } else {
DCHECK_EQ(read_status, DemuxerStream::kAborted); DCHECK_EQ(read_status, DemuxerStream::kAborted);
} }
......
...@@ -63,7 +63,8 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource { ...@@ -63,7 +63,8 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource {
kPlaying, kPlaying,
// We've reached end of stream from the demuxer, // Received end-of-stream packet from the |demuxer_stream_|. Waiting for
// EndOfStream event from |audio_consumer_|.
kEndOfStream, kEndOfStream,
}; };
...@@ -77,6 +78,10 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource { ...@@ -77,6 +78,10 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource {
// Resets AudioConsumer and reports error to the |client_|. // Resets AudioConsumer and reports error to the |client_|.
void OnError(PipelineStatus Status); void OnError(PipelineStatus Status);
// Initializes |stream_sink_|. Called during initialization and every time
// configuration changes.
void InitializeStreamSync(const AudioDecoderConfig& config);
// Callback for DecryptingDemuxerStream::Initialize(). // Callback for DecryptingDemuxerStream::Initialize().
void OnDecryptorInitialized(PipelineStatus status); void OnDecryptorInitialized(PipelineStatus status);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment