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

Unified Diff: media/mojo/services/mojo_renderer_service.cc

Issue 551963004: media: scaffolding and plumbing for MojoRenderer{Impl, Service} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: media/mojo/services/mojo_renderer_service.cc
diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc
new file mode 100644
index 0000000000000000000000000000000000000000..827b04716e7933011b2e97ca4728a07c2ccbf050
--- /dev/null
+++ b/media/mojo/services/mojo_renderer_service.cc
@@ -0,0 +1,154 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/mojo/services/mojo_renderer_service.h"
+
+#include "base/bind.h"
+#include "base/memory/scoped_vector.h"
+#include "media/base/audio_decoder.h"
+#include "media/base/audio_renderer.h"
+#include "media/base/audio_renderer_sink.h"
+#include "media/base/decryptor.h"
+#include "media/filters/audio_renderer_impl.h"
+#include "media/mojo/services/mojo_demuxer_stream_adapter.h"
+#include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/application_connection.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_runner_chromium.h"
+#include "mojo/public/cpp/application/interface_factory_impl.h"
+
+namespace {
+
+// TODO(tim): We should use |connection| passed to the MojoRendererService
scherkus (not reviewing) 2014/09/09 20:35:33 remove extra space before passed
tim (not reviewing) 2014/09/10 23:08:31 Done.
+// to connect to a MojoAudioRendererSink implementation that we would wrap in
+// media::AudioRendererSink and pass that to the AudioRendererImpl below.
+class DummyAudioRendererSink : public media::AudioRendererSink {
scherkus (not reviewing) 2014/09/09 20:35:33 you might be able to use media::NullAudioSink here
tim (not reviewing) 2014/09/10 23:08:30 Ah thanks!
+ virtual void Initialize(const media::AudioParameters& params,
+ RenderCallback* callback) OVERRIDE {}
+ virtual void Start() OVERRIDE {}
+ virtual void Stop() OVERRIDE {}
+ virtual void Pause() OVERRIDE {}
+ virtual void Play() OVERRIDE {}
+ virtual bool SetVolume(double volume) OVERRIDE {
+ return true;
+ }
+ protected:
+ virtual ~DummyAudioRendererSink() {}
+};
+
+} // namespace
+
+namespace media {
+
+class MojoRendererApplication
+ : public mojo::ApplicationDelegate,
+ public mojo::InterfaceFactory<mojo::MediaRenderer> {
+ public:
+ // mojo::ApplicationDelegate implementation.
+ virtual bool ConfigureIncomingConnection(
+ mojo::ApplicationConnection* connection) OVERRIDE {
+ connection->AddService(this);
+ return true;
+ }
+
+ // mojo::InterfaceFactory<mojo::MediaRenderer> implementation.
+ virtual void Create(
+ mojo::ApplicationConnection* connection,
+ mojo::InterfaceRequest<mojo::MediaRenderer> request) OVERRIDE {
+ mojo::BindToRequest(new MojoRendererService(connection), &request);
+ }
+};
+
+MojoRendererService::MojoRendererService(
+ mojo::ApplicationConnection* connection)
+ : hardware_config_(media::AudioParameters(), media::AudioParameters()),
scherkus (not reviewing) 2014/09/09 20:35:33 remove media:: here and everywhere else
tim (not reviewing) 2014/09/10 23:08:30 Done.
+ weak_factory_(this),
+ weak_this_(weak_factory_.GetWeakPtr()) {
+ audio_renderer_.reset(new media::AudioRendererImpl(
+ base::MessageLoop::current()->task_runner(),
+ new DummyAudioRendererSink(),
+ // TODO(tim): Figure out how to select decoders.
+ ScopedVector<media::AudioDecoder>(),
+ // TODO(tim): Not needed for now?
+ media::SetDecryptorReadyCB(),
+ hardware_config_));
+}
+
+MojoRendererService::~MojoRendererService() {}
+
+void MojoRendererService::Initialize(
+ mojo::DemuxerStreamPtr stream,
+ const mojo::Callback<void()>& callback) {
+ DCHECK(client());
+ stream_.reset(new MojoDemuxerStreamAdapter(stream.Pass(),
+ base::Bind(&MojoRendererService::OnStreamReady, weak_this_)));
+ init_cb_ = callback;;
scherkus (not reviewing) 2014/09/09 20:35:33 remove extra ;
tim (not reviewing) 2014/09/10 23:08:30 Done.
+}
+
+void MojoRendererService::Flush(const mojo::Callback<void()>& callback) {
+ NOTIMPLEMENTED();
+}
+
+void MojoRendererService::StartPlayingFrom(int64_t time_delta_usec) {
+ NOTIMPLEMENTED();
+}
+
+void MojoRendererService::SetPlaybackRate(float playback_rate) {
+ NOTIMPLEMENTED();
+}
+
+void MojoRendererService::SetVolume(float volume) {
+ NOTIMPLEMENTED();
+}
+
+void MojoRendererService::OnStreamReady() {
+ audio_renderer_->Initialize(
+ stream_.get(),
+ base::Bind(&MojoRendererService::OnAudioRendererInitializeDone,
+ weak_this_),
+ base::Bind(&MojoRendererService::OnUpdateStatistics, weak_this_),
+ base::Bind(&MojoRendererService::OnAudioTimeUpdate, weak_this_),
+ base::Bind(&MojoRendererService::OnBufferingStateChanged, weak_this_),
+ base::Bind(&MojoRendererService::OnAudioRendererEnded, weak_this_),
+ base::Bind(&MojoRendererService::OnError, weak_this_));
+}
+
+void MojoRendererService::OnAudioRendererInitializeDone(
+ media::PipelineStatus status) {
+ if (status != media::PIPELINE_OK) {
+ audio_renderer_.reset();
+ client()->OnError();
+ }
+ init_cb_.Run();
+}
+
+void MojoRendererService::OnUpdateStatistics(const PipelineStatistics& stats) {
+ NOTIMPLEMENTED();
+}
+
+void MojoRendererService::OnAudioTimeUpdate(base::TimeDelta time,
+ base::TimeDelta max_time) {
+ client()->OnTimeUpdate(time.InMilliseconds(), max_time.InMilliseconds());
xhwang 2014/09/10 00:00:52 InMicroseconds?
tim (not reviewing) 2014/09/10 23:08:30 Uh oh. Aaaaand here's why it's useful to have a t
+}
+
+void MojoRendererService::OnBufferingStateChanged(
+ media::BufferingState new_buffering_state) {
+ client()->OnBufferingStateChange(
+ static_cast<mojo::BufferingState>(new_buffering_state));
+}
+
+void MojoRendererService::OnAudioRendererEnded() {
+ client()->OnEnded();
+}
+
+void MojoRendererService::OnError(PipelineStatus error) {
+ client()->OnError();
xhwang 2014/09/10 00:00:52 Pass |error| in OnError()?
tim (not reviewing) 2014/09/10 23:08:30 In the last CL I thought you proposed that the ren
+}
+
+} // namespace media
+
+MojoResult MojoMain(MojoHandle shell_handle) {
scherkus (not reviewing) 2014/09/09 20:35:33 does MojoMain() belong here?
tim (not reviewing) 2014/09/10 23:08:30 It typically goes wherever the ApplicationDelegate
+ mojo::ApplicationRunnerChromium runner(new media::MojoRendererApplication);
+ return runner.Run(shell_handle);
+}

Powered by Google App Engine
This is Rietveld 408576698