summaryrefslogtreecommitdiffstats
path: root/sdk/dx8sdk/Include/DShowIDL/dvdif.idl
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2020-08-02 18:49:12 +0200
committerSergeanur <s.anureev@yandex.ua>2020-08-02 18:49:12 +0200
commit3e24ae8812ca4a0031d82ea7f7393605b8a4283a (patch)
tree5cc79378e86970d3b63cbed173d627410ea90ca6 /sdk/dx8sdk/Include/DShowIDL/dvdif.idl
parentMerge pull request #669 from erorcun/miami (diff)
parentMove sdk and eax (diff)
downloadre3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar.gz
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar.bz2
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar.lz
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar.xz
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.tar.zst
re3-3e24ae8812ca4a0031d82ea7f7393605b8a4283a.zip
Diffstat (limited to 'sdk/dx8sdk/Include/DShowIDL/dvdif.idl')
-rw-r--r--sdk/dx8sdk/Include/DShowIDL/dvdif.idl2326
1 files changed, 2326 insertions, 0 deletions
diff --git a/sdk/dx8sdk/Include/DShowIDL/dvdif.idl b/sdk/dx8sdk/Include/DShowIDL/dvdif.idl
new file mode 100644
index 00000000..4ad2bca1
--- /dev/null
+++ b/sdk/dx8sdk/Include/DShowIDL/dvdif.idl
@@ -0,0 +1,2326 @@
+//------------------------------------------------------------------------------
+// File: DVDIf.idl
+//
+// Desc: DirectShow interfaces to control playback of a DVD filter graph.
+//
+// Copyright (c) 1992-2002, Microsoft Corporation. All rights reserved.
+//------------------------------------------------------------------------------
+
+
+// forward declarations - these are the interfaces declared in this file
+
+import "unknwn.idl";
+import "objidl.idl";
+
+cpp_quote("#include <ddraw.h>")
+
+interface IDvdControl;
+interface IDvdInfo;
+interface IDirectDraw;
+interface IDirectDrawSurface;
+interface IDvdGraphBuilder ;
+interface IDDrawExclModeVideo;
+interface IDDrawExclModeVideoCallback;
+interface IDvdCmd;
+interface IDvdState;
+
+
+//==========================================================================
+//==========================================================================
+//
+// typedefs used by IDvdControl and IDvdInfo interfaces.
+//
+//==========================================================================
+//==========================================================================
+
+typedef enum tagDVD_DOMAIN {
+ // The DVD_DOMAIN is used to indicate the stat of a DVD player.
+ DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc
+ DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc
+ DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set
+ DVD_DOMAIN_Title, // displaying current title
+ DVD_DOMAIN_Stop // player is in stopped state
+} DVD_DOMAIN;
+
+typedef enum tagDVD_MENU_ID {
+ DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume
+ DVD_MENU_Root = 3, // main menu for a specific VTS
+ DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS
+ DVD_MENU_Audio = 5, // to choose audio stream in a VTS
+ DVD_MENU_Angle = 6, // to choose angle num in a VTS
+ DVD_MENU_Chapter = 7 // to choose a chapter in a VTS
+ // the Root menu always provides a means of getting to to Subpicture, Audio,
+ // Angle and Chapter menus if they exist.
+} 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
+{
+ // DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's
+ // preferred window aspect ratio and preferred method of converion of
+ // 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are
+ // the two conversion methods. This enum is used to indicate only a preference of
+ // conversion mechinism since some content can only be converted using one
+ // of these methods. 4*3 content is converted to a 16*9 window always by using
+ // "reverse" letterboxing where black bars are added to the right and left
+ // sides of the display instead of the top and bottom of the display as in the 16*9
+ // to 4*3 conversion useing letterboxing.
+ DISPLAY_CONTENT_DEFAULT = 0, // default to content
+ DISPLAY_16x9 = 1, // 16x9 display
+ DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence
+ DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence
+
+} DVD_PREFERRED_DISPLAY_MODE;
+
+typedef WORD DVD_REGISTER;
+typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers
+typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers
+
+
+
+// these are only for IDVDInfo1 compatibility and require the DVD-Video 1.0 specification
+// Please use the IDVDInfo2's DVD_Title/MenuAttributes, DVD_VideoAttributes, DVD_AudioAttributes, and DVD_SubpictureAttributes
+typedef struct tagDVD_ATR
+{
+ //
+ // Refer to the DVD-Video 1.0 spec to parse these structures.
+ //
+ ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT
+ // if this is for a Video Title Set (VTS)
+ BYTE pbATRI[768];// All stream attributes for menu and title from bytes
+ // 256 to 1023 of VMGI or VTSI.
+} DVD_ATR;
+typedef BYTE DVD_VideoATR[2]; // video stream attributes.
+typedef BYTE DVD_AudioATR[8]; // audio stream attributes.
+typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes.
+
+// DVD1.0 Timecode is BCD encoded in this format: 0xHhMmSsFf, where
+// H is tens of hours
+// h is hours
+// M is tens of minutes
+// m is minutes
+// S is tens of seconds
+// s is seconds
+// F is tens of frames
+// f is frames
+// Note that you must know the frame rate to interperate the frame count as time.
+typedef enum tagDVD_FRAMERATE
+{
+ DVD_FPS_25 =1, // 25 frames per second
+ DVD_FPS_30NonDrop = 3 // exactly 30 frames per second
+} DVD_FRAMERATE;
+
+cpp_quote("typedef struct tagDVD_TIMECODE")
+cpp_quote("{")
+cpp_quote(" ULONG Hours1 :4; // Hours")
+cpp_quote(" ULONG Hours10 :4; // Tens of Hours ")
+cpp_quote("")
+cpp_quote(" ULONG Minutes1 :4; // Minutes ")
+cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ")
+cpp_quote("")
+cpp_quote(" ULONG Seconds1 :4; // Seconds ")
+cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ")
+cpp_quote("")
+cpp_quote(" ULONG Frames1 :4; // Frames ")
+cpp_quote(" ULONG Frames10 :2; // Tens of Frames ")
+cpp_quote("")
+cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop")
+cpp_quote("} DVD_TIMECODE;")
+
+//
+// Newer IDVD2 methods can use the HMSF format instead
+// Call SetOption( DVD_HMSF_TimeCodeEvents, TRUE) to return EC_DVD_CURRENT_HMSF_TIME
+// instead of EC_DVD_CURRENT_TIME events
+//
+typedef enum tagDVD_TIMECODE_FLAGS
+{
+ DVD_TC_FLAG_25fps = 0x00000001, // 25 frames per second
+ DVD_TC_FLAG_30fps = 0x00000002, // 30 frames per second
+ DVD_TC_FLAG_DropFrame = 0x00000004, // 29.97 instead of 30 fps
+ DVD_TC_FLAG_Interpolated = 0x00000008, // timecode may be inaccurate
+ // remainder of bits are reserved and should not be read
+} DVD_TIMECODE_FLAGS;
+
+// this can be cast to/from a ULONG
+typedef struct tagDVD_HMSF_TIMECODE
+{
+ BYTE bHours;
+ BYTE bMinutes;
+ BYTE bSeconds;
+ BYTE bFrames;
+} DVD_HMSF_TIMECODE;
+
+typedef struct tagDVD_PLAYBACK_LOCATION2
+{
+ //
+ // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
+ // playback location for One_Sequential_PGC_Titles.
+ //
+ ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
+ ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
+ DVD_HMSF_TIMECODE TimeCode; // use DVD_TIMECODE for current playback time.
+ ULONG TimeCodeFlags; // union of DVD_TIMECODE_EVENT_FLAGS
+
+} DVD_PLAYBACK_LOCATION2;
+
+typedef struct tagDVD_PLAYBACK_LOCATION
+{
+ //
+ // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
+ // playback location for One_Sequential_PGC_Titles.
+ //
+ ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
+ ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
+ ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title
+
+} DVD_PLAYBACK_LOCATION;
+
+typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
+
+typedef enum {
+ //
+ // Annex J User Functions ---
+ //
+ UOP_FLAG_Play_Title_Or_AtTime = 0x00000001, // Title_Or_Time_Play
+ UOP_FLAG_Play_Chapter = 0x00000002, // Chapter_Search_Or_Play
+ UOP_FLAG_Play_Title = 0x00000004, // Title_Play
+ UOP_FLAG_Stop = 0x00000008, // Stop
+ UOP_FLAG_ReturnFromSubMenu = 0x00000010, // GoUp
+ UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020, // Time_Or_Chapter_Search
+ UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040, // Prev_Or_Top_PG_Search
+ UOP_FLAG_PlayNext_Chapter = 0x00000080, // Next_PG_Search
+ UOP_FLAG_Play_Forwards = 0x00000100, // Forward_Scan
+ UOP_FLAG_Play_Backwards = 0x00000200, // Backward_Scan
+ UOP_FLAG_ShowMenu_Title = 0x00000400, // Title_Menu_Call
+ UOP_FLAG_ShowMenu_Root = 0x00000800, // Root_Menu_Call
+ UOP_FLAG_ShowMenu_SubPic = 0x00001000, // SubPic_Menu_Call
+ UOP_FLAG_ShowMenu_Audio = 0x00002000, // Audio_Menu_Call
+ UOP_FLAG_ShowMenu_Angle = 0x00004000, // Angle_Menu_Call
+ UOP_FLAG_ShowMenu_Chapter = 0x00008000, // Chapter_Menu_Call
+ UOP_FLAG_Resume = 0x00010000, // Resume
+ UOP_FLAG_Select_Or_Activate_Button = 0x00020000, // Button_Select_Or_Activate
+ UOP_FLAG_Still_Off = 0x00040000, // Still_Off
+ UOP_FLAG_Pause_On = 0x00080000, // Pause_On
+ UOP_FLAG_Select_Audio_Stream = 0x00100000, // Audio_Stream_Change
+ UOP_FLAG_Select_SubPic_Stream = 0x00200000, // SubPic_Stream_Change
+ UOP_FLAG_Select_Angle = 0x00400000, // Angle_Change
+ UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000, // Karaoke_Audio_Pres_Mode_Change
+ UOP_FLAG_Select_Video_Mode_Preference = 0x01000000 // Video_Pres_Mode_Change
+} VALID_UOP_FLAG ;
+
+typedef enum {
+ DVD_CMD_FLAG_None = 0x00000000,
+ DVD_CMD_FLAG_Flush = 0x00000001,
+ DVD_CMD_FLAG_SendEvents = 0x00000002,
+ DVD_CMD_FLAG_Block = 0x00000004, // block end
+ DVD_CMD_FLAG_StartWhenRendered = 0x00000008, // command "start" when the first frame is rendered
+ DVD_CMD_FLAG_EndAfterRendered = 0x00000010, // command "ends" after the last frame is rendered
+} DVD_CMD_FLAGS;
+
+// For IDVDControl2::SetOption flags
+typedef enum {
+ DVD_ResetOnStop = 1, // default TRUE
+ DVD_NotifyParentalLevelChange = 2, // default FALSE
+ DVD_HMSF_TimeCodeEvents = 3, // default FALSE (send DVD_CURRENT_TIME events)
+ DVD_AudioDuringFFwdRew = 4 // default FALSE (or by reg)
+} DVD_OPTION_FLAG;
+
+typedef enum {
+ DVD_Relative_Upper = 1,
+ DVD_Relative_Lower = 2,
+ DVD_Relative_Left = 3,
+ DVD_Relative_Right = 4
+} DVD_RELATIVE_BUTTON;
+
+// Parental Level Information
+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 = 0x0800,
+ DVD_PARENTAL_LEVEL_3 = 0x0400,
+ DVD_PARENTAL_LEVEL_2 = 0x0200,
+ DVD_PARENTAL_LEVEL_1 = 0x0100
+} 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, // no special mode
+ 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, // MPEG1 with dynamic range control
+ DVD_AudioFormat_MPEG2 = 3,
+ DVD_AudioFormat_MPEG2_DRC = 4, // MPEG2 with dynamic range control
+ DVD_AudioFormat_LPCM = 5,
+ DVD_AudioFormat_DTS = 6,
+ DVD_AudioFormat_SDDS = 7,
+ DVD_AudioFormat_Other = 8
+} DVD_AUDIO_FORMAT;
+
+// flags for SelectKaraokeAudioPresentationMode
+typedef enum tagDVD_KARAOKE_DOWNMIX
+{
+ DVD_Mix_0to0 = 0x0001, // unused - reserved for future use
+ DVD_Mix_1to0 = 0x0002, // unused - reserved for future use
+ DVD_Mix_2to0 = 0x0004,
+ DVD_Mix_3to0 = 0x0008,
+ DVD_Mix_4to0 = 0x0010,
+ DVD_Mix_Lto0 = 0x0020, // mix auxillary L to channel 0 (left speaker)
+ DVD_Mix_Rto0 = 0x0040, // mix auxillary R to channel 0 (left speaker)
+
+ DVD_Mix_0to1 = 0x0100, // unused - reserved for future use
+ DVD_Mix_1to1 = 0x0200, // unused - reserved for future use
+ DVD_Mix_2to1 = 0x0400,
+ DVD_Mix_3to1 = 0x0800,
+ DVD_Mix_4to1 = 0x1000,
+ DVD_Mix_Lto1 = 0x2000, // mix auxillary L to channel 1 (right speaker)
+ DVD_Mix_Rto1 = 0x4000, // mix auxillary R to channel 1 (right speaker)
+} DVD_KARAOKE_DOWNMIX;
+
+
+typedef struct tagDVD_AudioAttributes
+{
+ DVD_AUDIO_APPMODE AppMode;
+ BYTE AppModeData;
+ DVD_AUDIO_FORMAT AudioFormat; // Use GetKaraokeAttributes()
+ LCID Language; // 0 if no language is present
+ DVD_AUDIO_LANG_EXT LanguageExtension; // (captions, if for children etc)
+ BOOL fHasMultichannelInfo; // multichannel attributes are present (Use GetMultiChannelAudioAttributes())
+ DWORD dwFrequency; // in hertz (48k, 96k)
+ BYTE bQuantization; // resolution (16, 20, 24 bits etc), 0 is unknown
+ BYTE bNumberOfChannels; // 5.1 AC3 has 6 channels
+ DWORD dwReserved[2];
+} DVD_AudioAttributes;
+
+typedef struct tagDVD_MUA_MixingInfo
+{
+ // surround sound mixing information applied when:
+ // AppMode = DVD_AudioMode_Surround
+ // AudioFormat = DVD_AudioFormat_LPCM,
+ // fHasMultichannelInfo=1 modes are all on
+ //
+ BOOL fMixTo0;
+ BOOL fMixTo1;
+
+ //
+ BOOL fMix0InPhase;
+ BOOL fMix1InPhase;
+
+ DWORD dwSpeakerPosition; // see ksmedia.h: SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, etc
+} DVD_MUA_MixingInfo;
+
+// The alpha coeff is used to mix to ACH0 and beta is used to mix to ACH1
+//
+// In general:
+// ACH0 = coeff[0].alpha * value[0] + coeff[1].alpha * value[1] + ...
+// ACH1 = coeff[0].beta * value[0] + coeff[1].beta * value[1] + ...
+typedef struct tagDVD_MUA_Coeff
+{
+ double log2_alpha; // actual coeff = 2^alpha
+ double log2_beta; // actual coeff = 2^beta
+} DVD_MUA_Coeff;
+
+typedef struct tagDVD_MultichannelAudioAttributes
+{
+ // actual Data for each data stream
+ DVD_MUA_MixingInfo Info[8];
+ DVD_MUA_Coeff Coeff[8];
+} DVD_MultichannelAudioAttributes;
+
+// bitwise OR of these flags descript the contents of each channel
+typedef enum tagDVD_KARAOKE_CONTENTS
+{
+ DVD_Karaoke_GuideVocal1 = 0x0001,
+ DVD_Karaoke_GuideVocal2 = 0x0002,
+ DVD_Karaoke_GuideMelody1 = 0x0004,
+ DVD_Karaoke_GuideMelody2 = 0x0008,
+ DVD_Karaoke_GuideMelodyA = 0x0010,
+ DVD_Karaoke_GuideMelodyB = 0x0020,
+ DVD_Karaoke_SoundEffectA = 0x0040,
+ DVD_Karaoke_SoundEffectB = 0x0080
+} DVD_KARAOKE_CONTENTS;
+
+typedef enum tagDVD_KARAOKE_ASSIGNMENT
+{
+ DVD_Assignment_reserved0 = 0,
+ DVD_Assignment_reserved1 = 1,
+ DVD_Assignment_LR = 2, // left right
+ DVD_Assignment_LRM = 3, // left right middle
+ DVD_Assignment_LR1 = 4, // left right audio1
+ DVD_Assignment_LRM1 = 5, // left right middle audio1
+ DVD_Assignment_LR12 = 6, // left right audio1 audio2
+ DVD_Assignment_LRM12 = 7 // left right middle audio1 audio2
+} DVD_KARAOKE_ASSIGNMENT;
+
+typedef struct tagDVD_KaraokeAttributes
+{
+ BYTE bVersion;
+ BOOL fMasterOfCeremoniesInGuideVocal1;
+ BOOL fDuet; // false = solo
+ DVD_KARAOKE_ASSIGNMENT ChannelAssignment;
+ WORD wChannelContents[8]; // logical OR of DVD_KARAOKE_CONTENTS
+} DVD_KaraokeAttributes;
+
+typedef enum tagDVD_VIDEO_COMPRESSION
+{
+ DVD_VideoCompression_Other = 0,
+ DVD_VideoCompression_MPEG1 = 1,
+ DVD_VideoCompression_MPEG2 = 2,
+} DVD_VIDEO_COMPRESSION;
+
+typedef struct tagDVD_VideoAttributes
+{
+ BOOL fPanscanPermitted; // if a 4x3 display, can be shown as PanScan
+ BOOL fLetterboxPermitted; // if a 4x3 display, can be shown as Letterbox
+ ULONG ulAspectX; // 4x3 or 16x9
+ ULONG ulAspectY;
+ ULONG ulFrameRate; // 50hz or 60hz
+ ULONG ulFrameHeight; // 525 (60hz) or 625 (50hz)
+ DVD_VIDEO_COMPRESSION Compression;// MPEG1 or MPEG2
+
+ BOOL fLine21Field1InGOP; // true if there is user data in field 1 of GOP of video stream
+ BOOL fLine21Field2InGOP; // true if there is user data in field 1 of GOP of video stream
+
+ ULONG ulSourceResolutionX; // X source resolution (352,704, or 720)
+ ULONG ulSourceResolutionY; // Y source resolution (240,480, 288 or 576)
+
+ BOOL fIsSourceLetterboxed; // subpictures and highlights (e.g. subtitles or menu buttons) are only
+ // displayed in the active video area and cannot be displayed in the top/bottom 'black' bars
+ BOOL fIsFilmMode; // for 625/50hz systems, is film mode (true) or camera mode (false)
+} DVD_VideoAttributes;
+
+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 struct tagDVD_SubpictureAttributes
+{
+ DVD_SUBPICTURE_TYPE Type;
+ DVD_SUBPICTURE_CODING CodingMode;
+ LCID Language;
+ DVD_SUBPICTURE_LANG_EXT LanguageExtension;
+} DVD_SubpictureAttributes;
+
+typedef enum tagDVD_TITLE_APPMODE
+{
+ DVD_AppMode_Not_Specified = 0, // no special mode
+ DVD_AppMode_Karaoke = 1,
+ DVD_AppMode_Other = 3,
+} DVD_TITLE_APPMODE;
+
+typedef struct tagDVD_TitleMainAttributes
+{
+ // for Titles
+ DVD_TITLE_APPMODE AppMode;
+
+ // Attributes about the 'main' video of the menu or title
+ DVD_VideoAttributes VideoAttributes;
+
+ ULONG ulNumberOfAudioStreams;
+ DVD_AudioAttributes AudioAttributes[8];
+ // present if the multichannel bit is set in the corresponding stream's audio attributes
+ DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8];
+
+ ULONG ulNumberOfSubpictureStreams;
+ DVD_SubpictureAttributes SubpictureAttributes[32];
+} DVD_TitleAttributes;
+
+typedef struct tagDVD_MenuAttributes
+{
+ // for VMG only
+ BOOL fCompatibleRegion[8]; // indeces 0..7 correspond to regions 1..8
+
+ // Attributes about the main menu (VMGM or VTSM)
+ DVD_VideoAttributes VideoAttributes;
+
+ BOOL fAudioPresent;
+ DVD_AudioAttributes AudioAttributes;
+
+ BOOL fSubpicturePresent;
+ DVD_SubpictureAttributes SubpictureAttributes;
+} DVD_MenuAttributes;
+
+//==========================================================================
+//==========================================================================
+// IDvdControl interface -- Basic DVD-Video playback control.
+// This modeled after the app control of a player specified in Annex J
+// of the DVD Video spec. IDvdInfo can be used to get information useful
+// in using IDvdControl
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(A70EFE61-E2A3-11d0-A9BE-00AA0061BE93),
+pointer_default(unique)
+]
+
+interface IDvdControl : IUnknown {
+ import "unknwn.idl";
+
+ // TitlePlay
+ // Start playing the specified title number.
+ // Title numbers range between 1 and 99.
+ HRESULT TitlePlay
+ ( [in] ULONG ulTitle
+ );
+
+ // ChapterPlay
+ // Start playing at the specified chapter (or part-of-title)
+ // within the specified title. Chapters range from 1 to 999.
+ HRESULT ChapterPlay
+ ( [in] ULONG ulTitle,
+ [in] ULONG ulChapter
+ );
+
+ // TimePlay
+ // Start playing at the specified time within the specified title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ HRESULT TimePlay
+ ( [in] ULONG ulTitle,
+ [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
+ );
+
+ // StopForResume
+ // Stop playback after saving resume information. DVD Navigator transfers to the DVD "Stop State" and
+ // (same as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
+ HRESULT StopForResume();
+
+ // GoUp
+ // Start playback of the program chain currently authored as the "GoUp_PGCN".
+ HRESULT GoUp();
+
+ // TimeSearch
+ // Start playing at the specified time within the current title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ HRESULT TimeSearch
+ ( [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
+ );
+
+ // ChapterSearch
+ // Start playing at the specified chapter (or part-of-title) within
+ // the current title.
+ HRESULT ChapterSearch
+ ( [in] ULONG ulChapter
+ );
+
+ // PrevPGSearch
+ // Start playing at the beginning of the previous DVD "program".
+ // For One-Sequential_PGC_Titles (which includes most titles) a program
+ // is equivalent to a chapter, otherwise a program is part of a chapter.
+ HRESULT PrevPGSearch();
+
+ // TopPGSearch
+ // Start playing from the beginning of they current program.
+ HRESULT TopPGSearch();
+
+ // NextPGSearch
+ // Start playing from the beginning of the next program.
+ HRESULT NextPGSearch();
+
+ // ForwardScan
+ // Set forward play at the specified speed.
+ // dwSpeed == 1 is normal play
+ // dwSpeed < 1 is slow play
+ // dwSpeed > 1 is fast play
+ // For dwSpeed != 1, audio and subpicture is muted.
+ HRESULT ForwardScan
+ ( [in] double dwSpeed
+ );
+
+ // BackwardScan
+ // Set reverse play at the specified speed.
+ // dwSpeed == 1 is normal play speed in reverse
+ // dwSpeed < 1 is slow play in reverse
+ // dwSpeed > 1 is fast play in reverse
+ // For reverse play, audio and subpicture are always muted.
+ HRESULT BackwardScan
+ ( [in] double dwSpeed
+ );
+
+ // MenuCall
+ // Start playback of the Menu specified by an enum DVD_MENU_ID.
+ HRESULT MenuCall
+ ( [in] DVD_MENU_ID MenuID
+ );
+
+ // Resume
+ // Returns to title playback in DVD_DOMAIN_Title. This is typically
+ // done after MenuCall which puts the DVD Navigator in
+ // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
+ HRESULT Resume();
+
+ // UpperButtonSelect
+ // Selects the button above the current button.
+ // "Selecting" a DVD button simply highlights the button but does
+ // not "Activate" the button. Selecting is the Windows equivalent
+ // to tabbing to a button but not pressing the space bar or enter key.
+ // Activating is the Windows equivalent of pressing the space bar or
+ // enter key after tabbing to a button.
+ HRESULT UpperButtonSelect();
+
+ // LowerButtonSelect
+ // Selects the button below the current button.
+ HRESULT LowerButtonSelect();
+
+ // LeftButtonSelect
+ // Selects the button to the left of the current button.
+ HRESULT LeftButtonSelect();
+
+ // RightButtonSelect
+ // Selects the button to the right of the current button.
+ HRESULT RightButtonSelect();
+
+ // ButtonActivate
+ // Activates current button.
+ HRESULT ButtonActivate();
+
+ // ButtonSelectAndActivate
+ // Selects and then activates the button specified by the user.
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Button numbers range from 1 to 36.
+ HRESULT ButtonSelectAndActivate
+ ( [in] ULONG ulButton
+ );
+
+ // StillOff
+ // Releases any current still if there are no available buttons.
+ // This includes VOBU stills, Cell stills, and PGC stills, whether the
+ // still is infinite. When buttons are available, stills are released by
+ // activating a button. Note this does not release a Pause.
+ HRESULT StillOff();
+
+ // PauseOn
+ // Freezes playback and any internal timers. This is similar to
+ // IMediaControl::Pause()
+ HRESULT PauseOn();
+
+ // PauseOff
+ // Releases a Pause.
+ HRESULT PauseOff();
+
+ // MenuLanguageSelect
+ // Selects the default language for menus. Languages are specified with
+ // Windows standard LCIDs. LCIDs can be created from ISO-639 codes with
+ // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT )
+ // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
+ // instead of 'ja' for the ISO639 code for Japanese.
+ // MenuLanguageSelect may only called from the DVD Stop state (DVD_DOMAIN_Stop).
+ HRESULT MenuLanguageSelect
+ ( [in] LCID Language
+ );
+
+ // AudioStreamChange
+ // Changes the current audio stream.
+ HRESULT AudioStreamChange
+ ( [in] ULONG ulAudio
+ );
+
+ // SubpictureStreamChange
+ // Changes the current subpicture stream number to nSubpic, and toggles
+ // its display.
+ HRESULT SubpictureStreamChange
+ ( [in] ULONG ulSubPicture,
+ [in] BOOL bDisplay
+ );
+
+ // AngleChange
+ // Changes the current angle number.
+ HRESULT AngleChange
+ ( [in] ULONG ulAngle
+ );
+
+ // ParentalLevelSelect
+ // Selects the current player parental level between 1 and 8. The
+ // defined parental levels are listed below :
+ //
+ // Level Rating
+ // ----- ------
+ //
+ // 1 G
+ // 3 PG
+ // 4 PG13
+ // 6 R
+ // 7 NC17
+ // Higher levels can play lower level content; lower levels cannot play
+ // higher level content. The DVD Navigator provides no restriction on
+ // setting the parental level. DVD player application may enforce
+ // restriction on parental level setting, such as password protection for
+ // raising the current parental level. Parental Management is disabled in
+ // the Navigator by default.
+ //
+ // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
+ // If parental management is disabled, then the player will play the
+ // first PGC in a parental block regardless of parental IDs.
+ //
+ HRESULT ParentalLevelSelect
+ ( [in] ULONG ulParentalLevel
+ );
+
+ // ParentalCountrySelect
+ // Sets the country in which to interpret the the Parental Level.
+ // The country specified using the Alpha-2 code of the ISO-3166 standard,
+ // with the addition of 'ZZ'
+ HRESULT ParentalCountrySelect
+ ( [in] WORD wCountry
+ );
+
+ // KaraokeAudioPresentationModeChange
+ // Sets the Karaoke audio mode.
+ // NOTE: This and all other Karoke support is currently not implemented.
+ HRESULT KaraokeAudioPresentationModeChange
+ ( [in] ULONG ulMode
+ );
+
+ // VideoModePreferrence
+ // The user can specify the preferred display mode that should
+ // be used to display content. The parameter is a ULONG that has
+ // one of the values defined in DVD_PREFERRED_DISPLAY_MODE
+ HRESULT VideoModePreferrence
+ ( [in] ULONG ulPreferredDisplayMode
+ );
+
+ // SetRoot
+ // Sets the root directory containing the DVD-Video volume.
+ // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
+ // If the root directory is not successfully set before
+ // IMediaControl::Play is called, the first drive starting from c:
+ // containing a VIDEO_TS directory in the top level directory
+ // will be used as the root.
+ HRESULT SetRoot
+ ( [in] LPCWSTR pszPath
+ );
+
+ // MouseActivate
+ // This is typically called in response to a mouse click.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is first selected, then activated.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT MouseActivate // typically called after a mouse click
+ ( [in] POINT point
+ );
+
+ // MouseSelect
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is selected.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT MouseSelect // typically called after a mouse move
+ ( [in] POINT point
+ );
+
+ // ChapterPlayAutoStop
+ // Start playing at the specified chapter within the specified title
+ // and play the number of chapters specified by the third parameter.
+ // Chapters range from 1 to 999.
+ HRESULT ChapterPlayAutoStop
+ ( [in] ULONG ulTitle, // title number
+ [in] ULONG ulChapter, // chapter number to start playback
+ [in] ULONG ulChaptersToPlay // number of chapters to play from the start chapter
+ );
+}
+
+
+
+//==========================================================================
+//==========================================================================
+// IDvdInfo interface -- allow an app to query for attributes of available
+// DVD titles and DVD player status. Also allow for control of a DVD
+// player beyond Annex J in the DVD spec.
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(A70EFE60-E2A3-11d0-A9BE-00AA0061BE93),
+pointer_default(unique)
+]
+
+interface IDvdInfo : IUnknown {
+ import "unknwn.idl";
+
+ // GetCurrentDomain
+ // Returns the current DVD Domain of the DVD player.
+ HRESULT GetCurrentDomain
+ ( [out] DVD_DOMAIN *pDomain
+ );
+
+ // GetCurrentLocation
+ // Returns information sufficient to restart playback of a video
+ // from the current playback location in titles that don't explicitly
+ // disable seeking to the current location.
+ HRESULT GetCurrentLocation
+ ( [out] DVD_PLAYBACK_LOCATION *pLocation
+ );
+
+ // GetTotalTitleTime
+ // Return the total playback time for the current title. Only works
+ // for One_Sequential_PGC_Titles.
+ HRESULT GetTotalTitleTime
+ ( [out] ULONG * pulTotalTime // use DVD_TIMECODE.
+ );
+
+ // GetCurrentButton
+ // Indicates the number of currently available buttons and the current
+ // selected button number. If buttons are not present it returns 0 for
+ // both pulButtonsAvailable and pulCurrentButton
+ HRESULT GetCurrentButton
+ ( [out] ULONG * pulButtonsAvailable,
+ [out] ULONG * pulCurrentButton
+ );
+
+ // GetCurrentAngle
+ // Indicates the number of currently available angles and the current
+ // selected angle number. If *pnAnglesAvailable==1, then the current
+ // video is not multiangle.
+ HRESULT GetCurrentAngle
+ ( [out] ULONG * pulAnglesAvailable,
+ [out] ULONG * pulCurrentAngle
+ );
+
+ // GetCurrentAudio
+ // Indicates the number of currently available audio streams and
+ // the current selected audio stream number.
+ // This only work when in DVD_DOMAIN_Title.
+ HRESULT GetCurrentAudio
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream
+ );
+
+ // GetCurrentSubpicture
+ // Indicates the number of currently available subpicture streams,
+ // the current selected subpicture stream number, and if the
+ // subpicture display is currently disabled. Subpicture streams
+ // authored as Forcedly Activated stream will be displayed even if
+ // subpicture display has been disabled by the app with
+ // IDVDControl::SubpictureChangeStream.
+ // This only work when in DVD_DOMAIN_Title.
+ HRESULT GetCurrentSubpicture
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream,
+ [out] BOOL * pIsDisabled
+ );
+
+ // GetCurrentUOPS
+ // Indicates which IDVDControl methods are currently valid. DVD titles
+ // can enable or disable individual user operations at almost any point
+ // during playback.
+ HRESULT GetCurrentUOPS
+ ( [out] VALID_UOP_SOMTHING_OR_OTHER * pUOP
+ );
+
+ // GetAllSPRMs
+ // Returns the current contents of all System Parameter Registers.
+ // See DVD-Video spec for use of individual registers.
+ HRESULT GetAllSPRMs
+ ( [out] SPRMARRAY * pRegisterArray
+ );
+
+ // GetAllGPRMs
+ // Returns the current contents of all General Parameter Registers.
+ // Use of GPRMs is title specific.
+ HRESULT GetAllGPRMs
+ ( [out] GPRMARRAY * pRegisterArray
+ );
+
+ // GetAudioLanguage
+ // Returns the language of the specified stream within the current
+ // title. Does not return languages for menus. Sets *pLanguage=0 if
+ // if the stream does not include language.
+ // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the result LCID.
+ HRESULT GetAudioLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetSubpictureLanguage
+ // Returns the language of the specified stream within the current
+ // title. Does not return languages for menus. Sets *pLanguage=0 if
+ // if the stream does not include language.
+ // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the result LCID.
+ HRESULT GetSubpictureLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetTitleAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for the specified title including menus.
+ // If nTitle == 0xffffffff, attributes for the current title are returned.
+ HRESULT GetTitleAttributes
+ ( [in] ULONG ulTitle, // requested title number
+ [out] DVD_ATR * pATR
+ );
+
+ // GetVMGAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for Video Manager Menus. Some menus, such as the DVD_MENU_Title
+ // are in a separate group of streams called the VMG (Video Manager) and
+ // are not associated with any particular title number.
+ HRESULT GetVMGAttributes
+ ( [out] DVD_ATR * pATR
+ );
+
+ // GetCurrentVideoAttributes
+ // Returns the video attributes for the current title or menu.
+ HRESULT GetCurrentVideoAttributes
+ ( [out] DVD_VideoATR *pATR
+ );
+
+ // GetCurrentAudioAttributes
+ // Returns the video attributes for the stream in the current
+ // title or menu.
+ HRESULT GetCurrentAudioAttributes
+ ( [out] DVD_AudioATR *pATR
+ );
+
+ // GetCurrentSubpictureAttributes
+ // Returns the video attributes for the stream in the current
+ // title or menu.
+ HRESULT GetCurrentSubpictureAttributes
+ ( [out] DVD_SubpictureATR *pATR
+ );
+
+
+ // GetCurrentVolumeInfo
+ // Returns current DVD volume info.
+ HRESULT GetCurrentVolumeInfo
+ ( [out] ULONG *pulNumOfVol, // number of volumes (disc sides?) in a volume set
+ [out] ULONG *pulThisVolNum, // volume number for this root directory
+ [out] DVD_DISC_SIDE *pSide, // current disc side
+ [out] ULONG *pulNumOfTitles // number of titles available in this volume
+ );
+
+
+ // GetDVDTextInfo
+ // Returns the TXTDT_MG structure, which can contain text descriptions for title
+ // name, volume name, producer name, vocalist name, etc. in various languages.
+ // refer to Section 4.1.6 and Annex A of the DVD-Video spec.
+ // If the buffer size passed in is insufficient (for example if cbBufSize==0),
+ // then E_OUTOFMEMORY is returned, and *pcbActualSize is set to the required size.
+ HRESULT GetDVDTextInfo
+ ( [out, size_is(ulBufSize)] BYTE *pTextManager,
+ [in] ULONG ulBufSize, // buffer size passed in
+ [out] ULONG *pulActualSize // amount of actual data return
+ );
+
+ // GetPlayerParentalLevel
+ // Returns the current parental level and the current country code
+ // that has been set in the system registers in player.
+ // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
+ // Valid Parental Levels = 1..8 if parental management is enabled
+ // 0xffffffff if parental management is disabled
+ // See ISO3166 : Alpha-2 Code for the country codes.
+ HRESULT GetPlayerParentalLevel
+ ( [out] ULONG *pulParentalLevel, // current parental level
+ [out] ULONG *pulCountryCode // current country code
+ );
+
+ // GetNumberOfChapters
+ // Returns the number of chapters that are defined for a
+ // given title.
+ HRESULT GetNumberOfChapters
+ ( [in] ULONG ulTitle, // Title for which number of chapters is requested
+ [out] ULONG *pulNumberOfChapters // Number of chapters for the specified title
+ );
+
+ // GetTitleParentalLevels
+ // Returns the parental levels that are defined for a
+ // particular title. pParentalLevels will be combination
+ // of DVD_PARENTAL_LEVEL_8, DVD_PARENTAL_LEVEL_6, or
+ // DVD_PARENTAL_LEVEL_1 "OR"ed together
+ HRESULT GetTitleParentalLevels
+ ( [in] ULONG ulTitle, // Title for which parental levels are requested
+ [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
+ );
+
+ // GetRoot
+ // Returns the root directory that is set in the player. If a valid root
+ // has been found, it returns the root string. Otherwise, it returns 0 for
+ // pcbActualSize indicating that a valid root directory has not been found
+ // or initialized.
+ //
+ // !!! used to return LPTSTR. interface was changed to return
+ // LPSTR (ansi) for compatibility. COM APIs should pass with
+ // UNICODE strings only.
+ //
+ HRESULT GetRoot
+ ( [out, size_is(ulBufSize)] LPSTR pRoot, // pointer to buffer to get root string
+ [in] ULONG ulBufSize, // size of buffer passed in
+ [out] ULONG *pulActualSize // size of actual data returned
+ );
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdCmd interface -- the IDVDControl2 command sequencing object.
+//
+// For the IDVDControl2 interface, the application can track the status of
+// commands that have been issued to the navigator. Each command is identified
+// by an IDvdCmd object. The IDvdCmd object stores the results of the command
+// at both the start (when the command has begun processing) and the end after
+// it has completed. It also allows the app to synchronize with the processing
+// of the command.
+//
+// The command object also allows the app to uniquely identify and correlate
+// completion events (if it prefers to process events in a message loop instead
+// of creating another process).
+//
+// Allows the app to track the status of an issued command to the nav.
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(5a4a97e4-94ee-4a55-9751-74b5643aa27d),
+pointer_default(unique)
+]
+
+interface IDvdCmd : IUnknown {
+ import "unknwn.idl";
+
+ //
+ // WaitForStart
+ //
+ // Blocks the application until the command has begun.
+ //
+ HRESULT WaitForStart();
+
+ //
+ // WaitForEnd
+ //
+ // Blocks until the command has completed or has been cancelled.
+ HRESULT WaitForEnd();
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdState interface -- the State state object.
+//
+// Whenever the application wishes to save or restore a location on the disc,
+// it needs to store the DVD state into an object.
+// The State object supports the IPersistStream
+//
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(86303d6d-1c4a-4087-ab42-f711167048ef),
+pointer_default(unique)
+]
+
+interface IDvdState : IUnknown
+{
+ //
+ // GetDiscID
+ //
+ // Returns the disc ID from which the bookmark was made.
+ //
+ HRESULT GetDiscID
+ ( [out] ULONGLONG* pullUniqueID ); // 64-bit unique id for the disc
+
+ //
+ // GetParentalLevel
+ //
+ // Returns the state's parental level
+ //
+ HRESULT GetParentalLevel
+ ( [out] ULONG* pulParentalLevel );
+}
+
+//==========================================================================
+//==========================================================================
+// IDvdControl2 interface -- Basic DVD-Video playback control.
+// This is modeled after the app control of a player specified in Annex J
+// of the DVD Video spec. IDvdInfo2 can be used to get information useful
+// in using IDvdControl2
+//==========================================================================
+//==========================================================================
+
+[
+object,
+uuid(33BC7430-EEC0-11D2-8201-00A0C9D74842),
+pointer_default(unique)
+]
+
+interface IDvdControl2 : IUnknown {
+ import "unknwn.idl";
+
+ // PlayTitle
+ //
+ // Start playing from the beginning of the specified title number.
+ // Annex J: Title_Play
+ // Title numbers range between 1 and 99.
+ HRESULT PlayTitle
+ ( [in] ULONG ulTitle,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayChapterInTitle
+ //
+ // Start playing from the beginning of the given chapter (or part-of-title) number
+ // within the specified title number.
+ // Annex J: PTT_Play
+ // Title numbers range between 1 and 99.
+ // Chapters range from 1 to 999.
+ HRESULT PlayChapterInTitle
+ ( [in] ULONG ulTitle,
+ [in] ULONG ulChapter,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayAtTimeInTitle
+ //
+ // Start playing from the specified time within the specified title number.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ // Annex J: Time_Play
+ // Title numbers range between 1 and 99.
+ HRESULT PlayAtTimeInTitle
+ ( [in] ULONG ulTitle,
+ [in] DVD_HMSF_TIMECODE* pStartTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // Stop
+ // Stop playback by transferring DVD Navigator to the DVD "Stop State" (same
+ // as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
+ // Annex J: Stop
+ HRESULT Stop();
+
+ // ReturnFromSubmenu
+ //
+ // Stop playback of current program chain (PGC) and start playing the PGC
+ // specified by "GoUp_PGCN".in the PGCI.
+ // If the GoUp_PGCN value is 0xFFFF the Resume() operation is carried out.
+ // Annex J: GoUp
+ HRESULT ReturnFromSubmenu(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayAtTime
+ // Start playing at the specified time within the current title.
+ // NOTE: the actual start time will be the closest sync point before
+ // or equal to the specified frame number.
+ // Annex J: Time_Search
+ // The time is in BCD format, passed in as a ULONG.
+ HRESULT PlayAtTime
+ ( [in] DVD_HMSF_TIMECODE* pTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayChapter
+ // Start playing at the specified chapter (or part-of-title) within
+ // the current title.
+ // Annex J: PTT_Search
+ // Chapters range from 1 to 999.
+ HRESULT PlayChapter
+ ( [in] ULONG ulChapter,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayPrevChapter
+ // Start playing at the beginning of the previous DVD "program".
+ // For One-Sequential_PGC_Titles (which includes most titles) a program
+ // is equivalent to a chapter, otherwise a program is part of a chapter.
+ // Annex J: PrevPG_Search
+ HRESULT PlayPrevChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // ReplayChapter
+ // Start playing from the beginning of they current program.
+ // Annex J: TopPG_Search
+ HRESULT ReplayChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayNextChapter
+ // Start playing from the beginning of the next program.
+ // Annex J: NextPG_Search
+ HRESULT PlayNextChapter(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // PlayForwards
+ // Set forward play at the specified speed.
+ // Annex J: Forward_Scan
+ // dSpeed == 1 is normal play
+ // dSpeed < 1 is slow play
+ // dSpeed > 1 is fast play
+ // For dSpeed != 1, audio and subpicture is muted.
+ HRESULT PlayForwards
+ ( [in] double dSpeed,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // PlayBackwards
+ // Set reverse play at the specified speed.
+ // Annex J: Backward_Scan
+ // dSpeed == 1 is normal play speed in reverse
+ // dSpeed < 1 is slow play in reverse
+ // dSpeed > 1 is fast play in reverse
+ // For reverse play, audio and subpicture are always muted.
+ HRESULT PlayBackwards
+ ( [in] double dSpeed,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // ShowMenu
+ // Start playback of the Menu specified by an enum DVD_MENU_ID.
+ // Annex J: Menu_Call
+ HRESULT ShowMenu
+ ( [in] DVD_MENU_ID MenuID,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // Resume
+ // Returns to title playback in DVD_DOMAIN_Title. This is typically
+ // done after MenuCall which puts the DVD Navigator in
+ // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
+ // Annex J: Resume
+ HRESULT Resume(
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd );
+
+ // SelectRelativeButton
+ // Moves the selection highlight above, below, to the left of, or to the right of the
+ // currently selected.
+ // "Selecting" a DVD button simply highlights the button but does
+ // not "Activate" the button. Selecting is the Windows equivalent
+ // to tabbing to a button but not pressing the space bar or enter key.
+ // Activating is the Windows equivalent of pressing the space bar or
+ // enter key after tabbing to a button.
+ // Annex J: Upper_button_Select, Lower_button_Select, Left_button_Select, Right_button_Select
+ HRESULT SelectRelativeButton( DVD_RELATIVE_BUTTON buttonDir );
+
+ // ActivateButton
+ // Activates current button.
+ // Annex J: Button_Activate
+ HRESULT ActivateButton();
+
+ // SelectButton
+ // Selects a specific button (with the index from 1 to 36).
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Button numbers range from 1 to 36.
+ HRESULT SelectButton
+ ( [in] ULONG ulButton
+ );
+
+ // SelectAndActivateButton
+ // Selects and then activates the button specified by the user.
+ // ulButton is intended to be a number entered by a user corresponding
+ // to button numbers currently displayed on screen.
+ // Annex J: Button_Select_And_Activate
+ // Button numbers range from 1 to 36.
+ HRESULT SelectAndActivateButton
+ ( [in] ULONG ulButton
+ );
+
+ // StillOff
+ // Releases any current still if there are no available buttons.
+ // This includes VOBU stills, Cell stills, and PGC stills, whether the
+ // still is infinite. When buttons are available, stills are released by
+ // activating a button. Note this does not release a Pause.
+ // Annex J: Still_Off
+ HRESULT StillOff();
+
+ // Pause
+ // Freezes / unfreezes playback and any internal timers. This is similar to
+ // IMediaControl::Pause(), but not the same in effect as IMediaControl::Pause
+ // puts the filter (all filters, if done to the graph) in paused state.
+ // Annex J: Pause_On and Pause_Off
+ // bState is TRUE or FALSE to indicate whether to do Puase_on/Pause_Off according
+ // to Annex J terminology.
+ HRESULT Pause
+ ( [in] BOOL bState
+ );
+
+ // SelectAudioStream
+ // Changes the current audio stream to ulAudio.
+ // Annex J: Audio_Stream_Change
+ // Audio stream number ranges between 0 and 7 or DEFAULT_AUDIO_STREAM (15 - default based on default language & language extension)
+ HRESULT SelectAudioStream
+ ( [in] ULONG ulAudio,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // SelectSubpictureStream
+ // Changes the current subpicture stream number to ulSubPicture
+ // Annex J: Sub-picture_Stream_Change (first param)
+ // Subpicture stream number should be between 0 and 31 or 63.
+ HRESULT SelectSubpictureStream
+ ( [in] ULONG ulSubPicture,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // SetSubpictureState
+ // Turns on/off current subpicture stream display.
+ // Annex J: Sub-picture_Stream_Change (second param)
+ // Subpicture state is On or Off (TRUE or FALSE)
+ HRESULT SetSubpictureState
+ ( [in] BOOL bState,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectAngle
+ // Changes the current angle number.
+ // Annex J: Angle_Change
+ // Angle number is between 1 and 9.
+ HRESULT SelectAngle
+ ( [in] ULONG ulAngle,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectParentalLevel
+ // Selects the current player parental level.
+ // Annex J: Parental_Level_Select
+ // Parental level ranges between 1 and 8.
+ // The defined parental levels are listed below :
+ //
+ // Level Rating
+ // ----- ------
+ // 1 G
+ // 3 PG
+ // 4 PG13
+ // 6 R
+ // 7 NC17
+ // Higher levels can play lower level content; lower levels cannot play
+ // higher level content. The DVD Navigator provides no restriction on
+ // setting the parental level. DVD player application may enforce
+ // restriction on parental level setting, such as password protection for
+ // raising the current parental level. Parental Management is disabled in
+ // the Navigator by default.
+ //
+ // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
+ // If parental management is disabled, then the player will play the
+ // first PGC in a parental block regardless of parental IDs.
+ //
+ HRESULT SelectParentalLevel
+ ( [in] ULONG ulParentalLevel
+ );
+
+ // SelectParentalCountry
+ // Sets the country in which to interpret the Parental Level.
+ // Annex J: Parental_Country_Select
+ // The country specified using the Alpha-2 code of the ISO-3166 standard,
+ HRESULT SelectParentalCountry
+ ( [in] BYTE bCountry[2]
+ );
+
+ // SelectKaraokeAudioPresentationMode
+ // Sets the Karaoke audio mode.
+ // Annex J: Karaoke_Audio_Presentation_Mode_Change
+ // NOTE: This and all other Karoke support is currently not implemented.
+ // Mode represents the audio mixing mode for Karaoke (same info as SPRM11).
+ // Use a bitwise OR of the bits in DVD_KARAOKE_DOWNMIX
+ HRESULT SelectKaraokeAudioPresentationMode
+ ( [in] ULONG ulMode
+ );
+
+ // SelectVideoModePreference
+ // The user can specify the (initial) preferred display mode (aspect ratio)
+ // (wide / letterbox / pan-scan) that should be used to display content
+ // (16 : 9).
+ // Annex J: Video_Presentation_Mode_Change
+ // The parameter is a ULONG that has one of the values defined in
+ // DVD_PREFERRED_DISPLAY_MODE
+ HRESULT SelectVideoModePreference
+ ( [in] ULONG ulPreferredDisplayMode
+ );
+
+ // SetDVDDirectory
+ // Sets the root directory containing the DVD-Video volume.
+ // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
+ // If the root directory is not successfully set before
+ // IMediaControl::Play is called, the first drive starting from c:
+ // containing a VIDEO_TS directory in the top level directory
+ // will be used as the root.
+ HRESULT SetDVDDirectory
+ ( [in] LPCWSTR pszwPath
+ );
+
+ // ActivateAtPosition
+ // This is typically called in response to a mouse click.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is first selected, then activated.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT ActivateAtPosition // typically called after a mouse click
+ ( [in] POINT point
+ );
+
+ // SelectAtPosition
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // The specified point within the display window is to see if it is
+ // within a current DVD button's highlight rect. If it is, that
+ // button is selected.
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT SelectAtPosition // typically called after a mouse move
+ ( [in] POINT point
+ );
+
+ // PlayChaptersAutoStop
+ // Start playing at the specified chapter within the specified title
+ // and play the number of chapters specified by the third parameter.
+ // Then the playback stops by sending an event EC_DVD_CHAPTER_AUTOSTOP.
+ // Title ranges from 1 to 99.
+ // Chapter (and number of chapters to play) ranges from 1 to 999.
+ HRESULT PlayChaptersAutoStop
+ ( [in] ULONG ulTitle, // title number
+ [in] ULONG ulChapter, // chapter number to start playback
+ [in] ULONG ulChaptersToPlay, // number of chapters to play from the start chapter
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // AcceptParentalLevelChange
+ //
+ // Application's way of informing the Navigator that the required parental
+ // level change indicated through a previous event was accepted or rejected
+ // by the app (and unblock the Navigator).
+ //
+ // FALSE - reject the disc's request to change the current parental level.
+ // TRUE - change the parental level as required by the disc.
+ HRESULT AcceptParentalLevelChange
+ ( [in] BOOL bAccept
+ );
+
+ // SetOption(flag, true/false )
+ // Flags:
+ //
+ // DVD_ResetOnStop
+ // Disable reset of the Navigator's internal state on the
+ // subsequent IMediaControl::Stop() call(s).
+ //
+ // FALSE - Navigator does not reset its state on the subsequent Stop calls
+ // (play from the current location on next Run call).
+ // TRUE - (default) Navigator resets its state on the subsequent Stop call
+ // (play from the first play PGC on the Run call after the Stop).
+ //
+ // DVD_NotifyParentalLevelChange
+ //
+ // Allows the application to indicate to the Navigator that it wants to control
+ // parent level change (e.g., through a dialog box) and indicate the acceptance
+ // or rejection of the new parental level to the Navigator through
+ // AcceptParentalLevelChange().
+ //
+ // FALSE - disable (default). Always reject request by the disc to change parental level.
+ // TRUE - enable. Navigator will send the app a 'EC_DVD_PARENTAL_LEVEL_CHANGE' event
+ // and block until AcceptParentalLevelChange() is called by the app.
+ //
+ // DVD_HMSF_TimeCodeEvents
+ //
+ // Lets the application specify to the Navigator if it wants to get the new time
+ // event EC_DVD_CURRENT_HMSF_TIME with the HMSF format rather than the older
+ // EC_DVD_CURRENT_TIME events.
+ //
+ // FALSE - disable (default). Older EC_DVD_CURRENT_TIME events are returned.
+ // TRUE - enable. Navigator will send the app EC_DVD_CURRENT_HMSF_TIME events.
+
+ HRESULT SetOption
+ ( [in] DVD_OPTION_FLAG flag,
+ [in] BOOL fState
+ );
+
+ // SetState
+ //
+ // The navigator will use the location information in the given state object to restore
+ // the navigator's position to a specific location on the disc.
+ // A valid state object is returned by either calling GetState(), or by using
+ // "CoCreateInstance( CLSID_DVDState, NULL, CLSCTX_INPROC_SERVER, IID_IDvdState, (void **) ppState )"
+ // to create a state object, followed by pState->IPersist::Load() to read it from memory or disk.
+ //
+ HRESULT SetState
+ ( [in] IDvdState* pState,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+
+ );
+
+ // PlayPeriodInTitleAutoStop
+ //
+ // Start playing from the specified time within the specified title number until the specified end time.
+ // NOTE: the actual start and end times will be the closest sync points before
+ // or equal to the specified frame number.
+ // Annex J: Time_Play for a limited range
+ // Title numbers range between 1 and 99.
+ HRESULT PlayPeriodInTitleAutoStop
+ ( [in] ULONG ulTitle,
+ [in] DVD_HMSF_TIMECODE* pStartTime,
+ [in] DVD_HMSF_TIMECODE* pEndTime,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SetGPRM
+ // Sets the current contents of a DVD General Parameter Register.
+ // Use of GPRMs is title specific.
+
+ HRESULT SetGPRM
+ ( [in] ULONG ulIndex,
+ [in] WORD wValue,
+ [in] DWORD dwFlags,
+ [out] IDvdCmd** ppCmd
+ );
+
+ // SelectDefaultMenuLanguage
+ // Selects the default language for menus.
+ // Languages are specified with Windows standard LCIDs. LCIDs can be created
+ // from ISO-639 codes with
+ // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT ).
+ // SelectMenuLanguage may only called from the DVD Stop state (DVD_DOMAIN_Stop).
+ // Annex J: Menu_Language_Select
+ //
+ // NOT TRUE ANYMORE:
+ // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
+ // instead of 'ja' for the ISO639 code for Japanese.
+ HRESULT SelectDefaultMenuLanguage
+ ( [in] LCID Language
+ );
+
+ // SelectDefaultAudioLanguage
+ // Selects the default audio language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT SelectDefaultAudioLanguage
+ ( [in] LCID Language,
+ [in] DVD_AUDIO_LANG_EXT audioExtension
+ );
+
+ // SelectDefaultSubpictureLanguage
+ // Selects the default subpicture language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT SelectDefaultSubpictureLanguage
+ ( [in] LCID Language,
+ [in] DVD_SUBPICTURE_LANG_EXT subpictureExtension
+ );
+}
+
+
+//==========================================================================
+//==========================================================================
+// IDvdInfo2 interface -- allows an app to query for attributes of available
+// DVD titles and DVD player status. Also allows for control of a DVD
+// player beyond Annex J in the DVD spec.
+//==========================================================================
+//==========================================================================
+
+enum DVD_TextStringType {
+ // disc structure (0x00..0x0f)
+ DVD_Struct_Volume = 0x01,
+ DVD_Struct_Title = 0x02,
+ DVD_Struct_ParentalID = 0x03,
+ DVD_Struct_PartOfTitle = 0x04,
+ DVD_Struct_Cell = 0x05,
+ // stream (0x10..0x1f)
+ DVD_Stream_Audio = 0x10,
+ DVD_Stream_Subpicture = 0x11,
+ DVD_Stream_Angle = 0x12,
+ // channel in stream (0x20..0x2f)
+ DVD_Channel_Audio = 0x20,
+
+ // Application information
+ // General (0x30..0x37)
+ DVD_General_Name = 0x30,
+ DVD_General_Comments = 0x31,
+
+ // Title (0x38..0x3f)
+ DVD_Title_Series = 0x38,
+ DVD_Title_Movie = 0x39,
+ DVD_Title_Video = 0x3a,
+ DVD_Title_Album = 0x3b,
+ DVD_Title_Song = 0x3c,
+ DVD_Title_Other = 0x3f,
+
+ // Title (sub) (0x40..0x47)
+ 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,
+
+ // Title (original) (0x48..0x4f)
+ 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,
+
+ // Other info (0x50..0x57)
+ DVD_Other_Scene = 0x50,
+ DVD_Other_Cut = 0x51,
+ DVD_Other_Take = 0x52,
+
+ // Language 0x58..0x5b
+ // Work 0x5c..0x6b
+ // Character 0x6c..0x8f
+ // Data 0x90..0x93
+ // Karaoke 0x94..0x9b
+ // Category 0x9c..0x9f
+ // Lyrics 0xa0..0xa3
+ // Document 0xa4..0xa7
+ // Others 0xa8..0xab
+ // Reserved 0xac..0xaf
+ // Admin 0xb0..0xb7
+ // more admin 0xb8..0xc0
+ // Reserved 0xd0..0xdf
+ // vendor 0xe0..0xef
+ // extension 0xf0..0xf7
+ // reserved 0xf8..0xff
+};
+
+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
+};
+
+cpp_quote ("#define DVD_TITLE_MENU 0x000")
+cpp_quote ("#define DVD_STREAM_DATA_CURRENT 0x800")
+cpp_quote ("#define DVD_STREAM_DATA_VMGM 0x400")
+cpp_quote ("#define DVD_STREAM_DATA_VTSM 0x401")
+cpp_quote ("#define DVD_DEFAULT_AUDIO_STREAM 0x0f")
+
+// DVD Decoder Caps data
+typedef struct tagDVD_DECODER_CAPS
+{
+ DWORD dwSize ; // size of this struct
+ DWORD dwAudioCaps ; // bits indicating audio support (AC3, DTS, SDDS, LPCM etc.) of decoder
+ double dFwdMaxRateVideo ; // max data rate for video going forward
+ double dFwdMaxRateAudio ; // ... .. .. ... audio ... ...
+ double dFwdMaxRateSP ; // ... .. .. ... SP ... ...
+ double dBwdMaxRateVideo ; // if smooth reverse is not available, this will be set to 0
+ double dBwdMaxRateAudio ; // -- ditto --
+ double dBwdMaxRateSP ; // -- ditto --
+ DWORD dwRes1 ; // reserved for future expansion
+ DWORD dwRes2 ; // -- ditto --
+ DWORD dwRes3 ; // -- ditto --
+ DWORD dwRes4 ; // -- ditto --
+} DVD_DECODER_CAPS ;
+
+// Bits for decoder's audio format support
+cpp_quote ("#define DVD_AUDIO_CAPS_AC3 0x00000001")
+cpp_quote ("#define DVD_AUDIO_CAPS_MPEG2 0x00000002")
+cpp_quote ("#define DVD_AUDIO_CAPS_LPCM 0x00000004")
+cpp_quote ("#define DVD_AUDIO_CAPS_DTS 0x00000008")
+cpp_quote ("#define DVD_AUDIO_CAPS_SDDS 0x00000010")
+
+
+[
+object,
+uuid(34151510-EEC0-11D2-8201-00A0C9D74842),
+pointer_default(unique)
+]
+
+interface IDvdInfo2 : IUnknown {
+ import "unknwn.idl";
+
+ // GetCurrentDomain
+ // Returns the current DVD Domain of the DVD player.
+ HRESULT GetCurrentDomain
+ ( [out] DVD_DOMAIN *pDomain
+ );
+
+ // GetCurrentLocation
+ // Returns information sufficient to restart playback of a video
+ // from the current playback location in titles that don't explicitly
+ // disable seeking to the current location.
+ HRESULT GetCurrentLocation
+ ( [out] DVD_PLAYBACK_LOCATION2 *pLocation
+ );
+
+ // GetTotalTitleTime
+ // Returns the total playback time for the current title. Only works
+ // for One_Sequential_PGC_Titles.
+ // THIS SHOULD CHANGE, RIGHT?
+ HRESULT GetTotalTitleTime
+ ( [out] DVD_HMSF_TIMECODE* pTotalTime,
+ [out] ULONG* ulTimeCodeFlags // union of DVD_TIMECODE_FLAGS
+ );
+
+ // GetCurrentButton
+ // Indicates the number of currently available buttons and the current
+ // selected button number. If buttons are not present it returns 0 for
+ // both pulButtonsAvailable and pulCurrentButton
+ HRESULT GetCurrentButton
+ ( [out] ULONG * pulButtonsAvailable,
+ [out] ULONG * pulCurrentButton
+ );
+
+ // GetCurrentAngle
+ // Indicates the number of currently available angles and the current
+ // selected angle number. If *pulAnglesAvailable is returned as 1 then
+ // the current content is not multiangle.
+ HRESULT GetCurrentAngle
+ ( [out] ULONG * pulAnglesAvailable,
+ [out] ULONG * pulCurrentAngle
+ );
+
+ // GetCurrentAudio
+ // Indicates the number of currently available audio streams and
+ // the currently selected audio stream number.
+ // This only works inside the Title domain.
+ HRESULT GetCurrentAudio
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream
+ );
+
+ // GetCurrentSubpicture
+ // Indicates the number of currently available subpicture streams,
+ // the currently selected subpicture stream number, and if the
+ // subpicture display is currently disabled. Subpicture streams
+ // authored as "Forcedly Activated" stream will be displayed even if
+ // subpicture display has been disabled by the app with
+ // IDVDControl::SetSubpictureState.
+ // This only works inside the Title domain.
+ HRESULT GetCurrentSubpicture
+ ( [out] ULONG * pulStreamsAvailable,
+ [out] ULONG * pulCurrentStream,
+ [out] BOOL * pbIsDisabled
+ );
+
+ // GetCurrentUOPS
+ // Indicates which IDVDControl methods (Annex J user operations) are
+ // currently valid. DVD titles can enable or disable individual user
+ // operations at almost any point during playback.
+ HRESULT GetCurrentUOPS
+ ( [out] ULONG * pulUOPs
+ );
+
+ // GetAllSPRMs
+ // Returns the current contents of all DVD System Parameter Registers.
+ // See DVD-Video spec for use of individual registers.
+ // WE SHOULD DOC THE SPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
+ HRESULT GetAllSPRMs
+ ( [out] SPRMARRAY * pRegisterArray
+ );
+
+ // GetAllGPRMs
+ // Returns the current contents of all DVD General Parameter Registers.
+ // Use of GPRMs is title specific.
+ // WE SHOULD DOC THE GPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
+ HRESULT GetAllGPRMs
+ ( [out] GPRMARRAY * pRegisterArray
+ );
+
+ // GetAudioLanguage
+ // Returns the language of the specified stream within the current title.
+ // Does not return languages for menus. Returns *pLanguage as 0 if the
+ // stream does not include language.
+ // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the returned LCID.
+ HRESULT GetAudioLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetSubpictureLanguage
+ // Returns the language of the specified stream within the current title.
+ // Does not return languages for menus. Returns *pLanguage=0 as 0 if the
+ // stream does not include language.
+ // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
+ // to create a human readable string name from the returned LCID.
+ HRESULT GetSubpictureLanguage
+ ( [in] ULONG ulStream,
+ [out] LCID * pLanguage
+ );
+
+ // GetTitleAttributes
+ // Returns attributes of all video, audio, and subpicture streams for the
+ // specified title including menus.
+ // If 0xffffffff is specified as ulTitle, attributes for the current title
+ // are returned.
+ HRESULT GetTitleAttributes
+ ( [in] ULONG ulTitle, // requested title number
+ [out] DVD_MenuAttributes * pMenu,
+ [out] DVD_TitleAttributes * pTitle
+ );
+
+ // GetVMGAttributes
+ // Returns attributes of all video, audio, and subpicture
+ // streams for Video Manager Menus. This method suppliments GetTitleAttributes()
+ // for some menus, such as the Title menu, which are in a separate group of
+ // streams called the VMG (Video Manager) and are not associated with any
+ // particular title number.
+ HRESULT GetVMGAttributes
+ ( [out] DVD_MenuAttributes* pATR
+ );
+
+ // GetCurrentVideoAttributes
+ // Returns the video attributes for the current title or menu.
+ //
+ HRESULT GetCurrentVideoAttributes
+ ( [out] DVD_VideoAttributes * pATR
+ );
+
+ // GetAudioAttributes
+ // Returns the audio attributes for the specified stream in the current title
+ // or menu.
+ HRESULT GetAudioAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_AudioAttributes *pATR
+ );
+
+ // GetKaraokeChannelContents
+ // Returns the karaoke contents of each channel of the specified stream in the current title
+ // or menu.
+ HRESULT GetKaraokeAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_KaraokeAttributes* pAttributes
+ );
+
+ // GetSubpictureAttributes
+ // Returns the subpicture attributes for the specified stream in the current
+ // title or menu.
+ HRESULT GetSubpictureAttributes
+ ( [in] ULONG ulStream,
+ [out] DVD_SubpictureAttributes *pATR
+ );
+
+ // GetDVDVolumeInfo
+ // Returns current DVD volume information.
+ HRESULT GetDVDVolumeInfo
+ ( [out] ULONG *pulNumOfVolumes, // number of volumes (disc sides?) in a volume set
+ [out] ULONG *pulVolume, // volume number for current DVD directory
+ [out] DVD_DISC_SIDE *pSide, // current disc side
+ [out] ULONG *pulNumOfTitles // number of titles available in this volume
+ );
+
+ // GetDVDTextNumberOfLanguages
+ // Returns the number of text languages for the current DVD directory.
+ // Should return some error code if no root directory is found.
+ HRESULT GetDVDTextNumberOfLanguages
+ ( [out] ULONG * pulNumOfLangs
+ );
+
+ // GetDVDTextLanguageInfo
+ // Returns the text languages information (number of strings, language code,
+ // char set) for the specified language index.
+ // Should return some error code if an invalid text index is specified.
+ HRESULT GetDVDTextLanguageInfo
+ ( [in] ULONG ulLangIndex,
+ [out] ULONG* pulNumOfStrings,
+ [out] LCID* pLangCode,
+ [out] enum DVD_TextCharSet * pbCharacterSet
+ );
+
+ // GetDVDTextStringAsNative
+ // Returns the text string as an array of bytes for the specified language
+ // index.and string index.
+ // Should return some error code if an invalid text or string index is specified.
+ // It also just returns the length of the string if pchBuffer is specified as NULL.
+ HRESULT GetDVDTextStringAsNative
+ ( [in] ULONG ulLangIndex,
+ [in] ULONG ulStringIndex,
+ [out] BYTE* pbBuffer,
+ [in] ULONG ulMaxBufferSize,
+ [out] ULONG* pulActualSize,
+ [out] enum DVD_TextStringType* pType
+ );
+
+ // GetDVDTextStringAsUnicode
+ // Returns the text string in Unicode for the specified language index.and string index.
+ // Should return some error code if an invalid text or string index is specified.
+ // It also just returns the length of the string if pchBuffer is specified as NULL.
+ HRESULT GetDVDTextStringAsUnicode
+ ( [in] ULONG ulLangIndex,
+ [in] ULONG ulStringIndex,
+ [out] WCHAR* pchwBuffer,
+ [in] ULONG ulMaxBufferSize,
+ [out] ULONG* pulActualSize,
+ [out] enum DVD_TextStringType* pType
+ );
+
+ // GetPlayerParentalLevel
+ // Returns the current parental level and the current country code that has
+ // been set in the system registers in player.
+ // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
+ // Valid Parental Levels range from 1 to 8 if parental management is enabled.
+ // Returns 0xffffffff if parental management is disabled
+ // See ISO3166 : Alpha-2 Code for the country codes.
+ HRESULT GetPlayerParentalLevel
+ ( [out] ULONG *pulParentalLevel, // current parental level
+ [out] BYTE pbCountryCode[2] // current country code
+ );
+
+ // GetNumberOfChapters
+ // Returns the number of chapters that are defined for a
+ // given title.
+ HRESULT GetNumberOfChapters
+ ( [in] ULONG ulTitle, // Title for which number of chapters is requested
+ [out] ULONG *pulNumOfChapters // Number of chapters for the specified title
+ );
+
+ // GetTitleParentalLevels
+ // Returns the parental levels that are defined for a particular title.
+ // pulParentalLevels will be combination of DVD_PARENTAL_LEVEL_8,
+ // DVD_PARENTAL_LEVEL_6, or DVD_PARENTAL_LEVEL_1 OR-ed together
+ HRESULT GetTitleParentalLevels
+ ( [in] ULONG ulTitle, // Title for which parental levels are requested
+ [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
+ );
+
+ // GetDVDDirectory
+ // Returns the root directory that is set in the player. If a valid root
+ // has been found, it returns the root string. Otherwise, it returns 0 for
+ // pcbActualSize indicating that a valid root directory has not been found
+ // or initialized.
+ //
+ // !!! used to return LPTSTR. interface was changed to return
+ // LPSTR (ansi) for compatibility. COM APIs should pass with
+ // UNICODE strings only.
+ //
+ HRESULT GetDVDDirectory
+ ( [out, size_is(ulMaxSize)] LPWSTR pszwPath, // pointer to buffer to get root string
+ [in] ULONG ulMaxSize, // size of buffer in WCHARs passed in
+ [out] ULONG *pulActualSize // size of actual data returned (in WCHARs)
+ );
+
+
+ // IsAudioStreamEnabled
+ //
+ // Determines if the specified audio stream is enabled/disabled in the current PGC.
+ //
+ // ulStreamNum - audio stream number to test
+ // pbEnabled - where to place the result
+ HRESULT IsAudioStreamEnabled
+ ( [in] ULONG ulStreamNum, // stream number to test
+ [out] BOOL *pbEnabled // returned state
+ );
+
+ // GetDiscID
+ //
+ // If pszwPath is specified as NULL, DVD Navigator will use the current path
+ // that would be returned by GetDVDDirectory() at this point.
+ //
+ // Returns a 64-bit identification number for the specified DVD disc.
+ HRESULT GetDiscID
+ ( [in] LPCWSTR pszwPath, // root path (should we rather use const WCHAR*?)
+ [out] ULONGLONG* pullDiscID // 64-bit unique id for the disc
+ ) ;
+
+ // GetState
+ //
+ // The navigator will create a new state object and save the current location into it.
+ // The state object can be used to restore the navigator the saved location at a later time.
+ // A new IDvdState object is created (with a single AddRef) and returned in *pStateData.
+ // The object must be Released() when the application is finished with it.
+ //
+ HRESULT GetState
+ ( [out] IDvdState **pStateData // returned object
+ );
+
+ //
+ // GetMenuLanguages
+ //
+ // Navigator gets all of the menu languages for the VMGM and VTSM domains.
+ //
+ HRESULT GetMenuLanguages
+ ( [out] LCID *pLanguages, // data buffer (NULL returns #languages)
+ [in] ULONG ulMaxLanguages, // maxiumum number of languages to retrieve
+ [out] ULONG *pulActualLanguages // actual number of languages retrieved
+ );
+
+ //
+ // GetButtonAtPosition
+ //
+ // This is typically called in response to a mouse move within the
+ // display window.
+ // It returns the button located at the specified point within the display window.
+ // If no button is present at that position, then VFW_E_DVD_NO_BUTTON is returned.
+ // Button indices start at 1.
+ //
+ // NOTE: DVD Buttons do not all necessarily have highlight rects,
+ // button rects can overlap, and button rects do not always
+ // correspond to the visual representation of DVD buttons.
+ HRESULT GetButtonAtPosition // typically called after a mouse move
+ ( [in] POINT point,
+ [out] ULONG *pulButtonIndex
+ );
+
+ //
+ // GetCmdFromEvent
+ //
+ // This method maps an EC_DVD_CMD_BEGIN/COMPLETE/CANCEL event's lParam1 into an AddRef'd
+ // IDvdCmd pointer. You must Release the returned pointer. NULL is returned if the function
+ // fails.
+ //
+ HRESULT GetCmdFromEvent
+ ( [in] LONG_PTR lParam1,
+ [out] IDvdCmd **pCmdObj
+ );
+
+ // GetDefaultMenuLanguage
+ // Returns the default language for menus.
+ HRESULT GetDefaultMenuLanguage
+ ( [out] LCID * pLanguage
+ );
+
+ // GetDefaultAudioLanguage
+ // Gets the default audio language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT GetDefaultAudioLanguage
+ ( [out] LCID* pLanguage,
+ [out] DVD_AUDIO_LANG_EXT* pAudioExtension
+ );
+
+ // GetDefaultSubpictureLanguage
+ // Gets the default subpicture language.
+ // Languages are specified with Windows standard LCIDs.
+ HRESULT GetDefaultSubpictureLanguage
+ ( [out] LCID* pLanguage,
+ [out] DVD_SUBPICTURE_LANG_EXT* pSubpictureExtension
+ );
+
+ //
+ // GetDecoderCaps:
+ // Retrieves the DVD decoder's details about max data rate for video, audio
+ // and subpicture (going backward and forward) as well as support for various
+ // types of audio (AC3, MPEG2, DTS, SDDS, LPCM).
+ //
+ HRESULT GetDecoderCaps
+ ( [out] DVD_DECODER_CAPS *pCaps
+ ) ;
+
+ //
+ // GetButtonRect:
+ // Retrieves the coordinates for a given button number
+ //
+ HRESULT GetButtonRect
+ ( [in] ULONG ulButton,
+ [out] RECT *pRect
+ ) ;
+
+ // IsSubpictureStreamEnabled
+ //
+ // Determines if the specified subpicture stream is enabled/disabled in the current PGC.
+ //
+ // ulStreamNum - Subpicture stream number to test
+ // pbEnabled - where to place the result
+ HRESULT IsSubpictureStreamEnabled
+ ( [in] ULONG ulStreamNum, // stream number to test
+ [out] BOOL *pbEnabled // returned state
+ );
+}
+
+
+
+//==========================================================================
+//==========================================================================
+//
+// typedefs used by IDvdGraphBuilder interface.
+//
+//==========================================================================
+//==========================================================================
+
+typedef enum _AM_DVD_GRAPH_FLAGS {
+ AM_DVD_HWDEC_PREFER = 0x01, // default
+ AM_DVD_HWDEC_ONLY = 0x02,
+ AM_DVD_SWDEC_PREFER = 0x04,
+ AM_DVD_SWDEC_ONLY = 0x08,
+ AM_DVD_NOVPE = 0x100,
+ AM_DVD_VMR9_ONLY = 0x800 // only use VMR9 (otherwise fail) for rendering
+} AM_DVD_GRAPH_FLAGS ;
+
+typedef enum _AM_DVD_STREAM_FLAGS {
+ AM_DVD_STREAM_VIDEO = 0x01,
+ AM_DVD_STREAM_AUDIO = 0x02,
+ AM_DVD_STREAM_SUBPIC = 0x04
+} AM_DVD_STREAM_FLAGS ;
+
+typedef struct {
+ HRESULT hrVPEStatus ; // VPE mixing error code (0 => success)
+ BOOL bDvdVolInvalid ; // Is specified DVD volume invalid?
+ BOOL bDvdVolUnknown ; // Is DVD volume to be played not specified/not found?
+ BOOL bNoLine21In ; // video decoder doesn't produce line21 (CC) data
+ BOOL bNoLine21Out ; // can't show decoded line21 data as CC on video
+ int iNumStreams ; // number of DVD streams to render
+ int iNumStreamsFailed ; // number of streams failed to render
+ DWORD dwFailedStreamsFlag ; // combination of flags to indicate failed streams
+} AM_DVD_RENDERSTATUS ;
+
+
+//
+// IDvdGraphBuilder interface to build a filter graph for DVD-Video playback.
+//
+
+[
+ object,
+ local,
+ uuid(FCC152B6-F372-11d0-8E00-00C04FD7C08B),
+ pointer_default(unique)
+]
+interface IDvdGraphBuilder : IUnknown {
+
+ // Returns the IGraphBuilder interface for the filtergraph used by the
+ // CDvdGraphBuilder object.
+ // Remember to *ppGB->Release() when you're done with it
+ HRESULT GetFiltergraph
+ ( [out] IGraphBuilder **ppGB
+ ) ;
+
+ // Gets specific interface pointers in the DVD-Video playback graph to
+ // make DVD-Video playback development easier.
+ // It helps get the following interfaces to control playback/show CC/
+ // position window/control volume etc:
+ // - IDvdControl, IDvdInfo
+ // - IAMLine21Decoder
+ // - IVideoWindow, IBasicVideo
+ // - IBasicAudio
+ // This method will return
+ // a) E_INVALIDARG if ppvIF is invalid
+ // b) E_NOINTERFACE if riid is an IID we don't know about
+ // c) VFW_E_DVD_GRAPHNOTREADY if the graph has not been built through
+ // RenderDvdVideoVolume() yet.
+ // Remember to *ppvIF->Release() when you're done with it
+ HRESULT GetDvdInterface
+ ( [in] REFIID riid, // IID of the interface required
+ [out] void **ppvIF // returns pointer to the required interface
+ ) ;
+
+ // Builds a filter graph according to user specs for playing back a
+ // DVD-Video volume.
+ // This method returns S_FALSE if
+ // 1. the graph has been either built, but either
+ // a) VPE mixing doesn't work (app didn't use AM_DVD_NOVPE flag)
+ // b) video decoder doesn't produce line21 data
+ // c) line21 data couldn't be rendered (decoding/mixing problem)
+ // d) the call specified an invalid volume path or DVD Nav couldn't
+ // locate any DVD-Video volume to be played.
+ // 2. some streams didn't render (completely), but the others have
+ // been rendered so that the volume can be partially played back.
+ // The status is indicated through the fields of the pStatus (out)
+ // parameter.
+ // About 1(a), the app will have enough info to tell the user that the
+ // video won't be visible unless a TV is connected to the NTSC out
+ // port of the DVD decoder (presumably HW in this case).
+ // For case 1(b) & (c), the app "can" put up a warning/informative message
+ // that closed captioning is not available because of the decoder.
+ // 1(d) helps an app to ask the user to insert a DVD-Video disc if none
+ // is specified/available in the drive when playback is started.
+ // This method builds the graph even if
+ // - an invalid DVD-Video volume is specified
+ // - the caller uses lpwszPathName = NULL to make the DVD Nav to locate
+ // the default volume to be played back, but DVD Nav doesn't find a
+ // default DVD-Video volume to be played back.
+ // An app can later specify the volume using IDvdControl::SetRoot()
+ // method.
+ // #2 will help the app indicate to the user that some of the streams
+ // can't be played.
+ //
+ // The graph is built using filters based on the dwFlags value (to use
+ // HW decoders or SW decoders or a mix of them).
+ // The dwFlags value is one of the values in AM_DVD_GRAPH_FLAGS enum
+ // type. The default value is AM_DVD_HWDEC_PREFER. None of the
+ // AM_DVD_HWDEC_xxx or AM_DVD_SWDEC_xxx flags can be mixed. However
+ // AM_DVD_NOVPE can be OR-ed with any of the AM_DVD_HWDEC_xxx flags.
+ //
+ // The method returns S_OK if the playback graph is built successfully
+ // with all the streams completely rendered and a valid DVD-Video volume
+ // is specified or a default one has been located.
+ //
+ // If the dwFlags specify conflicting options, E_INVALIDARG is returned.
+ // If the graph building fails, the method returns one of the following
+ // error codes:
+ // VFW_E_DVD_RENDERFAIL, VFW_E_DVD_DECNOTENOUGH
+ //
+ HRESULT RenderDvdVideoVolume
+ ( [in] LPCWSTR lpcwszPathName, // Can be NULL too
+ [in] DWORD dwFlags, // 0 is the default (use max HW)
+ [out] AM_DVD_RENDERSTATUS *pStatus // returns indications of ANY failure
+ ) ;
+}
+
+
+//
+// DDraw Exclusive Mode Video standard COM interface for Overlay Mixer
+//
+[
+ object,
+ local,
+ uuid(153ACC21-D83B-11d1-82BF-00A0C9696C8F),
+ pointer_default(unique)
+]
+interface IDDrawExclModeVideo : IUnknown {
+ // set a ddraw object to be used by the overlay mixer. If even one of the pins
+ // of the ovmixer is connected, then it won't start using the new ddraw obect
+ // immediately but just cache it. It will start using it the next time, all its
+ // pins are disconnected.
+ HRESULT SetDDrawObject([in] IDirectDraw *pDDrawObject);
+
+ // gets the ddraw object currently being used by the overlay mixer. If the app has not
+ // set any ddraw object and the ovmixer has not yet allocated one, then *ppDDrawObject
+ // will be set to NULL and *pbUsingExternal will be set TO FALSE. Otherwise *pbUsingExternal
+ // will be set to TRUE if the ovmixer is currently USING an app given ddraw object and FALSE
+ // othewise
+ HRESULT GetDDrawObject([out] IDirectDraw **ppDDrawObject,
+ [out] BOOL *pbUsingExternal);
+
+ // set a primary surface to be used by the overlay mixer. If even one of the pins
+ // of the ovmixer is connected, then it won't start using the new primary surface
+ // immediately but just cache it. It will start using it the next time, all its
+ // pins are disconnected.
+ // Also when the ovmixer does start using an app given primary surface, it will delete
+ // its output pin (and not draw its own colorkey) since the app is expected to do the
+ // window management and drawing colorkey etc on the primary surface
+ // This function makes sure that the surface provided exposes IDirectDrawSurface3, and
+ // is consistent with the ddraw object provided.
+ HRESULT SetDDrawSurface([in] IDirectDrawSurface *pDDrawSurface);
+
+ // gets the ddraw surface currently being used by the overlay mixer. If the app has not
+ // set any ddraw surface and the ovmixer has not yet allocated one, then *ppDDrawSurface
+ // will be set to NULL and *pbUsingExternal will be set to FALSE. Otherwise *pbUsingExternal
+ // will be set to TRUE if the ovmixer is curretnly USING an app given ddraw surface and FALSE
+ // otherwise
+ HRESULT GetDDrawSurface([out] IDirectDrawSurface **ppDDrawSurface,
+ [out] BOOL *pbUsingExternal);
+
+ // set draw paramters on the ovmixer (src and dest rect). Note that if the mode
+ // of the ovmixer is set to LETTER_BOX, then the ovmixer might show the video in
+ // only a subrect of *prcTarget (see IMixerPinConfig for details).
+ HRESULT SetDrawParameters([in] const RECT * prcSource,
+ [in] const RECT * prcTarget);
+
+ // gets the current video size and picture aspect ratio of the primary stream of the overlay mixer
+ // The app should look for the evene EC_VIDEO_SIZE_AR_CHANGED and on its receipt
+ // call this function again
+ HRESULT GetNativeVideoProps([out] DWORD *pdwVideoWidth,
+ [out] DWORD *pdwVideoHeight,
+ [out] DWORD *pdwPictAspectRatioX,
+ [out] DWORD *pdwPictAspectRatioY);
+
+ // Set the callback interface - the callback interface will be defined in a later release
+ // Currently returns E_NOTIMPL
+ HRESULT SetCallbackInterface([in] IDDrawExclModeVideoCallback *pCallback,
+ [in] DWORD dwFlags);
+}
+
+
+//
+// DDraw Exclusive Mode Video callbacks
+//
+
+// enum for flags
+enum _AM_OVERLAY_NOTIFY_FLAGS {
+ AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001,
+ AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002,
+ AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004
+};
+[
+ object,
+ local,
+ uuid(913c24a0-20ab-11d2-9038-00a0c9697298),
+ pointer_default(unique)
+]
+interface IDDrawExclModeVideoCallback : IUnknown {
+
+ // Called once before UpdateOverlay is called with bBefore == TRUE
+ // and once after it is called with bBefore == FALSE and otherwise
+ // identical parameters
+ HRESULT OnUpdateOverlay(
+ [in] BOOL bBefore, // After UpdateOverlayCalled?
+ [in] DWORD dwFlags,// _AM_OVERLAY_NOTIFY enum
+ [in] BOOL bOldVisible,
+ [in] const RECT *prcOldSrc,
+ [in] const RECT *prcOldDest,
+ [in] BOOL bNewVisible,
+ [in] const RECT *prcNewSrc,
+ [in] const RECT *prcNewDest);
+
+ // Called when the surface color key is changed
+ HRESULT OnUpdateColorKey(
+ [in] const COLORKEY *pKey,
+ [in] DWORD dwColor);
+
+ // Called when the video size or aspect ratio changes
+ HRESULT OnUpdateSize( [in] DWORD dwWidth, // Movie pixel width
+ [in] DWORD dwHeight, // Movie pixel height
+ [in] DWORD dwARWidth, // Aspect ratio horizontal
+ [in] DWORD dwARHeight); // Aspect ratio vertical
+}