/* * $Id$ * * (C) 2003-2006 Gabest * (C) 2006-2010 see AUTHORS * * This file is part of mplayerc. * * Mplayerc is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Mplayerc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #pragma once #include "BaseGraph.h" #include "AllocatorCommon7.h" #include "AllocatorCommon.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DSObjects { class CRealMediaGraph; class CRealMediaPlayer : public CUnknown , public IRMAErrorSink , public IRMAClientAdviseSink , public IRMAAuthenticationManager , public IRMASiteSupplier , public IRMAPassiveSiteWatcher , public IRMAAudioHook { protected: friend class CRealMediaGraph; CRealMediaGraph* m_pRMG; // IMPORTANT: do not ever AddRef on this from here HWND m_hWndParent; CSize m_VideoSize; bool m_fVideoSizeChanged; // DWORD m_wndStyle; CPlayerWindow m_wndWindowFrame, m_wndDestFrame; // FPRMCREATEENGINE m_fpCreateEngine; FPRMCLOSEENGINE m_fpCloseEngine; FPRMSETDLLACCESSPATH m_fpSetDLLAccessPath; HMODULE m_hRealMediaCore; CComPtr m_pEngine; CComPtr m_pPlayer; CComQIPtr m_pAudioPlayer; CComPtr m_pVolume; CComQIPtr m_pSiteManager; CComQIPtr m_pCommonClassFactory; CComQIPtr m_pTheSite; CComQIPtr m_pTheSite2; CMap m_CreatedSites; // OAFilterState m_State, m_UserState; REFERENCE_TIME m_nCurrent, m_nDuration; UINT16 m_unPercentComplete; // public: CRealMediaPlayer(HWND hWndParent, CRealMediaGraph* pRMG); virtual ~CRealMediaPlayer(); DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv); bool Init(); void Deinit(); virtual CSize GetVideoSize() { return(m_VideoSize); } virtual void SetWindowRect(CRect r) {} virtual void SetDestRect(CRect r) {} virtual bool CreateSite(IRMASite** pSite) = 0; virtual void DestroySite(IRMASite* pSite) = 0; // IRMAErrorSink STDMETHODIMP ErrorOccurred(const UINT8 unSeverity, const UINT32 ulRMACode, const UINT32 ulUserCode, const char* pUserString, const char* pMoreInfoURL); // IRMAClientAdviseSink STDMETHODIMP OnPosLength(UINT32 ulPosition, UINT32 ulLength); STDMETHODIMP OnPresentationOpened(); STDMETHODIMP OnPresentationClosed(); STDMETHODIMP OnStatisticsChanged(); STDMETHODIMP OnPreSeek(UINT32 ulOldTime, UINT32 ulNewTime); STDMETHODIMP OnPostSeek(UINT32 ulOldTime, UINT32 ulNewTime); STDMETHODIMP OnStop(); STDMETHODIMP OnPause(UINT32 ulTime); STDMETHODIMP OnBegin(UINT32 ulTime); STDMETHODIMP OnBuffering(UINT32 ulFlags, UINT16 unPercentComplete); STDMETHODIMP OnContacting(const char* pHostName); // IRMAAuthenticationManager STDMETHODIMP HandleAuthenticationRequest(IRMAAuthenticationManagerResponse* pResponse); // IRMASiteSupplier STDMETHODIMP SitesNeeded(UINT32 uRequestID, IRMAValues* pSiteProps); STDMETHODIMP SitesNotNeeded(UINT32 uRequestID); STDMETHODIMP BeginChangeLayout(); STDMETHODIMP DoneChangeLayout(); // IRMAPassiveSiteWatcher STDMETHODIMP PositionChanged(PNxPoint* pos); STDMETHODIMP SizeChanged(PNxSize* size); // IRMAAudioHook STDMETHODIMP OnBuffer(RMAAudioData* pAudioInData, RMAAudioData* pAudioOutData); STDMETHODIMP OnInit(RMAAudioFormat* pFormat); }; class CRealMediaPlayerWindowed : public CRealMediaPlayer { public: CRealMediaPlayerWindowed(HWND hWndParent, CRealMediaGraph* pRMG); virtual ~CRealMediaPlayerWindowed(); void SetWindowRect(CRect r); void SetDestRect(CRect r); bool CreateSite(IRMASite** pSite); void DestroySite(IRMASite* pSite); }; class CRealMediaPlayerWindowless : public CRealMediaPlayer { CComPtr m_pRMAP; public: CRealMediaPlayerWindowless(HWND hWndParent, CRealMediaGraph* pRMG); virtual ~CRealMediaPlayerWindowless(); STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv); bool CreateSite(IRMASite** pSite); void DestroySite(IRMASite* pSite); STDMETHODIMP SizeChanged(PNxSize* size); }; class CRealMediaGraph : public CBaseGraph { CRealMediaPlayer* m_pRMP; // TODO: access m_pRMP through a private interface CStringW m_fn; public: CRealMediaGraph(HWND hWndParent, HRESULT& hr); // in windowless mode IVideoWindow::* will return E_NOTIMPL, use ISubPicAllocatorPresenter instead virtual ~CRealMediaGraph(); DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv); protected: // IGraphBuilder STDMETHODIMP RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList); // IMediaControl STDMETHODIMP Run(); STDMETHODIMP Pause(); STDMETHODIMP Stop(); STDMETHODIMP GetState(LONG msTimeout, OAFilterState* pfs); // IMediaSeeking STDMETHODIMP GetDuration(LONGLONG* pDuration); STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent); STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags); // IVideoWindow STDMETHODIMP SetWindowPosition(long Left, long Top, long Width, long Height); // IBasicVideo STDMETHODIMP SetDestinationPosition(long Left, long Top, long Width, long Height); STDMETHODIMP GetVideoSize(long* pWidth, long* pHeight); // IBasicAudio STDMETHODIMP put_Volume(long lVolume); STDMETHODIMP get_Volume(long* plVolume); // IAMOpenProgress STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent); // IGraphEngine STDMETHODIMP_(engine_t) GetEngine(); }; }