windows-nt/Source/XPSP1/NT/multimedia/dshow/mfvideo/mswebdvd/msdvd.h
2020-09-26 16:20:57 +08:00

691 lines
29 KiB
C++

/*************************************************************************/
/* Copyright (C) 1999 Microsoft Corporation */
/* File: msdvd.h */
/* Description: Declaration of CMSWebDVD */
/* Author: David Janecek */
/*************************************************************************/
#ifndef __MSWEBDVD_H_
#define __MSWEBDVD_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include <streams.h>
#include <dvdevcod.h>
#include "MSWebDVD.h"
#include "MSWebDVDCP.h"
#include "MSDVDAdm.h"
#include "ThunkProc.h" // for template for MSDVD timer
#include "MSLCID.h"
#include "mediahndlr.h"
//
// Special user message used by the app for event notification
//
#define WM_DVDPLAY_EVENT (WM_USER+101)
#define NO_STOP (-1)
#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)
#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)
#define UNDEFINED_COLORKEY_COLOR 0xff000000
#define MAGENTA_COLOR_KEY 0x00ff00ff
#define DEFAULT_COLOR_KEY 0x00100010
#define DEFAULT_BACK_COLOR 0x00100010
#define OCR_ARROW_DEFAULT 100
/////////////////////////////////////////////////////////////////////////////////
// copied from vpinfo.h which is a private header
#if defined(CCHDEVICENAME)
#define AMCCHDEVICENAME CCHDEVICENAME
#else
#define AMCCHDEVICENAME 32
#endif
#define AMCCHDEVICEDESCRIPTION 256
#define AMDDRAWMONITORINFO_PRIMARY_MONITOR 0x0001
typedef struct {
GUID* lpGUID; // is NULL if the default DDraw device
GUID GUID; // otherwise points to this GUID
} AMDDRAWGUID;
typedef struct {
AMDDRAWGUID guid;
RECT rcMonitor;
HMONITOR hMon;
DWORD dwFlags;
char szDevice[AMCCHDEVICENAME];
char szDescription[AMCCHDEVICEDESCRIPTION];
DDCAPS_DX3 ddHWCaps;
} AMDDRAWMONITORINFO;
DECLARE_INTERFACE_(IAMSpecifyDDrawConnectionDevice, IUnknown)
{
// Use this method on a Multi-Monitor system to specify to the overlay
// mixer filter which Direct Draw driver should be used when connecting
// to an upstream decoder filter.
//
STDMETHOD (SetDDrawGUID)(THIS_
/* [in] */ const AMDDRAWGUID *lpGUID
) PURE;
// Use this method to determine the direct draw object that will be used when
// connecting the overlay mixer filter to an upstream decoder filter.
//
STDMETHOD (GetDDrawGUID)(THIS_
/* [out] */ AMDDRAWGUID *lpGUID
) PURE;
// Use this method on a multi-monitor system to specify to the
// overlay mixer filter the default Direct Draw device to use when
// connecting to an upstream filter. The default direct draw device
// can be overriden for a particular connection by SetDDrawGUID method
// described above.
//
STDMETHOD (SetDefaultDDrawGUID)(THIS_
/* [in] */ const AMDDRAWGUID *lpGUID
) PURE;
// Use this method on a multi-monitor system to determine which
// is the default direct draw device the overlay mixer filter
// will use when connecting to an upstream filter.
//
STDMETHOD (GetDefaultDDrawGUID)(THIS_
/* [out] */ AMDDRAWGUID *lpGUID
) PURE;
// Use this method to get a list of Direct Draw device GUIDs and thier
// associated monitor information that the overlay mixer can use when
// connecting to an upstream decoder filter.
//
// The method allocates and returns an array of AMDDRAWMONITORINFO
// structures, the caller of function is responsible for freeing this
// memory when it is no longer needed via CoTaskMemFree.
//
STDMETHOD (GetDDrawGUIDs)(THIS_
/* [out] */ LPDWORD lpdwNumDevices,
/* [out] */ AMDDRAWMONITORINFO** lplpInfo
) PURE;
};
typedef struct {
long lHeight; // in pels
long lWidth; // in pels
long lBitsPerPel; // Usually 16 but could be 12 for the YV12 format
long lAspectX; // X aspect ratio
long lAspectY; // Y aspect ratio
long lStride; // stride in bytes
DWORD dwFourCC; // YUV type code ie. 'YUY2', 'YV12' etc
DWORD dwFlags; // Flag used to further describe the image
DWORD dwImageSize; // Size of the bImage array in bytes, which follows this
// data structure
// BYTE bImage[dwImageSize];
} YUV_IMAGE;
#define DM_BOTTOMUP_IMAGE 0x00001
#define DM_TOPDOWN_IMAGE 0x00002
#define DM_FIELD_IMAGE 0x00004
#define DM_FRAME_IMAGE 0x00008
DECLARE_INTERFACE_(IDDrawNonExclModeVideo , IDDrawExclModeVideo )
{
//
// Call this function to capture the current image being displayed
// by the overlay mixer. It is not always possible to capture the
// current frame, for example MoComp may be in use. Applications
// should always call IsImageCaptureSupported (see below) before
// calling this function.
//
STDMETHOD (GetCurrentImage)(THIS_
/* [out] */ YUV_IMAGE** lplpImage
) PURE;
STDMETHOD (IsImageCaptureSupported)(THIS_
) PURE;
//
// On a multi-monitor system, applications call this function when they
// detect that the playback rectangle has moved to a different monitor.
// This call has no effect on a single monitor system.
//
STDMETHOD (ChangeMonitor)(THIS_
/* [in] */ HMONITOR hMonitor,
/* [in] */ LPDIRECTDRAW pDDrawObject,
/* [in] */ LPDIRECTDRAWSURFACE pDDrawSurface
) PURE;
//
// When an application receives a WM_DISPLAYCHANGE message it should
// call this function to allow the OVMixer to recreate DDraw surfaces
// suitable for the new display mode. The application itself must re-create
// the new DDraw object and primary surface passed in the call.
//
STDMETHOD (DisplayModeChanged)(THIS_
/* [in] */ HMONITOR hMonitor,
/* [in] */ LPDIRECTDRAW pDDrawObject,
/* [in] */ LPDIRECTDRAWSURFACE pDDrawSurface
) PURE;
//
// Applications should continually check that the primary surface passed
// to the OVMixer does not become "lost", ie. the user entered a Dos box or
// pressed Alt-Ctrl-Del. When "surface loss" is detected the application should
// call this function so that the OVMixer can restore the surfaces used for
// video playback.
//
STDMETHOD (RestoreSurfaces)(THIS_
) PURE;
};
////////////////////////////////////////////////////////////////////////////////////
/*************************************************************************/
/* Local Defines to sort of abstract the implementation and make the */
/* changes bit more convinient. */
/*************************************************************************/
#define INITIALIZE_GRAPH_IF_NEEDS_TO_BE \
{ \
hr = RenderGraphIfNeeded(); \
if(FAILED(hr)){ \
\
throw(hr); \
}/* end of if statement */ \
}
#define RETRY_IF_IN_FPDOM(func) \
{ \
hr = (func); \
if((VFW_E_DVD_INVALIDDOMAIN == hr || \
VFW_E_DVD_OPERATION_INHIBITED == hr)){ \
if(SUCCEEDED(PassFP_DOM())){ \
\
hr = (func); \
}/* end of if statement */ \
}/* end of if statement */ \
if(FAILED(hr)){ \
RestoreGraphState(); \
}/* end of if statement */ \
}
#define INITIALIZE_GRAPH_IF_NEEDS_TO_BE_AND_PLAY \
{ \
hr = Play(); /* put in the play mode*/ \
\
if(FAILED(hr)){ \
\
throw(hr); \
}/* end of if statement */ \
}
class CDDrawDVD;
class COverlayCallback;
/////////////////////////////////////////////////////////////////////////////
// CMSWebDVD
class ATL_NO_VTABLE CMSWebDVD :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CMSWebDVD, IMSWebDVD, &IID_IMSWebDVD, &LIBID_MSWEBDVDLib>,
public IPropertyNotifySinkCP<CMSWebDVD>,
public CComControl<CMSWebDVD>,
public IPersistStreamInitImpl<CMSWebDVD>,
public IOleControlImpl<CMSWebDVD>,
public IOleObjectImpl<CMSWebDVD>,
public IOleInPlaceActiveObjectImpl<CMSWebDVD>,
public IViewObjectExImpl<CMSWebDVD>,
public IOleInPlaceObjectWindowlessImpl<CMSWebDVD>,
public IPersistStorageImpl<CMSWebDVD>,
public ISpecifyPropertyPagesImpl<CMSWebDVD>,
public IDataObjectImpl<CMSWebDVD>,
public IProvideClassInfo2Impl<&CLSID_MSWebDVD, &DIID__IMSWebDVD, &LIBID_MSWEBDVDLib>,
public CComCoClass<CMSWebDVD, &CLSID_MSWebDVD>,
public IObjectSafety,
public ISupportErrorInfo,
public IPersistPropertyBagImpl<CMSWebDVD>,
public CProxy_IMSWebDVD< CMSWebDVD >,
#ifdef _WMP
public IWMPUIPluginImpl<CMSWebDVD>,
public IWMPUIPluginEventsImpl,
#endif
public IConnectionPointContainerImpl<CMSWebDVD>,
public IObjectWithSiteImplSec<CMSWebDVD>,
public CMSDVDTimer<CMSWebDVD>
{
public:
CMSWebDVD();
virtual ~CMSWebDVD();
//DECLARE_CLASSFACTORY_SINGLETON(CMSWebDVD)
DECLARE_REGISTRY_RESOURCEID(IDR_MSWEBDVD)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMSWebDVD)
COM_INTERFACE_ENTRY(IMSWebDVD)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()
BEGIN_PROP_MAP(CMSWebDVD)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("DisableAutoMouseProcessing", 70, CLSID_NULL)
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("EnableResetOnStop", 66, CLSID_NULL)
PROP_ENTRY("ColorKey", 58, CLSID_NULL)
PROP_ENTRY("WindowlessActivation", 69, CLSID_NULL)
#if 0
PROP_ENTRY("ToolTip", 92, CLSID_NULL)
PROP_ENTRY("ToolTipMaxWidth", 95, CLSID_NULL)
#endif
END_PROP_MAP()
BEGIN_CONNECTION_POINT_MAP(CMSWebDVD)
CONNECTION_POINT_ENTRY(DIID__IMSWebDVD)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CMSWebDVD)
MESSAGE_HANDLER(WM_CREATE, OnCreate); // works only in windowed case
MESSAGE_HANDLER(WM_DESTROY,OnDestroy);// works only in windowed case
MESSAGE_HANDLER(WM_SIZE, OnSize);
MESSAGE_HANDLER(WM_SIZING, OnSize);
MESSAGE_HANDLER(WM_ERASEBKGND, OnErase)
MESSAGE_HANDLER(WM_DVDPLAY_EVENT, OnDVDEvent);
MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseToolTip)
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
MESSAGE_HANDLER(WM_LBUTTONUP, OnButtonUp)
MESSAGE_HANDLER(WM_DISPLAYCHANGE, OnDispChange);
MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor);
CHAIN_MSG_MAP(CComControl<CMSWebDVD>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// IMSWebDVD
public:
STDMETHOD(get_FullScreenMode)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_FullScreenMode)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(PlayChaptersAutoStop)(LONG lTitle, LONG lstrChapter, LONG lChapterCount);
STDMETHOD(GetNumberOfChapters)(long lTitle, /*[out, retval]*/ long *pVal);
STDMETHOD(get_TitlesAvailable)(/*[out, retval]*/ long* pVal);
STDMETHOD(Render)(/*[in]*/ long lRender = 0);
STDMETHOD(Stop)();
STDMETHOD(Pause)();
STDMETHOD(Play)();
STDMETHOD(PlayTitle)(LONG lTitle);
STDMETHOD(PlayChapterInTitle)(LONG lTitle, LONG lChapter);
STDMETHOD(PlayChapter)(LONG lChapter);
STDMETHOD(GetSubpictureLanguage)(LONG lStream, BSTR* strLanguage);
STDMETHOD(PlayAtTime)(BSTR strTime);
STDMETHOD(PlayAtTimeInTitle)(long lTitle, BSTR strTime);
STDMETHOD(PlayPeriodInTitleAutoStop)(long lTitle, BSTR strStartTime, BSTR strEndTime);
STDMETHOD(ReplayChapter)();
STDMETHOD(PlayPrevChapter)();
STDMETHOD(PlayNextChapter)();
STDMETHOD(PlayForwards)(double dSpeed, VARIANT_BOOL fDoNotReset);
STDMETHOD(PlayBackwards)(double dSpeed, VARIANT_BOOL fDoNotReset);
STDMETHOD(StillOff)();
STDMETHOD(GetAudioLanguage)(LONG lStream, VARIANT_BOOL fFormat, BSTR* strAudioLang);
STDMETHOD(ReturnFromSubmenu)();
STDMETHOD(SelectAndActivateButton)(long lButton);
STDMETHOD(ActivateButton)();
STDMETHOD(SelectRightButton)();
STDMETHOD(SelectLeftButton)();
STDMETHOD(SelectLowerButton)();
STDMETHOD(SelectUpperButton)();
STDMETHOD(get_PlayState)(/*[out, retval]*/ DVDFilterState *pVal);
STDMETHOD(ShowMenu)(DVDMenuIDConstants MenuID);
STDMETHOD(Resume)();
STDMETHOD(get_CurrentSubpictureStream)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_CurrentSubpictureStream)(/*[in]*/ long newVal);
STDMETHOD(get_VolumesAvailable)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentVolume)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentDiscSide)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentDomain)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_DVDDirectory)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_DVDDirectory)(/*[in]*/ BSTR newVal);
STDMETHOD(get_CurrentTime)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(get_FramesPerSecond)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentChapter)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentTitle)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_ColorKey)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_ColorKey)(/*[in]*/ long newVal);
STDMETHOD(get_CurrentAudioStream)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_CurrentAudioStream)(/*[in]*/ long newVal);
STDMETHOD(get_AudioStreamsAvailable)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_AnglesAvailable)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentAngle)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_CurrentAngle)(/*[in]*/ long newVal);
STDMETHOD(get_CCActive)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_CCActive)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(get_ButtonsAvailable)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentButton)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_CurrentCCService)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_CurrentCCService)(/*[in]*/ long newVal);
STDMETHOD(get_TotalTitleTime)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(get_SubpictureStreamsAvailable)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_SubpictureOn)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_SubpictureOn)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(UOPValid)(long lUOP, VARIANT_BOOL* pfValid);
STDMETHOD(get_Balance)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_Balance)(/*[in]*/ long newVal);
STDMETHOD(get_Volume)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_Volume)(/*[in]*/ long newVal);
STDMETHOD(get_Mute)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_Mute)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(get_DVDUniqueID)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(GetSPRM)(long lIndex, short *psSPRM);
STDMETHOD(GetGPRM)(long lIndex, short *psSPRM);
STDMETHOD(get_EnableResetOnStop)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_EnableResetOnStop)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(get_BackColor)(VARIANT* pclrBackColor);
STDMETHOD(put_BackColor)(VARIANT clrBackColor);
STDMETHOD(get_ReadyState)(/*[out, retval]*/ LONG *pVal);
STDMETHOD(ActivateAtPosition)(long xPos, long yPos);
STDMETHOD(SelectAtPosition)(long xPos, long yPos);
STDMETHOD(get_DisableAutoMouseProcessing)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_DisableAutoMouseProcessing)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(get_WindowlessActivation)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(put_WindowlessActivation)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(GetButtonRect)(long lButton, IDVDRect** pRect);
STDMETHOD(GetButtonAtPosition)(long xPos, long yPos, long* plButton);
STDMETHOD(AcceptParentalLevelChange)(VARIANT_BOOL fAccept, BSTR strUserName, BSTR strPassword);
STDMETHOD(NotifyParentalLevelChange)(/*[in]*/ VARIANT_BOOL newVal);
STDMETHOD(SelectParentalCountry)(long lCountry, BSTR strUserName, BSTR strPassword);
STDMETHOD(SelectParentalLevel)(long lParentalLevel, BSTR strUserName, BSTR strPassword);
STDMETHOD(GetTitleParentalLevels)(long lTitle, long* plParentalLevels);
STDMETHOD(GetPlayerParentalCountry)(long* plCountryCode);
STDMETHOD(GetPlayerParentalLevel)(long* plParentalLevel);
STDMETHOD(SetClipVideoRect)(IDVDRect* pRect);
STDMETHOD(GetVideoSize)(IDVDRect** ppRect);
STDMETHOD(GetClipVideoRect)(IDVDRect** ppRect);
STDMETHOD(SetDVDScreenInMouseCoordinates)(IDVDRect* pRect);
STDMETHOD(GetDVDScreenInMouseCoordinates)(IDVDRect** ppRect);
#if 1
STDMETHOD(get_ToolTip)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_ToolTip)(/*[in]*/ BSTR newVal);
STDMETHOD(get_ToolTipMaxWidth)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_ToolTipMaxWidth)(/*[in]*/ long newVal);
STDMETHOD(GetDelayTime)(/*[in]*/ long delayType, /*[out, retval]*/ VARIANT *pVal);
STDMETHOD(SetDelayTime)(/*[in]*/ long delayType, /*[in]*/ VARIANT newVal);
#endif
HRESULT ProcessEvents();
STDMETHOD(Eject)();
STDMETHOD(SetGPRM)(long lIndex, short sValue);
STDMETHOD(GetDVDTextStringType)(long lLangIndex, long lStringIndex, DVDTextStringType* pType);
STDMETHOD(GetDVDTextString)(long lLangIndex, long lStringIndex, BSTR* pstrText);
STDMETHOD(GetDVDTextNumberOfStrings)(long lLangIndex, long* plNumOfStrings);
STDMETHOD(GetDVDTextNumberOfLanguages)(long* plNumOfLangs);
STDMETHOD(GetDVDTextLanguageLCID)(/*[in]*/ long lLangIndex, /*[out, retval]*/ long* lcid);
STDMETHOD(RegionChange)();
STDMETHOD(Zoom)(long x, long y, double zoomRatio);
STDMETHOD(get_CursorType)(/*[out, retval]*/ DVDCursorType *pVal);
STDMETHOD(put_CursorType)(/*[in]*/ DVDCursorType newVal);
STDMETHOD(get_DVDAdm)(/*[out, retval]*/ IDispatch* *pVal);
STDMETHOD(DeleteBookmark)();
STDMETHOD(RestoreBookmark)();
STDMETHOD(SaveBookmark)();
STDMETHOD(Capture)();
STDMETHOD(SelectDefaultAudioLanguage)(long lang, long ext);
STDMETHOD(SelectDefaultSubpictureLanguage)(long lang, DVDSPExt ext);
STDMETHOD(get_PreferredSubpictureStream)(/*[out, retval]*/ long *pVal);
STDMETHOD(CanStep)(VARIANT_BOOL fBackwards, VARIANT_BOOL *pfCan);
STDMETHOD(Step)(long lStep);
STDMETHOD(get_DefaultMenuLanguage)(long* lang);
STDMETHOD(put_DefaultMenuLanguage)(long lang);
STDMETHOD(get_DefaultSubpictureLanguage)(long* lang);
STDMETHOD(get_DefaultAudioLanguage)(long *lang);
STDMETHOD(get_DefaultSubpictureLanguageExt)(DVDSPExt* ext);
STDMETHOD(get_DefaultAudioLanguageExt)(long *ext);
STDMETHOD(get_KaraokeAudioPresentationMode)(/*[out, retval]*/ long *pVal);
STDMETHOD(put_KaraokeAudioPresentationMode)(/*[in]*/ long newVal);
STDMETHOD(GetKaraokeChannelContent)(long lStream, long lChan, long* lContent);
STDMETHOD(GetKaraokeChannelAssignment)(long lStream, long *lChannelAssignment);
STDMETHOD(get_AspectRatio)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_ShowCursor)(VARIANT_BOOL fShow);
STDMETHOD(get_ShowCursor)(VARIANT_BOOL* pfShow);
STDMETHOD(GetLangFromLangID)(/*[in]*/ long langID, /*[out, retval]*/ BSTR* lang);
STDMETHOD(DVDTimeCode2bstr)(/*[in]*/ long timeCode, /*[out, retval]*/ BSTR *pTimeStr);
STDMETHOD(IsSubpictureStreamEnabled)(/*[in]*/ long lstream, /*[out, retval]*/ VARIANT_BOOL *fEnabled);
STDMETHOD(IsAudioStreamEnabled)(/*[in]*/ long lstream, /*[out, retval]*/ VARIANT_BOOL *fEnabled);
STDMETHOD(SetObjectRects)(LPCRECT prcPos,LPCRECT prcClip);
//ISafety
STDMETHOD(GetInterfaceSafetyOptions)( REFIID riid,
DWORD *pdwSupportedOptions,
DWORD *pdwEnabledOptions );
STDMETHOD(SetInterfaceSafetyOptions)( REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions );
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite);
// local helper functions
public:
HRESULT AdjustDestRC();
HRESULT OnDraw(ATL_DRAWINFO& di);
#ifdef _WMP
HRESULT InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/);
#endif
HRESULT OnPostVerbInPlaceActivate();
HRESULT TimerProc(); // needs to be called from a timer proc
static CWndClassInfo& GetWndClassInfo(){
static HBRUSH hbr= ::CreateSolidBrush(RGB(0,0,0));
/**********************************
#define OCR_ARROW_DEFAULT 100
// need special cursor, we we do not have color key around it
static HCURSOR hcr = (HCURSOR) ::LoadImage((HINSTANCE) NULL,
MAKEINTRESOURCE(OCR_ARROW_DEFAULT),
IMAGE_CURSOR,0,0,0);
*********************/
static CWndClassInfo wc = {{ sizeof(WNDCLASSEX), 0, StartWindowProc,
0, 0, NULL, NULL, NULL, /* NULL */ hbr,
NULL, TEXT("MSMFVideoClass"), NULL },
NULL, NULL, MAKEINTRESOURCE(OCR_ARROW_DEFAULT), TRUE, 0, _T("") };
return wc;
}/* end of function GetWndClassInfo */
private:
VOID Init();
VOID Cleanup();
HRESULT SetDDrawExcl();
LRESULT OnDVDEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDispChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnErase(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnMouseToolTip(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnButtonDown(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnButtonUp(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnMouseMove(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetCursor(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
HRESULT SetReadyState(LONG lReadyState);
static HRESULT DVDTime2bstr(const DVD_HMSF_TIMECODE *pulTime, BSTR *pbstrTime);
static HRESULT Bstr2DVDTime(DVD_HMSF_TIMECODE *pulTime, const BSTR *pbstrTime);
HRESULT SetColorKey(COLORREF clr);
HRESULT GetColorKey(COLORREF* pClr);
HRESULT TraverseForInterface(REFIID iid, LPVOID* ppvObject);
HRESULT SetupAudio(); // fills in the audio interface
HRESULT SetupDDraw();
HRESULT SetupEventNotifySink(); // sets up IMediaEventSink
HRESULT RenderGraphIfNeeded();
HRESULT PassFP_DOM();
HRESULT getCDDriveLetter(TCHAR* lpDrive);
DWORD OpenCdRom(TCHAR chDrive, LPDWORD lpdwErrCode);
HRESULT CloseCdRom(DWORD DevHandle);
HRESULT EjectCdRom(DWORD DevHandle);
HRESULT UnEjectCdRom(DWORD DevHandle);
HRESULT HandleError(HRESULT hr);
HRESULT SelectParentalLevel(long lParentalLevel);
HRESULT SelectParentalCountry(long lCountry);
HRESULT TransformToWndwls(POINT& pt);
HRESULT getDVDDriveLetter(TCHAR* lpDrive);
HRESULT GetMostOuterWindow(HWND* phwndParent);
HRESULT RestoreDefaultSettings();
HRESULT GetParentHWND(HWND* pWnd);
HRESULT GetUsableWindow(HWND* pWnd);
HRESULT GetClientRectInScreen(RECT* prc);
HRESULT OnResize(); //helper function that we need to marshal
HRESULT RestoreGraphState();
HRESULT AppendString(TCHAR* strDest, INT strID, LONG dwLen);
HRESULT InvalidateRgn(bool fErase = false);
// monitor support
HRESULT RefreshDDrawGuids();
HRESULT DDrawGuidFromHMonitor(HMONITOR hMon, AMDDRAWGUID* lpGUID);
bool IsWindowOnWrongMonitor(HMONITOR* lphMon);
HRESULT RestoreSurfaces();
HRESULT ChangeMonitor(HMONITOR hMon, const AMDDRAWGUID* lpguid);
HRESULT DisplayChange(HMONITOR hMon, const AMDDRAWGUID* lpguid);
HRESULT UpdateCurrentMonitor(const AMDDRAWGUID* lpguid);
HRESULT HandleMultiMonMove();
HRESULT HandleMultiMonPaint(HDC hdc);
HRESULT get_IntVolume(LONG* plVolume);
HRESULT put_IntVolume(long lVolume);
HRESULT CanStepBackwards();
// member variables
private:
LONG m_lChapter, m_lTitle;
LONG m_lChapterCount; // count of the chapters to play
CComPtr<IDvdGraphBuilder> m_pDvdGB; // IDvdGraphBuilder interface
CComPtr<IGraphBuilder> m_pGB; // IGraphBuilder interface
CComPtr<IMediaControl> m_pMC; // IMediaControl interface
CComPtr<IMediaEventEx> m_pME ; // IMediaEventEx interface
CComPtr<IDvdControl2> m_pDvdCtl2; // New DVD Control
CComPtr<IDvdInfo2> m_pDvdInfo2; // New DVD Info Interface
CComPtr<IBasicAudio> m_pAudio; // Audio interface
CComPtr<IMediaEventSink> m_pMediaSink;
BOOL m_bUseColorKey; // flag to see if we are using color key
COLORREF m_clrColorKey; // color key
BOOL m_bMute; // mute flag
LONG m_lLastVolume; // used to preserve the last volume for mute
BOOL m_fEnableResetOnStop; // disable or enable the restart of the seek
CComPtr<IVideoFrameStep> m_pVideoFrameStep;
CComPtr<IDDrawNonExclModeVideo> m_pDDEX; // The new interface that can capture
//IDDrawExclModeVideo *m_pDDEX; // IDDrawExclModeVideo interface
bool m_fUseDDrawDirect; // flag to switch between a ddraw mode and none ddraw mode
bool m_fInitialized; // flag to see if we are initialize
HANDLE m_hFPDOMEvent; // handle to the FP_DOM event which gets signaled when we get out of FP_DOM
bool m_fDisableAutoMouseProcessing; // Disable the automatic mouse processing
bool m_bEjected; // whether disc is ejected right now
bool m_fStillOn; // flag to see if we have a still
bool m_fResetSpeed;
CComPtr<IMSDVDAdm> m_pDvdAdmin;
DVDCursorType m_nCursorType;
RECT *m_pClipRect;
RECT m_ClipRectDown;
BOOL m_bMouseDown;
POINT m_ClipCenter;
POINT m_LastMouse;
POINT m_LastMouseDown;
HCURSOR m_hCursor;
double m_dZoomRatio;
DWORD m_dwAspectX;
DWORD m_dwAspectY;
DWORD m_dwVideoWidth;
DWORD m_dwVideoHeight;
DWORD m_dwOvMaxStretch;
HWND m_hWndOuter;
RECT m_rcOldPos;
RECT m_rcPosAspectRatioAjusted;
UINT_PTR m_hTimerId;
DVDFilterState m_DVDFilterState;
MSLangID m_LangID;
long m_lKaraokeAudioPresentationMode;
DWORD_PTR m_dwTTReshowDelay;
DWORD_PTR m_dwTTAutopopDelay;
DWORD_PTR m_dwTTInitalDelay;
// monitor support
CDDrawDVD* m_pDDrawDVD;
DWORD m_dwNumDevices;
AMDDRAWMONITORINFO* m_lpInfo;
AMDDRAWMONITORINFO* m_lpCurMonitor;
BOOL m_MonitorWarn;
bool m_fStepComplete;
BOOL m_bFireUpdateOverlay;
// ejection/insert handling
// This MUST be in the same thread as the disk reader or we'll
// end up with some nasty race conditions (ejection notification
// will happen after a read instead of before)
CMediaHandler m_mediaHandler;
BOOL m_bFireNoSubpictureStream;
#if 1
HWND m_hWndTip; // Tooltip window
LONG m_nTTMaxWidth; // Max tooltip width
CComBSTR m_bstrToolTip; // Tooltip string
BOOL m_bTTCreated; // Has tooltip been created yet
HRESULT CreateToolTip();
#endif
bool m_fBackWardsFlagInitialized;
bool m_fCanStepBackwards;
// stock properties have to be public due to ATL implementation
public:
LONG m_nReadyState; // ready state change stock property
OLE_COLOR m_clrBackColor; // stock property implemeted in the CStockPropImpl
void SetDiscEjected(bool bEjected) {m_bEjected = bEjected;};
HRESULT UpdateOverlay();
};
// error code
#define E_FORMAT_NOT_SUPPORTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xFF2)
#endif //__MSWEBDVD_H_
/*************************************************************************/
/* End of file: msdvd.h */
/*************************************************************************/