2013-02-15 00:35:48 -08:00
|
|
|
/* -*- 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.
|
2013-05-06 18:58:55 -07:00
|
|
|
class WMFSourceReaderCallback MOZ_FINAL : public IMFSourceReaderCallback
|
2013-02-15 00:35:48 -08:00
|
|
|
{
|
|
|
|
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.
|
|
|
|
nsAutoRefCnt mRefCnt;
|
|
|
|
NS_DECL_OWNINGTHREAD
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mozilla
|
|
|
|
|
2013-05-04 03:12:41 -07:00
|
|
|
#endif // WMFSourceReaderCallback_h_
|