diff -r 000000000000 -r 6474c204b198 content/media/wmf/WMFSourceReaderCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/media/wmf/WMFSourceReaderCallback.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,83 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* 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/. */ +#if !defined(WMFSourceReaderCallback_h_) +#define WMFSourceReaderCallback_h_ + +#include "WMF.h" +#include "mozilla/ReentrantMonitor.h" +#include "mozilla/RefPtr.h" +#include "nsISupportsImpl.h" + +namespace mozilla { + +// A listener which we pass into the IMFSourceReader upon creation which is +// notified when an asynchronous call to IMFSourceReader::ReadSample() +// completes. This allows us to abort ReadSample() operations when the +// WMFByteStream's underlying MediaResource is closed. This ensures that +// the decode threads don't get stuck in a synchronous ReadSample() call +// when the MediaResource is unexpectedly shutdown. +class WMFSourceReaderCallback MOZ_FINAL : public IMFSourceReaderCallback +{ +public: + WMFSourceReaderCallback(); + + // IUnknown Methods. + STDMETHODIMP QueryInterface(REFIID aIId, LPVOID *aInterface); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + // IMFSourceReaderCallback methods + STDMETHODIMP OnReadSample(HRESULT hrStatus, + DWORD dwStreamIndex, + DWORD dwStreamFlags, + LONGLONG llTimestamp, + IMFSample *pSample); + STDMETHODIMP OnEvent(DWORD, IMFMediaEvent *); + STDMETHODIMP OnFlush(DWORD); + + // Causes the calling thread to block waiting for the + // IMFSourceReader::ReadSample() result callback to occur, or for the + // WMFByteStream to be closed. + HRESULT Wait(DWORD* aStreamFlags, + LONGLONG* aTimeStamp, + IMFSample** aSample); + + // Cancels Wait() calls. + HRESULT Cancel(); + +private: + + // Sets state to record the result of a read, and awake threads + // waiting in Wait(). + HRESULT NotifyReadComplete(HRESULT aReadStatus, + DWORD aStreamIndex, + DWORD aStreamFlags, + LONGLONG aTimestamp, + IMFSample *aSample); + + // Synchronizes all member data in this class, and Wait() blocks on + // and NotifyReadComplete() notifies this monitor. + ReentrantMonitor mMonitor; + + // Read result data. + HRESULT mResultStatus; + DWORD mStreamFlags; + LONGLONG mTimestamp; + IMFSample* mSample; + + // Sentinal. Set to true when a read result is returned. Wait() won't exit + // until this is set to true. + bool mReadFinished; + + // IUnknown ref counting. + ThreadSafeAutoRefCnt mRefCnt; + NS_DECL_OWNINGTHREAD + +}; + +} // namespace mozilla + +#endif // WMFSourceReaderCallback_h_