/*** Autogenerated by WIDL 9.8 from include/dvdif.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __dvdif_h__
#define __dvdif_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IDvdControl_FWD_DEFINED__
#define __IDvdControl_FWD_DEFINED__
typedef interface IDvdControl IDvdControl;
#ifdef __cplusplus
interface IDvdControl;
#endif /* __cplusplus */
#endif

#ifndef __IDvdInfo_FWD_DEFINED__
#define __IDvdInfo_FWD_DEFINED__
typedef interface IDvdInfo IDvdInfo;
#ifdef __cplusplus
interface IDvdInfo;
#endif /* __cplusplus */
#endif

#ifndef __IDvdCmd_FWD_DEFINED__
#define __IDvdCmd_FWD_DEFINED__
typedef interface IDvdCmd IDvdCmd;
#ifdef __cplusplus
interface IDvdCmd;
#endif /* __cplusplus */
#endif

#ifndef __IDvdState_FWD_DEFINED__
#define __IDvdState_FWD_DEFINED__
typedef interface IDvdState IDvdState;
#ifdef __cplusplus
interface IDvdState;
#endif /* __cplusplus */
#endif

#ifndef __IDvdControl2_FWD_DEFINED__
#define __IDvdControl2_FWD_DEFINED__
typedef interface IDvdControl2 IDvdControl2;
#ifdef __cplusplus
interface IDvdControl2;
#endif /* __cplusplus */
#endif

#ifndef __IDvdInfo2_FWD_DEFINED__
#define __IDvdInfo2_FWD_DEFINED__
typedef interface IDvdInfo2 IDvdInfo2;
#ifdef __cplusplus
interface IDvdInfo2;
#endif /* __cplusplus */
#endif

#ifndef __IDvdGraphBuilder_FWD_DEFINED__
#define __IDvdGraphBuilder_FWD_DEFINED__
typedef interface IDvdGraphBuilder IDvdGraphBuilder;
#ifdef __cplusplus
interface IDvdGraphBuilder;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <objidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <ddraw.h>
#if 0
#ifndef __IGraphBuilder_FWD_DEFINED__
#define __IGraphBuilder_FWD_DEFINED__
typedef interface IGraphBuilder IGraphBuilder;
#ifdef __cplusplus
interface IGraphBuilder;
#endif /* __cplusplus */
#endif

#endif
typedef enum tagDVD_DOMAIN {
    DVD_DOMAIN_FirstPlay = 1,
    DVD_DOMAIN_VideoManagerMenu = 2,
    DVD_DOMAIN_VideoTitleSetMenu = 3,
    DVD_DOMAIN_Title = 4,
    DVD_DOMAIN_Stop = 5
} DVD_DOMAIN;
typedef enum tagDVD_MENU_ID {
    DVD_MENU_Title = 2,
    DVD_MENU_Root = 3,
    DVD_MENU_Subpicture = 4,
    DVD_MENU_Audio = 5,
    DVD_MENU_Angle = 6,
    DVD_MENU_Chapter = 7
} DVD_MENU_ID;
typedef enum tagDVD_DISC_SIDE {
    DVD_SIDE_A = 1,
    DVD_SIDE_B = 2
} DVD_DISC_SIDE;
typedef enum tagDVD_PREFERRED_DISPLAY_MODE {
    DISPLAY_CONTENT_DEFAULT = 0,
    DISPLAY_16x9 = 1,
    DISPLAY_4x3_PANSCAN_PREFERRED = 2,
    DISPLAY_4x3_LETTERBOX_PREFERRED = 3
} DVD_PREFERRED_DISPLAY_MODE;
typedef WORD DVD_REGISTER;
typedef DVD_REGISTER GPRMARRAY[16];
typedef DVD_REGISTER SPRMARRAY[24];
typedef struct tagDVD_ATR {
    ULONG ulCAT;
    BYTE pbATRI[768];
} DVD_ATR;
typedef BYTE DVD_VideoATR[2];
typedef BYTE DVD_AudioATR[8];
typedef BYTE DVD_SubpictureATR[6];
typedef enum tagDVD_FRAMERATE {
    DVD_FPS_25 = 1,
    DVD_FPS_30NonDrop = 3
} DVD_FRAMERATE;
typedef struct tagDVD_TIMECODE
{
   ULONG Hours1 : 4;
   ULONG Hours10 : 4;
   ULONG Minutes1 : 4;
   ULONG Minutes10 : 4;
   ULONG Seconds1 : 4;
   ULONG Seconds10 : 4;
   ULONG Frames1 : 4;
   ULONG Frames10 : 2;
   ULONG FrameRateCode : 2;
} DVD_TIMECODE;
typedef enum tagDVD_NavCmdType {
    DVD_NavCmdType_Pre = 1,
    DVD_NavCmdType_Post = 2,
    DVD_NavCmdType_Cell = 3,
    DVD_NavCmdType_Button = 4
} DVD_NavCmdType;
typedef enum tagDVD_TIMECODE_FLAGS {
    DVD_TC_FLAG_25fps = 0x1,
    DVD_TC_FLAG_30fps = 0x2,
    DVD_TC_FLAG_DropFrame = 0x4,
    DVD_TC_FLAG_Interpolated = 0x8
} DVD_TIMECODE_FLAGS;
typedef struct tagDVD_HMSF_TIMECODE {
    BYTE bHours;
    BYTE bMinutes;
    BYTE bSeconds;
    BYTE bFrames;
} DVD_HMSF_TIMECODE;
typedef struct tagDVD_PLAYBACK_LOCATION2 {
    ULONG TitleNum;
    ULONG ChapterNum;
    DVD_HMSF_TIMECODE TimeCode;
    ULONG TimeCodeFlags;
} DVD_PLAYBACK_LOCATION2;
typedef struct tagDVD_PLAYBACK_LOCATION {
    ULONG TitleNum;
    ULONG ChapterNum;
    ULONG TimeCode;
} DVD_PLAYBACK_LOCATION;
typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
typedef enum __WIDL_dvdif_generated_name_0000000E {
    UOP_FLAG_Play_Title_Or_AtTime = 0x1,
    UOP_FLAG_Play_Chapter = 0x2,
    UOP_FLAG_Play_Title = 0x4,
    UOP_FLAG_Stop = 0x8,
    UOP_FLAG_ReturnFromSubMenu = 0x10,
    UOP_FLAG_Play_Chapter_Or_AtTime = 0x20,
    UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x40,
    UOP_FLAG_PlayNext_Chapter = 0x80,
    UOP_FLAG_Play_Forwards = 0x100,
    UOP_FLAG_Play_Backwards = 0x200,
    UOP_FLAG_ShowMenu_Title = 0x400,
    UOP_FLAG_ShowMenu_Root = 0x800,
    UOP_FLAG_ShowMenu_SubPic = 0x1000,
    UOP_FLAG_ShowMenu_Audio = 0x2000,
    UOP_FLAG_ShowMenu_Angle = 0x4000,
    UOP_FLAG_ShowMenu_Chapter = 0x8000,
    UOP_FLAG_Resume = 0x10000,
    UOP_FLAG_Select_Or_Activate_Button = 0x20000,
    UOP_FLAG_Still_Off = 0x40000,
    UOP_FLAG_Pause_On = 0x80000,
    UOP_FLAG_Select_Audio_Stream = 0x100000,
    UOP_FLAG_Select_SubPic_Stream = 0x200000,
    UOP_FLAG_Select_Angle = 0x400000,
    UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x800000,
    UOP_FLAG_Select_Video_Mode_Preference = 0x1000000
} VALID_UOP_FLAG;
typedef enum __WIDL_dvdif_generated_name_0000000F {
    DVD_CMD_FLAG_None = 0x0,
    DVD_CMD_FLAG_Flush = 0x1,
    DVD_CMD_FLAG_SendEvents = 0x2,
    DVD_CMD_FLAG_Block = 0x4,
    DVD_CMD_FLAG_StartWhenRendered = 0x8,
    DVD_CMD_FLAG_EndAfterRendered = 0x10
} DVD_CMD_FLAGS;
typedef enum __WIDL_dvdif_generated_name_00000010 {
    DVD_ResetOnStop = 1,
    DVD_NotifyParentalLevelChange = 2,
    DVD_HMSF_TimeCodeEvents = 3,
    DVD_AudioDuringFFwdRew = 4,
    DVD_EnableNonblockingAPIs = 5,
    DVD_CacheSizeInMB = 6,
    DVD_EnablePortableBookmarks = 7,
    DVD_EnableExtendedCopyProtectErrors = 8,
    DVD_NotifyPositionChange = 9,
    DVD_IncreaseOutputControl = 10,
    DVD_EnableStreaming = 11,
    DVD_EnableESOutput = 12,
    DVD_EnableTitleLength = 13,
    DVD_DisableStillThrottle = 14,
    DVD_EnableLoggingEvents = 15,
    DVD_MaxReadBurstInKB = 16,
    DVD_ReadBurstPeriodInMS = 17,
    DVD_RestartDisc = 18,
    DVD_EnableCC = 19
} DVD_OPTION_FLAG;
typedef enum __WIDL_dvdif_generated_name_00000011 {
    DVD_Relative_Upper = 1,
    DVD_Relative_Lower = 2,
    DVD_Relative_Left = 3,
    DVD_Relative_Right = 4
} DVD_RELATIVE_BUTTON;
typedef enum tagDVD_PARENTAL_LEVEL {
    DVD_PARENTAL_LEVEL_8 = 0x8000,
    DVD_PARENTAL_LEVEL_7 = 0x4000,
    DVD_PARENTAL_LEVEL_6 = 0x2000,
    DVD_PARENTAL_LEVEL_5 = 0x1000,
    DVD_PARENTAL_LEVEL_4 = 0x800,
    DVD_PARENTAL_LEVEL_3 = 0x400,
    DVD_PARENTAL_LEVEL_2 = 0x200,
    DVD_PARENTAL_LEVEL_1 = 0x100
} DVD_PARENTAL_LEVEL;
typedef enum tagDVD_AUDIO_LANG_EXT {
    DVD_AUD_EXT_NotSpecified = 0,
    DVD_AUD_EXT_Captions = 1,
    DVD_AUD_EXT_VisuallyImpaired = 2,
    DVD_AUD_EXT_DirectorComments1 = 3,
    DVD_AUD_EXT_DirectorComments2 = 4
} DVD_AUDIO_LANG_EXT;
typedef enum tagDVD_SUBPICTURE_LANG_EXT {
    DVD_SP_EXT_NotSpecified = 0,
    DVD_SP_EXT_Caption_Normal = 1,
    DVD_SP_EXT_Caption_Big = 2,
    DVD_SP_EXT_Caption_Children = 3,
    DVD_SP_EXT_CC_Normal = 5,
    DVD_SP_EXT_CC_Big = 6,
    DVD_SP_EXT_CC_Children = 7,
    DVD_SP_EXT_Forced = 9,
    DVD_SP_EXT_DirectorComments_Normal = 13,
    DVD_SP_EXT_DirectorComments_Big = 14,
    DVD_SP_EXT_DirectorComments_Children = 15
} DVD_SUBPICTURE_LANG_EXT;
typedef enum tagDVD_AUDIO_APPMODE {
    DVD_AudioMode_None = 0,
    DVD_AudioMode_Karaoke = 1,
    DVD_AudioMode_Surround = 2,
    DVD_AudioMode_Other = 3
} DVD_AUDIO_APPMODE;
typedef enum tagDVD_AUDIO_FORMAT {
    DVD_AudioFormat_AC3 = 0,
    DVD_AudioFormat_MPEG1 = 1,
    DVD_AudioFormat_MPEG1_DRC = 2,
    DVD_AudioFormat_MPEG2 = 3,
    DVD_AudioFormat_MPEG2_DRC = 4,
    DVD_AudioFormat_LPCM = 5,
    DVD_AudioFormat_DTS = 6,
    DVD_AudioFormat_SDDS = 7,
    DVD_AudioFormat_Other = 8
} DVD_AUDIO_FORMAT;
typedef enum tagDVD_KARAOKE_DOWNMIX {
    DVD_Mix_0to0 = 0x1,
    DVD_Mix_1to0 = 0x2,
    DVD_Mix_2to0 = 0x4,
    DVD_Mix_3to0 = 0x8,
    DVD_Mix_4to0 = 0x10,
    DVD_Mix_Lto0 = 0x20,
    DVD_Mix_Rto0 = 0x40,
    DVD_Mix_0to1 = 0x100,
    DVD_Mix_1to1 = 0x200,
    DVD_Mix_2to1 = 0x400,
    DVD_Mix_3to1 = 0x800,
    DVD_Mix_4to1 = 0x1000,
    DVD_Mix_Lto1 = 0x2000,
    DVD_Mix_Rto1 = 0x4000
} DVD_KARAOKE_DOWNMIX;
typedef enum tagDVD_KARAOKE_CONTENTS {
    DVD_Karaoke_GuideVocal1 = 0x1,
    DVD_Karaoke_GuideVocal2 = 0x2,
    DVD_Karaoke_GuideMelody1 = 0x4,
    DVD_Karaoke_GuideMelody2 = 0x8,
    DVD_Karaoke_GuideMelodyA = 0x10,
    DVD_Karaoke_GuideMelodyB = 0x20,
    DVD_Karaoke_SoundEffectA = 0x40,
    DVD_Karaoke_SoundEffectB = 0x80
} DVD_KARAOKE_CONTENTS;
typedef enum tagDVD_KARAOKE_ASSIGNMENT {
    DVD_Assignment_reserved0 = 0,
    DVD_Assignment_reserved1 = 1,
    DVD_Assignment_LR = 2,
    DVD_Assignment_LRM = 3,
    DVD_Assignment_LR1 = 4,
    DVD_Assignment_LRM1 = 5,
    DVD_Assignment_LR12 = 6,
    DVD_Assignment_LRM12 = 7
} DVD_KARAOKE_ASSIGNMENT;
typedef struct tagDVD_MUA_MixingInfo {
    WINBOOL fMixTo0;
    WINBOOL fMixTo1;
    WINBOOL fMix0InPhase;
    WINBOOL fMix1InPhase;
    DWORD dwSpeakerPosition;
} DVD_MUA_MixingInfo;
typedef struct tagDVD_MUA_Coeff {
    double log2_alpha;
    double log2_beta;
} DVD_MUA_Coeff;
typedef enum tagDVD_VIDEO_COMPRESSION {
    DVD_VideoCompression_Other = 0,
    DVD_VideoCompression_MPEG1 = 1,
    DVD_VideoCompression_MPEG2 = 2
} DVD_VIDEO_COMPRESSION;
typedef enum tagDVD_SUBPICTURE_TYPE {
    DVD_SPType_NotSpecified = 0,
    DVD_SPType_Language = 1,
    DVD_SPType_Other = 2
} DVD_SUBPICTURE_TYPE;
typedef enum tagDVD_SUBPICTURE_CODING {
    DVD_SPCoding_RunLength = 0,
    DVD_SPCoding_Extended = 1,
    DVD_SPCoding_Other = 2
} DVD_SUBPICTURE_CODING;
typedef enum tagDVD_TITLE_APPMODE {
    DVD_AppMode_Not_Specified = 0,
    DVD_AppMode_Karaoke = 1,
    DVD_AppMode_Other = 3
} DVD_TITLE_APPMODE;
enum DVD_TextStringType {
    DVD_Struct_Volume = 0x1,
    DVD_Struct_Title = 0x2,
    DVD_Struct_ParentalID = 0x3,
    DVD_Struct_PartOfTitle = 0x4,
    DVD_Struct_Cell = 0x5,
    DVD_Stream_Audio = 0x10,
    DVD_Stream_Subpicture = 0x11,
    DVD_Stream_Angle = 0x12,
    DVD_Channel_Audio = 0x20,
    DVD_General_Name = 0x30,
    DVD_General_Comments = 0x31,
    DVD_Title_Series = 0x38,
    DVD_Title_Movie = 0x39,
    DVD_Title_Video = 0x3a,
    DVD_Title_Album = 0x3b,
    DVD_Title_Song = 0x3c,
    DVD_Title_Other = 0x3f,
    DVD_Title_Sub_Series = 0x40,
    DVD_Title_Sub_Movie = 0x41,
    DVD_Title_Sub_Video = 0x42,
    DVD_Title_Sub_Album = 0x43,
    DVD_Title_Sub_Song = 0x44,
    DVD_Title_Sub_Other = 0x47,
    DVD_Title_Orig_Series = 0x48,
    DVD_Title_Orig_Movie = 0x49,
    DVD_Title_Orig_Video = 0x4a,
    DVD_Title_Orig_Album = 0x4b,
    DVD_Title_Orig_Song = 0x4c,
    DVD_Title_Orig_Other = 0x4f,
    DVD_Other_Scene = 0x50,
    DVD_Other_Cut = 0x51,
    DVD_Other_Take = 0x52
};
enum DVD_TextCharSet {
    DVD_CharSet_Unicode = 0,
    DVD_CharSet_ISO646 = 1,
    DVD_CharSet_JIS_Roman_Kanji = 2,
    DVD_CharSet_ISO8859_1 = 3,
    DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4
};
typedef struct tagDVD_AudioAttributes {
    DVD_AUDIO_APPMODE AppMode;
    BYTE AppModeData;
    DVD_AUDIO_FORMAT AudioFormat;
    LCID Language;
    DVD_AUDIO_LANG_EXT LanguageExtension;
    WINBOOL fHasMultichannelInfo;
    DWORD dwFrequency;
    BYTE bQuantization;
    BYTE bNumberOfChannels;
    DWORD dwReserved[2];
} DVD_AudioAttributes;
typedef struct tagDVD_MultichannelAudioAttributes {
    DVD_MUA_MixingInfo Info[8];
    DVD_MUA_Coeff Coeff[8];
} DVD_MultichannelAudioAttributes;
typedef struct tagDVD_VideoAttributes {
    WINBOOL fPanscanPermitted;
    WINBOOL fLetterboxPermitted;
    ULONG ulAspectX;
    ULONG ulAspectY;
    ULONG ulFrameRate;
    ULONG ulFrameHeight;
    DVD_VIDEO_COMPRESSION Compression;
    WINBOOL fLine21Field1InGOP;
    WINBOOL fLine21Field2InGOP;
    ULONG ulSourceResolutionX;
    ULONG ulSourceResolutionY;
    WINBOOL fIsSourceLetterboxed;
    WINBOOL fIsFilmMode;
} DVD_VideoAttributes;
typedef struct tagDVD_SubpictureAttributes {
    DVD_SUBPICTURE_TYPE Type;
    DVD_SUBPICTURE_CODING CodingMode;
    LCID Language;
    DVD_SUBPICTURE_LANG_EXT LanguageExtension;
} DVD_SubpictureAttributes;
typedef struct tagDVD_KaraokeAttributes {
    BYTE bVersion;
    WINBOOL fMasterOfCeremoniesInGuideVocal1;
    WINBOOL fDuet;
    DVD_KARAOKE_ASSIGNMENT ChannelAssignment;
    WORD wChannelContents[8];
} DVD_KaraokeAttributes;
typedef struct tagDVD_TitleMainAttributes {
    union {
        DVD_TITLE_APPMODE AppMode;
        DVD_HMSF_TIMECODE TitleLength;
    } DUMMYUNIONNAME;
    DVD_VideoAttributes VideoAttributes;
    ULONG ulNumberOfAudioStreams;
    DVD_AudioAttributes AudioAttributes[8];
    DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8];
    ULONG ulNumberOfSubpictureStreams;
    DVD_SubpictureAttributes SubpictureAttributes[32];
} DVD_TitleAttributes;
typedef struct tagDVD_MenuAttributes {
    WINBOOL fCompatibleRegion[8];
    DVD_VideoAttributes VideoAttributes;
    WINBOOL fAudioPresent;
    DVD_AudioAttributes AudioAttributes;
    WINBOOL fSubpicturePresent;
    DVD_SubpictureAttributes SubpictureAttributes;
} DVD_MenuAttributes;
#define DVD_TITLE_MENU           0x000
#define DVD_STREAM_DATA_VMGM     0x400
#define DVD_STREAM_DATA_VTSM     0x401
#define DVD_STREAM_DATA_CURRENT  0x800
#define DVD_DEFAULT_AUDIO_STREAM 0x00f
#define DVD_AUDIO_CAPS_AC3   0x00000001
#define DVD_AUDIO_CAPS_MPEG2 0x00000002
#define DVD_AUDIO_CAPS_LPCM  0x00000004
#define DVD_AUDIO_CAPS_DTS   0x00000008
#define DVD_AUDIO_CAPS_SDDS  0x00000010
typedef struct tagDVD_DECODER_CAPS {
    DWORD dwSize;
    DWORD dwAudioCaps;
    double dFwdMaxRateVideo;
    double dFwdMaxRateAudio;
    double dFwdMaxRateSP;
    double dBwdMaxRateVideo;
    double dBwdMaxRateAudio;
    double dBwdMaxRateSP;
    DWORD dwRes1;
    DWORD dwRes2;
    DWORD dwRes3;
    DWORD dwRes4;
} DVD_DECODER_CAPS;
typedef enum _AM_DVD_GRAPH_FLAGS {
    AM_DVD_HWDEC_PREFER = 0x1,
    AM_DVD_HWDEC_ONLY = 0x2,
    AM_DVD_SWDEC_PREFER = 0x4,
    AM_DVD_SWDEC_ONLY = 0x8,
    AM_DVD_NOVPE = 0x100,
    AM_DVD_DO_NOT_CLEAR = 0x200,
    AM_DVD_VMR9_ONLY = 0x800,
    AM_DVD_EVR_ONLY = 0x1000,
    AM_DVD_EVR_QOS = 0x2000,
    AM_DVD_ADAPT_GRAPH = 0x4000,
    AM_DVD_MASK = 0xffff
} AM_DVD_GRAPH_FLAGS;
typedef enum _AM_DVD_STREAM_FLAGS {
    AM_DVD_STREAM_VIDEO = 0x1,
    AM_DVD_STREAM_AUDIO = 0x2,
    AM_DVD_STREAM_SUBPIC = 0x4
} AM_DVD_STREAM_FLAGS;
typedef struct tagAM_DVD_RENDERSTATUS {
    HRESULT hrVPEStatus;
    WINBOOL bDvdVolInvalid;
    WINBOOL bDvdVolUnknown;
    WINBOOL bNoLine21In;
    WINBOOL bNoLine21Out;
    int iNumStreams;
    int iNumStreamsFailed;
    DWORD dwFailedStreamsFlag;
} AM_DVD_RENDERSTATUS;
/*****************************************************************************
 * IDvdControl interface
 */
