Index: media/gpu/ipc/service/gpu_video_encode_accelerator.cc |
diff --git a/media/gpu/ipc/service/gpu_video_encode_accelerator.cc b/media/gpu/ipc/service/gpu_video_encode_accelerator.cc |
index 533e2cd95de4ed3640239454d8f7c89de8e65849..27c24b52f7ec9942223fffedec09d581a5e98e2b 100644 |
--- a/media/gpu/ipc/service/gpu_video_encode_accelerator.cc |
+++ b/media/gpu/ipc/service/gpu_video_encode_accelerator.cc |
@@ -22,25 +22,10 @@ |
#include "media/base/limits.h" |
#include "media/base/video_frame.h" |
#include "media/gpu/gpu_video_accelerator_util.h" |
+#include "media/gpu/gpu_video_encode_accelerator_factory.h" |
#include "media/gpu/ipc/common/media_messages.h" |
#include "media/media_features.h" |
-#if defined(OS_CHROMEOS) |
-#if defined(USE_V4L2_CODEC) |
-#include "media/gpu/v4l2_video_encode_accelerator.h" |
-#endif |
-#if defined(ARCH_CPU_X86_FAMILY) |
-#include "media/gpu/vaapi_video_encode_accelerator.h" |
-#endif |
-#elif defined(OS_ANDROID) && BUILDFLAG(ENABLE_WEBRTC) |
-#include "media/gpu/android_video_encode_accelerator.h" |
-#elif defined(OS_MACOSX) |
-#include "media/gpu/vt_video_encode_accelerator_mac.h" |
-#elif defined(OS_WIN) |
-#include "base/feature_list.h" |
-#include "media/base/media_switches.h" |
-#include "media/gpu/media_foundation_video_encode_accelerator_win.h" |
-#endif |
namespace media { |
@@ -65,44 +50,6 @@ void DropSharedMemory(std::unique_ptr<base::SharedMemory> shm) { |
// Just let |shm| fall out of scope. |
} |
-#if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
-std::unique_ptr<VideoEncodeAccelerator> CreateV4L2VEA() { |
- scoped_refptr<V4L2Device> device = V4L2Device::Create(); |
- if (!device) |
- return nullptr; |
- return base::WrapUnique<VideoEncodeAccelerator>( |
- new V4L2VideoEncodeAccelerator(device)); |
-} |
-#endif |
- |
-#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
-std::unique_ptr<VideoEncodeAccelerator> CreateVaapiVEA() { |
- return base::WrapUnique<VideoEncodeAccelerator>( |
- new VaapiVideoEncodeAccelerator()); |
-} |
-#endif |
- |
-#if defined(OS_ANDROID) && BUILDFLAG(ENABLE_WEBRTC) |
-std::unique_ptr<VideoEncodeAccelerator> CreateAndroidVEA() { |
- return base::WrapUnique<VideoEncodeAccelerator>( |
- new AndroidVideoEncodeAccelerator()); |
-} |
-#endif |
- |
-#if defined(OS_MACOSX) |
-std::unique_ptr<VideoEncodeAccelerator> CreateVTVEA() { |
- return base::WrapUnique<VideoEncodeAccelerator>( |
- new VTVideoEncodeAccelerator()); |
-} |
-#endif |
- |
-#if defined(OS_WIN) |
-std::unique_ptr<VideoEncodeAccelerator> CreateMediaFoundationVEA() { |
- return base::WrapUnique<media::VideoEncodeAccelerator>( |
- new MediaFoundationVideoEncodeAccelerator()); |
-} |
-#endif |
- |
} // anonymous namespace |
class GpuVideoEncodeAccelerator::MessageFilter : public IPC::MessageFilter { |
@@ -219,35 +166,30 @@ bool GpuVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, |
const gpu::GpuPreferences& gpu_preferences = |
stub_->channel()->gpu_channel_manager()->gpu_preferences(); |
- // Try all possible encoders and use the first successful encoder. |
- for (const auto& factory_function : GetVEAFactoryFunctions(gpu_preferences)) { |
- encoder_ = factory_function.Run(); |
- if (encoder_ && |
- encoder_->Initialize(input_format, input_visible_size, output_profile, |
- initial_bitrate, this)) { |
- input_format_ = input_format; |
- input_visible_size_ = input_visible_size; |
- // Attempt to set up performing encoding tasks on IO thread, if supported |
- // by the VEA. |
- if (encoder_->TryToSetupEncodeOnSeparateThread( |
- weak_this_factory_.GetWeakPtr(), io_task_runner_)) { |
- filter_ = new MessageFilter(this, host_route_id_); |
- stub_->channel()->AddFilter(filter_.get()); |
- encode_task_runner_ = io_task_runner_; |
- } |
- |
- if (!encoder_worker_thread_.Start()) { |
- DLOG(ERROR) << "Failed spawning encoder worker thread."; |
- return false; |
- } |
- encoder_worker_task_runner_ = encoder_worker_thread_.task_runner(); |
- |
- return true; |
- } |
+ GpuVideoEncodeAcceleratorFactory factory; |
+ encoder_ = factory.CreateVEA(input_format, input_visible_size, output_profile, |
+ initial_bitrate, this, gpu_preferences); |
+ if (!encoder_) { |
+ DLOG(ERROR) << __func__ << " VEA initialization failed"; |
Pawel Osciak
2017/05/15 01:28:51
"Could not create VEA". If we don't support HW enc
Owen Lin
2017/05/16 07:35:05
Done.
|
+ return false; |
} |
- encoder_.reset(); |
- DLOG(ERROR) << __func__ << " VEA initialization failed"; |
- return false; |
+ input_format_ = input_format; |
+ input_visible_size_ = input_visible_size; |
+ // Attempt to set up performing encoding tasks on IO thread, if supported |
+ // by the VEA. |
+ if (encoder_->TryToSetupEncodeOnSeparateThread( |
+ weak_this_factory_.GetWeakPtr(), io_task_runner_)) { |
+ filter_ = new MessageFilter(this, host_route_id_); |
+ stub_->channel()->AddFilter(filter_.get()); |
+ encode_task_runner_ = io_task_runner_; |
+ } |
+ |
+ if (!encoder_worker_thread_.Start()) { |
+ DLOG(ERROR) << "Failed spawning encoder worker thread."; |
Pawel Osciak
2017/05/15 01:28:51
Should we drop encoder_, filter_ and reset encoder
Owen Lin
2017/05/16 07:35:05
mmm.... I am not sure what's your concerns here. B
Pawel Osciak
2017/05/18 04:33:37
The issue here is that if starting the encoder thr
Owen Lin
2017/05/18 06:14:34
Acknowledged.
|
+ return false; |
+ } |
+ encoder_worker_task_runner_ = encoder_worker_thread_.task_runner(); |
+ return true; |
} |
bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) { |
@@ -335,44 +277,9 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() { |
gpu::VideoEncodeAcceleratorSupportedProfiles |
GpuVideoEncodeAccelerator::GetSupportedProfiles( |
const gpu::GpuPreferences& gpu_preferences) { |
- VideoEncodeAccelerator::SupportedProfiles profiles; |
- |
- for (const auto& factory_function : GetVEAFactoryFunctions(gpu_preferences)) { |
- std::unique_ptr<VideoEncodeAccelerator> encoder = factory_function.Run(); |
- if (!encoder) |
- continue; |
- VideoEncodeAccelerator::SupportedProfiles vea_profiles = |
- encoder->GetSupportedProfiles(); |
- GpuVideoAcceleratorUtil::InsertUniqueEncodeProfiles(vea_profiles, |
- &profiles); |
- } |
- return GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles(profiles); |
-} |
- |
-// static |
-std::vector<GpuVideoEncodeAccelerator::VEAFactoryFunction> |
-GpuVideoEncodeAccelerator::GetVEAFactoryFunctions( |
- const gpu::GpuPreferences& gpu_preferences) { |
- std::vector<VEAFactoryFunction> vea_factory_functions; |
-#if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
- vea_factory_functions.push_back(base::Bind(&CreateV4L2VEA)); |
-#endif |
-#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
- if (!gpu_preferences.disable_vaapi_accelerated_video_encode) |
- vea_factory_functions.push_back(base::Bind(&CreateVaapiVEA)); |
-#endif |
-#if defined(OS_ANDROID) && BUILDFLAG(ENABLE_WEBRTC) |
- if (!gpu_preferences.disable_web_rtc_hw_encoding) |
- vea_factory_functions.push_back(base::Bind(&CreateAndroidVEA)); |
-#endif |
-#if defined(OS_MACOSX) |
- vea_factory_functions.push_back(base::Bind(&CreateVTVEA)); |
-#endif |
-#if defined(OS_WIN) |
- if (base::FeatureList::IsEnabled(kMediaFoundationH264Encoding)) |
- vea_factory_functions.push_back(base::Bind(&CreateMediaFoundationVEA)); |
-#endif |
- return vea_factory_functions; |
+ GpuVideoEncodeAcceleratorFactory factory; |
+ return GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles( |
+ factory.GetSupportedProfiles(gpu_preferences)); |
} |
void GpuVideoEncodeAccelerator::OnFilterRemoved() { |