//------------------------------------------------------------------------------ // 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 ") 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 }