#ifndef __IDvdControl_INTERFACE_DEFINED__
#define __IDvdControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdControl, 0xa70efe61, 0xe2a3, 0x11d0, 0xa9,0xbe, 0x00,0xaa,0x00,0x61,0xbe,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a70efe61-e2a3-11d0-a9be-00aa0061be93")
IDvdControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE TitlePlay(
        ULONG title) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChapterPlay(
        ULONG title,
        ULONG chapter) = 0;

    virtual HRESULT STDMETHODCALLTYPE TimePlay(
        ULONG title,
        ULONG time) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopForResume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GoUp(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TimeSearch(
        ULONG time) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChapterSearch(
        ULONG chapter) = 0;

    virtual HRESULT STDMETHODCALLTYPE PrevPGSearch(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TopPGSearch(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE NextPGSearch(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ForwardScan(
        double speed) = 0;

    virtual HRESULT STDMETHODCALLTYPE BackwardScan(
        double speed) = 0;

    virtual HRESULT STDMETHODCALLTYPE MenuCall(
        DVD_MENU_ID id) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpperButtonSelect(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE LowerButtonSelect(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE LeftButtonSelect(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RightButtonSelect(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ButtonActivate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ButtonSelectActivate(
        ULONG button) = 0;

    virtual HRESULT STDMETHODCALLTYPE StillOff(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE PauseOn(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE PauseOff(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE MenuLanguageSelect(
        LCID language) = 0;

    virtual HRESULT STDMETHODCALLTYPE AudioStreamChange(
        ULONG audio) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubpictureStreamChange(
        ULONG subpicture,
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE AngleChange(
        ULONG angle) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParentalLevelSelect(
        ULONG level) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParentalCountrySelect(
        WORD country) = 0;

    virtual HRESULT STDMETHODCALLTYPE KaraokeAudioPresentationModeChange(
        ULONG mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE VideoModePreference(
        ULONG mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRoot(
        const WCHAR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE MouseActivate(
        POINT point) = 0;

    virtual HRESULT STDMETHODCALLTYPE MouseSelect(
        POINT point) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChapterPlayAutoStop(
        ULONG title,
        ULONG chapter,
        ULONG count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdControl, 0xa70efe61, 0xe2a3, 0x11d0, 0xa9,0xbe, 0x00,0xaa,0x00,0x61,0xbe,0x93)
#endif
#else
typedef struct IDvdControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdControl *This);

    /*** IDvdControl methods ***/
    HRESULT (STDMETHODCALLTYPE *TitlePlay)(
        IDvdControl *This,
        ULONG title);

    HRESULT (STDMETHODCALLTYPE *ChapterPlay)(
        IDvdControl *This,
        ULONG title,
        ULONG chapter);

    HRESULT (STDMETHODCALLTYPE *TimePlay)(
        IDvdControl *This,
        ULONG title,
        ULONG time);

    HRESULT (STDMETHODCALLTYPE *StopForResume)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *GoUp)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *TimeSearch)(
        IDvdControl *This,
        ULONG time);

    HRESULT (STDMETHODCALLTYPE *ChapterSearch)(
        IDvdControl *This,
        ULONG chapter);

    HRESULT (STDMETHODCALLTYPE *PrevPGSearch)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *TopPGSearch)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *NextPGSearch)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *ForwardScan)(
        IDvdControl *This,
        double speed);

    HRESULT (STDMETHODCALLTYPE *BackwardScan)(
        IDvdControl *This,
        double speed);

    HRESULT (STDMETHODCALLTYPE *MenuCall)(
        IDvdControl *This,
        DVD_MENU_ID id);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *UpperButtonSelect)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *LowerButtonSelect)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *LeftButtonSelect)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *RightButtonSelect)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *ButtonActivate)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *ButtonSelectActivate)(
        IDvdControl *This,
        ULONG button);

    HRESULT (STDMETHODCALLTYPE *StillOff)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *PauseOn)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *PauseOff)(
        IDvdControl *This);

    HRESULT (STDMETHODCALLTYPE *MenuLanguageSelect)(
        IDvdControl *This,
        LCID language);

    HRESULT (STDMETHODCALLTYPE *AudioStreamChange)(
        IDvdControl *This,
        ULONG audio);

    HRESULT (STDMETHODCALLTYPE *SubpictureStreamChange)(
        IDvdControl *This,
        ULONG subpicture,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *AngleChange)(
        IDvdControl *This,
        ULONG angle);

    HRESULT (STDMETHODCALLTYPE *ParentalLevelSelect)(
        IDvdControl *This,
        ULONG level);

    HRESULT (STDMETHODCALLTYPE *ParentalCountrySelect)(
        IDvdControl *This,
        WORD country);

    HRESULT (STDMETHODCALLTYPE *KaraokeAudioPresentationModeChange)(
        IDvdControl *This,
        ULONG mode);

    HRESULT (STDMETHODCALLTYPE *VideoModePreference)(
        IDvdControl *This,
        ULONG mode);

    HRESULT (STDMETHODCALLTYPE *SetRoot)(
        IDvdControl *This,
        const WCHAR *path);

    HRESULT (STDMETHODCALLTYPE *MouseActivate)(
        IDvdControl *This,
        POINT point);

    HRESULT (STDMETHODCALLTYPE *MouseSelect)(
        IDvdControl *This,
        POINT point);

    HRESULT (STDMETHODCALLTYPE *ChapterPlayAutoStop)(
        IDvdControl *This,
        ULONG title,
        ULONG chapter,
        ULONG count);

    END_INTERFACE
} IDvdControlVtbl;

