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

Side by Side Diff: media/remoting/remote_renderer_impl.cc

Issue 2491043003: MediaResource refactoring to support multiple streams (Closed)
Patch Set: rebase Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/remoting/remote_renderer_impl.h" 5 #include "media/remoting/remote_renderer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/callback_helpers.h" 13 #include "base/callback_helpers.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
16 #include "base/numerics/safe_math.h" 16 #include "base/numerics/safe_math.h"
17 #include "base/threading/thread_task_runner_handle.h" 17 #include "base/threading/thread_task_runner_handle.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "media/base/bind_to_current_loop.h" 19 #include "media/base/bind_to_current_loop.h"
20 #include "media/base/demuxer_stream_provider.h" 20 #include "media/base/media_resource.h"
21 #include "media/remoting/remote_demuxer_stream_adapter.h" 21 #include "media/remoting/remote_demuxer_stream_adapter.h"
22 #include "media/remoting/remoting_renderer_controller.h" 22 #include "media/remoting/remoting_renderer_controller.h"
23 #include "media/remoting/rpc/proto_enum_utils.h" 23 #include "media/remoting/rpc/proto_enum_utils.h"
24 #include "media/remoting/rpc/proto_utils.h" 24 #include "media/remoting/rpc/proto_utils.h"
25 25
26 namespace { 26 namespace {
27 27
28 // The moving time window to track the media time and statistics updates. 28 // The moving time window to track the media time and statistics updates.
29 constexpr base::TimeDelta kTrackingWindow = base::TimeDelta::FromSeconds(5); 29 constexpr base::TimeDelta kTrackingWindow = base::TimeDelta::FromSeconds(5);
30 30
(...skipping 24 matching lines...) Expand all
55 namespace media { 55 namespace media {
56 56
57 RemoteRendererImpl::RemoteRendererImpl( 57 RemoteRendererImpl::RemoteRendererImpl(
58 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, 58 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
59 const base::WeakPtr<RemotingRendererController>& 59 const base::WeakPtr<RemotingRendererController>&
60 remoting_renderer_controller, 60 remoting_renderer_controller,
61 VideoRendererSink* video_renderer_sink) 61 VideoRendererSink* video_renderer_sink)
62 : state_(STATE_UNINITIALIZED), 62 : state_(STATE_UNINITIALIZED),
63 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), 63 main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
64 media_task_runner_(std::move(media_task_runner)), 64 media_task_runner_(std::move(media_task_runner)),
65 demuxer_stream_provider_(nullptr), 65 media_resource_(nullptr),
66 client_(nullptr), 66 client_(nullptr),
67 remoting_renderer_controller_(remoting_renderer_controller), 67 remoting_renderer_controller_(remoting_renderer_controller),
68 rpc_broker_(remoting_renderer_controller_->GetRpcBroker()), 68 rpc_broker_(remoting_renderer_controller_->GetRpcBroker()),
69 rpc_handle_(rpc_broker_->GetUniqueHandle()), 69 rpc_handle_(rpc_broker_->GetUniqueHandle()),
70 remote_renderer_handle_(remoting::kInvalidHandle), 70 remote_renderer_handle_(remoting::kInvalidHandle),
71 video_renderer_sink_(video_renderer_sink), 71 video_renderer_sink_(video_renderer_sink),
72 weak_factory_(this) { 72 weak_factory_(this) {
73 VLOG(2) << __func__; 73 VLOG(2) << __func__;
74 // The constructor is running on the main thread. 74 // The constructor is running on the main thread.
75 DCHECK(remoting_renderer_controller_); 75 DCHECK(remoting_renderer_controller_);
(...skipping 21 matching lines...) Expand all
97 remoting_renderer_controller_, 97 remoting_renderer_controller_,
98 RemotingRendererController::ShowInterstitialCallback())); 98 RemotingRendererController::ShowInterstitialCallback()));
99 99
100 // Post task on main thread to unregister message receiver. 100 // Post task on main thread to unregister message receiver.
101 main_task_runner_->PostTask( 101 main_task_runner_->PostTask(
102 FROM_HERE, 102 FROM_HERE,
103 base::Bind(&remoting::RpcBroker::UnregisterMessageReceiverCallback, 103 base::Bind(&remoting::RpcBroker::UnregisterMessageReceiverCallback,
104 rpc_broker_, rpc_handle_)); 104 rpc_broker_, rpc_handle_));
105 } 105 }
106 106
107 void RemoteRendererImpl::Initialize( 107 void RemoteRendererImpl::Initialize(MediaResource* media_resource,
108 DemuxerStreamProvider* demuxer_stream_provider, 108 media::RendererClient* client,
109 media::RendererClient* client, 109 const PipelineStatusCB& init_cb) {
110 const PipelineStatusCB& init_cb) {
111 VLOG(2) << __func__; 110 VLOG(2) << __func__;
112 DCHECK(media_task_runner_->BelongsToCurrentThread()); 111 DCHECK(media_task_runner_->BelongsToCurrentThread());
113 DCHECK(demuxer_stream_provider); 112 DCHECK(media_resource);
114 DCHECK(client); 113 DCHECK(client);
115 114
116 if (state_ != STATE_UNINITIALIZED) { 115 if (state_ != STATE_UNINITIALIZED) {
117 media_task_runner_->PostTask( 116 media_task_runner_->PostTask(
118 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INVALID_STATE)); 117 FROM_HERE, base::Bind(init_cb, PIPELINE_ERROR_INVALID_STATE));
119 return; 118 return;
120 } 119 }
121 120
122 demuxer_stream_provider_ = demuxer_stream_provider; 121 media_resource_ = media_resource;
123 client_ = client; 122 client_ = client;
124 init_workflow_done_callback_ = init_cb; 123 init_workflow_done_callback_ = init_cb;
125 124
126 state_ = STATE_CREATE_PIPE; 125 state_ = STATE_CREATE_PIPE;
126
127 std::vector<::media::DemuxerStream*> streams = media_resource_->GetStreams();
128 ::media::DemuxerStream* audio_demuxer_stream = nullptr;
129 ::media::DemuxerStream* video_demuxer_stream = nullptr;
130 for (const auto& s : streams) {
131 if (s->type() == DemuxerStream::AUDIO && s->enabled() &&
132 !audio_demuxer_stream)
133 audio_demuxer_stream = s;
134 if (s->type() == DemuxerStream::VIDEO && s->enabled() &&
135 !video_demuxer_stream)
136 video_demuxer_stream = s;
137 }
138
127 // Create audio mojo data pipe handles if audio is available. 139 // Create audio mojo data pipe handles if audio is available.
128 ::media::DemuxerStream* audio_demuxer_stream =
129 demuxer_stream_provider_->GetStream(::media::DemuxerStream::AUDIO);
130 std::unique_ptr<mojo::DataPipe> audio_data_pipe; 140 std::unique_ptr<mojo::DataPipe> audio_data_pipe;
131 if (audio_demuxer_stream) { 141 if (audio_demuxer_stream) {
132 audio_data_pipe = base::WrapUnique(remoting::CreateDataPipe()); 142 audio_data_pipe = base::WrapUnique(remoting::CreateDataPipe());
133 } 143 }
134 144
135 // Create video mojo data pipe handles if video is available. 145 // Create video mojo data pipe handles if video is available.
136 ::media::DemuxerStream* video_demuxer_stream =
137 demuxer_stream_provider_->GetStream(::media::DemuxerStream::VIDEO);
138 std::unique_ptr<mojo::DataPipe> video_data_pipe; 146 std::unique_ptr<mojo::DataPipe> video_data_pipe;
139 if (video_demuxer_stream) { 147 if (video_demuxer_stream) {
140 video_data_pipe = base::WrapUnique(remoting::CreateDataPipe()); 148 video_data_pipe = base::WrapUnique(remoting::CreateDataPipe());
141 } 149 }
142 150
143 // Establish remoting data pipe connection using main thread. 151 // Establish remoting data pipe connection using main thread.
144 const RemotingSourceImpl::DataPipeStartCallback data_pipe_callback = 152 const RemotingSourceImpl::DataPipeStartCallback data_pipe_callback =
145 base::Bind(&RemoteRendererImpl::OnDataPipeCreatedOnMainThread, 153 base::Bind(&RemoteRendererImpl::OnDataPipeCreatedOnMainThread,
146 media_task_runner_, weak_factory_.GetWeakPtr(), rpc_broker_); 154 media_task_runner_, weak_factory_.GetWeakPtr(), rpc_broker_);
147 main_task_runner_->PostTask( 155 main_task_runner_->PostTask(
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 int audio_rpc_handle, 326 int audio_rpc_handle,
319 int video_rpc_handle) { 327 int video_rpc_handle) {
320 VLOG(2) << __func__; 328 VLOG(2) << __func__;
321 DCHECK(media_task_runner_->BelongsToCurrentThread()); 329 DCHECK(media_task_runner_->BelongsToCurrentThread());
322 DCHECK(!init_workflow_done_callback_.is_null()); 330 DCHECK(!init_workflow_done_callback_.is_null());
323 331
324 if (state_ == STATE_ERROR) 332 if (state_ == STATE_ERROR)
325 return; // Abort because something went wrong in the meantime. 333 return; // Abort because something went wrong in the meantime.
326 DCHECK_EQ(state_, STATE_CREATE_PIPE); 334 DCHECK_EQ(state_, STATE_CREATE_PIPE);
327 335
336 // TODO(erickung): Make remote renderer multi-stream capable.
337 std::vector<::media::DemuxerStream*> streams = media_resource_->GetStreams();
338 ::media::DemuxerStream* audio_demuxer_stream = nullptr;
339 ::media::DemuxerStream* video_demuxer_stream = nullptr;
340 for (const auto& s : streams) {
341 if (s->type() == DemuxerStream::AUDIO && s->enabled() &&
342 !audio_demuxer_stream)
343 audio_demuxer_stream = s;
344 if (s->type() == DemuxerStream::VIDEO && s->enabled() &&
345 !video_demuxer_stream)
346 video_demuxer_stream = s;
347 }
348
328 // Create audio demuxer stream adapter if audio is available. 349 // Create audio demuxer stream adapter if audio is available.
329 ::media::DemuxerStream* audio_demuxer_stream =
330 demuxer_stream_provider_->GetStream(::media::DemuxerStream::AUDIO);
331 if (audio_demuxer_stream && audio.is_valid() && audio_handle.is_valid() && 350 if (audio_demuxer_stream && audio.is_valid() && audio_handle.is_valid() &&
332 audio_rpc_handle != remoting::kInvalidHandle) { 351 audio_rpc_handle != remoting::kInvalidHandle) {
333 VLOG(2) << "Initialize audio"; 352 VLOG(2) << "Initialize audio";
334 audio_demuxer_stream_adapter_.reset( 353 audio_demuxer_stream_adapter_.reset(
335 new remoting::RemoteDemuxerStreamAdapter( 354 new remoting::RemoteDemuxerStreamAdapter(
336 main_task_runner_, media_task_runner_, "audio", 355 main_task_runner_, media_task_runner_, "audio",
337 audio_demuxer_stream, rpc_broker_, audio_rpc_handle, 356 audio_demuxer_stream, rpc_broker_, audio_rpc_handle,
338 std::move(audio), std::move(audio_handle), 357 std::move(audio), std::move(audio_handle),
339 base::Bind(&RemoteRendererImpl::OnFatalError, 358 base::Bind(&RemoteRendererImpl::OnFatalError,
340 base::Unretained(this)))); 359 base::Unretained(this))));
341 } 360 }
342 361
343 // Create video demuxer stream adapter if video is available. 362 // Create video demuxer stream adapter if video is available.
344 ::media::DemuxerStream* video_demuxer_stream =
345 demuxer_stream_provider_->GetStream(::media::DemuxerStream::VIDEO);
346 if (video_demuxer_stream && video.is_valid() && video_handle.is_valid() && 363 if (video_demuxer_stream && video.is_valid() && video_handle.is_valid() &&
347 video_rpc_handle != remoting::kInvalidHandle) { 364 video_rpc_handle != remoting::kInvalidHandle) {
348 VLOG(2) << "Initialize video"; 365 VLOG(2) << "Initialize video";
349 video_demuxer_stream_adapter_.reset( 366 video_demuxer_stream_adapter_.reset(
350 new remoting::RemoteDemuxerStreamAdapter( 367 new remoting::RemoteDemuxerStreamAdapter(
351 main_task_runner_, media_task_runner_, "video", 368 main_task_runner_, media_task_runner_, "video",
352 video_demuxer_stream, rpc_broker_, video_rpc_handle, 369 video_demuxer_stream, rpc_broker_, video_rpc_handle,
353 std::move(video), std::move(video_handle), 370 std::move(video), std::move(video_handle),
354 base::Bind(&RemoteRendererImpl::OnFatalError, 371 base::Bind(&RemoteRendererImpl::OnFatalError,
355 base::Unretained(this)))); 372 base::Unretained(this))));
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 kDataFlowPollPeriod.InSecondsF()) / 883 kDataFlowPollPeriod.InSecondsF()) /
867 kBytesPerKilobit; 884 kBytesPerKilobit;
868 DCHECK_GE(kilobits_per_second, 0); 885 DCHECK_GE(kilobits_per_second, 0);
869 const base::CheckedNumeric<int> checked_kbps = kilobits_per_second; 886 const base::CheckedNumeric<int> checked_kbps = kilobits_per_second;
870 metrics_recorder_.OnVideoRateEstimate( 887 metrics_recorder_.OnVideoRateEstimate(
871 checked_kbps.ValueOrDefault(std::numeric_limits<int>::max())); 888 checked_kbps.ValueOrDefault(std::numeric_limits<int>::max()));
872 } 889 }
873 } 890 }
874 891
875 } // namespace media 892 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698