media_engine_extension.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. #ifndef MEDIA_RENDERERS_WIN_MEDIA_ENGINE_EXTENSION_H_
  5. #define MEDIA_RENDERERS_WIN_MEDIA_ENGINE_EXTENSION_H_
  6. #include <mfapi.h>
  7. #include <mfmediaengine.h>
  8. #include <wrl.h>
  9. #include "base/synchronization/lock.h"
  10. namespace media {
  11. // Implement IMFMediaEngineExtension to load media source into the
  12. // IMFMediaEngine. See details from:
  13. // https://docs.microsoft.com/en-us/windows/win32/api/mfmediaengine/nn-mfmediaengine-imfmediaengineextension.
  14. //
  15. class MediaEngineExtension
  16. : public Microsoft::WRL::RuntimeClass<
  17. Microsoft::WRL::RuntimeClassFlags<
  18. Microsoft::WRL::RuntimeClassType::ClassicCom>,
  19. IMFMediaEngineExtension> {
  20. public:
  21. MediaEngineExtension();
  22. ~MediaEngineExtension() override;
  23. HRESULT RuntimeClassInitialize();
  24. // IMFMediaEngineExtension
  25. IFACEMETHODIMP CanPlayType(BOOL is_audio_only,
  26. BSTR mime_type,
  27. MF_MEDIA_ENGINE_CANPLAY* result) override;
  28. IFACEMETHODIMP BeginCreateObject(BSTR url_bstr,
  29. IMFByteStream* byte_stream,
  30. MF_OBJECT_TYPE type,
  31. IUnknown** cancel_cookie,
  32. IMFAsyncCallback* callback,
  33. IUnknown* state) override;
  34. IFACEMETHODIMP CancelObjectCreation(IUnknown* cancel_cookie) override;
  35. IFACEMETHODIMP EndCreateObject(IMFAsyncResult* result,
  36. IUnknown** ret_obj) override;
  37. HRESULT SetMediaSource(IUnknown* mf_media_source);
  38. void Shutdown();
  39. private:
  40. bool pending_create_object_ = false;
  41. // Need a lock to ensure thread safe operation between IMFMediaEngineExtension
  42. // method calls from MFMediaEngine threadpool thread and
  43. // SetMediaSource/Shutdown from MediaFoundationRenderer calling thread.
  44. base::Lock lock_;
  45. bool has_shutdown_ GUARDED_BY(lock_) = false;
  46. Microsoft::WRL::ComPtr<IUnknown> mf_media_source_ GUARDED_BY(lock_);
  47. };
  48. } // namespace media
  49. #endif // MEDIA_RENDERERS_WIN_MEDIA_ENGINE_EXTENSION_H_