diff options
Diffstat (limited to 'dxsdk/Include/DShowIDL/dvdif.idl')
-rw-r--r-- | dxsdk/Include/DShowIDL/dvdif.idl | 2326 |
1 files changed, 2326 insertions, 0 deletions
diff --git a/dxsdk/Include/DShowIDL/dvdif.idl b/dxsdk/Include/DShowIDL/dvdif.idl new file mode 100644 index 00000000..4ad2bca1 --- /dev/null +++ b/dxsdk/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 +} |