summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortimav <timav@chromium.org>2016-03-17 18:14:37 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-18 01:15:41 +0000
commitfe54753dafe23379ba6ec9d20d08d1a32b9ecc13 (patch)
treef0a136b7e60f5b09721bb617c43d322cb59aec66
parent23b8e20ccb791a82b3cf1e5432a4b51b3b0ab375 (diff)
downloadchromium_src-fe54753dafe23379ba6ec9d20d08d1a32b9ecc13.zip
chromium_src-fe54753dafe23379ba6ec9d20d08d1a32b9ecc13.tar.gz
chromium_src-fe54753dafe23379ba6ec9d20d08d1a32b9ecc13.tar.bz2
Connect MojoAudioDecoder to the service
MojoAudioDecoder is the client side part of the decoder that runs in the renderer process. This CL connects it to the remote service and propagates the media task runner to it. BUG=542910 Review URL: https://codereview.chromium.org/1797393007 Cr-Commit-Position: refs/heads/master@{#381861}
-rw-r--r--content/renderer/media/media_interface_provider.cc3
-rw-r--r--media/base/decoder_factory.cc4
-rw-r--r--media/base/decoder_factory.h15
-rw-r--r--media/mojo/services/mojo_audio_decoder.cc17
-rw-r--r--media/mojo/services/mojo_audio_decoder.h5
-rw-r--r--media/mojo/services/mojo_decoder_factory.cc13
-rw-r--r--media/mojo/services/mojo_decoder_factory.h8
-rw-r--r--media/renderers/default_renderer_factory.cc4
8 files changed, 56 insertions, 13 deletions
diff --git a/content/renderer/media/media_interface_provider.cc b/content/renderer/media/media_interface_provider.cc
index 288613b..e19723a 100644
--- a/content/renderer/media/media_interface_provider.cc
+++ b/content/renderer/media/media_interface_provider.cc
@@ -34,6 +34,9 @@ void MediaInterfaceProvider::GetInterface(const mojo::String& interface_name,
} else if (interface_name == media::interfaces::Renderer::Name_) {
GetMediaServiceFactory()->CreateRenderer(
mojo::MakeRequest<media::interfaces::Renderer>(std::move(pipe)));
+ } else if (interface_name == media::interfaces::AudioDecoder::Name_) {
+ GetMediaServiceFactory()->CreateAudioDecoder(
+ mojo::MakeRequest<media::interfaces::AudioDecoder>(std::move(pipe)));
} else {
NOTREACHED();
}
diff --git a/media/base/decoder_factory.cc b/media/base/decoder_factory.cc
index 8fa99ae..c9fe057 100644
--- a/media/base/decoder_factory.cc
+++ b/media/base/decoder_factory.cc
@@ -4,6 +4,8 @@
#include "media/base/decoder_factory.h"
+#include "base/single_thread_task_runner.h"
+
namespace media {
DecoderFactory::DecoderFactory() {}
@@ -11,9 +13,11 @@ DecoderFactory::DecoderFactory() {}
DecoderFactory::~DecoderFactory() {}
void DecoderFactory::CreateAudioDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
ScopedVector<AudioDecoder>* audio_decoders) {}
void DecoderFactory::CreateVideoDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
ScopedVector<VideoDecoder>* video_decoders) {}
} // namespace media
diff --git a/media/base/decoder_factory.h b/media/base/decoder_factory.h
index 21d66d2..9ae3f1b 100644
--- a/media/base/decoder_factory.h
+++ b/media/base/decoder_factory.h
@@ -6,9 +6,14 @@
#define MEDIA_BASE_DECODER_FACTORY_H_
#include "base/macros.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_vector.h"
#include "media/base/media_export.h"
+namespace base {
+class SingleThreadTaskRunner;
+}
+
namespace media {
class AudioDecoder;
@@ -21,10 +26,16 @@ class MEDIA_EXPORT DecoderFactory {
virtual ~DecoderFactory();
// Creates audio decoders and append them to the end of |audio_decoders|.
- virtual void CreateAudioDecoders(ScopedVector<AudioDecoder>* audio_decoders);
+ // Decoders are single-threaded, each decoder should run on |task_runner|.
+ virtual void CreateAudioDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ ScopedVector<AudioDecoder>* audio_decoders);
// Creates video decoders and append them to the end of |video_decoders|.
- virtual void CreateVideoDecoders(ScopedVector<VideoDecoder>* video_decoders);
+ // Decoders are single-threaded, each decoder should run on |task_runner|.
+ virtual void CreateVideoDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ ScopedVector<VideoDecoder>* video_decoders);
private:
DISALLOW_COPY_AND_ASSIGN(DecoderFactory);
diff --git a/media/mojo/services/mojo_audio_decoder.cc b/media/mojo/services/mojo_audio_decoder.cc
index 14a7a00..1c6ad0c 100644
--- a/media/mojo/services/mojo_audio_decoder.cc
+++ b/media/mojo/services/mojo_audio_decoder.cc
@@ -12,7 +12,10 @@
namespace media {
-MojoAudioDecoder::MojoAudioDecoder() {
+MojoAudioDecoder::MojoAudioDecoder(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ interfaces::AudioDecoderPtr remote_decoder)
+ : task_runner_(task_runner), remote_decoder_(std::move(remote_decoder)) {
DVLOG(1) << __FUNCTION__;
}
@@ -29,17 +32,19 @@ void MojoAudioDecoder::Initialize(const AudioDecoderConfig& config,
const InitCB& init_cb,
const OutputCB& output_cb) {
DVLOG(1) << __FUNCTION__;
- task_runner_ = base::ThreadTaskRunnerHandle::Get();
+ DCHECK(task_runner_->BelongsToCurrentThread());
NOTIMPLEMENTED();
- // Pretend to be able to decode anything.
- task_runner_->PostTask(FROM_HERE, base::Bind(init_cb, true));
+ // Fail initialization while not implemented.
+ task_runner_->PostTask(FROM_HERE, base::Bind(init_cb, false));
}
void MojoAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
const DecodeCB& decode_cb) {
DVLOG(3) << __FUNCTION__;
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
NOTIMPLEMENTED();
// Actually we can't decode anything.
@@ -48,11 +53,15 @@ void MojoAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
void MojoAudioDecoder::Reset(const base::Closure& closure) {
DVLOG(2) << __FUNCTION__;
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
NOTIMPLEMENTED();
}
bool MojoAudioDecoder::NeedsBitstreamConversion() const {
DVLOG(1) << __FUNCTION__;
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
NOTIMPLEMENTED();
return false;
}
diff --git a/media/mojo/services/mojo_audio_decoder.h b/media/mojo/services/mojo_audio_decoder.h
index c055e0e..eba5e75 100644
--- a/media/mojo/services/mojo_audio_decoder.h
+++ b/media/mojo/services/mojo_audio_decoder.h
@@ -8,6 +8,7 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "media/base/audio_decoder.h"
+#include "media/mojo/interfaces/audio_decoder.mojom.h"
namespace base {
class SingleThreadTaskRunner;
@@ -18,7 +19,8 @@ namespace media {
// An AudioDecoder that proxies to an interfaces::AudioDecoder.
class MojoAudioDecoder : public AudioDecoder {
public:
- MojoAudioDecoder();
+ MojoAudioDecoder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ interfaces::AudioDecoderPtr remote_decoder);
~MojoAudioDecoder() final;
// AudioDecoder implementation.
@@ -34,6 +36,7 @@ class MojoAudioDecoder : public AudioDecoder {
private:
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+ interfaces::AudioDecoderPtr remote_decoder_;
DISALLOW_COPY_AND_ASSIGN(MojoAudioDecoder);
};
diff --git a/media/mojo/services/mojo_decoder_factory.cc b/media/mojo/services/mojo_decoder_factory.cc
index 390a55c..4b94914 100644
--- a/media/mojo/services/mojo_decoder_factory.cc
+++ b/media/mojo/services/mojo_decoder_factory.cc
@@ -4,8 +4,11 @@
#include "media/mojo/services/mojo_decoder_factory.h"
+#include "base/single_thread_task_runner.h"
+#include "media/mojo/interfaces/audio_decoder.mojom.h"
#include "media/mojo/services/mojo_audio_decoder.h"
#include "media/mojo/services/mojo_video_decoder.h"
+#include "mojo/shell/public/cpp/connect.h"
namespace media {
@@ -18,14 +21,20 @@ MojoDecoderFactory::MojoDecoderFactory(
MojoDecoderFactory::~MojoDecoderFactory() {}
void MojoDecoderFactory::CreateAudioDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
ScopedVector<AudioDecoder>* audio_decoders) {
#if defined(ENABLE_MOJO_AUDIO_DECODER)
- // TODO(xhwang): Connect to mojo audio decoder service and pass it here.
- audio_decoders->push_back(new media::MojoAudioDecoder());
+ interfaces::AudioDecoderPtr audio_decoder_ptr;
+ mojo::GetInterface<interfaces::AudioDecoder>(interface_provider_,
+ &audio_decoder_ptr);
+
+ audio_decoders->push_back(
+ new media::MojoAudioDecoder(task_runner, std::move(audio_decoder_ptr)));
#endif
}
void MojoDecoderFactory::CreateVideoDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
ScopedVector<VideoDecoder>* video_decoders) {
#if defined(ENABLE_MOJO_VIDEO_DECODER)
// TODO(sandersd): Connect to mojo video decoder service and pass it here.
diff --git a/media/mojo/services/mojo_decoder_factory.h b/media/mojo/services/mojo_decoder_factory.h
index a11ba86..98e12a9 100644
--- a/media/mojo/services/mojo_decoder_factory.h
+++ b/media/mojo/services/mojo_decoder_factory.h
@@ -17,9 +17,13 @@ class MojoDecoderFactory : public DecoderFactory {
mojo::shell::mojom::InterfaceProvider* interface_provider);
~MojoDecoderFactory() final;
- void CreateAudioDecoders(ScopedVector<AudioDecoder>* audio_decoders) final;
+ void CreateAudioDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ ScopedVector<AudioDecoder>* audio_decoders) final;
- void CreateVideoDecoders(ScopedVector<VideoDecoder>* video_decoders) final;
+ void CreateVideoDecoders(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ ScopedVector<VideoDecoder>* video_decoders) final;
private:
mojo::shell::mojom::InterfaceProvider* interface_provider_;
diff --git a/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc
index f1530d6..e09f90e 100644
--- a/media/renderers/default_renderer_factory.cc
+++ b/media/renderers/default_renderer_factory.cc
@@ -59,7 +59,7 @@ ScopedVector<AudioDecoder> DefaultRendererFactory::CreateAudioDecoders(
// Use an external decoder only if we cannot otherwise decode in the
// renderer.
if (decoder_factory_)
- decoder_factory_->CreateAudioDecoders(&audio_decoders);
+ decoder_factory_->CreateAudioDecoders(media_task_runner, &audio_decoders);
return audio_decoders;
}
@@ -74,7 +74,7 @@ ScopedVector<VideoDecoder> DefaultRendererFactory::CreateVideoDecoders(
// Prefer an external decoder since one will only exist if it is hardware
// accelerated.
if (decoder_factory_)
- decoder_factory_->CreateVideoDecoders(&video_decoders);
+ decoder_factory_->CreateVideoDecoders(media_task_runner, &video_decoders);
// |gpu_factories_| requires that its entry points be called on its
// |GetTaskRunner()|. Since |pipeline_| will own decoders created from the