107 lines
3.4 KiB
C++
107 lines
3.4 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// player.h : Playback helper class.
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
const UINT WM_APP_PLAYER_EVENT = WM_APP + 1; // wparam = IMFMediaEvent*
|
|
|
|
enum PlayerState
|
|
{
|
|
Closed = 0, // No session.
|
|
Ready, // Session was created, ready to open a file.
|
|
OpenPending, // Session is opening a file.
|
|
Started, // Session is playing a file.
|
|
Paused, // Session is paused.
|
|
Stopped, // Session is stopped (ready to play).
|
|
Closing // Application has closed the session, but is waiting for MESessionClosed.
|
|
};
|
|
|
|
class CPlayer : public IMFAsyncCallback
|
|
{
|
|
public:
|
|
static HRESULT CreateInstance(HWND hVideo, HWND hEvent, CPlayer **ppPlayer);
|
|
|
|
// IUnknown methods
|
|
STDMETHODIMP QueryInterface(REFIID iid, void** ppv);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
// IMFAsyncCallback methods
|
|
STDMETHODIMP GetParameters(DWORD*, DWORD*)
|
|
{
|
|
// Implementation of this method is optional.
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP Invoke(IMFAsyncResult* pAsyncResult);
|
|
|
|
// Playback
|
|
HRESULT OpenURL(const WCHAR *sURL);
|
|
HRESULT Play();
|
|
HRESULT Pause();
|
|
HRESULT Shutdown();
|
|
HRESULT HandleEvent(UINT_PTR pUnkPtr);
|
|
PlayerState GetState() const { return m_state; }
|
|
|
|
// Video functionality
|
|
HRESULT Repaint();
|
|
HRESULT ResizeVideo(WORD width, WORD height);
|
|
BOOL HasVideo() const { return (m_pVideoDisplay != NULL); }
|
|
|
|
// Content protection manager
|
|
HRESULT GetContentProtectionManager(ContentProtectionManager **ppManager);
|
|
|
|
|
|
protected:
|
|
|
|
// Constructor is private. Use static CreateInstance method to instantiate.
|
|
CPlayer(HWND hVideo, HWND hEvent);
|
|
|
|
// Destructor is private. Caller should call Release.
|
|
virtual ~CPlayer();
|
|
|
|
HRESULT Initialize();
|
|
HRESULT CreateSession();
|
|
HRESULT CloseSession();
|
|
HRESULT StartPlayback();
|
|
HRESULT CreateMediaSource(const WCHAR *sURL);
|
|
HRESULT CreateTopologyFromSource(IMFTopology **ppTopology);
|
|
|
|
HRESULT AddBranchToPartialTopology(
|
|
IMFTopology *pTopology,
|
|
IMFPresentationDescriptor *pSourcePD,
|
|
DWORD iStream
|
|
);
|
|
|
|
|
|
// Media event handlers
|
|
HRESULT OnTopologyReady(IMFMediaEvent *pEvent);
|
|
HRESULT OnSessionStarted(IMFMediaEvent *pEvent);
|
|
HRESULT OnSessionPaused(IMFMediaEvent *pEvent);
|
|
HRESULT OnSessionClosed(IMFMediaEvent *pEvent);
|
|
HRESULT OnPresentationEnded(IMFMediaEvent *pEvent);
|
|
|
|
long m_nRefCount; // Reference count.
|
|
|
|
IMFMediaSession *m_pSession;
|
|
IMFMediaSource *m_pSource;
|
|
IMFVideoDisplayControl *m_pVideoDisplay;
|
|
|
|
HWND m_hwndVideo; // Video window.
|
|
HWND m_hwndEvent; // App window to receive events.
|
|
PlayerState m_state; // Current state of the media session.
|
|
HANDLE m_hCloseEvent; // Event to wait on while closing
|
|
|
|
ContentProtectionManager *m_pContentProtectionManager;
|
|
|
|
}; |