diff -r 000000000000 -r 6474c204b198 content/media/directshow/DirectShowUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/media/directshow/DirectShowUtils.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,115 @@ +/* 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/. */ + +#ifndef _DirectShowUtils_h_ +#define _DirectShowUtils_h_ + +#include +#include "dshow.h" +#include "DShowTools.h" +#include "prlog.h" + +namespace mozilla { + +// Win32 "Event" wrapper. Must be paired with a CriticalSection to create a +// Java-style "monitor". +class Signal { +public: + + Signal(CriticalSection* aLock) + : mLock(aLock) + { + CriticalSectionAutoEnter lock(*mLock); + mEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + } + + ~Signal() { + CriticalSectionAutoEnter lock(*mLock); + CloseHandle(mEvent); + } + + // Lock must be held. + void Notify() { + SetEvent(mEvent); + } + + // Lock must be held. Check the wait condition before waiting! + HRESULT Wait() { + mLock->Leave(); + DWORD result = WaitForSingleObject(mEvent, INFINITE); + mLock->Enter(); + return result == WAIT_OBJECT_0 ? S_OK : E_FAIL; + } + +private: + CriticalSection* mLock; + HANDLE mEvent; +}; + +HRESULT +AddGraphToRunningObjectTable(IUnknown *aUnkGraph, DWORD *aOutRotRegister); + +void +RemoveGraphFromRunningObjectTable(DWORD aRotRegister); + +const char* +GetGraphNotifyString(long evCode); + +// Creates a filter and adds it to a graph. +HRESULT +CreateAndAddFilter(IGraphBuilder* aGraph, + REFGUID aFilterClsId, + LPCWSTR aFilterName, + IBaseFilter **aOutFilter); + +HRESULT +AddMP3DMOWrapperFilter(IGraphBuilder* aGraph, + IBaseFilter **aOutFilter); + +// Connects the output pin on aOutputFilter to an input pin on +// aInputFilter, in aGraph. +HRESULT +ConnectFilters(IGraphBuilder* aGraph, + IBaseFilter* aOutputFilter, + IBaseFilter* aInputFilter); + +HRESULT +MatchUnconnectedPin(IPin* aPin, + PIN_DIRECTION aPinDir, + bool *aOutMatches); + +// Converts from microseconds to DirectShow "Reference Time" +// (hundreds of nanoseconds). +inline int64_t +UsecsToRefTime(const int64_t aUsecs) +{ + return aUsecs * 10; +} + +// Converts from DirectShow "Reference Time" (hundreds of nanoseconds) +// to microseconds. +inline int64_t +RefTimeToUsecs(const int64_t hRefTime) +{ + return hRefTime / 10; +} + +// Converts from DirectShow "Reference Time" (hundreds of nanoseconds) +// to seconds. +inline double +RefTimeToSeconds(const REFERENCE_TIME aRefTime) +{ + return double(aRefTime) / 10000000; +} + + +#if defined(PR_LOGGING) +const char* +GetDirectShowGuidName(const GUID& aGuid); +#endif + +} // namespace mozilla + +#endif