Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: content/common/gpu/media/gpu_video_decode_accelerator.cc

Issue 1745903002: Introduce GpuVideoDecodeAcceleratorFactory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/gpu/media/gpu_video_decode_accelerator.h" 5 #include "content/common/gpu/media/gpu_video_decode_accelerator.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/stl_util.h" 14 #include "base/stl_util.h"
15 #include "base/thread_task_runner_handle.h" 15 #include "base/thread_task_runner_handle.h"
16 #include "build/build_config.h" 16 #include "build/build_config.h"
17 17
18 #include "content/common/gpu/gpu_channel.h" 18 #include "content/common/gpu/gpu_channel.h"
19 #include "content/common/gpu/gpu_channel_manager.h" 19 #include "content/common/gpu/gpu_channel_manager.h"
20 #include "content/common/gpu/media/gpu_video_accelerator_util.h" 20 #include "content/common/gpu/media/gpu_video_accelerator_util.h"
21 #include "content/common/gpu/media/media_messages.h" 21 #include "content/common/gpu/media/media_messages.h"
22 #include "content/public/gpu/gpu_video_decode_accelerator_factory.h"
22 #include "gpu/command_buffer/common/command_buffer.h" 23 #include "gpu/command_buffer/common/command_buffer.h"
23 #include "gpu/command_buffer/service/gpu_preferences.h"
24 #include "ipc/ipc_message_macros.h" 24 #include "ipc/ipc_message_macros.h"
25 #include "ipc/ipc_message_utils.h" 25 #include "ipc/ipc_message_utils.h"
26 #include "ipc/message_filter.h" 26 #include "ipc/message_filter.h"
27 #include "media/base/limits.h" 27 #include "media/base/limits.h"
28 #include "ui/gl/gl_context.h" 28 #include "ui/gl/gl_context.h"
29 #include "ui/gl/gl_image.h" 29 #include "ui/gl/gl_image.h"
30 #include "ui/gl/gl_surface_egl.h"
31
32 #if defined(OS_WIN)
33 #include "base/win/windows_version.h"
34 #include "content/common/gpu/media/dxva_video_decode_accelerator_win.h"
35 #elif defined(OS_MACOSX)
36 #include "content/common/gpu/media/vt_video_decode_accelerator_mac.h"
37 #elif defined(OS_CHROMEOS)
38 #if defined(USE_V4L2_CODEC)
39 #include "content/common/gpu/media/v4l2_device.h"
40 #include "content/common/gpu/media/v4l2_slice_video_decode_accelerator.h"
41 #include "content/common/gpu/media/v4l2_video_decode_accelerator.h"
42 #endif
43 #if defined(ARCH_CPU_X86_FAMILY)
44 #include "content/common/gpu/media/vaapi_video_decode_accelerator.h"
45 #include "ui/gl/gl_implementation.h"
46 #endif
47 #elif defined(USE_OZONE)
48 #include "media/ozone/media_ozone_platform.h"
49 #elif defined(OS_ANDROID)
50 #include "content/common/gpu/media/android_video_decode_accelerator.h"
51 #endif
52
53 #include "ui/gfx/geometry/size.h" 30 #include "ui/gfx/geometry/size.h"
54 31
55 namespace content { 32 namespace content {
56 33
34 namespace {
35 static gfx::GLContext* GetGLContext(
36 const base::WeakPtr<GpuCommandBufferStub>& stub) {
37 if (!stub) {
38 DLOG(ERROR) << "Stub is gone; no GLContext.";
39 return nullptr;
40 }
41
42 return stub->decoder()->GetGLContext();
43 }
44
57 static bool MakeDecoderContextCurrent( 45 static bool MakeDecoderContextCurrent(
58 const base::WeakPtr<GpuCommandBufferStub> stub) { 46 const base::WeakPtr<GpuCommandBufferStub>& stub) {
59 if (!stub) { 47 if (!stub) {
60 DLOG(ERROR) << "Stub is gone; won't MakeCurrent()."; 48 DLOG(ERROR) << "Stub is gone; won't MakeCurrent().";
61 return false; 49 return false;
62 } 50 }
63 51
64 if (!stub->decoder()->MakeCurrent()) { 52 if (!stub->decoder()->MakeCurrent()) {
65 DLOG(ERROR) << "Failed to MakeCurrent()"; 53 DLOG(ERROR) << "Failed to MakeCurrent()";
66 return false; 54 return false;
67 } 55 }
68 56
69 return true; 57 return true;
70 } 58 }
71 59
60 #if (defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)) || defined(OS_MACOSX)
61 static bool BindImage(const base::WeakPtr<GpuCommandBufferStub>& stub,
62 uint32_t client_texture_id,
63 uint32_t texture_target,
64 const scoped_refptr<gl::GLImage>& image) {
65 if (!stub) {
66 DLOG(ERROR) << "Stub is gone; won't BindImage().";
67 return false;
68 }
69
70 gpu::gles2::GLES2Decoder* command_decoder = stub->decoder();
71 gpu::gles2::TextureManager* texture_manager =
72 command_decoder->GetContextGroup()->texture_manager();
73 gpu::gles2::TextureRef* ref = texture_manager->GetTexture(client_texture_id);
74 if (ref) {
75 texture_manager->SetLevelImage(ref, texture_target, 0, image.get(),
76 gpu::gles2::Texture::BOUND);
77 }
78
79 return true;
80 }
81 #endif
82
83 static base::WeakPtr<gpu::gles2::GLES2Decoder> GetGLES2Decoder(
84 const base::WeakPtr<GpuCommandBufferStub>& stub) {
85 if (!stub) {
86 DLOG(ERROR) << "Stub is gone; no GLES2Decoder.";
87 return base::WeakPtr<gpu::gles2::GLES2Decoder>();
88 }
89
90 return stub->decoder()->AsWeakPtr();
91 }
92 } // anonymous namespace
93
72 // DebugAutoLock works like AutoLock but only acquires the lock when 94 // DebugAutoLock works like AutoLock but only acquires the lock when
73 // DCHECK is on. 95 // DCHECK is on.
74 #if DCHECK_IS_ON() 96 #if DCHECK_IS_ON()
75 typedef base::AutoLock DebugAutoLock; 97 typedef base::AutoLock DebugAutoLock;
76 #else 98 #else
77 class DebugAutoLock { 99 class DebugAutoLock {
78 public: 100 public:
79 explicit DebugAutoLock(base::Lock&) {} 101 explicit DebugAutoLock(base::Lock&) {}
80 }; 102 };
81 #endif 103 #endif
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) 155 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
134 : host_route_id_(host_route_id), 156 : host_route_id_(host_route_id),
135 stub_(stub), 157 stub_(stub),
136 texture_target_(0), 158 texture_target_(0),
137 filter_removed_(true, false), 159 filter_removed_(true, false),
138 child_task_runner_(base::ThreadTaskRunnerHandle::Get()), 160 child_task_runner_(base::ThreadTaskRunnerHandle::Get()),
139 io_task_runner_(io_task_runner), 161 io_task_runner_(io_task_runner),
140 weak_factory_for_io_(this) { 162 weak_factory_for_io_(this) {
141 DCHECK(stub_); 163 DCHECK(stub_);
142 stub_->AddDestructionObserver(this); 164 stub_->AddDestructionObserver(this);
143 make_context_current_ = 165 get_gl_context_cb_ = base::Bind(&GetGLContext, stub_->AsWeakPtr());
166 make_context_current_cb_ =
144 base::Bind(&MakeDecoderContextCurrent, stub_->AsWeakPtr()); 167 base::Bind(&MakeDecoderContextCurrent, stub_->AsWeakPtr());
168 #if (defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)) || defined(OS_MACOSX)
169 bind_image_cb_ = base::Bind(&BindImage, stub_->AsWeakPtr());
170 #endif
171 get_gles2_decoder_cb_ = base::Bind(&GetGLES2Decoder, stub_->AsWeakPtr());
145 } 172 }
146 173
147 GpuVideoDecodeAccelerator::~GpuVideoDecodeAccelerator() { 174 GpuVideoDecodeAccelerator::~GpuVideoDecodeAccelerator() {
148 // This class can only be self-deleted from OnWillDestroyStub(), which means 175 // This class can only be self-deleted from OnWillDestroyStub(), which means
149 // the VDA has already been destroyed in there. 176 // the VDA has already been destroyed in there.
150 DCHECK(!video_decode_accelerator_); 177 DCHECK(!video_decode_accelerator_);
151 } 178 }
152 179
153 // static 180 // static
154 gpu::VideoDecodeAcceleratorCapabilities 181 gpu::VideoDecodeAcceleratorCapabilities
155 GpuVideoDecodeAccelerator::GetCapabilities( 182 GpuVideoDecodeAccelerator::GetCapabilities(
156 const gpu::GpuPreferences& gpu_preferences) { 183 const gpu::GpuPreferences& gpu_preferences) {
157 media::VideoDecodeAccelerator::Capabilities capabilities; 184 return GpuVideoDecodeAcceleratorFactory::GetDecoderCapabilities(
158 if (gpu_preferences.disable_accelerated_video_decode) 185 gpu_preferences);
159 return gpu::VideoDecodeAcceleratorCapabilities();
160
161 // Query supported profiles for each VDA. The order of querying VDAs should
162 // be the same as the order of initializing VDAs. Then the returned profile
163 // can be initialized by corresponding VDA successfully.
164 #if defined(OS_WIN)
165 capabilities.supported_profiles =
166 DXVAVideoDecodeAccelerator::GetSupportedProfiles();
167 #elif defined(OS_CHROMEOS)
168 media::VideoDecodeAccelerator::SupportedProfiles vda_profiles;
169 #if defined(USE_V4L2_CODEC)
170 vda_profiles = V4L2VideoDecodeAccelerator::GetSupportedProfiles();
171 GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles(
172 vda_profiles, &capabilities.supported_profiles);
173 vda_profiles = V4L2SliceVideoDecodeAccelerator::GetSupportedProfiles();
174 GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles(
175 vda_profiles, &capabilities.supported_profiles);
176 #endif
177 #if defined(ARCH_CPU_X86_FAMILY)
178 vda_profiles = VaapiVideoDecodeAccelerator::GetSupportedProfiles();
179 GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles(
180 vda_profiles, &capabilities.supported_profiles);
181 #endif
182 #elif defined(OS_MACOSX)
183 capabilities.supported_profiles =
184 VTVideoDecodeAccelerator::GetSupportedProfiles();
185 #elif defined(OS_ANDROID)
186 capabilities = AndroidVideoDecodeAccelerator::GetCapabilities();
187 #endif
188 return GpuVideoAcceleratorUtil::ConvertMediaToGpuDecodeCapabilities(
189 capabilities);
190 } 186 }
191 187
192 bool GpuVideoDecodeAccelerator::OnMessageReceived(const IPC::Message& msg) { 188 bool GpuVideoDecodeAccelerator::OnMessageReceived(const IPC::Message& msg) {
193 if (!video_decode_accelerator_) 189 if (!video_decode_accelerator_)
194 return false; 190 return false;
195 191
196 bool handled = true; 192 bool handled = true;
197 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAccelerator, msg) 193 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAccelerator, msg)
198 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_SetCdm, OnSetCdm) 194 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_SetCdm, OnSetCdm)
199 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Decode, OnDecode) 195 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderMsg_Decode, OnDecode)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 318
323 bool GpuVideoDecodeAccelerator::Send(IPC::Message* message) { 319 bool GpuVideoDecodeAccelerator::Send(IPC::Message* message) {
324 if (filter_ && io_task_runner_->BelongsToCurrentThread()) 320 if (filter_ && io_task_runner_->BelongsToCurrentThread())
325 return filter_->SendOnIOThread(message); 321 return filter_->SendOnIOThread(message);
326 DCHECK(child_task_runner_->BelongsToCurrentThread()); 322 DCHECK(child_task_runner_->BelongsToCurrentThread());
327 return stub_->channel()->Send(message); 323 return stub_->channel()->Send(message);
328 } 324 }
329 325
330 bool GpuVideoDecodeAccelerator::Initialize( 326 bool GpuVideoDecodeAccelerator::Initialize(
331 const media::VideoDecodeAccelerator::Config& config) { 327 const media::VideoDecodeAccelerator::Config& config) {
332 const gpu::GpuPreferences& gpu_preferences =
333 stub_->channel()->gpu_channel_manager()->gpu_preferences();
334 if (gpu_preferences.disable_accelerated_video_decode)
335 return false;
336
337 DCHECK(!video_decode_accelerator_); 328 DCHECK(!video_decode_accelerator_);
338 329
339 if (!stub_->channel()->AddRoute(host_route_id_, stub_->stream_id(), this)) { 330 if (!stub_->channel()->AddRoute(host_route_id_, stub_->stream_id(), this)) {
340 DLOG(ERROR) << "Initialize(): failed to add route"; 331 DLOG(ERROR) << "Initialize(): failed to add route";
341 return false; 332 return false;
342 } 333 }
343 334
344 #if !defined(OS_WIN) 335 #if !defined(OS_WIN)
345 // Ensure we will be able to get a GL context at all before initializing 336 // Ensure we will be able to get a GL context at all before initializing
346 // non-Windows VDAs. 337 // non-Windows VDAs.
347 if (!make_context_current_.Run()) { 338 if (!make_context_current_cb_.Run())
339 return false;
340 #endif
341
342 scoped_ptr<GpuVideoDecodeAcceleratorFactory> vda_factory =
343 GpuVideoDecodeAcceleratorFactory::CreateWithGLES2Decoder(
344 get_gl_context_cb_, make_context_current_cb_, bind_image_cb_,
345 get_gles2_decoder_cb_);
346
347 if (!vda_factory) {
348 LOG(ERROR) << "Failed creating the VDA factory";
348 return false; 349 return false;
349 } 350 }
350 #endif
351 351
352 // Array of Create..VDA() function pointers, maybe applicable to the current
353 // platform. This list is ordered by priority of use and it should be the
354 // same as the order of querying supported profiles of VDAs.
355 const GpuVideoDecodeAccelerator::CreateVDAFp create_vda_fps[] = {
356 #if defined(OS_WIN)
357 &GpuVideoDecodeAccelerator::CreateDXVAVDA,
358 #endif
359 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC)
360 &GpuVideoDecodeAccelerator::CreateV4L2VDA,
361 &GpuVideoDecodeAccelerator::CreateV4L2SliceVDA,
362 #endif
363 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
364 &GpuVideoDecodeAccelerator::CreateVaapiVDA,
365 #endif
366 #if defined(OS_MACOSX)
367 &GpuVideoDecodeAccelerator::CreateVTVDA,
368 #endif
369 #if !defined(OS_CHROMEOS) && defined(USE_OZONE)
370 &GpuVideoDecodeAccelerator::CreateOzoneVDA,
371 #endif
372 #if defined(OS_ANDROID)
373 &GpuVideoDecodeAccelerator::CreateAndroidVDA,
374 #endif
375 };
376
377 for (const auto& create_vda_function : create_vda_fps) {
378 video_decode_accelerator_ = (this->*create_vda_function)();
379 if (!video_decode_accelerator_ ||
380 !video_decode_accelerator_->Initialize(config, this))
381 continue;
382
383 if (video_decode_accelerator_->CanDecodeOnIOThread()) {
384 filter_ = new MessageFilter(this, host_route_id_);
385 stub_->channel()->AddFilter(filter_.get());
386 }
387 return true;
388 }
389 video_decode_accelerator_.reset();
390 LOG(ERROR) << "HW video decode not available for profile " << config.profile
391 << (config.is_encrypted ? " with encryption" : "");
392 return false;
393 }
394
395 #if defined(OS_WIN)
396 scoped_ptr<media::VideoDecodeAccelerator>
397 GpuVideoDecodeAccelerator::CreateDXVAVDA() {
398 scoped_ptr<media::VideoDecodeAccelerator> decoder;
399 const gpu::GpuPreferences& gpu_preferences = 352 const gpu::GpuPreferences& gpu_preferences =
400 stub_->channel()->gpu_channel_manager()->gpu_preferences(); 353 stub_->channel()->gpu_channel_manager()->gpu_preferences();
401 if (base::win::GetVersion() >= base::win::VERSION_WIN7) { 354 video_decode_accelerator_ =
402 DVLOG(0) << "Initializing DXVA HW decoder for windows."; 355 vda_factory->CreateVDA(this, config, gpu_preferences);
403 decoder.reset(new DXVAVideoDecodeAccelerator( 356 if (!video_decode_accelerator_) {
404 make_context_current_, stub_->decoder()->GetGLContext(), 357 LOG(ERROR) << "HW video decode not available for profile " << config.profile
405 gpu_preferences.enable_accelerated_vpx_decode)); 358 << (config.is_encrypted ? " with encryption" : "");
406 } else { 359 return false;
407 NOTIMPLEMENTED() << "HW video decode acceleration not available.";
408 } 360 }
409 return decoder; 361
362 // Attempt to set up performing decoding tasks on IO thread, if supported by
363 // the VDA.
364 if (video_decode_accelerator_->TryToSetupDecodeOnSeparateThread(
365 weak_factory_for_io_.GetWeakPtr(), io_task_runner_)) {
366 filter_ = new MessageFilter(this, host_route_id_);
367 stub_->channel()->AddFilter(filter_.get());
368 }
369
370 return true;
410 } 371 }
411 #endif
412
413 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC)
414 scoped_ptr<media::VideoDecodeAccelerator>
415 GpuVideoDecodeAccelerator::CreateV4L2VDA() {
416 scoped_ptr<media::VideoDecodeAccelerator> decoder;
417 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder);
418 if (device.get()) {
419 decoder.reset(new V4L2VideoDecodeAccelerator(
420 gfx::GLSurfaceEGL::GetHardwareDisplay(),
421 stub_->decoder()->GetGLContext()->GetHandle(),
422 weak_factory_for_io_.GetWeakPtr(),
423 make_context_current_,
424 device,
425 io_task_runner_));
426 }
427 return decoder;
428 }
429
430 scoped_ptr<media::VideoDecodeAccelerator>
431 GpuVideoDecodeAccelerator::CreateV4L2SliceVDA() {
432 scoped_ptr<media::VideoDecodeAccelerator> decoder;
433 scoped_refptr<V4L2Device> device = V4L2Device::Create(V4L2Device::kDecoder);
434 if (device.get()) {
435 decoder.reset(new V4L2SliceVideoDecodeAccelerator(
436 device,
437 gfx::GLSurfaceEGL::GetHardwareDisplay(),
438 stub_->decoder()->GetGLContext()->GetHandle(),
439 weak_factory_for_io_.GetWeakPtr(),
440 make_context_current_,
441 io_task_runner_));
442 }
443 return decoder;
444 }
445 #endif
446
447 #if (defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)) || defined(OS_MACOSX)
448 void GpuVideoDecodeAccelerator::BindImage(uint32_t client_texture_id,
449 uint32_t texture_target,
450 scoped_refptr<gl::GLImage> image) {
451 gpu::gles2::GLES2Decoder* command_decoder = stub_->decoder();
452 gpu::gles2::TextureManager* texture_manager =
453 command_decoder->GetContextGroup()->texture_manager();
454 gpu::gles2::TextureRef* ref = texture_manager->GetTexture(client_texture_id);
455 if (ref) {
456 texture_manager->SetLevelImage(ref, texture_target, 0, image.get(),
457 gpu::gles2::Texture::BOUND);
458 }
459 }
460 #endif
461
462 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
463 scoped_ptr<media::VideoDecodeAccelerator>
464 GpuVideoDecodeAccelerator::CreateVaapiVDA() {
465 return make_scoped_ptr<media::VideoDecodeAccelerator>(
466 new VaapiVideoDecodeAccelerator(
467 make_context_current_,
468 base::Bind(&GpuVideoDecodeAccelerator::BindImage,
469 base::Unretained(this))));
470 }
471 #endif
472
473 #if defined(OS_MACOSX)
474 scoped_ptr<media::VideoDecodeAccelerator>
475 GpuVideoDecodeAccelerator::CreateVTVDA() {
476 return make_scoped_ptr<media::VideoDecodeAccelerator>(
477 new VTVideoDecodeAccelerator(
478 make_context_current_,
479 base::Bind(&GpuVideoDecodeAccelerator::BindImage,
480 base::Unretained(this))));
481 }
482 #endif
483
484 #if !defined(OS_CHROMEOS) && defined(USE_OZONE)
485 scoped_ptr<media::VideoDecodeAccelerator>
486 GpuVideoDecodeAccelerator::CreateOzoneVDA() {
487 media::MediaOzonePlatform* platform =
488 media::MediaOzonePlatform::GetInstance();
489 return make_scoped_ptr<media::VideoDecodeAccelerator>(
490 platform->CreateVideoDecodeAccelerator(make_context_current_));
491 }
492 #endif
493
494 #if defined(OS_ANDROID)
495 scoped_ptr<media::VideoDecodeAccelerator>
496 GpuVideoDecodeAccelerator::CreateAndroidVDA() {
497 return make_scoped_ptr<media::VideoDecodeAccelerator>(
498 new AndroidVideoDecodeAccelerator(stub_->decoder()->AsWeakPtr(),
499 make_context_current_));
500 }
501 #endif
502 372
503 void GpuVideoDecodeAccelerator::OnSetCdm(int cdm_id) { 373 void GpuVideoDecodeAccelerator::OnSetCdm(int cdm_id) {
504 DCHECK(video_decode_accelerator_); 374 DCHECK(video_decode_accelerator_);
505 video_decode_accelerator_->SetCdm(cdm_id); 375 video_decode_accelerator_->SetCdm(cdm_id);
506 } 376 }
507 377
508 void GpuVideoDecodeAccelerator::CallOrPostNotifyError( 378 void GpuVideoDecodeAccelerator::CallOrPostNotifyError(
509 media::VideoDecodeAccelerator::Error error) { 379 media::VideoDecodeAccelerator::Error error) {
510 if (child_task_runner_->BelongsToCurrentThread()) { 380 if (child_task_runner_->BelongsToCurrentThread()) {
511 NotifyError(error); 381 NotifyError(error);
512 } else { 382 } else {
513 child_task_runner_->PostTask( 383 child_task_runner_->PostTask(
514 FROM_HERE, base::Bind(&GpuVideoDecodeAccelerator::NotifyError, 384 FROM_HERE, base::Bind(&GpuVideoDecodeAccelerator::NotifyError,
515 base::Unretained(this), error)); 385 base::Unretained(this), error));
516 } 386 }
517 } 387 }
518 388
519 // Runs on IO thread if video_decode_accelerator_->CanDecodeOnIOThread() is 389 // Runs on IO thread if VDA::TryToSetupDecodeOnSeparateThread() succeeded,
520 // true, otherwise on the main thread. 390 // otherwise on the main thread.
521 void GpuVideoDecodeAccelerator::OnDecode( 391 void GpuVideoDecodeAccelerator::OnDecode(
522 const media::BitstreamBuffer& bitstream_buffer) { 392 const media::BitstreamBuffer& bitstream_buffer) {
523 DCHECK(video_decode_accelerator_); 393 DCHECK(video_decode_accelerator_);
524 video_decode_accelerator_->Decode(bitstream_buffer); 394 video_decode_accelerator_->Decode(bitstream_buffer);
525 } 395 }
526 396
527 void GpuVideoDecodeAccelerator::OnAssignPictureBuffers( 397 void GpuVideoDecodeAccelerator::OnAssignPictureBuffers(
528 const std::vector<int32_t>& buffer_ids, 398 const std::vector<int32_t>& buffer_ids,
529 const std::vector<uint32_t>& texture_ids) { 399 const std::vector<uint32_t>& texture_ids) {
530 if (buffer_ids.size() != texture_ids.size()) { 400 if (buffer_ids.size() != texture_ids.size()) {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 scoped_refptr<gpu::gles2::TextureRef> texture_ref = it->second; 505 scoped_refptr<gpu::gles2::TextureRef> texture_ref = it->second;
636 GLenum target = texture_ref->texture()->target(); 506 GLenum target = texture_ref->texture()->target();
637 gpu::gles2::TextureManager* texture_manager = 507 gpu::gles2::TextureManager* texture_manager =
638 stub_->decoder()->GetContextGroup()->texture_manager(); 508 stub_->decoder()->GetContextGroup()->texture_manager();
639 DCHECK(!texture_ref->texture()->IsLevelCleared(target, 0)); 509 DCHECK(!texture_ref->texture()->IsLevelCleared(target, 0));
640 texture_manager->SetLevelCleared(texture_ref.get(), target, 0, true); 510 texture_manager->SetLevelCleared(texture_ref.get(), target, 0, true);
641 uncleared_textures_.erase(it); 511 uncleared_textures_.erase(it);
642 } 512 }
643 513
644 } // namespace content 514 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698