d3d11_video_decoder_impl.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/gpu/windows/d3d11_video_decoder_impl.h"
  5. #include "base/bind.h"
  6. #include "gpu/command_buffer/common/sync_token.h"
  7. #include "gpu/command_buffer/service/scheduler.h"
  8. #include "gpu/ipc/service/gpu_channel.h"
  9. #include "media/base/bind_to_current_loop.h"
  10. #include "media/base/media_log.h"
  11. #include "media/gpu/windows/d3d11_picture_buffer.h"
  12. namespace media {
  13. D3D11VideoDecoderImpl::D3D11VideoDecoderImpl(
  14. std::unique_ptr<MediaLog> media_log,
  15. base::RepeatingCallback<scoped_refptr<CommandBufferHelper>()> get_helper_cb)
  16. : media_log_(std::move(media_log)),
  17. get_helper_cb_(std::move(get_helper_cb)) {
  18. // May be called from any thread.
  19. }
  20. D3D11VideoDecoderImpl::~D3D11VideoDecoderImpl() {
  21. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  22. }
  23. void D3D11VideoDecoderImpl::Initialize(InitCB init_cb) {
  24. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  25. // If have a helper, then we're as initialized as we need to be.
  26. if (helper_) {
  27. std::move(init_cb).Run(true, release_mailbox_cb_);
  28. return;
  29. }
  30. helper_ = get_helper_cb_.Run();
  31. // Get the stub, register, and generally do stuff.
  32. if (!helper_ || !helper_->MakeContextCurrent()) {
  33. const char* reason = "Failed to make context current.";
  34. DLOG(ERROR) << reason;
  35. if (media_log_)
  36. MEDIA_LOG(ERROR, media_log_) << reason;
  37. std::move(init_cb).Run(false, ReleaseMailboxCB());
  38. return;
  39. }
  40. release_mailbox_cb_ = BindToCurrentLoop(base::BindRepeating(
  41. &D3D11VideoDecoderImpl::OnMailboxReleased, GetWeakPtr()));
  42. std::move(init_cb).Run(true, release_mailbox_cb_);
  43. }
  44. void D3D11VideoDecoderImpl::OnMailboxReleased(
  45. base::OnceClosure wait_complete_cb,
  46. const gpu::SyncToken& sync_token) {
  47. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  48. if (!helper_) {
  49. std::move(wait_complete_cb).Run();
  50. return;
  51. }
  52. helper_->WaitForSyncToken(
  53. sync_token, base::BindOnce(&D3D11VideoDecoderImpl::OnSyncTokenReleased,
  54. GetWeakPtr(), std::move(wait_complete_cb)));
  55. }
  56. void D3D11VideoDecoderImpl::OnSyncTokenReleased(
  57. base::OnceClosure wait_complete_cb) {
  58. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  59. std::move(wait_complete_cb).Run();
  60. }
  61. base::WeakPtr<D3D11VideoDecoderImpl> D3D11VideoDecoderImpl::GetWeakPtr() {
  62. // May be called from any thread.
  63. return weak_factory_.GetWeakPtr();
  64. }
  65. } // namespace media