Chromium Code Reviews| 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 f74dd294140ea05fd083bab53dbcd3e00e3c2a76..87f4d0aa711d84b74dfc0141ae3c6e2f30214efc 100644 | 
| --- a/content/common/gpu/media/video_decode_accelerator_unittest.cc | 
| +++ b/content/common/gpu/media/video_decode_accelerator_unittest.cc | 
| @@ -47,8 +47,10 @@ | 
| #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" | 
| 
 
hans
2016/04/08 01:29:43
I think you need a dependency on gpu.gyp:command_b
 
 | 
| #include "media/filters/h264_parser.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| #include "ui/gfx/codec/png_codec.h" | 
| @@ -359,17 +361,6 @@ class GLRenderingVDAClient | 
| 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); | 
| @@ -402,8 +393,10 @@ class GLRenderingVDAClient | 
| int next_bitstream_buffer_id_; | 
| ClientStateNotification<ClientState>* note_; | 
| scoped_ptr<VideoDecodeAccelerator> decoder_; | 
| - scoped_ptr<base::WeakPtrFactory<VideoDecodeAccelerator> > | 
| - weak_decoder_factory_; | 
| + base::WeakPtr<VideoDecodeAccelerator> weak_vda_; | 
| + scoped_ptr<base::WeakPtrFactory<VideoDecodeAccelerator>> | 
| + weak_vda_ptr_factory_; | 
| + scoped_ptr<GpuVideoDecodeAcceleratorFactoryImpl> vda_factory_; | 
| int remaining_play_throughs_; | 
| int reset_after_frame_num_; | 
| int delete_decoder_state_; | 
| @@ -441,9 +434,23 @@ class GLRenderingVDAClient | 
| 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, | 
| RenderingHelper* rendering_helper, | 
| @@ -484,7 +491,8 @@ GLRenderingVDAClient::GLRenderingVDAClient( | 
| 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) { | 
| + next_picture_buffer_id_(1), | 
| + weak_this_factory_(this) { | 
| 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. | 
| @@ -495,6 +503,8 @@ GLRenderingVDAClient::GLRenderingVDAClient( | 
| profile_ = (profile != media::VIDEO_CODEC_PROFILE_UNKNOWN | 
| ? profile | 
| : media::H264PROFILE_BASELINE); | 
| + | 
| + weak_this_ = weak_this_factory_.GetWeakPtr(); | 
| } | 
| GLRenderingVDAClient::~GLRenderingVDAClient() { | 
| @@ -503,114 +513,35 @@ GLRenderingVDAClient::~GLRenderingVDAClient() { | 
| SetState(CS_DESTROYED); | 
| } | 
| -static bool DoNothingReturnTrue() { return true; } | 
| +void GLRenderingVDAClient::CreateAndStartDecoder() { | 
| + LOG_ASSERT(decoder_deleted()); | 
| + LOG_ASSERT(!decoder_.get()); | 
| -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; | 
| -} | 
| + 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_); | 
| + } | 
| -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())); | 
| + VideoDecodeAccelerator::Config config(profile_); | 
| + gpu::GpuPreferences gpu_preferences; | 
| + decoder_ = vda_factory_->CreateVDA(this, config, gpu_preferences); | 
| } | 
| -#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; | 
| -} | 
| + LOG_ASSERT(decoder_) << "Failed creating a VDA"; | 
| -void GLRenderingVDAClient::BindImage(uint32_t client_texture_id, | 
| - uint32_t texture_target, | 
| - scoped_refptr<gl::GLImage> image, | 
| - bool can_bind_to_sampler) {} | 
| + decoder_->TryToSetupDecodeOnSeparateThread( | 
| + weak_this_, base::ThreadTaskRunnerHandle::Get()); | 
| -void GLRenderingVDAClient::CreateAndStartDecoder() { | 
| - LOG_ASSERT(decoder_deleted()); | 
| - LOG_ASSERT(!decoder_.get()); | 
| - | 
| - 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); | 
| + SetState(CS_DECODER_SET); | 
| + FinishInitialization(); | 
| } | 
| void GLRenderingVDAClient::ProvidePictureBuffers( | 
| @@ -717,10 +648,8 @@ void GLRenderingVDAClient::ReturnPicture(int32_t picture_buffer_id) { | 
| if (num_decoded_frames_ > delay_reuse_after_frame_num_) { | 
| base::MessageLoop::current()->PostDelayedTask( | 
| - FROM_HERE, | 
| - base::Bind(&VideoDecodeAccelerator::ReusePictureBuffer, | 
| - weak_decoder_factory_->GetWeakPtr(), | 
| - picture_buffer_id), | 
| + FROM_HERE, base::Bind(&VideoDecodeAccelerator::ReusePictureBuffer, | 
| + weak_vda_, picture_buffer_id), | 
| kReuseDelay); | 
| } else { | 
| decoder_->ReusePictureBuffer(picture_buffer_id); | 
| @@ -842,7 +771,7 @@ void GLRenderingVDAClient::FinishInitialization() { | 
| void GLRenderingVDAClient::DeleteDecoder() { | 
| if (decoder_deleted()) | 
| return; | 
| - weak_decoder_factory_.reset(); | 
| + weak_vda_ptr_factory_.reset(); | 
| decoder_.reset(); | 
| STLClearObject(&encoded_data_); | 
| active_textures_.clear(); |