//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; // // DirectShow interfaces to control playback of a DVD filter graph. // // forward declarations - these are the interfaces declared in this file import "unknwn.idl"; import "objidl.idl"; interface IDvdControl; interface IDvdInfo; interface IDvdGraphBuilder ; //========================================================================== //========================================================================== // // 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 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. See DVD-Video spec. typedef BYTE DVD_AudioATR[8]; // audio stream attributes. See DVD-Video spec. typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes. See DVD-Video spec. // DVD 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;") typedef struct tagDVD_PLAYBACK_LOCATION { // // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save // playback location for Once_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; // Parental Level Information cpp_quote ("#define DVD_PARENTAL_LEVEL_8 0x8000") cpp_quote ("#define DVD_PARENTAL_LEVEL_7 0x4000") cpp_quote ("#define DVD_PARENTAL_LEVEL_6 0x2000") cpp_quote ("#define DVD_PARENTAL_LEVEL_5 0x1000") cpp_quote ("#define DVD_PARENTAL_LEVEL_4 0x0800") cpp_quote ("#define DVD_PARENTAL_LEVEL_3 0x0400") cpp_quote ("#define DVD_PARENTAL_LEVEL_2 0x0200") cpp_quote ("#define DVD_PARENTAL_LEVEL_1 0x0100") //========================================================================== //========================================================================== // 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 uiTitle ); // 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 uiTitle, [in] ULONG uiChapter ); // 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 uiTitle, [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 Chapter ); // 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. // uiButton 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 uiButton ); // 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 nAudio ); // SubpictureStreamChange // Changes the current subpicture stream number to nSubpic, and toggles // its display. HRESULT SubpictureStreamChange ( [in] ULONG nSubPicture, [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 * pTotalTime // 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 pnButtonsAvailable and pnCurrentButton HRESULT GetCurrentButton ( [out] ULONG * pnButtonsAvailable, [out] ULONG * pnCurrentButton ); // 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 * pnAnglesAvailable, [out] ULONG * pnCurrentAngle ); // 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 * pnStreamsAvailable, [out] ULONG * pnCurrentStream ); // 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 * pnStreamsAvailable, [out] ULONG * pnCurrentStream, [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 ); // GetAudioLanguageString // 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 nStream, [out] LCID * pLanguage ); // GetSubpictureLanguageString // 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 nStream, [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 nTitle, // 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 *pNumOfVol, // number of volumes (disc sides?) in a volume set [out] ULONG *pThisVolNum, // volume number for this root directory [out] DVD_DISC_SIDE *pSide, // current disc side [out] ULONG *pNumOfTitles // 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(cbBufSize)] BYTE *pTextManager, [in] ULONG cbBufSize, // buffer size passed in [out] ULONG *pcbActualSize // 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 *pParentalLevel, // current parental level [out] ULONG *pCountryCode // 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 *pNumberOfChapters // 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 *pParentalLevels // 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. HRESULT GetRoot ( [out, size_is(cbBufSize)] LPTSTR pRoot, // pointer to buffer to get root string [in] ULONG cbBufSize, // size of buffer passed in [out] ULONG *pcbActualSize // size of actual data returned ); } //========================================================================== //========================================================================== // // 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_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 ) ; }