media_engine_extension.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2020 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/renderers/win/media_engine_extension.h"
  5. #include <mferror.h>
  6. #include "media/base/win/mf_helpers.h"
  7. namespace media {
  8. using Microsoft::WRL::ComPtr;
  9. MediaEngineExtension::MediaEngineExtension() = default;
  10. MediaEngineExtension::~MediaEngineExtension() = default;
  11. HRESULT MediaEngineExtension::RuntimeClassInitialize() {
  12. DVLOG_FUNC(1);
  13. return S_OK;
  14. }
  15. HRESULT MediaEngineExtension::CanPlayType(BOOL is_audio_only,
  16. BSTR mime_type,
  17. MF_MEDIA_ENGINE_CANPLAY* result) {
  18. // We use MF_MEDIA_ENGINE_EXTENSION to resolve as custom media source for
  19. // MFMediaEngine, MIME types are not used.
  20. *result = MF_MEDIA_ENGINE_CANPLAY_NOT_SUPPORTED;
  21. return S_OK;
  22. }
  23. HRESULT MediaEngineExtension::BeginCreateObject(BSTR url_bstr,
  24. IMFByteStream* byte_stream,
  25. MF_OBJECT_TYPE type,
  26. IUnknown** cancel_cookie,
  27. IMFAsyncCallback* callback,
  28. IUnknown* state) {
  29. DVLOG_FUNC(1) << "type=" << type;
  30. if (cancel_cookie) {
  31. // We don't support a cancel cookie.
  32. *cancel_cookie = nullptr;
  33. }
  34. ComPtr<IUnknown> local_source;
  35. {
  36. base::AutoLock lock(lock_);
  37. if (has_shutdown_) {
  38. return MF_E_SHUTDOWN;
  39. }
  40. local_source = mf_media_source_;
  41. }
  42. if (type == MF_OBJECT_MEDIASOURCE) {
  43. DVLOG_FUNC(2) << "Begin to resolve |mf_media_source_|";
  44. DCHECK(local_source) << "Media Source should have been set";
  45. ComPtr<IMFAsyncResult> async_result;
  46. RETURN_IF_FAILED(MFCreateAsyncResult(local_source.Get(), callback, state,
  47. &async_result));
  48. RETURN_IF_FAILED(async_result->SetStatus(S_OK));
  49. pending_create_object_ = true;
  50. // Invoke the callback synchronously since no outstanding work is required.
  51. RETURN_IF_FAILED(callback->Invoke(async_result.Get()));
  52. } else {
  53. // MediaEngine will try to resolve with different |type|.
  54. return MF_E_UNEXPECTED;
  55. }
  56. return S_OK;
  57. }
  58. HRESULT MediaEngineExtension::CancelObjectCreation(
  59. __in IUnknown* cancel_cookie) {
  60. DVLOG_FUNC(1);
  61. return MF_E_UNEXPECTED;
  62. }
  63. HRESULT MediaEngineExtension::EndCreateObject(__in IMFAsyncResult* result,
  64. __deref_out IUnknown** ret_obj) {
  65. DVLOG_FUNC(1);
  66. *ret_obj = nullptr;
  67. if (!pending_create_object_)
  68. return MF_E_UNEXPECTED;
  69. DVLOG_FUNC(2) << "End to resolve |mf_media_source_|";
  70. RETURN_IF_FAILED(result->GetStatus());
  71. RETURN_IF_FAILED(result->GetObject(ret_obj));
  72. pending_create_object_ = false;
  73. return S_OK;
  74. }
  75. HRESULT MediaEngineExtension::SetMediaSource(IUnknown* mf_media_source) {
  76. DVLOG_FUNC(1);
  77. base::AutoLock lock(lock_);
  78. if (has_shutdown_)
  79. return MF_E_SHUTDOWN;
  80. mf_media_source_ = mf_media_source;
  81. return S_OK;
  82. }
  83. // Break cycles.
  84. void MediaEngineExtension::Shutdown() {
  85. DVLOG_FUNC(1);
  86. base::AutoLock lock(lock_);
  87. if (!has_shutdown_) {
  88. mf_media_source_.Reset();
  89. has_shutdown_ = true;
  90. }
  91. }
  92. } // namespace media