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(
} // namespace (anonymous)
MediaCodecAudioDecoder::MediaCodecAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: task_runner_(task_runner),
state_(STATE_UNINITIALIZED),
pending_input_buf_index_(kInvalidBufferIndex) {
......
......@@ -103,7 +103,7 @@ class AudioTimestampHelper;
class MEDIA_EXPORT MediaCodecAudioDecoder : public AudioDecoder {
public:
explicit MediaCodecAudioDecoder(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~MediaCodecAudioDecoder() override;
// AudioDecoder implementation.
......
......@@ -4,15 +4,19 @@
module media.interfaces;
import "media/mojo/interfaces/audio_decoder.mojom";
import "media/mojo/interfaces/content_decryption_module.mojom";
import "media/mojo/interfaces/renderer.mojom";
// A factory interface to create media services. Renderers can only access
// ContentDecryptionModules created in the same factory.
interface ServiceFactory {
// Creates a ContentDecryptionModule service.
CreateCdm(ContentDecryptionModule& cdm);
// Creates an AudioDecoder service.
CreateAudioDecoder(AudioDecoder& audio_decoder);
// Creates a Renderer service.
CreateRenderer(Renderer& renderer);
// Creates a ContentDecryptionModule service.
CreateCdm(ContentDecryptionModule& cdm);
};
......@@ -5,6 +5,7 @@
#include "media/mojo/services/android_mojo_media_client.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/services/mojo_provision_fetcher.h"
#include "mojo/shell/public/cpp/connect.h"
......@@ -28,6 +29,12 @@ AndroidMojoMediaClient::AndroidMojoMediaClient() {}
AndroidMojoMediaClient::~AndroidMojoMediaClient() {}
// 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(
mojo::shell::mojom::InterfaceProvider* interface_provider) {
return make_scoped_ptr(new AndroidCdmFactory(
......
......@@ -16,6 +16,9 @@ class AndroidMojoMediaClient : public MojoMediaClient {
~AndroidMojoMediaClient() final;
// MojoMediaClient implementation.
scoped_ptr<AudioDecoder> CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) final;
scoped_ptr<CdmFactory> CreateCdmFactory(
mojo::shell::mojom::InterfaceProvider* interface_provider) final;
......
......@@ -8,7 +8,7 @@
namespace media {
MojoAudioDecoderService::MojoAudioDecoderService(
scoped_ptr<AudioDecoder> decoder,
scoped_ptr<media::AudioDecoder> decoder,
mojo::InterfaceRequest<interfaces::AudioDecoder> request)
: binding_(this, std::move(request)), decoder_(std::move(decoder)) {}
......
......@@ -7,6 +7,7 @@
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "media/base/audio_decoder.h"
#include "media/mojo/interfaces/audio_decoder.mojom.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
......@@ -15,7 +16,7 @@ namespace media {
class MojoAudioDecoderService : public interfaces::AudioDecoder {
public:
MojoAudioDecoderService(
scoped_ptr<AudioDecoder> decoder,
scoped_ptr<media::AudioDecoder> decoder,
mojo::InterfaceRequest<interfaces::AudioDecoder> request);
~MojoAudioDecoderService() final;
......@@ -37,7 +38,7 @@ class MojoAudioDecoderService : public interfaces::AudioDecoder {
mojo::StrongBinding<interfaces::AudioDecoder> binding_;
// The AudioDecoder that does actual decoding work.
scoped_ptr<AudioDecoder> decoder_;
scoped_ptr<media::AudioDecoder> decoder_;
// The destination for the decoded buffers.
interfaces::AudioDecoderClientPtr client_;
......
......@@ -12,6 +12,11 @@ MojoMediaClient::~MojoMediaClient() {}
void MojoMediaClient::Initialize() {}
scoped_ptr<AudioDecoder> MojoMediaClient::CreateAudioDecoder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
return nullptr;
}
scoped_ptr<RendererFactory> MojoMediaClient::CreateRendererFactory(
const scoped_refptr<MediaLog>& media_log) {
return nullptr;
......
......@@ -5,6 +5,7 @@
#ifndef 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/cdm_factory.h"
#include "media/base/media_log.h"
......@@ -32,6 +33,9 @@ class MojoMediaClient {
// Called exactly once before any other method.
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
// instead of creating factories. See http://crbug.com/586211
......
......@@ -8,6 +8,7 @@
#include "media/base/cdm_factory.h"
#include "media/base/media_log.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_media_client.h"
#include "media/mojo/services/mojo_renderer_service.h"
......@@ -34,6 +35,22 @@ ServiceFactoryImpl::~ServiceFactoryImpl() {
}
// 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(
mojo::InterfaceRequest<interfaces::Renderer> request) {
// The created object is owned by the pipe.
......
......@@ -39,6 +39,8 @@ class ServiceFactoryImpl : public interfaces::ServiceFactory {
~ServiceFactoryImpl() final;
// interfaces::ServiceFactory implementation.
void CreateAudioDecoder(
mojo::InterfaceRequest<interfaces::AudioDecoder> audio_decoder) final;
void CreateRenderer(
mojo::InterfaceRequest<interfaces::Renderer> renderer) final;
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