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

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: More MSVC... 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
« no previous file with comments | « media/mojo/services/mojo_renderer_service.h ('k') | media/mojo/services/renderer_config.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/video_renderer.h" 15 #include "media/base/video_renderer.h"
16 #include "media/filters/audio_renderer_impl.h" 16 #include "media/filters/audio_renderer_impl.h"
17 #include "media/filters/renderer_impl.h" 17 #include "media/filters/renderer_impl.h"
18 #include "media/filters/video_renderer_impl.h"
19 #include "media/mojo/services/demuxer_stream_provider_shim.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
26 namespace media { 28 namespace media {
27 29
28 // Time interval to update media time. 30 // Time interval to update media time.
29 const int kTimeUpdateIntervalMs = 50; 31 const int kTimeUpdateIntervalMs = 50;
30 32
31 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, 33 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log,
32 const std::string& error) { 34 const std::string& error) {
33 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); 35 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
34 } 36 }
35 37
36 // Shim DemuxerStreamProvider wrapper for a single DemuxerStream. 38 static void PaintNothing(const scoped_refptr<VideoFrame>& frame) {
37 // TODO(dalecurtis): Once we support more than one DemuxerStream we'll need a 39 }
38 // more complicated shim which can handle a mojo::Array<DemuxerStream>.
39 class DemuxerStreamProviderShim : public DemuxerStreamProvider {
40 public:
41 DemuxerStreamProviderShim(scoped_ptr<MojoDemuxerStreamAdapter> stream)
42 : stream_(stream.Pass()) {}
43
44 ~DemuxerStreamProviderShim() override {}
45
46 DemuxerStream* GetStream(DemuxerStream::Type type) override {
47 return type != stream_->type() ? nullptr : stream_.get();
48 };
49
50 Liveness GetLiveness() const override {
51 return DemuxerStreamProvider::LIVENESS_UNKNOWN;
52 }
53
54 private:
55 scoped_ptr<MojoDemuxerStreamAdapter> stream_;
56
57 DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProviderShim);
58 };
59 40
60 class MojoRendererApplication 41 class MojoRendererApplication
61 : public mojo::ApplicationDelegate, 42 : public mojo::ApplicationDelegate,
62 public mojo::InterfaceFactory<mojo::MediaRenderer> { 43 public mojo::InterfaceFactory<mojo::MediaRenderer> {
63 public: 44 public:
64 // mojo::ApplicationDelegate implementation. 45 // mojo::ApplicationDelegate implementation.
65 bool ConfigureIncomingConnection( 46 bool ConfigureIncomingConnection(
66 mojo::ApplicationConnection* connection) override { 47 mojo::ApplicationConnection* connection) override {
67 connection->AddService(this); 48 connection->AddService(this);
68 return true; 49 return true;
(...skipping 26 matching lines...) Expand all
95 76
96 scoped_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl( 77 scoped_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl(
97 task_runner, 78 task_runner,
98 audio_renderer_sink_.get(), 79 audio_renderer_sink_.get(),
99 renderer_config->GetAudioDecoders( 80 renderer_config->GetAudioDecoders(
100 task_runner, 81 task_runner,
101 base::Bind(&LogMediaSourceError, media_log)).Pass(), 82 base::Bind(&LogMediaSourceError, media_log)).Pass(),
102 SetDecryptorReadyCB(), 83 SetDecryptorReadyCB(),
103 renderer_config->GetAudioHardwareConfig(), 84 renderer_config->GetAudioHardwareConfig(),
104 media_log)); 85 media_log));
105 scoped_ptr<VideoRenderer> video_renderer(nullptr); 86
87 scoped_ptr<VideoRenderer> video_renderer(new VideoRendererImpl(
88 task_runner,
89 renderer_config->GetVideoDecoders(
90 task_runner,
91 base::Bind(&LogMediaSourceError, media_log)).Pass(),
92 SetDecryptorReadyCB(),
93 base::Bind(&PaintNothing),
94 true,
95 media_log));
106 96
107 // Create renderer. 97 // Create renderer.
108 renderer_.reset(new RendererImpl( 98 renderer_.reset(new RendererImpl(
109 task_runner, audio_renderer.Pass(), video_renderer.Pass())); 99 task_runner, audio_renderer.Pass(), video_renderer.Pass()));
110 } 100 }
111 101
112 MojoRendererService::~MojoRendererService() { 102 MojoRendererService::~MojoRendererService() {
113 } 103 }
114 104
115 void MojoRendererService::Initialize(mojo::DemuxerStreamPtr stream, 105 void MojoRendererService::Initialize(mojo::DemuxerStreamPtr audio,
106 mojo::DemuxerStreamPtr video,
116 const mojo::Closure& callback) { 107 const mojo::Closure& callback) {
117 DVLOG(1) << __FUNCTION__; 108 DVLOG(1) << __FUNCTION__;
118 DCHECK_EQ(state_, STATE_UNINITIALIZED); 109 DCHECK_EQ(state_, STATE_UNINITIALIZED);
119 DCHECK(client()); 110 DCHECK(client());
120 111
121 state_ = STATE_INITIALIZING; 112 state_ = STATE_INITIALIZING;
122 stream_provider_.reset(new DemuxerStreamProviderShim( 113 stream_provider_.reset(new DemuxerStreamProviderShim(
123 make_scoped_ptr(new MojoDemuxerStreamAdapter( 114 audio.Pass(),
124 stream.Pass(), 115 video.Pass(),
125 base::Bind(&MojoRendererService::OnStreamReady, 116 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback)));
126 weak_this_,
127 callback))).Pass()));
128 } 117 }
129 118
130 void MojoRendererService::Flush(const mojo::Closure& callback) { 119 void MojoRendererService::Flush(const mojo::Closure& callback) {
131 DVLOG(2) << __FUNCTION__; 120 DVLOG(2) << __FUNCTION__;
132 DCHECK_EQ(state_, STATE_PLAYING); 121 DCHECK_EQ(state_, STATE_PLAYING);
133 122
134 state_ = STATE_FLUSHING; 123 state_ = STATE_FLUSHING;
135 time_update_timer_.Reset(); 124 time_update_timer_.Reset();
136 renderer_->Flush(base::Bind(&MojoTrampoline, callback)); 125 renderer_->Flush(base::Bind(&MojoTrampoline, callback));
137 } 126 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 state_ = STATE_ERROR; 207 state_ = STATE_ERROR;
219 client()->OnError(); 208 client()->OnError();
220 } 209 }
221 210
222 } // namespace media 211 } // namespace media
223 212
224 MojoResult MojoMain(MojoHandle shell_handle) { 213 MojoResult MojoMain(MojoHandle shell_handle) {
225 mojo::ApplicationRunnerChromium runner(new media::MojoRendererApplication); 214 mojo::ApplicationRunnerChromium runner(new media::MojoRendererApplication);
226 return runner.Run(shell_handle); 215 return runner.Run(shell_handle);
227 } 216 }
OLDNEW
« no previous file with comments | « media/mojo/services/mojo_renderer_service.h ('k') | media/mojo/services/renderer_config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698