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(); |