interface IDvdControl {
    CONST_VTBL IDvdControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdControl methods ***/
#define IDvdControl_TitlePlay(This,title) (This)->lpVtbl->TitlePlay(This,title)
#define IDvdControl_ChapterPlay(This,title,chapter) (This)->lpVtbl->ChapterPlay(This,title,chapter)
#define IDvdControl_TimePlay(This,title,time) (This)->lpVtbl->TimePlay(This,title,time)
#define IDvdControl_StopForResume(This) (This)->lpVtbl->StopForResume(This)
#define IDvdControl_GoUp(This) (This)->lpVtbl->GoUp(This)
#define IDvdControl_TimeSearch(This,time) (This)->lpVtbl->TimeSearch(This,time)
#define IDvdControl_ChapterSearch(This,chapter) (This)->lpVtbl->ChapterSearch(This,chapter)
#define IDvdControl_PrevPGSearch(This) (This)->lpVtbl->PrevPGSearch(This)
#define IDvdControl_TopPGSearch(This) (This)->lpVtbl->TopPGSearch(This)
#define IDvdControl_NextPGSearch(This) (This)->lpVtbl->NextPGSearch(This)
#define IDvdControl_ForwardScan(This,speed) (This)->lpVtbl->ForwardScan(This,speed)
#define IDvdControl_BackwardScan(This,speed) (This)->lpVtbl->BackwardScan(This,speed)
#define IDvdControl_MenuCall(This,id) (This)->lpVtbl->MenuCall(This,id)
#define IDvdControl_Resume(This) (This)->lpVtbl->Resume(This)
#define IDvdControl_UpperButtonSelect(This) (This)->lpVtbl->UpperButtonSelect(This)
#define IDvdControl_LowerButtonSelect(This) (This)->lpVtbl->LowerButtonSelect(This)
#define IDvdControl_LeftButtonSelect(This) (This)->lpVtbl->LeftButtonSelect(This)
#define IDvdControl_RightButtonSelect(This) (This)->lpVtbl->RightButtonSelect(This)
#define IDvdControl_ButtonActivate(This) (This)->lpVtbl->ButtonActivate(This)
#define IDvdControl_ButtonSelectActivate(This,button) (This)->lpVtbl->ButtonSelectActivate(This,button)
#define IDvdControl_StillOff(This) (This)->lpVtbl->StillOff(This)
#define IDvdControl_PauseOn(This) (This)->lpVtbl->PauseOn(This)
#define IDvdControl_PauseOff(This) (This)->lpVtbl->PauseOff(This)
#define IDvdControl_MenuLanguageSelect(This,language) (This)->lpVtbl->MenuLanguageSelect(This,language)
#define IDvdControl_AudioStreamChange(This,audio) (This)->lpVtbl->AudioStreamChange(This,audio)
#define IDvdControl_SubpictureStreamChange(This,subpicture,enable) (This)->lpVtbl->SubpictureStreamChange(This,subpicture,enable)
#define IDvdControl_AngleChange(This,angle) (This)->lpVtbl->AngleChange(This,angle)
#define IDvdControl_ParentalLevelSelect(This,level) (This)->lpVtbl->ParentalLevelSelect(This,level)
#define IDvdControl_ParentalCountrySelect(This,country) (This)->lpVtbl->ParentalCountrySelect(This,country)
#define IDvdControl_KaraokeAudioPresentationModeChange(This,mode) (This)->lpVtbl->KaraokeAudioPresentationModeChange(This,mode)
#define IDvdControl_VideoModePreference(This,mode) (This)->lpVtbl->VideoModePreference(This,mode)
#define IDvdControl_SetRoot(This,path) (This)->lpVtbl->SetRoot(This,path)
#define IDvdControl_MouseActivate(This,point) (This)->lpVtbl->MouseActivate(This,point)
#define IDvdControl_MouseSelect(This,point) (This)->lpVtbl->MouseSelect(This,point)
#define IDvdControl_ChapterPlayAutoStop(This,title,chapter,count) (This)->lpVtbl->ChapterPlayAutoStop(This,title,chapter,count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdControl_QueryInterface(IDvdControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdControl_AddRef(IDvdControl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdControl_Release(IDvdControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdControl methods ***/
static __WIDL_INLINE HRESULT IDvdControl_TitlePlay(IDvdControl* This,ULONG title) {
    return This->lpVtbl->TitlePlay(This,title);
}
static __WIDL_INLINE HRESULT IDvdControl_ChapterPlay(IDvdControl* This,ULONG title,ULONG chapter) {
    return This->lpVtbl->ChapterPlay(This,title,chapter);
}
static __WIDL_INLINE HRESULT IDvdControl_TimePlay(IDvdControl* This,ULONG title,ULONG time) {
    return This->lpVtbl->TimePlay(This,title,time);
}
static __WIDL_INLINE HRESULT IDvdControl_StopForResume(IDvdControl* This) {
    return This->lpVtbl->StopForResume(This);
}
static __WIDL_INLINE HRESULT IDvdControl_GoUp(IDvdControl* This) {
    return This->lpVtbl->GoUp(This);
}
static __WIDL_INLINE HRESULT IDvdControl_TimeSearch(IDvdControl* This,ULONG time) {
    return This->lpVtbl->TimeSearch(This,time);
}
static __WIDL_INLINE HRESULT IDvdControl_ChapterSearch(IDvdControl* This,ULONG chapter) {
    return This->lpVtbl->ChapterSearch(This,chapter);
}
static __WIDL_INLINE HRESULT IDvdControl_PrevPGSearch(IDvdControl* This) {
    return This->lpVtbl->PrevPGSearch(This);
}
static __WIDL_INLINE HRESULT IDvdControl_TopPGSearch(IDvdControl* This) {
    return This->lpVtbl->TopPGSearch(This);
}
static __WIDL_INLINE HRESULT IDvdControl_NextPGSearch(IDvdControl* This) {
    return This->lpVtbl->NextPGSearch(This);
}
static __WIDL_INLINE HRESULT IDvdControl_ForwardScan(IDvdControl* This,double speed) {
    return This->lpVtbl->ForwardScan(This,speed);
}
static __WIDL_INLINE HRESULT IDvdControl_BackwardScan(IDvdControl* This,double speed) {
    return This->lpVtbl->BackwardScan(This,speed);
}
static __WIDL_INLINE HRESULT IDvdControl_MenuCall(IDvdControl* This,DVD_MENU_ID id) {
    return This->lpVtbl->MenuCall(This,id);
}
static __WIDL_INLINE HRESULT IDvdControl_Resume(IDvdControl* This) {
    return This->lpVtbl->Resume(This);
}
static __WIDL_INLINE HRESULT IDvdControl_UpperButtonSelect(IDvdControl* This) {
    return This->lpVtbl->UpperButtonSelect(This);
}
static __WIDL_INLINE HRESULT IDvdControl_LowerButtonSelect(IDvdControl* This) {
    return This->lpVtbl->LowerButtonSelect(This);
}
static __WIDL_INLINE HRESULT IDvdControl_LeftButtonSelect(IDvdControl* This) {
    return This->lpVtbl->LeftButtonSelect(This);
}
static __WIDL_INLINE HRESULT IDvdControl_RightButtonSelect(IDvdControl* This) {
    return This->lpVtbl->RightButtonSelect(This);
}
static __WIDL_INLINE HRESULT IDvdControl_ButtonActivate(IDvdControl* This) {
    return This->lpVtbl->ButtonActivate(This);
}
static __WIDL_INLINE HRESULT IDvdControl_ButtonSelectActivate(IDvdControl* This,ULONG button) {
    return This->lpVtbl->ButtonSelectActivate(This,button);
}
static __WIDL_INLINE HRESULT IDvdControl_StillOff(IDvdControl* This) {
    return This->lpVtbl->StillOff(This);
}
static __WIDL_INLINE HRESULT IDvdControl_PauseOn(IDvdControl* This) {
    return This->lpVtbl->PauseOn(This);
}
static __WIDL_INLINE HRESULT IDvdControl_PauseOff(IDvdControl* This) {
    return This->lpVtbl->PauseOff(This);
}
static __WIDL_INLINE HRESULT IDvdControl_MenuLanguageSelect(IDvdControl* This,LCID language) {
    return This->lpVtbl->MenuLanguageSelect(This,language);
}
static __WIDL_INLINE HRESULT IDvdControl_AudioStreamChange(IDvdControl* This,ULONG audio) {
    return This->lpVtbl->AudioStreamChange(This,audio);
}
static __WIDL_INLINE HRESULT IDvdControl_SubpictureStreamChange(IDvdControl* This,ULONG subpicture,WINBOOL enable) {
    return This->lpVtbl->SubpictureStreamChange(This,subpicture,enable);
}
static __WIDL_INLINE HRESULT IDvdControl_AngleChange(IDvdControl* This,ULONG angle) {
    return This->lpVtbl->AngleChange(This,angle);
}
static __WIDL_INLINE HRESULT IDvdControl_ParentalLevelSelect(IDvdControl* This,ULONG level) {
    return This->lpVtbl->ParentalLevelSelect(This,level);
}
static __WIDL_INLINE HRESULT IDvdControl_ParentalCountrySelect(IDvdControl* This,WORD country) {
    return This->lpVtbl->ParentalCountrySelect(This,country);
}
static __WIDL_INLINE HRESULT IDvdControl_KaraokeAudioPresentationModeChange(IDvdControl* This,ULONG mode) {
    return This->lpVtbl->KaraokeAudioPresentationModeChange(This,mode);
}
static __WIDL_INLINE HRESULT IDvdControl_VideoModePreference(IDvdControl* This,ULONG mode) {
    return This->lpVtbl->VideoModePreference(This,mode);
}
static __WIDL_INLINE HRESULT IDvdControl_SetRoot(IDvdControl* This,const WCHAR *path) {
    return This->lpVtbl->SetRoot(This,path);
}
static __WIDL_INLINE HRESULT IDvdControl_MouseActivate(IDvdControl* This,POINT point) {
    return This->lpVtbl->MouseActivate(This,point);
}
static __WIDL_INLINE HRESULT IDvdControl_MouseSelect(IDvdControl* This,POINT point) {
    return This->lpVtbl->MouseSelect(This,point);
}
static __WIDL_INLINE HRESULT IDvdControl_ChapterPlayAutoStop(IDvdControl* This,ULONG title,ULONG chapter,ULONG count) {
    return This->lpVtbl->ChapterPlayAutoStop(This,title,chapter,count);
}
#endif
#endif

#endif


#endif  /* __IDvdControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdInfo interface
 */
#ifndef __IDvdInfo_INTERFACE_DEFINED__
#define __IDvdInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdInfo, 0xa70efe60, 0xe2a3, 0x11d0, 0xa9,0xbe, 0x00,0xaa,0x00,0x61,0xbe,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a70efe60-e2a3-11d0-a9be-00aa0061be93")
IDvdInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentDomain(
        DVD_DOMAIN *domain) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentLocation(
        DVD_PLAYBACK_LOCATION *location) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTotalTitleTime(
        ULONG *time) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentButton(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAngle(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAudio(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpicture(
        ULONG *count,
        ULONG *current,
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentUOPS(
        VALID_UOP_SOMTHING_OR_OTHER *uops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllSPRMs(
        SPRMARRAY *regs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllGPRMs(
        GPRMARRAY *regs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioLanguage(
        ULONG stream,
        LCID *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubpictureLanguage(
        ULONG stream,
        LCID *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTitleAttributes(
        ULONG title,
        DVD_ATR *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVMGAttributes(
        DVD_ATR *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentVideoAttributes(
        DVD_VideoATR *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAudioAttributes(
        DVD_AudioATR *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpictureAttributes(
        DVD_SubpictureATR *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentVolumeInfo(
        ULONG *volume_count,
        ULONG *current,
        DVD_DISC_SIDE *side,
        ULONG *title_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDTextInfo(
        BYTE *text_manager,
        ULONG size,
        ULONG *ret_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayerParentalLevel(
        ULONG *level,
        ULONG *country_code) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumberOfChapters(
        ULONG title,
        ULONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTitleParentalLevels(
        ULONG title,
        ULONG *levels) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRoot(
        char *path,
        ULONG size,
        ULONG *ret_size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdInfo, 0xa70efe60, 0xe2a3, 0x11d0, 0xa9,0xbe, 0x00,0xaa,0x00,0x61,0xbe,0x93)
#endif
#else
typedef struct IDvdInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdInfo *This);

    /*** IDvdInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentDomain)(
        IDvdInfo *This,
        DVD_DOMAIN *domain);

    HRESULT (STDMETHODCALLTYPE *GetCurrentLocation)(
        IDvdInfo *This,
        DVD_PLAYBACK_LOCATION *location);

    HRESULT (STDMETHODCALLTYPE *GetTotalTitleTime)(
        IDvdInfo *This,
        ULONG *time);

    HRESULT (STDMETHODCALLTYPE *GetCurrentButton)(
        IDvdInfo *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAngle)(
        IDvdInfo *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAudio)(
        IDvdInfo *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSubpicture)(
        IDvdInfo *This,
        ULONG *count,
        ULONG *current,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *GetCurrentUOPS)(
        IDvdInfo *This,
        VALID_UOP_SOMTHING_OR_OTHER *uops);

    HRESULT (STDMETHODCALLTYPE *GetAllSPRMs)(
        IDvdInfo *This,
        SPRMARRAY *regs);

    HRESULT (STDMETHODCALLTYPE *GetAllGPRMs)(
        IDvdInfo *This,
        GPRMARRAY *regs);

    HRESULT (STDMETHODCALLTYPE *GetAudioLanguage)(
        IDvdInfo *This,
        ULONG stream,
        LCID *language);

    HRESULT (STDMETHODCALLTYPE *GetSubpictureLanguage)(
        IDvdInfo *This,
        ULONG stream,
        LCID *language);

    HRESULT (STDMETHODCALLTYPE *GetTitleAttributes)(
        IDvdInfo *This,
        ULONG title,
        DVD_ATR *attr);

    HRESULT (STDMETHODCALLTYPE *GetVMGAttributes)(
        IDvdInfo *This,
        DVD_ATR *attr);

    HRESULT (STDMETHODCALLTYPE *GetCurrentVideoAttributes)(
        IDvdInfo *This,
        DVD_VideoATR *attr);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAudioAttributes)(
        IDvdInfo *This,
        DVD_AudioATR *attr);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSubpictureAttributes)(
        IDvdInfo *This,
        DVD_SubpictureATR *attr);

    HRESULT (STDMETHODCALLTYPE *GetCurrentVolumeInfo)(
        IDvdInfo *This,
        ULONG *volume_count,
        ULONG *current,
        DVD_DISC_SIDE *side,
        ULONG *title_count);

    HRESULT (STDMETHODCALLTYPE *GetDVDTextInfo)(
        IDvdInfo *This,
        BYTE *text_manager,
        ULONG size,
        ULONG *ret_size);

    HRESULT (STDMETHODCALLTYPE *GetPlayerParentalLevel)(
        IDvdInfo *This,
        ULONG *level,
        ULONG *country_code);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfChapters)(
        IDvdInfo *This,
        ULONG title,
        ULONG *count);

    HRESULT (STDMETHODCALLTYPE *GetTitleParentalLevels)(
        IDvdInfo *This,
        ULONG title,
        ULONG *levels);

    HRESULT (STDMETHODCALLTYPE *GetRoot)(
        IDvdInfo *This,
        char *path,
        ULONG size,
        ULONG *ret_size);

    END_INTERFACE
} IDvdInfoVtbl;

interface IDvdInfo {
    CONST_VTBL IDvdInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdInfo methods ***/
#define IDvdInfo_GetCurrentDomain(This,domain) (This)->lpVtbl->GetCurrentDomain(This,domain)
#define IDvdInfo_GetCurrentLocation(This,location) (This)->lpVtbl->GetCurrentLocation(This,location)
#define IDvdInfo_GetTotalTitleTime(This,time) (This)->lpVtbl->GetTotalTitleTime(This,time)
#define IDvdInfo_GetCurrentButton(This,count,current) (This)->lpVtbl->GetCurrentButton(This,count,current)
#define IDvdInfo_GetCurrentAngle(This,count,current) (This)->lpVtbl->GetCurrentAngle(This,count,current)
#define IDvdInfo_GetCurrentAudio(This,count,current) (This)->lpVtbl->GetCurrentAudio(This,count,current)
#define IDvdInfo_GetCurrentSubpicture(This,count,current,enable) (This)->lpVtbl->GetCurrentSubpicture(This,count,current,enable)
#define IDvdInfo_GetCurrentUOPS(This,uops) (This)->lpVtbl->GetCurrentUOPS(This,uops)
#define IDvdInfo_GetAllSPRMs(This,regs) (This)->lpVtbl->GetAllSPRMs(This,regs)
#define IDvdInfo_GetAllGPRMs(This,regs) (This)->lpVtbl->GetAllGPRMs(This,regs)
#define IDvdInfo_GetAudioLanguage(This,stream,language) (This)->lpVtbl->GetAudioLanguage(This,stream,language)
#define IDvdInfo_GetSubpictureLanguage(This,stream,language) (This)->lpVtbl->GetSubpictureLanguage(This,stream,language)
#define IDvdInfo_GetTitleAttributes(This,title,attr) (This)->lpVtbl->GetTitleAttributes(This,title,attr)
#define IDvdInfo_GetVMGAttributes(This,attr) (This)->lpVtbl->GetVMGAttributes(This,attr)
#define IDvdInfo_GetCurrentVideoAttributes(This,attr) (This)->lpVtbl->GetCurrentVideoAttributes(This,attr)
#define IDvdInfo_GetCurrentAudioAttributes(This,attr) (This)->lpVtbl->GetCurrentAudioAttributes(This,attr)
#define IDvdInfo_GetCurrentSubpictureAttributes(This,attr) (This)->lpVtbl->GetCurrentSubpictureAttributes(This,attr)
#define IDvdInfo_GetCurrentVolumeInfo(This,volume_count,current,side,title_count) (This)->lpVtbl->GetCurrentVolumeInfo(This,volume_count,current,side,title_count)
#define IDvdInfo_GetDVDTextInfo(This,text_manager,size,ret_size) (This)->lpVtbl->GetDVDTextInfo(This,text_manager,size,ret_size)
#define IDvdInfo_GetPlayerParentalLevel(This,level,country_code) (This)->lpVtbl->GetPlayerParentalLevel(This,level,country_code)
#define IDvdInfo_GetNumberOfChapters(This,title,count) (This)->lpVtbl->GetNumberOfChapters(This,title,count)
#define IDvdInfo_GetTitleParentalLevels(This,title,levels) (This)->lpVtbl->GetTitleParentalLevels(This,title,levels)
#define IDvdInfo_GetRoot(This,path,size,ret_size) (This)->lpVtbl->GetRoot(This,path,size,ret_size)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdInfo_QueryInterface(IDvdInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdInfo_AddRef(IDvdInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdInfo_Release(IDvdInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdInfo methods ***/
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentDomain(IDvdInfo* This,DVD_DOMAIN *domain) {
    return This->lpVtbl->GetCurrentDomain(This,domain);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentLocation(IDvdInfo* This,DVD_PLAYBACK_LOCATION *location) {
    return This->lpVtbl->GetCurrentLocation(This,location);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetTotalTitleTime(IDvdInfo* This,ULONG *time) {
    return This->lpVtbl->GetTotalTitleTime(This,time);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentButton(IDvdInfo* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentButton(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentAngle(IDvdInfo* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentAngle(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentAudio(IDvdInfo* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentAudio(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentSubpicture(IDvdInfo* This,ULONG *count,ULONG *current,WINBOOL *enable) {
    return This->lpVtbl->GetCurrentSubpicture(This,count,current,enable);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentUOPS(IDvdInfo* This,VALID_UOP_SOMTHING_OR_OTHER *uops) {
    return This->lpVtbl->GetCurrentUOPS(This,uops);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetAllSPRMs(IDvdInfo* This,SPRMARRAY *regs) {
    return This->lpVtbl->GetAllSPRMs(This,regs);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetAllGPRMs(IDvdInfo* This,GPRMARRAY *regs) {
    return This->lpVtbl->GetAllGPRMs(This,regs);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetAudioLanguage(IDvdInfo* This,ULONG stream,LCID *language) {
    return This->lpVtbl->GetAudioLanguage(This,stream,language);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetSubpictureLanguage(IDvdInfo* This,ULONG stream,LCID *language) {
    return This->lpVtbl->GetSubpictureLanguage(This,stream,language);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetTitleAttributes(IDvdInfo* This,ULONG title,DVD_ATR *attr) {
    return This->lpVtbl->GetTitleAttributes(This,title,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetVMGAttributes(IDvdInfo* This,DVD_ATR *attr) {
    return This->lpVtbl->GetVMGAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentVideoAttributes(IDvdInfo* This,DVD_VideoATR *attr) {
    return This->lpVtbl->GetCurrentVideoAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentAudioAttributes(IDvdInfo* This,DVD_AudioATR *attr) {
    return This->lpVtbl->GetCurrentAudioAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentSubpictureAttributes(IDvdInfo* This,DVD_SubpictureATR *attr) {
    return This->lpVtbl->GetCurrentSubpictureAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetCurrentVolumeInfo(IDvdInfo* This,ULONG *volume_count,ULONG *current,DVD_DISC_SIDE *side,ULONG *title_count) {
    return This->lpVtbl->GetCurrentVolumeInfo(This,volume_count,current,side,title_count);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetDVDTextInfo(IDvdInfo* This,BYTE *text_manager,ULONG size,ULONG *ret_size) {
    return This->lpVtbl->GetDVDTextInfo(This,text_manager,size,ret_size);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetPlayerParentalLevel(IDvdInfo* This,ULONG *level,ULONG *country_code) {
    return This->lpVtbl->GetPlayerParentalLevel(This,level,country_code);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetNumberOfChapters(IDvdInfo* This,ULONG title,ULONG *count) {
    return This->lpVtbl->GetNumberOfChapters(This,title,count);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetTitleParentalLevels(IDvdInfo* This,ULONG title,ULONG *levels) {
    return This->lpVtbl->GetTitleParentalLevels(This,title,levels);
}
static __WIDL_INLINE HRESULT IDvdInfo_GetRoot(IDvdInfo* This,char *path,ULONG size,ULONG *ret_size) {
    return This->lpVtbl->GetRoot(This,path,size,ret_size);
}
#endif
#endif

#endif


#endif  /* __IDvdInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdCmd interface
 */
#ifndef __IDvdCmd_INTERFACE_DEFINED__
#define __IDvdCmd_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdCmd, 0x5a4a97e4, 0x94ee, 0x4a55, 0x97,0x51, 0x74,0xb5,0x64,0x3a,0xa2,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5a4a97e4-94ee-4a55-9751-74b5643aa27d")
IDvdCmd : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE WaitForStart(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitForEnd(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdCmd, 0x5a4a97e4, 0x94ee, 0x4a55, 0x97,0x51, 0x74,0xb5,0x64,0x3a,0xa2,0x7d)
#endif
#else
typedef struct IDvdCmdVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdCmd *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdCmd *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdCmd *This);

    /*** IDvdCmd methods ***/
    HRESULT (STDMETHODCALLTYPE *WaitForStart)(
        IDvdCmd *This);

    HRESULT (STDMETHODCALLTYPE *WaitForEnd)(
        IDvdCmd *This);

    END_INTERFACE
} IDvdCmdVtbl;

interface IDvdCmd {
    CONST_VTBL IDvdCmdVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdCmd_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdCmd_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdCmd_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdCmd methods ***/
#define IDvdCmd_WaitForStart(This) (This)->lpVtbl->WaitForStart(This)
#define IDvdCmd_WaitForEnd(This) (This)->lpVtbl->WaitForEnd(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdCmd_QueryInterface(IDvdCmd* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdCmd_AddRef(IDvdCmd* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdCmd_Release(IDvdCmd* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdCmd methods ***/
static __WIDL_INLINE HRESULT IDvdCmd_WaitForStart(IDvdCmd* This) {
    return This->lpVtbl->WaitForStart(This);
}
static __WIDL_INLINE HRESULT IDvdCmd_WaitForEnd(IDvdCmd* This) {
    return This->lpVtbl->WaitForEnd(This);
}
#endif
#endif

#endif


#endif  /* __IDvdCmd_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdState interface
 */
#ifndef __IDvdState_INTERFACE_DEFINED__
#define __IDvdState_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdState, 0x86303d6d, 0x1c4a, 0x4087, 0xab,0x42, 0xf7,0x11,0x16,0x70,0x48,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("86303d6d-1c4a-4087-ab42-f711167048ef")
IDvdState : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDiscID(
        ULONGLONG *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParentalLevel(
        ULONG *level) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdState, 0x86303d6d, 0x1c4a, 0x4087, 0xab,0x42, 0xf7,0x11,0x16,0x70,0x48,0xef)
#endif
#else
typedef struct IDvdStateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdState *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdState *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdState *This);

    /*** IDvdState methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDiscID)(
        IDvdState *This,
        ULONGLONG *id);

    HRESULT (STDMETHODCALLTYPE *GetParentalLevel)(
        IDvdState *This,
        ULONG *level);

    END_INTERFACE
} IDvdStateVtbl;

interface IDvdState {
    CONST_VTBL IDvdStateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdState_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdState_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdState_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdState methods ***/
#define IDvdState_GetDiscID(This,id) (This)->lpVtbl->GetDiscID(This,id)
#define IDvdState_GetParentalLevel(This,level) (This)->lpVtbl->GetParentalLevel(This,level)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdState_QueryInterface(IDvdState* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdState_AddRef(IDvdState* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdState_Release(IDvdState* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdState methods ***/
static __WIDL_INLINE HRESULT IDvdState_GetDiscID(IDvdState* This,ULONGLONG *id) {
    return This->lpVtbl->GetDiscID(This,id);
}
static __WIDL_INLINE HRESULT IDvdState_GetParentalLevel(IDvdState* This,ULONG *level) {
    return This->lpVtbl->GetParentalLevel(This,level);
}
#endif
#endif

#endif


#endif  /* __IDvdState_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdControl2 interface
 */
#ifndef __IDvdControl2_INTERFACE_DEFINED__
#define __IDvdControl2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdControl2, 0x33bc7430, 0xeec0, 0x11d2, 0x82,0x01, 0x00,0xa0,0xc9,0xd7,0x48,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("33bc7430-eec0-11d2-8201-00a0c9d74842")
IDvdControl2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PlayTitle(
        ULONG title,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayChapterInTitle(
        ULONG title,
        ULONG chapter,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayTimeInTitle(
        ULONG title,
        DVD_HMSF_TIMECODE *time,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReturnFromSubmenu(
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayAtTime(
        DVD_HMSF_TIMECODE *time,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayChapter(
        ULONG chapter,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayPrevChapter(
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReplayChapter(
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayNextChapter(
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayForwards(
        double speed,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayBackwards(
        double speed,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShowMenu(
        DVD_MENU_ID id,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectRelativeButton(
        DVD_RELATIVE_BUTTON button) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateButton(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectButton(
        ULONG button) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAndActivateButton(
        ULONG button) = 0;

    virtual HRESULT STDMETHODCALLTYPE StillOff(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAudioStream(
        ULONG stream,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectSubpictureStream(
        ULONG stream,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubpictureState(
        WINBOOL enable,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAngle(
        ULONG angle,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectParentalLevel(
        ULONG level) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectParentalCountry(
        BYTE country[2]) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectKaraokeAudioPresentationMode(
        ULONG mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectVideoModePreference(
        ULONG mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDVDDirectory(
        const WCHAR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateAtPosition(
        POINT point) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectAtPosition(
        POINT point) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayChaptersAutoStop(
        ULONG title,
        ULONG chapter,
        ULONG count,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE AcceptParentalLevelChange(
        WINBOOL accept) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOption(
        DVD_OPTION_FLAG flag,
        WINBOOL option) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetState(
        IDvdState *state,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE PlayPeriodInTitleAutoStop(
        ULONG title,
        DVD_HMSF_TIMECODE *start_time,
        DVD_HMSF_TIMECODE *end_time,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGRPM(
        ULONG index,
        WORD value,
        DWORD flags,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectDefaultMenuLanguage(
        LCID language) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectDefaultAudioLanguage(
        LCID language,
        DVD_AUDIO_LANG_EXT extension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectDefaultSubpictureLanguage(
        LCID language,
        DVD_SUBPICTURE_LANG_EXT extension) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdControl2, 0x33bc7430, 0xeec0, 0x11d2, 0x82,0x01, 0x00,0xa0,0xc9,0xd7,0x48,0x42)
#endif
#else
typedef struct IDvdControl2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdControl2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdControl2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdControl2 *This);

    /*** IDvdControl2 methods ***/
    HRESULT (STDMETHODCALLTYPE *PlayTitle)(
        IDvdControl2 *This,
        ULONG title,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayChapterInTitle)(
        IDvdControl2 *This,
        ULONG title,
        ULONG chapter,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayTimeInTitle)(
        IDvdControl2 *This,
        ULONG title,
        DVD_HMSF_TIMECODE *time,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IDvdControl2 *This);

    HRESULT (STDMETHODCALLTYPE *ReturnFromSubmenu)(
        IDvdControl2 *This,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayAtTime)(
        IDvdControl2 *This,
        DVD_HMSF_TIMECODE *time,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayChapter)(
        IDvdControl2 *This,
        ULONG chapter,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayPrevChapter)(
        IDvdControl2 *This,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *ReplayChapter)(
        IDvdControl2 *This,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayNextChapter)(
        IDvdControl2 *This,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayForwards)(
        IDvdControl2 *This,
        double speed,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayBackwards)(
        IDvdControl2 *This,
        double speed,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *ShowMenu)(
        IDvdControl2 *This,
        DVD_MENU_ID id,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IDvdControl2 *This,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SelectRelativeButton)(
        IDvdControl2 *This,
        DVD_RELATIVE_BUTTON button);

    HRESULT (STDMETHODCALLTYPE *ActivateButton)(
        IDvdControl2 *This);

    HRESULT (STDMETHODCALLTYPE *SelectButton)(
        IDvdControl2 *This,
        ULONG button);

    HRESULT (STDMETHODCALLTYPE *SelectAndActivateButton)(
        IDvdControl2 *This,
        ULONG button);

    HRESULT (STDMETHODCALLTYPE *StillOff)(
        IDvdControl2 *This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IDvdControl2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *SelectAudioStream)(
        IDvdControl2 *This,
        ULONG stream,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SelectSubpictureStream)(
        IDvdControl2 *This,
        ULONG stream,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SetSubpictureState)(
        IDvdControl2 *This,
        WINBOOL enable,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SelectAngle)(
        IDvdControl2 *This,
        ULONG angle,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SelectParentalLevel)(
        IDvdControl2 *This,
        ULONG level);

    HRESULT (STDMETHODCALLTYPE *SelectParentalCountry)(
        IDvdControl2 *This,
        BYTE country[2]);

    HRESULT (STDMETHODCALLTYPE *SelectKaraokeAudioPresentationMode)(
        IDvdControl2 *This,
        ULONG mode);

    HRESULT (STDMETHODCALLTYPE *SelectVideoModePreference)(
        IDvdControl2 *This,
        ULONG mode);

    HRESULT (STDMETHODCALLTYPE *SetDVDDirectory)(
        IDvdControl2 *This,
        const WCHAR *path);

    HRESULT (STDMETHODCALLTYPE *ActivateAtPosition)(
        IDvdControl2 *This,
        POINT point);

    HRESULT (STDMETHODCALLTYPE *SelectAtPosition)(
        IDvdControl2 *This,
        POINT point);

    HRESULT (STDMETHODCALLTYPE *PlayChaptersAutoStop)(
        IDvdControl2 *This,
        ULONG title,
        ULONG chapter,
        ULONG count,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *AcceptParentalLevelChange)(
        IDvdControl2 *This,
        WINBOOL accept);

    HRESULT (STDMETHODCALLTYPE *SetOption)(
        IDvdControl2 *This,
        DVD_OPTION_FLAG flag,
        WINBOOL option);

    HRESULT (STDMETHODCALLTYPE *SetState)(
        IDvdControl2 *This,
        IDvdState *state,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *PlayPeriodInTitleAutoStop)(
        IDvdControl2 *This,
        ULONG title,
        DVD_HMSF_TIMECODE *start_time,
        DVD_HMSF_TIMECODE *end_time,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SetGRPM)(
        IDvdControl2 *This,
        ULONG index,
        WORD value,
        DWORD flags,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *SelectDefaultMenuLanguage)(
        IDvdControl2 *This,
        LCID language);

    HRESULT (STDMETHODCALLTYPE *SelectDefaultAudioLanguage)(
        IDvdControl2 *This,
        LCID language,
        DVD_AUDIO_LANG_EXT extension);

    HRESULT (STDMETHODCALLTYPE *SelectDefaultSubpictureLanguage)(
        IDvdControl2 *This,
        LCID language,
        DVD_SUBPICTURE_LANG_EXT extension);

    END_INTERFACE
} IDvdControl2Vtbl;

interface IDvdControl2 {
    CONST_VTBL IDvdControl2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdControl2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdControl2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdControl2_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdControl2 methods ***/
#define IDvdControl2_PlayTitle(This,title,flags,cmd) (This)->lpVtbl->PlayTitle(This,title,flags,cmd)
#define IDvdControl2_PlayChapterInTitle(This,title,chapter,flags,cmd) (This)->lpVtbl->PlayChapterInTitle(This,title,chapter,flags,cmd)
#define IDvdControl2_PlayTimeInTitle(This,title,time,flags,cmd) (This)->lpVtbl->PlayTimeInTitle(This,title,time,flags,cmd)
#define IDvdControl2_Stop(This) (This)->lpVtbl->Stop(This)
#define IDvdControl2_ReturnFromSubmenu(This,flags,cmd) (This)->lpVtbl->ReturnFromSubmenu(This,flags,cmd)
#define IDvdControl2_PlayAtTime(This,time,flags,cmd) (This)->lpVtbl->PlayAtTime(This,time,flags,cmd)
#define IDvdControl2_PlayChapter(This,chapter,flags,cmd) (This)->lpVtbl->PlayChapter(This,chapter,flags,cmd)
#define IDvdControl2_PlayPrevChapter(This,flags,cmd) (This)->lpVtbl->PlayPrevChapter(This,flags,cmd)
#define IDvdControl2_ReplayChapter(This,flags,cmd) (This)->lpVtbl->ReplayChapter(This,flags,cmd)
#define IDvdControl2_PlayNextChapter(This,flags,cmd) (This)->lpVtbl->PlayNextChapter(This,flags,cmd)
#define IDvdControl2_PlayForwards(This,speed,flags,cmd) (This)->lpVtbl->PlayForwards(This,speed,flags,cmd)
#define IDvdControl2_PlayBackwards(This,speed,flags,cmd) (This)->lpVtbl->PlayBackwards(This,speed,flags,cmd)
#define IDvdControl2_ShowMenu(This,id,flags,cmd) (This)->lpVtbl->ShowMenu(This,id,flags,cmd)
#define IDvdControl2_Resume(This,flags,cmd) (This)->lpVtbl->Resume(This,flags,cmd)
#define IDvdControl2_SelectRelativeButton(This,button) (This)->lpVtbl->SelectRelativeButton(This,button)
#define IDvdControl2_ActivateButton(This) (This)->lpVtbl->ActivateButton(This)
#define IDvdControl2_SelectButton(This,button) (This)->lpVtbl->SelectButton(This,button)
#define IDvdControl2_SelectAndActivateButton(This,button) (This)->lpVtbl->SelectAndActivateButton(This,button)
#define IDvdControl2_StillOff(This) (This)->lpVtbl->StillOff(This)
#define IDvdControl2_Pause(This,enable) (This)->lpVtbl->Pause(This,enable)
#define IDvdControl2_SelectAudioStream(This,stream,flags,cmd) (This)->lpVtbl->SelectAudioStream(This,stream,flags,cmd)
#define IDvdControl2_SelectSubpictureStream(This,stream,flags,cmd) (This)->lpVtbl->SelectSubpictureStream(This,stream,flags,cmd)
#define IDvdControl2_SetSubpictureState(This,enable,flags,cmd) (This)->lpVtbl->SetSubpictureState(This,enable,flags,cmd)
#define IDvdControl2_SelectAngle(This,angle,flags,cmd) (This)->lpVtbl->SelectAngle(This,angle,flags,cmd)
#define IDvdControl2_SelectParentalLevel(This,level) (This)->lpVtbl->SelectParentalLevel(This,level)
#define IDvdControl2_SelectParentalCountry(This,country) (This)->lpVtbl->SelectParentalCountry(This,country)
#define IDvdControl2_SelectKaraokeAudioPresentationMode(This,mode) (This)->lpVtbl->SelectKaraokeAudioPresentationMode(This,mode)
#define IDvdControl2_SelectVideoModePreference(This,mode) (This)->lpVtbl->SelectVideoModePreference(This,mode)
#define IDvdControl2_SetDVDDirectory(This,path) (This)->lpVtbl->SetDVDDirectory(This,path)
#define IDvdControl2_ActivateAtPosition(This,point) (This)->lpVtbl->ActivateAtPosition(This,point)
#define IDvdControl2_SelectAtPosition(This,point) (This)->lpVtbl->SelectAtPosition(This,point)
#define IDvdControl2_PlayChaptersAutoStop(This,title,chapter,count,flags,cmd) (This)->lpVtbl->PlayChaptersAutoStop(This,title,chapter,count,flags,cmd)
#define IDvdControl2_AcceptParentalLevelChange(This,accept) (This)->lpVtbl->AcceptParentalLevelChange(This,accept)
#define IDvdControl2_SetOption(This,flag,option) (This)->lpVtbl->SetOption(This,flag,option)
#define IDvdControl2_SetState(This,state,flags,cmd) (This)->lpVtbl->SetState(This,state,flags,cmd)
#define IDvdControl2_PlayPeriodInTitleAutoStop(This,title,start_time,end_time,flags,cmd) (This)->lpVtbl->PlayPeriodInTitleAutoStop(This,title,start_time,end_time,flags,cmd)
#define IDvdControl2_SetGRPM(This,index,value,flags,cmd) (This)->lpVtbl->SetGRPM(This,index,value,flags,cmd)
#define IDvdControl2_SelectDefaultMenuLanguage(This,language) (This)->lpVtbl->SelectDefaultMenuLanguage(This,language)
#define IDvdControl2_SelectDefaultAudioLanguage(This,language,extension) (This)->lpVtbl->SelectDefaultAudioLanguage(This,language,extension)
#define IDvdControl2_SelectDefaultSubpictureLanguage(This,language,extension) (This)->lpVtbl->SelectDefaultSubpictureLanguage(This,language,extension)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdControl2_QueryInterface(IDvdControl2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdControl2_AddRef(IDvdControl2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdControl2_Release(IDvdControl2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdControl2 methods ***/
static __WIDL_INLINE HRESULT IDvdControl2_PlayTitle(IDvdControl2* This,ULONG title,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayTitle(This,title,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayChapterInTitle(IDvdControl2* This,ULONG title,ULONG chapter,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayChapterInTitle(This,title,chapter,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayTimeInTitle(IDvdControl2* This,ULONG title,DVD_HMSF_TIMECODE *time,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayTimeInTitle(This,title,time,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_Stop(IDvdControl2* This) {
    return This->lpVtbl->Stop(This);
}
static __WIDL_INLINE HRESULT IDvdControl2_ReturnFromSubmenu(IDvdControl2* This,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->ReturnFromSubmenu(This,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayAtTime(IDvdControl2* This,DVD_HMSF_TIMECODE *time,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayAtTime(This,time,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayChapter(IDvdControl2* This,ULONG chapter,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayChapter(This,chapter,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayPrevChapter(IDvdControl2* This,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayPrevChapter(This,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_ReplayChapter(IDvdControl2* This,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->ReplayChapter(This,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayNextChapter(IDvdControl2* This,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayNextChapter(This,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayForwards(IDvdControl2* This,double speed,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayForwards(This,speed,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayBackwards(IDvdControl2* This,double speed,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayBackwards(This,speed,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_ShowMenu(IDvdControl2* This,DVD_MENU_ID id,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->ShowMenu(This,id,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_Resume(IDvdControl2* This,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->Resume(This,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectRelativeButton(IDvdControl2* This,DVD_RELATIVE_BUTTON button) {
    return This->lpVtbl->SelectRelativeButton(This,button);
}
static __WIDL_INLINE HRESULT IDvdControl2_ActivateButton(IDvdControl2* This) {
    return This->lpVtbl->ActivateButton(This);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectButton(IDvdControl2* This,ULONG button) {
    return This->lpVtbl->SelectButton(This,button);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectAndActivateButton(IDvdControl2* This,ULONG button) {
    return This->lpVtbl->SelectAndActivateButton(This,button);
}
static __WIDL_INLINE HRESULT IDvdControl2_StillOff(IDvdControl2* This) {
    return This->lpVtbl->StillOff(This);
}
static __WIDL_INLINE HRESULT IDvdControl2_Pause(IDvdControl2* This,WINBOOL enable) {
    return This->lpVtbl->Pause(This,enable);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectAudioStream(IDvdControl2* This,ULONG stream,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SelectAudioStream(This,stream,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectSubpictureStream(IDvdControl2* This,ULONG stream,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SelectSubpictureStream(This,stream,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SetSubpictureState(IDvdControl2* This,WINBOOL enable,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SetSubpictureState(This,enable,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectAngle(IDvdControl2* This,ULONG angle,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SelectAngle(This,angle,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectParentalLevel(IDvdControl2* This,ULONG level) {
    return This->lpVtbl->SelectParentalLevel(This,level);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectParentalCountry(IDvdControl2* This,BYTE country[2]) {
    return This->lpVtbl->SelectParentalCountry(This,country);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectKaraokeAudioPresentationMode(IDvdControl2* This,ULONG mode) {
    return This->lpVtbl->SelectKaraokeAudioPresentationMode(This,mode);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectVideoModePreference(IDvdControl2* This,ULONG mode) {
    return This->lpVtbl->SelectVideoModePreference(This,mode);
}
static __WIDL_INLINE HRESULT IDvdControl2_SetDVDDirectory(IDvdControl2* This,const WCHAR *path) {
    return This->lpVtbl->SetDVDDirectory(This,path);
}
static __WIDL_INLINE HRESULT IDvdControl2_ActivateAtPosition(IDvdControl2* This,POINT point) {
    return This->lpVtbl->ActivateAtPosition(This,point);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectAtPosition(IDvdControl2* This,POINT point) {
    return This->lpVtbl->SelectAtPosition(This,point);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayChaptersAutoStop(IDvdControl2* This,ULONG title,ULONG chapter,ULONG count,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayChaptersAutoStop(This,title,chapter,count,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_AcceptParentalLevelChange(IDvdControl2* This,WINBOOL accept) {
    return This->lpVtbl->AcceptParentalLevelChange(This,accept);
}
static __WIDL_INLINE HRESULT IDvdControl2_SetOption(IDvdControl2* This,DVD_OPTION_FLAG flag,WINBOOL option) {
    return This->lpVtbl->SetOption(This,flag,option);
}
static __WIDL_INLINE HRESULT IDvdControl2_SetState(IDvdControl2* This,IDvdState *state,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SetState(This,state,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_PlayPeriodInTitleAutoStop(IDvdControl2* This,ULONG title,DVD_HMSF_TIMECODE *start_time,DVD_HMSF_TIMECODE *end_time,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->PlayPeriodInTitleAutoStop(This,title,start_time,end_time,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SetGRPM(IDvdControl2* This,ULONG index,WORD value,DWORD flags,IDvdCmd **cmd) {
    return This->lpVtbl->SetGRPM(This,index,value,flags,cmd);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectDefaultMenuLanguage(IDvdControl2* This,LCID language) {
    return This->lpVtbl->SelectDefaultMenuLanguage(This,language);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectDefaultAudioLanguage(IDvdControl2* This,LCID language,DVD_AUDIO_LANG_EXT extension) {
    return This->lpVtbl->SelectDefaultAudioLanguage(This,language,extension);
}
static __WIDL_INLINE HRESULT IDvdControl2_SelectDefaultSubpictureLanguage(IDvdControl2* This,LCID language,DVD_SUBPICTURE_LANG_EXT extension) {
    return This->lpVtbl->SelectDefaultSubpictureLanguage(This,language,extension);
}
#endif
#endif

#endif


#endif  /* __IDvdControl2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdInfo2 interface
 */
#ifndef __IDvdInfo2_INTERFACE_DEFINED__
#define __IDvdInfo2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdInfo2, 0x34151510, 0xeec0, 0x11d2, 0x82,0x01, 0x00,0xa0,0xc9,0xd7,0x48,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34151510-eec0-11d2-8201-00a0c9d74842")
IDvdInfo2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentDomain(
        DVD_DOMAIN *domain) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentLocation(
        DVD_PLAYBACK_LOCATION2 *location) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTotalTitleTime(
        DVD_HMSF_TIMECODE *time,
        ULONG *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentButton(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAngle(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAudio(
        ULONG *count,
        ULONG *current) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSubpicture(
        ULONG *count,
        ULONG *current,
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentUOPS(
        ULONG *uops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllSPRMs(
        SPRMARRAY *regs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllGPRMs(
        GPRMARRAY *regs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioLanguage(
        ULONG stream,
        LCID *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubpictureLanguage(
        ULONG stream,
        LCID *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTitleAttributes(
        ULONG index,
        DVD_MenuAttributes *menu,
        DVD_TitleAttributes *title) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVMGAttributes(
        DVD_MenuAttributes *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVideoAttributes(
        DVD_VideoAttributes *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioAttributes(
        ULONG stream,
        DVD_AudioAttributes *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetKaraokeAttributes(
        ULONG stream,
        DVD_KaraokeAttributes *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubpictureAttributes(
        ULONG stream,
        DVD_SubpictureAttributes *attr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentVolumeInfo(
        ULONG *volume_count,
        ULONG *current,
        DVD_DISC_SIDE *side,
        ULONG *title_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDTextNumberOfLanguages(
        ULONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDTextLanguageInfo(
        ULONG index,
        ULONG *string_count,
        LCID *language,
        enum DVD_TextCharSet *character_set) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDTextStringAsNative(
        ULONG lang_index,
        ULONG string_index,
        BYTE *string,
        ULONG size,
        ULONG *ret_size,
        enum DVD_TextStringType *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDTextStringAsUnicode(
        ULONG lang_index,
        ULONG string_index,
        WCHAR *string,
        ULONG size,
        ULONG *ret_size,
        enum DVD_TextStringType *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayerParentalLevel(
        ULONG *level,
        BYTE country_code[2]) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumberOfChapters(
        ULONG title,
        ULONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTitleParentalLevels(
        ULONG title,
        ULONG *levels) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDVDDirectory(
        WCHAR *path,
        ULONG size,
        ULONG *ret_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsAudioStreamEnabled(
        ULONG stream,
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDiscID(
        const WCHAR *path,
        ULONGLONG *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetState(
        IDvdState **state) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMenuLanguages(
        LCID *languages,
        ULONG count,
        ULONG *ret_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetButtonAtPosition(
        POINT point,
        ULONG *button) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCmdFromEvent(
        LONG_PTR param,
        IDvdCmd **cmd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultMenuLanguage(
        LCID *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultAudioLanguage(
        LCID *language,
        DVD_AUDIO_LANG_EXT *extension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectDefaultSubpictureLanguage(
        LCID *language,
        DVD_SUBPICTURE_LANG_EXT *extension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDecoderCaps(
        DVD_DECODER_CAPS *caps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetButtonRect(
        ULONG button,
        RECT *rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSubpictureStreamEnabled(
        ULONG stream,
        WINBOOL *enable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdInfo2, 0x34151510, 0xeec0, 0x11d2, 0x82,0x01, 0x00,0xa0,0xc9,0xd7,0x48,0x42)
#endif
#else
typedef struct IDvdInfo2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdInfo2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdInfo2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdInfo2 *This);

    /*** IDvdInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentDomain)(
        IDvdInfo2 *This,
        DVD_DOMAIN *domain);

    HRESULT (STDMETHODCALLTYPE *GetCurrentLocation)(
        IDvdInfo2 *This,
        DVD_PLAYBACK_LOCATION2 *location);

    HRESULT (STDMETHODCALLTYPE *GetTotalTitleTime)(
        IDvdInfo2 *This,
        DVD_HMSF_TIMECODE *time,
        ULONG *flags);

    HRESULT (STDMETHODCALLTYPE *GetCurrentButton)(
        IDvdInfo2 *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAngle)(
        IDvdInfo2 *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAudio)(
        IDvdInfo2 *This,
        ULONG *count,
        ULONG *current);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSubpicture)(
        IDvdInfo2 *This,
        ULONG *count,
        ULONG *current,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *GetCurrentUOPS)(
        IDvdInfo2 *This,
        ULONG *uops);

    HRESULT (STDMETHODCALLTYPE *GetAllSPRMs)(
        IDvdInfo2 *This,
        SPRMARRAY *regs);

    HRESULT (STDMETHODCALLTYPE *GetAllGPRMs)(
        IDvdInfo2 *This,
        GPRMARRAY *regs);

    HRESULT (STDMETHODCALLTYPE *GetAudioLanguage)(
        IDvdInfo2 *This,
        ULONG stream,
        LCID *language);

    HRESULT (STDMETHODCALLTYPE *GetSubpictureLanguage)(
        IDvdInfo2 *This,
        ULONG stream,
        LCID *language);

    HRESULT (STDMETHODCALLTYPE *GetTitleAttributes)(
        IDvdInfo2 *This,
        ULONG index,
        DVD_MenuAttributes *menu,
        DVD_TitleAttributes *title);

    HRESULT (STDMETHODCALLTYPE *GetVMGAttributes)(
        IDvdInfo2 *This,
        DVD_MenuAttributes *attr);

    HRESULT (STDMETHODCALLTYPE *GetVideoAttributes)(
        IDvdInfo2 *This,
        DVD_VideoAttributes *attr);

    HRESULT (STDMETHODCALLTYPE *GetAudioAttributes)(
        IDvdInfo2 *This,
        ULONG stream,
        DVD_AudioAttributes *attr);

    HRESULT (STDMETHODCALLTYPE *GetKaraokeAttributes)(
        IDvdInfo2 *This,
        ULONG stream,
        DVD_KaraokeAttributes *attr);

    HRESULT (STDMETHODCALLTYPE *GetSubpictureAttributes)(
        IDvdInfo2 *This,
        ULONG stream,
        DVD_SubpictureAttributes *attr);

    HRESULT (STDMETHODCALLTYPE *GetCurrentVolumeInfo)(
        IDvdInfo2 *This,
        ULONG *volume_count,
        ULONG *current,
        DVD_DISC_SIDE *side,
        ULONG *title_count);

    HRESULT (STDMETHODCALLTYPE *GetDVDTextNumberOfLanguages)(
        IDvdInfo2 *This,
        ULONG *count);

    HRESULT (STDMETHODCALLTYPE *GetDVDTextLanguageInfo)(
        IDvdInfo2 *This,
        ULONG index,
        ULONG *string_count,
        LCID *language,
        enum DVD_TextCharSet *character_set);

    HRESULT (STDMETHODCALLTYPE *GetDVDTextStringAsNative)(
        IDvdInfo2 *This,
        ULONG lang_index,
        ULONG string_index,
        BYTE *string,
        ULONG size,
        ULONG *ret_size,
        enum DVD_TextStringType *type);

    HRESULT (STDMETHODCALLTYPE *GetDVDTextStringAsUnicode)(
        IDvdInfo2 *This,
        ULONG lang_index,
        ULONG string_index,
        WCHAR *string,
        ULONG size,
        ULONG *ret_size,
        enum DVD_TextStringType *type);

    HRESULT (STDMETHODCALLTYPE *GetPlayerParentalLevel)(
        IDvdInfo2 *This,
        ULONG *level,
        BYTE country_code[2]);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfChapters)(
        IDvdInfo2 *This,
        ULONG title,
        ULONG *count);

    HRESULT (STDMETHODCALLTYPE *GetTitleParentalLevels)(
        IDvdInfo2 *This,
        ULONG title,
        ULONG *levels);

    HRESULT (STDMETHODCALLTYPE *GetDVDDirectory)(
        IDvdInfo2 *This,
        WCHAR *path,
        ULONG size,
        ULONG *ret_size);

    HRESULT (STDMETHODCALLTYPE *IsAudioStreamEnabled)(
        IDvdInfo2 *This,
        ULONG stream,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *GetDiscID)(
        IDvdInfo2 *This,
        const WCHAR *path,
        ULONGLONG *id);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IDvdInfo2 *This,
        IDvdState **state);

    HRESULT (STDMETHODCALLTYPE *GetMenuLanguages)(
        IDvdInfo2 *This,
        LCID *languages,
        ULONG count,
        ULONG *ret_count);

    HRESULT (STDMETHODCALLTYPE *GetButtonAtPosition)(
        IDvdInfo2 *This,
        POINT point,
        ULONG *button);

    HRESULT (STDMETHODCALLTYPE *GetCmdFromEvent)(
        IDvdInfo2 *This,
        LONG_PTR param,
        IDvdCmd **cmd);

    HRESULT (STDMETHODCALLTYPE *GetDefaultMenuLanguage)(
        IDvdInfo2 *This,
        LCID *language);

    HRESULT (STDMETHODCALLTYPE *GetDefaultAudioLanguage)(
        IDvdInfo2 *This,
        LCID *language,
        DVD_AUDIO_LANG_EXT *extension);

    HRESULT (STDMETHODCALLTYPE *SelectDefaultSubpictureLanguage)(
        IDvdInfo2 *This,
        LCID *language,
        DVD_SUBPICTURE_LANG_EXT *extension);

    HRESULT (STDMETHODCALLTYPE *GetDecoderCaps)(
        IDvdInfo2 *This,
        DVD_DECODER_CAPS *caps);

    HRESULT (STDMETHODCALLTYPE *GetButtonRect)(
        IDvdInfo2 *This,
        ULONG button,
        RECT *rect);

    HRESULT (STDMETHODCALLTYPE *IsSubpictureStreamEnabled)(
        IDvdInfo2 *This,
        ULONG stream,
        WINBOOL *enable);

    END_INTERFACE
} IDvdInfo2Vtbl;

interface IDvdInfo2 {
    CONST_VTBL IDvdInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdInfo2 methods ***/
#define IDvdInfo2_GetCurrentDomain(This,domain) (This)->lpVtbl->GetCurrentDomain(This,domain)
#define IDvdInfo2_GetCurrentLocation(This,location) (This)->lpVtbl->GetCurrentLocation(This,location)
#define IDvdInfo2_GetTotalTitleTime(This,time,flags) (This)->lpVtbl->GetTotalTitleTime(This,time,flags)
#define IDvdInfo2_GetCurrentButton(This,count,current) (This)->lpVtbl->GetCurrentButton(This,count,current)
#define IDvdInfo2_GetCurrentAngle(This,count,current) (This)->lpVtbl->GetCurrentAngle(This,count,current)
#define IDvdInfo2_GetCurrentAudio(This,count,current) (This)->lpVtbl->GetCurrentAudio(This,count,current)
#define IDvdInfo2_GetCurrentSubpicture(This,count,current,enable) (This)->lpVtbl->GetCurrentSubpicture(This,count,current,enable)
#define IDvdInfo2_GetCurrentUOPS(This,uops) (This)->lpVtbl->GetCurrentUOPS(This,uops)
#define IDvdInfo2_GetAllSPRMs(This,regs) (This)->lpVtbl->GetAllSPRMs(This,regs)
#define IDvdInfo2_GetAllGPRMs(This,regs) (This)->lpVtbl->GetAllGPRMs(This,regs)
#define IDvdInfo2_GetAudioLanguage(This,stream,language) (This)->lpVtbl->GetAudioLanguage(This,stream,language)
#define IDvdInfo2_GetSubpictureLanguage(This,stream,language) (This)->lpVtbl->GetSubpictureLanguage(This,stream,language)
#define IDvdInfo2_GetTitleAttributes(This,index,menu,title) (This)->lpVtbl->GetTitleAttributes(This,index,menu,title)
#define IDvdInfo2_GetVMGAttributes(This,attr) (This)->lpVtbl->GetVMGAttributes(This,attr)
#define IDvdInfo2_GetVideoAttributes(This,attr) (This)->lpVtbl->GetVideoAttributes(This,attr)
#define IDvdInfo2_GetAudioAttributes(This,stream,attr) (This)->lpVtbl->GetAudioAttributes(This,stream,attr)
#define IDvdInfo2_GetKaraokeAttributes(This,stream,attr) (This)->lpVtbl->GetKaraokeAttributes(This,stream,attr)
#define IDvdInfo2_GetSubpictureAttributes(This,stream,attr) (This)->lpVtbl->GetSubpictureAttributes(This,stream,attr)
#define IDvdInfo2_GetCurrentVolumeInfo(This,volume_count,current,side,title_count) (This)->lpVtbl->GetCurrentVolumeInfo(This,volume_count,current,side,title_count)
#define IDvdInfo2_GetDVDTextNumberOfLanguages(This,count) (This)->lpVtbl->GetDVDTextNumberOfLanguages(This,count)
#define IDvdInfo2_GetDVDTextLanguageInfo(This,index,string_count,language,character_set) (This)->lpVtbl->GetDVDTextLanguageInfo(This,index,string_count,language,character_set)
#define IDvdInfo2_GetDVDTextStringAsNative(This,lang_index,string_index,string,size,ret_size,type) (This)->lpVtbl->GetDVDTextStringAsNative(This,lang_index,string_index,string,size,ret_size,type)
#define IDvdInfo2_GetDVDTextStringAsUnicode(This,lang_index,string_index,string,size,ret_size,type) (This)->lpVtbl->GetDVDTextStringAsUnicode(This,lang_index,string_index,string,size,ret_size,type)
#define IDvdInfo2_GetPlayerParentalLevel(This,level,country_code) (This)->lpVtbl->GetPlayerParentalLevel(This,level,country_code)
#define IDvdInfo2_GetNumberOfChapters(This,title,count) (This)->lpVtbl->GetNumberOfChapters(This,title,count)
#define IDvdInfo2_GetTitleParentalLevels(This,title,levels) (This)->lpVtbl->GetTitleParentalLevels(This,title,levels)
#define IDvdInfo2_GetDVDDirectory(This,path,size,ret_size) (This)->lpVtbl->GetDVDDirectory(This,path,size,ret_size)
#define IDvdInfo2_IsAudioStreamEnabled(This,stream,enable) (This)->lpVtbl->IsAudioStreamEnabled(This,stream,enable)
#define IDvdInfo2_GetDiscID(This,path,id) (This)->lpVtbl->GetDiscID(This,path,id)
#define IDvdInfo2_GetState(This,state) (This)->lpVtbl->GetState(This,state)
#define IDvdInfo2_GetMenuLanguages(This,languages,count,ret_count) (This)->lpVtbl->GetMenuLanguages(This,languages,count,ret_count)
#define IDvdInfo2_GetButtonAtPosition(This,point,button) (This)->lpVtbl->GetButtonAtPosition(This,point,button)
#define IDvdInfo2_GetCmdFromEvent(This,param,cmd) (This)->lpVtbl->GetCmdFromEvent(This,param,cmd)
#define IDvdInfo2_GetDefaultMenuLanguage(This,language) (This)->lpVtbl->GetDefaultMenuLanguage(This,language)
#define IDvdInfo2_GetDefaultAudioLanguage(This,language,extension) (This)->lpVtbl->GetDefaultAudioLanguage(This,language,extension)
#define IDvdInfo2_SelectDefaultSubpictureLanguage(This,language,extension) (This)->lpVtbl->SelectDefaultSubpictureLanguage(This,language,extension)
#define IDvdInfo2_GetDecoderCaps(This,caps) (This)->lpVtbl->GetDecoderCaps(This,caps)
#define IDvdInfo2_GetButtonRect(This,button,rect) (This)->lpVtbl->GetButtonRect(This,button,rect)
#define IDvdInfo2_IsSubpictureStreamEnabled(This,stream,enable) (This)->lpVtbl->IsSubpictureStreamEnabled(This,stream,enable)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdInfo2_QueryInterface(IDvdInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdInfo2_AddRef(IDvdInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdInfo2_Release(IDvdInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdInfo2 methods ***/
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentDomain(IDvdInfo2* This,DVD_DOMAIN *domain) {
    return This->lpVtbl->GetCurrentDomain(This,domain);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentLocation(IDvdInfo2* This,DVD_PLAYBACK_LOCATION2 *location) {
    return This->lpVtbl->GetCurrentLocation(This,location);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetTotalTitleTime(IDvdInfo2* This,DVD_HMSF_TIMECODE *time,ULONG *flags) {
    return This->lpVtbl->GetTotalTitleTime(This,time,flags);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentButton(IDvdInfo2* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentButton(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentAngle(IDvdInfo2* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentAngle(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentAudio(IDvdInfo2* This,ULONG *count,ULONG *current) {
    return This->lpVtbl->GetCurrentAudio(This,count,current);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentSubpicture(IDvdInfo2* This,ULONG *count,ULONG *current,WINBOOL *enable) {
    return This->lpVtbl->GetCurrentSubpicture(This,count,current,enable);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentUOPS(IDvdInfo2* This,ULONG *uops) {
    return This->lpVtbl->GetCurrentUOPS(This,uops);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetAllSPRMs(IDvdInfo2* This,SPRMARRAY *regs) {
    return This->lpVtbl->GetAllSPRMs(This,regs);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetAllGPRMs(IDvdInfo2* This,GPRMARRAY *regs) {
    return This->lpVtbl->GetAllGPRMs(This,regs);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetAudioLanguage(IDvdInfo2* This,ULONG stream,LCID *language) {
    return This->lpVtbl->GetAudioLanguage(This,stream,language);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetSubpictureLanguage(IDvdInfo2* This,ULONG stream,LCID *language) {
    return This->lpVtbl->GetSubpictureLanguage(This,stream,language);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetTitleAttributes(IDvdInfo2* This,ULONG index,DVD_MenuAttributes *menu,DVD_TitleAttributes *title) {
    return This->lpVtbl->GetTitleAttributes(This,index,menu,title);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetVMGAttributes(IDvdInfo2* This,DVD_MenuAttributes *attr) {
    return This->lpVtbl->GetVMGAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetVideoAttributes(IDvdInfo2* This,DVD_VideoAttributes *attr) {
    return This->lpVtbl->GetVideoAttributes(This,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetAudioAttributes(IDvdInfo2* This,ULONG stream,DVD_AudioAttributes *attr) {
    return This->lpVtbl->GetAudioAttributes(This,stream,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetKaraokeAttributes(IDvdInfo2* This,ULONG stream,DVD_KaraokeAttributes *attr) {
    return This->lpVtbl->GetKaraokeAttributes(This,stream,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetSubpictureAttributes(IDvdInfo2* This,ULONG stream,DVD_SubpictureAttributes *attr) {
    return This->lpVtbl->GetSubpictureAttributes(This,stream,attr);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCurrentVolumeInfo(IDvdInfo2* This,ULONG *volume_count,ULONG *current,DVD_DISC_SIDE *side,ULONG *title_count) {
    return This->lpVtbl->GetCurrentVolumeInfo(This,volume_count,current,side,title_count);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDVDTextNumberOfLanguages(IDvdInfo2* This,ULONG *count) {
    return This->lpVtbl->GetDVDTextNumberOfLanguages(This,count);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDVDTextLanguageInfo(IDvdInfo2* This,ULONG index,ULONG *string_count,LCID *language,enum DVD_TextCharSet *character_set) {
    return This->lpVtbl->GetDVDTextLanguageInfo(This,index,string_count,language,character_set);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDVDTextStringAsNative(IDvdInfo2* This,ULONG lang_index,ULONG string_index,BYTE *string,ULONG size,ULONG *ret_size,enum DVD_TextStringType *type) {
    return This->lpVtbl->GetDVDTextStringAsNative(This,lang_index,string_index,string,size,ret_size,type);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDVDTextStringAsUnicode(IDvdInfo2* This,ULONG lang_index,ULONG string_index,WCHAR *string,ULONG size,ULONG *ret_size,enum DVD_TextStringType *type) {
    return This->lpVtbl->GetDVDTextStringAsUnicode(This,lang_index,string_index,string,size,ret_size,type);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetPlayerParentalLevel(IDvdInfo2* This,ULONG *level,BYTE country_code[2]) {
    return This->lpVtbl->GetPlayerParentalLevel(This,level,country_code);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetNumberOfChapters(IDvdInfo2* This,ULONG title,ULONG *count) {
    return This->lpVtbl->GetNumberOfChapters(This,title,count);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetTitleParentalLevels(IDvdInfo2* This,ULONG title,ULONG *levels) {
    return This->lpVtbl->GetTitleParentalLevels(This,title,levels);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDVDDirectory(IDvdInfo2* This,WCHAR *path,ULONG size,ULONG *ret_size) {
    return This->lpVtbl->GetDVDDirectory(This,path,size,ret_size);
}
static __WIDL_INLINE HRESULT IDvdInfo2_IsAudioStreamEnabled(IDvdInfo2* This,ULONG stream,WINBOOL *enable) {
    return This->lpVtbl->IsAudioStreamEnabled(This,stream,enable);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDiscID(IDvdInfo2* This,const WCHAR *path,ULONGLONG *id) {
    return This->lpVtbl->GetDiscID(This,path,id);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetState(IDvdInfo2* This,IDvdState **state) {
    return This->lpVtbl->GetState(This,state);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetMenuLanguages(IDvdInfo2* This,LCID *languages,ULONG count,ULONG *ret_count) {
    return This->lpVtbl->GetMenuLanguages(This,languages,count,ret_count);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetButtonAtPosition(IDvdInfo2* This,POINT point,ULONG *button) {
    return This->lpVtbl->GetButtonAtPosition(This,point,button);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetCmdFromEvent(IDvdInfo2* This,LONG_PTR param,IDvdCmd **cmd) {
    return This->lpVtbl->GetCmdFromEvent(This,param,cmd);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDefaultMenuLanguage(IDvdInfo2* This,LCID *language) {
    return This->lpVtbl->GetDefaultMenuLanguage(This,language);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDefaultAudioLanguage(IDvdInfo2* This,LCID *language,DVD_AUDIO_LANG_EXT *extension) {
    return This->lpVtbl->GetDefaultAudioLanguage(This,language,extension);
}
static __WIDL_INLINE HRESULT IDvdInfo2_SelectDefaultSubpictureLanguage(IDvdInfo2* This,LCID *language,DVD_SUBPICTURE_LANG_EXT *extension) {
    return This->lpVtbl->SelectDefaultSubpictureLanguage(This,language,extension);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetDecoderCaps(IDvdInfo2* This,DVD_DECODER_CAPS *caps) {
    return This->lpVtbl->GetDecoderCaps(This,caps);
}
static __WIDL_INLINE HRESULT IDvdInfo2_GetButtonRect(IDvdInfo2* This,ULONG button,RECT *rect) {
    return This->lpVtbl->GetButtonRect(This,button,rect);
}
static __WIDL_INLINE HRESULT IDvdInfo2_IsSubpictureStreamEnabled(IDvdInfo2* This,ULONG stream,WINBOOL *enable) {
    return This->lpVtbl->IsSubpictureStreamEnabled(This,stream,enable);
}
#endif
#endif

#endif


#endif  /* __IDvdInfo2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDvdGraphBuilder interface
 */
#ifndef __IDvdGraphBuilder_INTERFACE_DEFINED__
#define __IDvdGraphBuilder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDvdGraphBuilder, 0xfcc152b6, 0xf372, 0x11d0, 0x8e,0x00, 0x00,0xc0,0x4f,0xd7,0xc0,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fcc152b6-f372-11d0-8e00-00c04fd7c08b")
IDvdGraphBuilder : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFiltergraph(
        IGraphBuilder **graph) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDvdInterface(
        REFIID iid,
        void **out) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenderDvdVideoVolume(
        const WCHAR *path,
        DWORD flags,
        AM_DVD_RENDERSTATUS *status) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDvdGraphBuilder, 0xfcc152b6, 0xf372, 0x11d0, 0x8e,0x00, 0x00,0xc0,0x4f,0xd7,0xc0,0x8b)
#endif
#else
typedef struct IDvdGraphBuilderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDvdGraphBuilder *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDvdGraphBuilder *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDvdGraphBuilder *This);

    /*** IDvdGraphBuilder methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFiltergraph)(
        IDvdGraphBuilder *This,
        IGraphBuilder **graph);

    HRESULT (STDMETHODCALLTYPE *GetDvdInterface)(
        IDvdGraphBuilder *This,
        REFIID iid,
        void **out);

    HRESULT (STDMETHODCALLTYPE *RenderDvdVideoVolume)(
        IDvdGraphBuilder *This,
        const WCHAR *path,
        DWORD flags,
        AM_DVD_RENDERSTATUS *status);

    END_INTERFACE
} IDvdGraphBuilderVtbl;

interface IDvdGraphBuilder {
    CONST_VTBL IDvdGraphBuilderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDvdGraphBuilder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDvdGraphBuilder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDvdGraphBuilder_Release(This) (This)->lpVtbl->Release(This)
/*** IDvdGraphBuilder methods ***/
#define IDvdGraphBuilder_GetFiltergraph(This,graph) (This)->lpVtbl->GetFiltergraph(This,graph)
#define IDvdGraphBuilder_GetDvdInterface(This,iid,out) (This)->lpVtbl->GetDvdInterface(This,iid,out)
#define IDvdGraphBuilder_RenderDvdVideoVolume(This,path,flags,status) (This)->lpVtbl->RenderDvdVideoVolume(This,path,flags,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDvdGraphBuilder_QueryInterface(IDvdGraphBuilder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDvdGraphBuilder_AddRef(IDvdGraphBuilder* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDvdGraphBuilder_Release(IDvdGraphBuilder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDvdGraphBuilder methods ***/
static __WIDL_INLINE HRESULT IDvdGraphBuilder_GetFiltergraph(IDvdGraphBuilder* This,IGraphBuilder **graph) {
    return This->lpVtbl->GetFiltergraph(This,graph);
}
static __WIDL_INLINE HRESULT IDvdGraphBuilder_GetDvdInterface(IDvdGraphBuilder* This,REFIID iid,void **out) {
    return This->lpVtbl->GetDvdInterface(This,iid,out);
}
static __WIDL_INLINE HRESULT IDvdGraphBuilder_RenderDvdVideoVolume(IDvdGraphBuilder* This,const WCHAR *path,DWORD flags,AM_DVD_RENDERSTATUS *status) {
    return This->lpVtbl->RenderDvdVideoVolume(This,path,flags,status);
}
#endif
#endif

#endif


#endif  /* __IDvdGraphBuilder_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __dvdif_h__ */
