1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "mojo/services/html_viewer/webmediaplayer_factory.h" 6 7 #include "base/files/file_path.h" 8 #include "base/path_service.h" 9 #include "base/threading/thread.h" 10 #include "media/audio/audio_manager.h" 11 #include "media/audio/audio_manager_base.h" 12 #include "media/audio/null_audio_sink.h" 13 #include "media/base/audio_hardware_config.h" 14 #include "media/base/media.h" 15 #include "media/base/media_log.h" 16 #include "media/blink/null_encrypted_media_player_support.h" 17 #include "media/blink/webmediaplayer_impl.h" 18 #include "media/blink/webmediaplayer_params.h" 19 #include "media/filters/gpu_video_accelerator_factories.h" 20 21 namespace mojo { 22 23 WebMediaPlayerFactory::WebMediaPlayerFactory( 24 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner) 25 : compositor_task_runner_(compositor_task_runner), 26 media_thread_("Media"), 27 audio_manager_(media::AudioManager::Create(&fake_audio_log_factory_)), 28 audio_hardware_config_( 29 audio_manager_->GetInputStreamParameters( 30 media::AudioManagerBase::kDefaultDeviceId), 31 audio_manager_->GetDefaultOutputStreamParameters()) { 32 33 if (!media::IsMediaLibraryInitialized()) { 34 base::FilePath module_dir; 35 CHECK(PathService::Get(base::DIR_EXE, &module_dir)); 36 CHECK(media::InitializeMediaLibrary(module_dir)); 37 } 38 } 39 40 WebMediaPlayerFactory::~WebMediaPlayerFactory() { 41 } 42 43 blink::WebMediaPlayer* WebMediaPlayerFactory::CreateMediaPlayer( 44 blink::WebLocalFrame* frame, 45 const blink::WebURL& url, 46 blink::WebMediaPlayerClient* client) { 47 #if defined(OS_ANDROID) 48 return NULL; 49 #else 50 51 media::WebMediaPlayerParams params( 52 media::WebMediaPlayerParams::DeferLoadCB(), 53 CreateAudioRendererSink(), 54 GetAudioHardwareConfig(), 55 new media::MediaLog(), 56 scoped_refptr<media::GpuVideoAcceleratorFactories>(), 57 GetMediaThreadTaskRunner(), 58 compositor_task_runner_, 59 base::Bind(&media::NullEncryptedMediaPlayerSupport::Create), 60 NULL); 61 base::WeakPtr<media::WebMediaPlayerDelegate> delegate; 62 63 return new media::WebMediaPlayerImpl(frame, client, delegate, params); 64 #endif 65 } 66 67 const media::AudioHardwareConfig& 68 WebMediaPlayerFactory::GetAudioHardwareConfig() { 69 return audio_hardware_config_; 70 } 71 72 scoped_refptr<media::AudioRendererSink> 73 WebMediaPlayerFactory::CreateAudioRendererSink() { 74 // TODO(acolwell): Replace this with an AudioRendererSink implementation 75 // that actually talks to the audio device or an audio mojo service. 76 return new media::NullAudioSink(GetMediaThreadTaskRunner()); 77 } 78 79 scoped_refptr<base::SingleThreadTaskRunner> 80 WebMediaPlayerFactory::GetMediaThreadTaskRunner() { 81 if (!media_thread_.IsRunning()) 82 media_thread_.Start(); 83 84 return media_thread_.message_loop_proxy(); 85 } 86 87 } // namespace mojo 88