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