Index: media/mojo/clients/mojo_renderer.cc |
diff --git a/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc |
index 119de6240f6467c83f12bf0784d31676373b120d..6d284985fe0aef738012d458e51d401e03ada41c 100644 |
--- a/media/mojo/clients/mojo_renderer.cc |
+++ b/media/mojo/clients/mojo_renderer.cc |
@@ -78,28 +78,33 @@ void MojoRenderer::InitializeRendererFromStreams( |
DemuxerStream* const video = |
demuxer_stream_provider_->GetStream(DemuxerStream::VIDEO); |
- mojom::DemuxerStreamPtr audio_stream; |
+ std::vector<mojom::DemuxerStreamPtr> streams; |
if (audio) { |
- audio_stream_.reset( |
- new MojoDemuxerStreamImpl(audio, MakeRequest(&audio_stream))); |
- // Using base::Unretained(this) is safe because |this| owns |
- // |audio_stream_|, and the error handler can't be invoked once |
- // |audio_stream_| is destroyed. |
- audio_stream_->set_connection_error_handler( |
+ mojom::DemuxerStreamPtr audio_stream; |
+ std::unique_ptr<MojoDemuxerStreamImpl> mojo_stream = |
+ base::MakeUnique<MojoDemuxerStreamImpl>(audio, |
+ MakeRequest(&audio_stream)); |
+ // Using base::Unretained(this) is safe because |this| owns |mojo_stream|, |
+ // and the error handler can't be invoked once |mojo_stream| is destroyed. |
+ mojo_stream->set_connection_error_handler( |
base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError, |
- base::Unretained(this), DemuxerStream::AUDIO)); |
+ base::Unretained(this), mojo_stream.get())); |
+ streams_.push_back(std::move(mojo_stream)); |
+ streams.push_back(std::move(audio_stream)); |
} |
- mojom::DemuxerStreamPtr video_stream; |
if (video) { |
- video_stream_.reset( |
- new MojoDemuxerStreamImpl(video, MakeRequest(&video_stream))); |
- // Using base::Unretained(this) is safe because |this| owns |
- // |video_stream_|, and the error handler can't be invoked once |
- // |video_stream_| is destroyed. |
- video_stream_->set_connection_error_handler( |
+ mojom::DemuxerStreamPtr video_stream; |
+ std::unique_ptr<MojoDemuxerStreamImpl> mojo_stream = |
+ base::MakeUnique<MojoDemuxerStreamImpl>(video, |
+ MakeRequest(&video_stream)); |
+ // Using base::Unretained(this) is safe because |this| owns |mojo_stream|, |
+ // and the error handler can't be invoked once |mojo_stream| is destroyed. |
+ mojo_stream->set_connection_error_handler( |
base::Bind(&MojoRenderer::OnDemuxerStreamConnectionError, |
- base::Unretained(this), DemuxerStream::VIDEO)); |
+ base::Unretained(this), mojo_stream.get())); |
+ streams_.push_back(std::move(mojo_stream)); |
+ streams.push_back(std::move(video_stream)); |
} |
BindRemoteRendererIfNeeded(); |
@@ -111,8 +116,8 @@ void MojoRenderer::InitializeRendererFromStreams( |
// |remote_renderer_|, and the callback won't be dispatched if |
// |remote_renderer_| is destroyed. |
remote_renderer_->Initialize( |
- std::move(client_ptr_info), std::move(audio_stream), |
- std::move(video_stream), base::nullopt, base::nullopt, |
+ std::move(client_ptr_info), std::move(streams), base::nullopt, |
+ base::nullopt, |
base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); |
} |
@@ -130,9 +135,9 @@ void MojoRenderer::InitializeRendererFromUrl(media::RendererClient* client) { |
// Using base::Unretained(this) is safe because |this| owns |
// |remote_renderer_|, and the callback won't be dispatched if |
// |remote_renderer_| is destroyed. |
+ std::vector<mojom::DemuxerStreamPtr> streams; |
remote_renderer_->Initialize( |
- std::move(client_ptr_info), mojom::DemuxerStreamPtr(), |
- mojom::DemuxerStreamPtr(), url_params.media_url, |
+ std::move(client_ptr_info), std::move(streams), url_params.media_url, |
url_params.first_party_for_cookies, |
base::Bind(&MojoRenderer::OnInitialized, base::Unretained(this), client)); |
} |
@@ -315,17 +320,18 @@ void MojoRenderer::OnConnectionError() { |
client_->OnError(PIPELINE_ERROR_DECODE); |
} |
-void MojoRenderer::OnDemuxerStreamConnectionError(DemuxerStream::Type type) { |
- DVLOG(1) << __func__ << ": " << type; |
+void MojoRenderer::OnDemuxerStreamConnectionError( |
+ MojoDemuxerStreamImpl* stream) { |
+ DVLOG(1) << __func__ << ": stream=" << stream; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (type == DemuxerStream::AUDIO) { |
- audio_stream_.reset(); |
- } else if (type == DemuxerStream::VIDEO) { |
- video_stream_.reset(); |
- } else { |
- NOTREACHED() << "Unexpected demuxer stream type: " << type; |
+ for (auto& s : streams_) { |
+ if (s.get() == stream) { |
+ s.reset(); |
+ return; |
+ } |
} |
+ NOTREACHED() << "Unrecognized demuxer stream=" << stream; |
} |
void MojoRenderer::BindRemoteRendererIfNeeded() { |