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

Unified 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, 2 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
index d7e43703f0e60a33e42356f05ca8fce8ba2da7b7..0f27f48d25bdb72de7dbdea8550745a620bf15d2 100644
--- a/media/mojo/services/mojo_renderer_service.cc
+++ b/media/mojo/services/mojo_renderer_service.cc
@@ -12,9 +12,11 @@
#include "media/base/audio_renderer_sink.h"
#include "media/base/decryptor.h"
#include "media/base/media_log.h"
+#include "media/base/serial_runner.h"
xhwang 2014/10/29 00:22:13 not used?
DaleCurtis 2014/10/30 23:16:56 Done.
#include "media/base/video_renderer.h"
#include "media/filters/audio_renderer_impl.h"
#include "media/filters/renderer_impl.h"
+#include "media/filters/video_renderer_impl.h"
#include "media/mojo/services/mojo_demuxer_stream_adapter.h"
#include "media/mojo/services/renderer_config.h"
#include "mojo/application/application_runner_chromium.h"
@@ -23,6 +25,9 @@
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/interface_factory_impl.h"
+// TODO(dalecurtis): Put this in renderer config.
+#include "media/filters/ffmpeg_video_decoder.h"
+
namespace media {
// Time interval to update media time.
@@ -33,26 +38,71 @@ static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log,
media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
}
+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.
+}
+
// Shim DemuxerStreamProvider wrapper for a single DemuxerStream.
// TODO(dalecurtis): Once we support more than one DemuxerStream we'll need a
// more complicated shim which can handle a mojo::Array<DemuxerStream>.
+// TODO(dalecurtis): This should probably be in its own file now.
class DemuxerStreamProviderShim : public DemuxerStreamProvider {
public:
- DemuxerStreamProviderShim(scoped_ptr<MojoDemuxerStreamAdapter> stream)
- : stream_(stream.Pass()) {}
+ DemuxerStreamProviderShim(mojo::DemuxerStreamPtr audio,
+ mojo::DemuxerStreamPtr video,
+ const base::Closure& demuxer_ready_cb)
+ : demuxer_ready_cb_(demuxer_ready_cb),
+ streams_ready_(0),
+ weak_factory_(this) {
+ DCHECK(audio || video);
+ DCHECK(!demuxer_ready_cb_.is_null());
+
+ if (audio) {
+ streams_.push_back(new MojoDemuxerStreamAdapter(
+ audio.Pass(),
+ base::Bind(&DemuxerStreamProviderShim::OnStreamReady,
+ weak_factory_.GetWeakPtr()),
+ DemuxerStream::AUDIO));
+ }
+
+ if (video) {
+ streams_.push_back(new MojoDemuxerStreamAdapter(
+ video.Pass(),
+ base::Bind(&DemuxerStreamProviderShim::OnStreamReady,
+ weak_factory_.GetWeakPtr()),
+ DemuxerStream::VIDEO));
+ }
xhwang 2014/10/29 00:22:13 see above comments
DaleCurtis 2014/10/30 23:16:56 Moved out.
+ }
~DemuxerStreamProviderShim() override {}
DemuxerStream* GetStream(DemuxerStream::Type type) override {
- return type != stream_->type() ? nullptr : stream_.get();
- };
+ DCHECK(demuxer_ready_cb_.is_null());
+ for (auto* stream : streams_) {
+ if (stream->type() == type)
+ return stream;
+ }
+
+ return nullptr;
+ }
Liveness GetLiveness() const override {
+ // 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.
return DemuxerStreamProvider::LIVENESS_UNKNOWN;
}
private:
- scoped_ptr<MojoDemuxerStreamAdapter> stream_;
+ void OnStreamReady() {
+ if (++streams_ready_ == streams_.size()) {
xhwang 2014/10/29 00:22:13 I like this!
+ demuxer_ready_cb_.Run();
+ 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.
+ }
+ }
+
+ base::Closure demuxer_ready_cb_;
+ ScopedVector<MojoDemuxerStreamAdapter> streams_;
+ size_t streams_ready_;
+
+ base::WeakPtrFactory<DemuxerStreamProviderShim> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProviderShim);
};
@@ -101,7 +151,19 @@ MojoRendererService::MojoRendererService(
SetDecryptorReadyCB(),
renderer_config->GetAudioHardwareConfig(),
media_log));
- scoped_ptr<VideoRenderer> video_renderer(nullptr);
+
+
+ // Create our video decoders and renderer.
+ ScopedVector<VideoDecoder> video_decoders;
+ video_decoders.push_back(new FFmpegVideoDecoder(task_runner));
+
+ scoped_ptr<VideoRenderer> video_renderer(
+ new VideoRendererImpl(task_runner,
+ video_decoders.Pass(),
+ SetDecryptorReadyCB(),
+ base::Bind(&PaintNothingDropEverything),
+ true,
+ media_log));
// Create renderer.
renderer_.reset(new RendererImpl(
@@ -120,11 +182,9 @@ void MojoRendererService::Initialize(mojo::DemuxerStreamPtr audio,
state_ = STATE_INITIALIZING;
stream_provider_.reset(new DemuxerStreamProviderShim(
- make_scoped_ptr(new MojoDemuxerStreamAdapter(
- audio.Pass(),
- base::Bind(&MojoRendererService::OnStreamReady,
- weak_this_,
- callback))).Pass()));
+ audio.Pass(),
+ video.Pass(),
+ base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback)));
}
void MojoRendererService::Flush(const mojo::Closure& callback) {
« 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