diff options
Diffstat (limited to 'dom/media/platforms/wmf/MFMediaEngineExtension.cpp')
-rw-r--r-- | dom/media/platforms/wmf/MFMediaEngineExtension.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/dom/media/platforms/wmf/MFMediaEngineExtension.cpp b/dom/media/platforms/wmf/MFMediaEngineExtension.cpp new file mode 100644 index 0000000000..eb761da364 --- /dev/null +++ b/dom/media/platforms/wmf/MFMediaEngineExtension.cpp @@ -0,0 +1,88 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "MFMediaEngineExtension.h" + +#include <mfapi.h> +#include <mferror.h> + +#include "MFMediaSource.h" +#include "MFMediaEngineUtils.h" +#include "WMF.h" + +namespace mozilla { + +#define LOG(msg, ...) \ + MOZ_LOG(gMFMediaEngineLog, LogLevel::Debug, \ + ("MFMediaEngineExtension=%p, " msg, this, ##__VA_ARGS__)) + +using Microsoft::WRL::ComPtr; + +void MFMediaEngineExtension::SetMediaSource(IMFMediaSource* aMediaSource) { + LOG("SetMediaSource=%p", aMediaSource); + mMediaSource = aMediaSource; +} + +// https://docs.microsoft.com/en-us/windows/win32/api/mfmediaengine/nf-mfmediaengine-imfmediaengineextension-begincreateobject +IFACEMETHODIMP MFMediaEngineExtension::BeginCreateObject( + BSTR aUrl, IMFByteStream* aByteStream, MF_OBJECT_TYPE aType, + IUnknown** aCancelCookie, IMFAsyncCallback* aCallback, IUnknown* aState) { + if (aCancelCookie) { + // We don't support a cancel cookie. + *aCancelCookie = nullptr; + } + + if (aType != MF_OBJECT_MEDIASOURCE) { + LOG("Only support media source type"); + return MF_E_UNEXPECTED; + } + + MOZ_ASSERT(mMediaSource); + ComPtr<IMFAsyncResult> result; + ComPtr<IUnknown> sourceUnknown = mMediaSource; + RETURN_IF_FAILED(wmf::MFCreateAsyncResult(sourceUnknown.Get(), aCallback, + aState, &result)); + RETURN_IF_FAILED(result->SetStatus(S_OK)); + + LOG("Creating object"); + mIsObjectCreating = true; + + RETURN_IF_FAILED(aCallback->Invoke(result.Get())); + return S_OK; +} + +IFACEMETHODIMP MFMediaEngineExtension::CancelObjectCreation( + IUnknown* aCancelCookie) { + return MF_E_UNEXPECTED; +} + +IFACEMETHODIMP MFMediaEngineExtension::EndCreateObject(IMFAsyncResult* aResult, + IUnknown** aRetObj) { + *aRetObj = nullptr; + if (!mIsObjectCreating) { + LOG("No object is creating, not an expected call"); + return MF_E_UNEXPECTED; + } + + RETURN_IF_FAILED(aResult->GetStatus()); + RETURN_IF_FAILED(aResult->GetObject(aRetObj)); + + LOG("End of creating object"); + mIsObjectCreating = false; + return S_OK; +} + +IFACEMETHODIMP MFMediaEngineExtension::CanPlayType( + BOOL aIsAudioOnly, BSTR aMimeType, MF_MEDIA_ENGINE_CANPLAY* aResult) { + // We use MF_MEDIA_ENGINE_EXTENSION to resolve as custom media source for + // MFMediaEngine, MIME types are not used. + *aResult = MF_MEDIA_ENGINE_CANPLAY_NOT_SUPPORTED; + return S_OK; +} + +// TODO : break cycle of mMediaSource + +#undef LOG + +} // namespace mozilla |