Commit 9a58997b authored by timav's avatar timav Committed by Commit bot

Connect Mojo AudioDecoder service to the Mojo service factory

The AudioDecoder service is created by MojiMediaClient directly,
without intermediate factory.

BUG=542910

Review URL: https://codereview.chromium.org/1810763002

Cr-Commit-Position: refs/heads/master@{#381643}
parent a3104228
...@@ -67,7 +67,7 @@ scoped_ptr<MediaCodecBridge> CreateMediaCodec( ...@@ -67,7 +67,7 @@ scoped_ptr<MediaCodecBridge> CreateMediaCodec(
} // namespace (anonymous) } // namespace (anonymous)
MediaCodecAudioDecoder::MediaCodecAudioDecoder( MediaCodecAudioDecoder::MediaCodecAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: task_runner_(task_runner), : task_runner_(task_runner),
state_(STATE_UNINITIALIZED), state_(STATE_UNINITIALIZED),
pending_input_buf_index_(kInvalidBufferIndex) { pending_input_buf_index_(kInvalidBufferIndex) {
......
...@@ -103,7 +103,7 @@ class AudioTimestampHelper; ...@@ -103,7 +103,7 @@ class AudioTimestampHelper;
class MEDIA_EXPORT MediaCodecAudioDecoder : public AudioDecoder { class MEDIA_EXPORT MediaCodecAudioDecoder : public AudioDecoder {
public: public:
explicit MediaCodecAudioDecoder( explicit MediaCodecAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~MediaCodecAudioDecoder() override; ~MediaCodecAudioDecoder() override;
// AudioDecoder implementation. // AudioDecoder implementation.
......
...@@ -4,15 +4,19 @@ ...@@ -4,15 +4,19 @@
module media.interfaces; module media.interfaces;
import "media/mojo/interfaces/audio_decoder.mojom";
import "media/mojo/interfaces/content_decryption_module.mojom"; import "media/mojo/interfaces/content_decryption_module.mojom";
import "media/mojo/interfaces/renderer.mojom"; import "media/mojo/interfaces/renderer.mojom";
// A factory interface to create media services. Renderers can only access // A factory interface to create media services. Renderers can only access
// ContentDecryptionModules created in the same factory. // ContentDecryptionModules created in the same factory.
interface ServiceFactory { interface ServiceFactory {
// Creates a ContentDecryptionModule service. // Creates an AudioDecoder service.
CreateCdm(ContentDecryptionModule& cdm); CreateAudioDecoder(AudioDecoder& audio_decoder);
// Creates a Renderer service. // Creates a Renderer service.
CreateRenderer(Renderer& renderer); CreateRenderer(Renderer& renderer);
// Creates a ContentDecryptionModule service.
CreateCdm(ContentDecryptionModule& cdm);
}; };
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "media/mojo/services/android_mojo_media_client.h" #include "media/mojo/services/android_mojo_media_client.h"
#include "media/base/android/android_cdm_factory.h" #include "media/base/android/android_cdm_factory.h"
#include "media/filters/android/media_codec_audio_decoder.h"
#include "media/mojo/interfaces/provision_fetcher.mojom.h" #include "media/mojo/interfaces/provision_fetcher.mojom.h"
#include "media/mojo/services/mojo_provision_fetcher.h" #include "media/mojo/services/mojo_provision_fetcher.h"
#include "mojo/shell/public/cpp/connect.h" #include "mojo/shell/public/cpp/connect.h"
...@@ -28,6 +29,12 @@ AndroidMojoMediaClient::AndroidMojoMediaClient() {} ...@@ -28,6 +29,12 @@ AndroidMojoMediaClient::AndroidMojoMediaClient() {}
AndroidMojoMediaClient::~AndroidMojoMediaClient() {} AndroidMojoMediaClient::~AndroidMojoMediaClient() {}
// MojoMediaClient overrides. // MojoMediaClient overrides.
scoped_ptr<AudioDecoder> AndroidMojoMediaClient::CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
return make_scoped_ptr(new MediaCodecAudioDecoder(task_runner));
}
scoped_ptr<CdmFactory> AndroidMojoMediaClient::CreateCdmFactory( scoped_ptr<CdmFactory> AndroidMojoMediaClient::CreateCdmFactory(
mojo::shell::mojom::InterfaceProvider* interface_provider) { mojo::shell::mojom::InterfaceProvider* interface_provider) {
return make_scoped_ptr(new AndroidCdmFactory( return make_scoped_ptr(new AndroidCdmFactory(
......
...@@ -16,6 +16,9 @@ class AndroidMojoMediaClient : public MojoMediaClient { ...@@ -16,6 +16,9 @@ class AndroidMojoMediaClient : public MojoMediaClient {
~AndroidMojoMediaClient() final; ~AndroidMojoMediaClient() final;
// MojoMediaClient implementation. // MojoMediaClient implementation.
scoped_ptr<AudioDecoder> CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) final;
scoped_ptr<CdmFactory> CreateCdmFactory( scoped_ptr<CdmFactory> CreateCdmFactory(
mojo::shell::mojom::InterfaceProvider* interface_provider) final; mojo::shell::mojom::InterfaceProvider* interface_provider) final;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
namespace media { namespace media {
MojoAudioDecoderService::MojoAudioDecoderService( MojoAudioDecoderService::MojoAudioDecoderService(
scoped_ptr<AudioDecoder> decoder, scoped_ptr<media::AudioDecoder> decoder,
mojo::InterfaceRequest<interfaces::AudioDecoder> request) mojo::InterfaceRequest<interfaces::AudioDecoder> request)
: binding_(this, std::move(request)), decoder_(std::move(decoder)) {} : binding_(this, std::move(request)), decoder_(std::move(decoder)) {}
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "media/base/audio_decoder.h"
#include "media/mojo/interfaces/audio_decoder.mojom.h" #include "media/mojo/interfaces/audio_decoder.mojom.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h"
...@@ -15,7 +16,7 @@ namespace media { ...@@ -15,7 +16,7 @@ namespace media {
class MojoAudioDecoderService : public interfaces::AudioDecoder { class MojoAudioDecoderService : public interfaces::AudioDecoder {
public: public:
MojoAudioDecoderService( MojoAudioDecoderService(
scoped_ptr<AudioDecoder> decoder, scoped_ptr<media::AudioDecoder> decoder,
mojo::InterfaceRequest<interfaces::AudioDecoder> request); mojo::InterfaceRequest<interfaces::AudioDecoder> request);
~MojoAudioDecoderService() final; ~MojoAudioDecoderService() final;
...@@ -37,7 +38,7 @@ class MojoAudioDecoderService : public interfaces::AudioDecoder { ...@@ -37,7 +38,7 @@ class MojoAudioDecoderService : public interfaces::AudioDecoder {
mojo::StrongBinding<interfaces::AudioDecoder> binding_; mojo::StrongBinding<interfaces::AudioDecoder> binding_;
// The AudioDecoder that does actual decoding work. // The AudioDecoder that does actual decoding work.
scoped_ptr<AudioDecoder> decoder_; scoped_ptr<media::AudioDecoder> decoder_;
// The destination for the decoded buffers. // The destination for the decoded buffers.
interfaces::AudioDecoderClientPtr client_; interfaces::AudioDecoderClientPtr client_;
......
...@@ -12,6 +12,11 @@ MojoMediaClient::~MojoMediaClient() {} ...@@ -12,6 +12,11 @@ MojoMediaClient::~MojoMediaClient() {}
void MojoMediaClient::Initialize() {} void MojoMediaClient::Initialize() {}
scoped_ptr<AudioDecoder> MojoMediaClient::CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
return nullptr;
}
scoped_ptr<RendererFactory> MojoMediaClient::CreateRendererFactory( scoped_ptr<RendererFactory> MojoMediaClient::CreateRendererFactory(
const scoped_refptr<MediaLog>& media_log) { const scoped_refptr<MediaLog>& media_log) {
return nullptr; return nullptr;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef MEDIA_MOJO_SERVICES_MOJO_MEDIA_CLIENT_H_ #ifndef MEDIA_MOJO_SERVICES_MOJO_MEDIA_CLIENT_H_
#define MEDIA_MOJO_SERVICES_MOJO_MEDIA_CLIENT_H_ #define MEDIA_MOJO_SERVICES_MOJO_MEDIA_CLIENT_H_
#include "media/base/audio_decoder.h"
#include "media/base/audio_renderer_sink.h" #include "media/base/audio_renderer_sink.h"
#include "media/base/cdm_factory.h" #include "media/base/cdm_factory.h"
#include "media/base/media_log.h" #include "media/base/media_log.h"
...@@ -32,6 +33,9 @@ class MojoMediaClient { ...@@ -32,6 +33,9 @@ class MojoMediaClient {
// Called exactly once before any other method. // Called exactly once before any other method.
virtual void Initialize(); virtual void Initialize();
virtual scoped_ptr<AudioDecoder> CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
// TODO(xhwang): Consider creating Renderer and CDM directly in the client // TODO(xhwang): Consider creating Renderer and CDM directly in the client
// instead of creating factories. See http://crbug.com/586211 // instead of creating factories. See http://crbug.com/586211
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "media/base/cdm_factory.h" #include "media/base/cdm_factory.h"
#include "media/base/media_log.h" #include "media/base/media_log.h"
#include "media/base/renderer_factory.h" #include "media/base/renderer_factory.h"
#include "media/mojo/services/mojo_audio_decoder_service.h"
#include "media/mojo/services/mojo_cdm_service.h" #include "media/mojo/services/mojo_cdm_service.h"
#include "media/mojo/services/mojo_media_client.h" #include "media/mojo/services/mojo_media_client.h"
#include "media/mojo/services/mojo_renderer_service.h" #include "media/mojo/services/mojo_renderer_service.h"
...@@ -34,6 +35,22 @@ ServiceFactoryImpl::~ServiceFactoryImpl() { ...@@ -34,6 +35,22 @@ ServiceFactoryImpl::~ServiceFactoryImpl() {
} }
// interfaces::ServiceFactory implementation. // interfaces::ServiceFactory implementation.
void ServiceFactoryImpl::CreateAudioDecoder(
mojo::InterfaceRequest<interfaces::AudioDecoder> request) {
scoped_refptr<base::SingleThreadTaskRunner> task_runner(
base::MessageLoop::current()->task_runner());
scoped_ptr<AudioDecoder> audio_decoder =
mojo_media_client_->CreateAudioDecoder(task_runner);
if (!audio_decoder) {
LOG(ERROR) << "AudioDecoder creation failed.";
return;
}
new MojoAudioDecoderService(std::move(audio_decoder), std::move(request));
}
void ServiceFactoryImpl::CreateRenderer( void ServiceFactoryImpl::CreateRenderer(
mojo::InterfaceRequest<interfaces::Renderer> request) { mojo::InterfaceRequest<interfaces::Renderer> request) {
// The created object is owned by the pipe. // The created object is owned by the pipe.
......
...@@ -39,6 +39,8 @@ class ServiceFactoryImpl : public interfaces::ServiceFactory { ...@@ -39,6 +39,8 @@ class ServiceFactoryImpl : public interfaces::ServiceFactory {
~ServiceFactoryImpl() final; ~ServiceFactoryImpl() final;
// interfaces::ServiceFactory implementation. // interfaces::ServiceFactory implementation.
void CreateAudioDecoder(
mojo::InterfaceRequest<interfaces::AudioDecoder> audio_decoder) final;
void CreateRenderer( void CreateRenderer(
mojo::InterfaceRequest<interfaces::Renderer> renderer) final; mojo::InterfaceRequest<interfaces::Renderer> renderer) final;
void CreateCdm( void CreateCdm(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment