Index: content/common/gpu/media/video_decode_accelerator_unittest.cc |
diff --git a/content/common/gpu/media/video_decode_accelerator_unittest.cc b/content/common/gpu/media/video_decode_accelerator_unittest.cc |
index a04e7c896283cc0f577ef21bf2af3430f7209b7c..c7ca0d2342d5c0b57b9a25dd1c67de3aa969f72e 100644 |
--- a/content/common/gpu/media/video_decode_accelerator_unittest.cc |
+++ b/content/common/gpu/media/video_decode_accelerator_unittest.cc |
@@ -47,10 +47,8 @@ |
#include "base/threading/thread.h" |
#include "build/build_config.h" |
#include "content/common/gpu/media/fake_video_decode_accelerator.h" |
-#include "content/common/gpu/media/gpu_video_decode_accelerator_factory_impl.h" |
#include "content/common/gpu/media/rendering_helper.h" |
#include "content/common/gpu/media/video_accelerator_unittest_helpers.h" |
-#include "gpu/command_buffer/service/gpu_preferences.h" |
#include "media/filters/h264_parser.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gfx/codec/png_codec.h" |
@@ -360,6 +358,17 @@ |
private: |
typedef std::map<int32_t, scoped_refptr<TextureRef>> TextureRefMap; |
+ scoped_ptr<media::VideoDecodeAccelerator> CreateFakeVDA(); |
+ scoped_ptr<media::VideoDecodeAccelerator> CreateDXVAVDA(); |
+ scoped_ptr<media::VideoDecodeAccelerator> CreateV4L2VDA(); |
+ scoped_ptr<media::VideoDecodeAccelerator> CreateV4L2SliceVDA(); |
+ scoped_ptr<media::VideoDecodeAccelerator> CreateVaapiVDA(); |
+ |
+ void BindImage(uint32_t client_texture_id, |
+ uint32_t texture_target, |
+ scoped_refptr<gl::GLImage> image, |
+ bool can_bind_as_sampler); |
+ |
void SetState(ClientState new_state); |
void FinishInitialization(); |
void ReturnPicture(int32_t picture_buffer_id); |
@@ -392,10 +401,8 @@ |
int next_bitstream_buffer_id_; |
ClientStateNotification<ClientState>* note_; |
scoped_ptr<VideoDecodeAccelerator> decoder_; |
- base::WeakPtr<VideoDecodeAccelerator> weak_vda_; |
- scoped_ptr<base::WeakPtrFactory<VideoDecodeAccelerator>> |
- weak_vda_ptr_factory_; |
- scoped_ptr<GpuVideoDecodeAcceleratorFactoryImpl> vda_factory_; |
+ scoped_ptr<base::WeakPtrFactory<VideoDecodeAccelerator> > |
+ weak_decoder_factory_; |
int remaining_play_throughs_; |
int reset_after_frame_num_; |
int delete_decoder_state_; |
@@ -433,22 +440,8 @@ |
int32_t next_picture_buffer_id_; |
- base::WeakPtr<GLRenderingVDAClient> weak_this_; |
- base::WeakPtrFactory<GLRenderingVDAClient> weak_this_factory_; |
- |
DISALLOW_IMPLICIT_CONSTRUCTORS(GLRenderingVDAClient); |
}; |
- |
-static bool DoNothingReturnTrue() { |
- return true; |
-} |
- |
-static bool DummyBindImage(uint32_t client_texture_id, |
- uint32_t texture_target, |
- const scoped_refptr<gl::GLImage>& image, |
- bool can_bind_to_sampler) { |
- return true; |
-} |
GLRenderingVDAClient::GLRenderingVDAClient( |
size_t window_id, |
@@ -490,8 +483,7 @@ |
delay_reuse_after_frame_num_(delay_reuse_after_frame_num), |
decode_calls_per_second_(decode_calls_per_second), |
render_as_thumbnails_(render_as_thumbnails), |
- next_picture_buffer_id_(1), |
- weak_this_factory_(this) { |
+ next_picture_buffer_id_(1) { |
LOG_ASSERT(num_in_flight_decodes > 0); |
LOG_ASSERT(num_play_throughs > 0); |
// |num_in_flight_decodes_| is unsupported if |decode_calls_per_second_| > 0. |
@@ -502,8 +494,6 @@ |
profile_ = (profile != media::VIDEO_CODEC_PROFILE_UNKNOWN |
? profile |
: media::H264PROFILE_BASELINE); |
- |
- weak_this_ = weak_this_factory_.GetWeakPtr(); |
} |
GLRenderingVDAClient::~GLRenderingVDAClient() { |
@@ -512,35 +502,114 @@ |
SetState(CS_DESTROYED); |
} |
+static bool DoNothingReturnTrue() { return true; } |
+ |
+scoped_ptr<media::VideoDecodeAccelerator> |
+GLRenderingVDAClient::CreateFakeVDA() { |
+ scoped_ptr<media::VideoDecodeAccelerator> decoder; |
+ if (fake_decoder_) { |
+ decoder.reset(new FakeVideoDecodeAccelerator( |
+ static_cast<gfx::GLContext*> (rendering_helper_->GetGLContextHandle()), |
+ frame_size_, |
+ base::Bind(&DoNothingReturnTrue))); |
+ } |
+ return decoder; |
+} |
+ |
+scoped_ptr<media::VideoDecodeAccelerator> |
+GLRenderingVDAClient::CreateDXVAVDA() { |
+ scoped_ptr<media::VideoDecodeAccelerator> decoder; |
+#if defined(OS_WIN) |
+ if (base::win::GetVersion() >= base::win::VERSION_WIN7) { |
+ const bool enable_accelerated_vpx_decode = false; |
+ decoder.reset(new DXVAVideoDecodeAccelerator( |
+ base::Bind(&DoNothingReturnTrue), |
+ rendering_helper_->GetGLContext().get(), |
+ enable_accelerated_vpx_decode)); |
+ } |
+#endif |
+ return decoder; |
+} |
+ |
+scoped_ptr<media::VideoDecodeAccelerator> |
+GLRenderingVDAClient::CreateV4L2VDA() { |
+ scoped_ptr<media::VideoDecodeAccelerator> decoder; |
+#if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
+ scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); |
+ if (device.get()) { |
+ base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); |
+ decoder.reset(new V4L2VideoDecodeAccelerator( |
+ static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), |
+ static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), |
+ weak_client, base::Bind(&DoNothingReturnTrue), device, |
+ base::ThreadTaskRunnerHandle::Get())); |
+ } |
+#endif |
+ return decoder; |
+} |
+ |
+scoped_ptr<media::VideoDecodeAccelerator> |
+GLRenderingVDAClient::CreateV4L2SliceVDA() { |
+ scoped_ptr<media::VideoDecodeAccelerator> decoder; |
+#if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
+ scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder); |
+ if (device.get()) { |
+ base::WeakPtr<VideoDecodeAccelerator::Client> weak_client = AsWeakPtr(); |
+ decoder.reset(new V4L2SliceVideoDecodeAccelerator( |
+ device, static_cast<EGLDisplay>(rendering_helper_->GetGLDisplay()), |
+ static_cast<EGLContext>(rendering_helper_->GetGLContextHandle()), |
+ weak_client, base::Bind(&DoNothingReturnTrue), |
+ base::ThreadTaskRunnerHandle::Get())); |
+ } |
+#endif |
+ return decoder; |
+} |
+ |
+scoped_ptr<media::VideoDecodeAccelerator> |
+GLRenderingVDAClient::CreateVaapiVDA() { |
+ scoped_ptr<media::VideoDecodeAccelerator> decoder; |
+#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
+ decoder.reset(new VaapiVideoDecodeAccelerator( |
+ base::Bind(&DoNothingReturnTrue), |
+ base::Bind(&GLRenderingVDAClient::BindImage, base::Unretained(this)))); |
+#endif |
+ return decoder; |
+} |
+ |
+void GLRenderingVDAClient::BindImage(uint32_t client_texture_id, |
+ uint32_t texture_target, |
+ scoped_refptr<gl::GLImage> image, |
+ bool can_bind_to_sampler) {} |
+ |
void GLRenderingVDAClient::CreateAndStartDecoder() { |
LOG_ASSERT(decoder_deleted()); |
LOG_ASSERT(!decoder_.get()); |
- if (fake_decoder_) { |
- decoder_.reset(new FakeVideoDecodeAccelerator( |
- frame_size_, base::Bind(&DoNothingReturnTrue))); |
- LOG_ASSERT(decoder_->Initialize(profile_, this)); |
- } else { |
- if (!vda_factory_) { |
- vda_factory_ = GpuVideoDecodeAcceleratorFactoryImpl::Create( |
- base::Bind(&RenderingHelper::GetGLContext, |
- base::Unretained(rendering_helper_)), |
- base::Bind(&DoNothingReturnTrue), base::Bind(&DummyBindImage)); |
- LOG_ASSERT(vda_factory_); |
- } |
- |
- VideoDecodeAccelerator::Config config(profile_); |
- gpu::GpuPreferences gpu_preferences; |
- decoder_ = vda_factory_->CreateVDA(this, config, gpu_preferences); |
- } |
- |
- LOG_ASSERT(decoder_) << "Failed creating a VDA"; |
- |
- decoder_->TryToSetupDecodeOnSeparateThread( |
- weak_this_, base::ThreadTaskRunnerHandle::Get()); |
- |
- SetState(CS_DECODER_SET); |
- FinishInitialization(); |
+ VideoDecodeAccelerator::Client* client = this; |
+ |
+ scoped_ptr<media::VideoDecodeAccelerator> decoders[] = { |
+ CreateFakeVDA(), |
+ CreateDXVAVDA(), |
+ CreateV4L2VDA(), |
+ CreateV4L2SliceVDA(), |
+ CreateVaapiVDA(), |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(decoders); ++i) { |
+ if (!decoders[i]) |
+ continue; |
+ decoder_ = std::move(decoders[i]); |
+ weak_decoder_factory_.reset( |
+ new base::WeakPtrFactory<VideoDecodeAccelerator>(decoder_.get())); |
+ if (decoder_->Initialize(profile_, client)) { |
+ SetState(CS_DECODER_SET); |
+ FinishInitialization(); |
+ return; |
+ } |
+ } |
+ // Decoders are all initialize failed. |
+ LOG(ERROR) << "VideoDecodeAccelerator::Initialize() failed"; |
+ LOG_ASSERT(false); |
} |
void GLRenderingVDAClient::ProvidePictureBuffers( |
@@ -644,8 +713,10 @@ |
if (num_decoded_frames_ > delay_reuse_after_frame_num_) { |
base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, base::Bind(&VideoDecodeAccelerator::ReusePictureBuffer, |
- weak_vda_, picture_buffer_id), |
+ FROM_HERE, |
+ base::Bind(&VideoDecodeAccelerator::ReusePictureBuffer, |
+ weak_decoder_factory_->GetWeakPtr(), |
+ picture_buffer_id), |
kReuseDelay); |
} else { |
decoder_->ReusePictureBuffer(picture_buffer_id); |
@@ -767,7 +838,7 @@ |
void GLRenderingVDAClient::DeleteDecoder() { |
if (decoder_deleted()) |
return; |
- weak_vda_ptr_factory_.reset(); |
+ weak_decoder_factory_.reset(); |
decoder_.reset(); |
STLClearObject(&encoded_data_); |
active_textures_.clear(); |