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