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

Side by Side Diff: media/mojo/services/mojo_renderer_service.cc

Issue 684963003: Add support for external video renderers in mojo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mojo_config
Patch Set: Created 6 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/mojo/services/mojo_renderer_service.h" 5 #include "media/mojo/services/mojo_renderer_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "media/base/audio_decoder.h" 10 #include "media/base/audio_decoder.h"
11 #include "media/base/audio_renderer.h" 11 #include "media/base/audio_renderer.h"
12 #include "media/base/audio_renderer_sink.h" 12 #include "media/base/audio_renderer_sink.h"
13 #include "media/base/decryptor.h" 13 #include "media/base/decryptor.h"
14 #include "media/base/media_log.h" 14 #include "media/base/media_log.h"
15 #include "media/base/serial_runner.h"
xhwang 2014/10/29 00:22:13 not used?
DaleCurtis 2014/10/30 23:16:56 Done.
15 #include "media/base/video_renderer.h" 16 #include "media/base/video_renderer.h"
16 #include "media/filters/audio_renderer_impl.h" 17 #include "media/filters/audio_renderer_impl.h"
17 #include "media/filters/renderer_impl.h" 18 #include "media/filters/renderer_impl.h"
19 #include "media/filters/video_renderer_impl.h"
18 #include "media/mojo/services/mojo_demuxer_stream_adapter.h" 20 #include "media/mojo/services/mojo_demuxer_stream_adapter.h"
19 #include "media/mojo/services/renderer_config.h" 21 #include "media/mojo/services/renderer_config.h"
20 #include "mojo/application/application_runner_chromium.h" 22 #include "mojo/application/application_runner_chromium.h"
21 #include "mojo/public/c/system/main.h" 23 #include "mojo/public/c/system/main.h"
22 #include "mojo/public/cpp/application/application_connection.h" 24 #include "mojo/public/cpp/application/application_connection.h"
23 #include "mojo/public/cpp/application/application_delegate.h" 25 #include "mojo/public/cpp/application/application_delegate.h"
24 #include "mojo/public/cpp/application/interface_factory_impl.h" 26 #include "mojo/public/cpp/application/interface_factory_impl.h"
25 27
28 // TODO(dalecurtis): Put this in renderer config.
29 #include "media/filters/ffmpeg_video_decoder.h"
30
26 namespace media { 31 namespace media {
27 32
28 // Time interval to update media time. 33 // Time interval to update media time.
29 const int kTimeUpdateIntervalMs = 50; 34 const int kTimeUpdateIntervalMs = 50;
30 35
31 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, 36 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log,
32 const std::string& error) { 37 const std::string& error) {
33 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); 38 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
34 } 39 }
35 40
41 static void PaintNothingDropEverything(const scoped_refptr<VideoFrame>& frame) {
xhwang 2014/10/29 00:22:13 PaintNothing == DropEverything ? Pick one of them?
DaleCurtis 2014/10/30 23:16:56 Done.
42 }
43
36 // Shim DemuxerStreamProvider wrapper for a single DemuxerStream. 44 // Shim DemuxerStreamProvider wrapper for a single DemuxerStream.
37 // TODO(dalecurtis): Once we support more than one DemuxerStream we'll need a 45 // TODO(dalecurtis): Once we support more than one DemuxerStream we'll need a
38 // more complicated shim which can handle a mojo::Array<DemuxerStream>. 46 // more complicated shim which can handle a mojo::Array<DemuxerStream>.
47 // TODO(dalecurtis): This should probably be in its own file now.
39 class DemuxerStreamProviderShim : public DemuxerStreamProvider { 48 class DemuxerStreamProviderShim : public DemuxerStreamProvider {
40 public: 49 public:
41 DemuxerStreamProviderShim(scoped_ptr<MojoDemuxerStreamAdapter> stream) 50 DemuxerStreamProviderShim(mojo::DemuxerStreamPtr audio,
42 : stream_(stream.Pass()) {} 51 mojo::DemuxerStreamPtr video,
52 const base::Closure& demuxer_ready_cb)
53 : demuxer_ready_cb_(demuxer_ready_cb),
54 streams_ready_(0),
55 weak_factory_(this) {
56 DCHECK(audio || video);
57 DCHECK(!demuxer_ready_cb_.is_null());
58
59 if (audio) {
60 streams_.push_back(new MojoDemuxerStreamAdapter(
61 audio.Pass(),
62 base::Bind(&DemuxerStreamProviderShim::OnStreamReady,
63 weak_factory_.GetWeakPtr()),
64 DemuxerStream::AUDIO));
65 }
66
67 if (video) {
68 streams_.push_back(new MojoDemuxerStreamAdapter(
69 video.Pass(),
70 base::Bind(&DemuxerStreamProviderShim::OnStreamReady,
71 weak_factory_.GetWeakPtr()),
72 DemuxerStream::VIDEO));
73 }
xhwang 2014/10/29 00:22:13 see above comments
DaleCurtis 2014/10/30 23:16:56 Moved out.
74 }
43 75
44 ~DemuxerStreamProviderShim() override {} 76 ~DemuxerStreamProviderShim() override {}
45 77
46 DemuxerStream* GetStream(DemuxerStream::Type type) override { 78 DemuxerStream* GetStream(DemuxerStream::Type type) override {
47 return type != stream_->type() ? nullptr : stream_.get(); 79 DCHECK(demuxer_ready_cb_.is_null());
48 }; 80 for (auto* stream : streams_) {
81 if (stream->type() == type)
82 return stream;
83 }
84
85 return nullptr;
86 }
49 87
50 Liveness GetLiveness() const override { 88 Liveness GetLiveness() const override {
89 // TODO(dalecurtis): What to do here?? Probably we need an API for this.
xhwang 2014/10/29 00:22:13 See https://code.google.com/p/chromium/issues/deta
DaleCurtis 2014/10/30 23:16:57 Acknowledged.
51 return DemuxerStreamProvider::LIVENESS_UNKNOWN; 90 return DemuxerStreamProvider::LIVENESS_UNKNOWN;
52 } 91 }
53 92
54 private: 93 private:
55 scoped_ptr<MojoDemuxerStreamAdapter> stream_; 94 void OnStreamReady() {
95 if (++streams_ready_ == streams_.size()) {
xhwang 2014/10/29 00:22:13 I like this!
96 demuxer_ready_cb_.Run();
97 demuxer_ready_cb_.Reset();
xhwang 2014/10/29 00:22:13 base::ResetAndReturn(&demuxer_ready_cb).Run()?
DaleCurtis 2014/10/30 23:16:56 Done.
98 }
99 }
100
101 base::Closure demuxer_ready_cb_;
102 ScopedVector<MojoDemuxerStreamAdapter> streams_;
103 size_t streams_ready_;
104
105 base::WeakPtrFactory<DemuxerStreamProviderShim> weak_factory_;
56 106
57 DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProviderShim); 107 DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProviderShim);
58 }; 108 };
59 109
60 class MojoRendererApplication 110 class MojoRendererApplication
61 : public mojo::ApplicationDelegate, 111 : public mojo::ApplicationDelegate,
62 public mojo::InterfaceFactory<mojo::MediaRenderer> { 112 public mojo::InterfaceFactory<mojo::MediaRenderer> {
63 public: 113 public:
64 // mojo::ApplicationDelegate implementation. 114 // mojo::ApplicationDelegate implementation.
65 bool ConfigureIncomingConnection( 115 bool ConfigureIncomingConnection(
(...skipping 28 matching lines...) Expand all
94 144
95 scoped_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl( 145 scoped_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl(
96 task_runner, 146 task_runner,
97 audio_renderer_sink_.get(), 147 audio_renderer_sink_.get(),
98 renderer_config->GetAudioDecoders( 148 renderer_config->GetAudioDecoders(
99 task_runner, 149 task_runner,
100 base::Bind(&LogMediaSourceError, media_log)).Pass(), 150 base::Bind(&LogMediaSourceError, media_log)).Pass(),
101 SetDecryptorReadyCB(), 151 SetDecryptorReadyCB(),
102 renderer_config->GetAudioHardwareConfig(), 152 renderer_config->GetAudioHardwareConfig(),
103 media_log)); 153 media_log));
104 scoped_ptr<VideoRenderer> video_renderer(nullptr); 154
155
156 // Create our video decoders and renderer.
157 ScopedVector<VideoDecoder> video_decoders;
158 video_decoders.push_back(new FFmpegVideoDecoder(task_runner));
159
160 scoped_ptr<VideoRenderer> video_renderer(
161 new VideoRendererImpl(task_runner,
162 video_decoders.Pass(),
163 SetDecryptorReadyCB(),
164 base::Bind(&PaintNothingDropEverything),
165 true,
166 media_log));
105 167
106 // Create renderer. 168 // Create renderer.
107 renderer_.reset(new RendererImpl( 169 renderer_.reset(new RendererImpl(
108 task_runner, audio_renderer.Pass(), video_renderer.Pass())); 170 task_runner, audio_renderer.Pass(), video_renderer.Pass()));
109 } 171 }
110 172
111 MojoRendererService::~MojoRendererService() { 173 MojoRendererService::~MojoRendererService() {
112 } 174 }
113 175
114 void MojoRendererService::Initialize(mojo::DemuxerStreamPtr audio, 176 void MojoRendererService::Initialize(mojo::DemuxerStreamPtr audio,
115 mojo::DemuxerStreamPtr video, 177 mojo::DemuxerStreamPtr video,
116 const mojo::Closure& callback) { 178 const mojo::Closure& callback) {
117 DVLOG(1) << __FUNCTION__; 179 DVLOG(1) << __FUNCTION__;
118 DCHECK_EQ(state_, STATE_UNINITIALIZED); 180 DCHECK_EQ(state_, STATE_UNINITIALIZED);
119 DCHECK(client()); 181 DCHECK(client());
120 182
121 state_ = STATE_INITIALIZING; 183 state_ = STATE_INITIALIZING;
122 stream_provider_.reset(new DemuxerStreamProviderShim( 184 stream_provider_.reset(new DemuxerStreamProviderShim(
123 make_scoped_ptr(new MojoDemuxerStreamAdapter( 185 audio.Pass(),
124 audio.Pass(), 186 video.Pass(),
125 base::Bind(&MojoRendererService::OnStreamReady, 187 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback)));
126 weak_this_,
127 callback))).Pass()));
128 } 188 }
129 189
130 void MojoRendererService::Flush(const mojo::Closure& callback) { 190 void MojoRendererService::Flush(const mojo::Closure& callback) {
131 DVLOG(2) << __FUNCTION__; 191 DVLOG(2) << __FUNCTION__;
132 DCHECK_EQ(state_, STATE_PLAYING); 192 DCHECK_EQ(state_, STATE_PLAYING);
133 193
134 state_ = STATE_FLUSHING; 194 state_ = STATE_FLUSHING;
135 renderer_->Flush(base::Bind(&MojoTrampoline, callback)); 195 renderer_->Flush(base::Bind(&MojoTrampoline, callback));
136 } 196 }
137 197
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 state_ = STATE_ERROR; 280 state_ = STATE_ERROR;
221 client()->OnError(); 281 client()->OnError();
222 } 282 }
223 283
224 } // namespace media 284 } // namespace media
225 285
226 MojoResult MojoMain(MojoHandle shell_handle) { 286 MojoResult MojoMain(MojoHandle shell_handle) {
227 mojo::ApplicationRunnerChromium runner(new media::MojoRendererApplication); 287 mojo::ApplicationRunnerChromium runner(new media::MojoRendererApplication);
228 return runner.Run(shell_handle); 288 return runner.Run(shell_handle);
229 } 289 }
OLDNEW
« media/mojo/services/mojo_demuxer_stream_impl.cc ('K') | « media/mojo/services/mojo_renderer_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698