Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2324 lines
88 KiB

//------------------------------------------------------------------------------
// File: DVDIf.idl
//
// Desc: DirectShow interfaces to control playback of a DVD filter graph.
//
// Copyright (c) 1992-2000, Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
// forward declarations - these are the interfaces declared in this file
import "unknwn.idl";
import "objidl.idl";
cpp_quote("#include <ddraw.h>")
interface IDvdControl;
interface IDvdInfo;
interface IDirectDraw;
interface IDirectDrawSurface;
interface IDvdGraphBuilder ;
interface IDDrawExclModeVideo;
interface IDDrawExclModeVideoCallback;
interface IDvdCmd;
interface IDvdState;
//==========================================================================
//==========================================================================
//
// typedefs used by IDvdControl and IDvdInfo interfaces.
//
//==========================================================================
//==========================================================================
typedef enum tagDVD_DOMAIN {
// The DVD_DOMAIN is used to indicate the stat of a DVD player.
DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc
DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc
DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set
DVD_DOMAIN_Title, // displaying current title
DVD_DOMAIN_Stop // player is in stopped state
} DVD_DOMAIN;
typedef enum tagDVD_MENU_ID {
DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume
DVD_MENU_Root = 3, // main menu for a specific VTS
DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS
DVD_MENU_Audio = 5, // to choose audio stream in a VTS
DVD_MENU_Angle = 6, // to choose angle num in a VTS
DVD_MENU_Chapter = 7 // to choose a chapter in a VTS
// the Root menu always provides a means of getting to to Subpicture, Audio,
// Angle and Chapter menus if they exist.
} DVD_MENU_ID;
typedef enum tagDVD_DISC_SIDE {
DVD_SIDE_A = 1,
DVD_SIDE_B = 2
} DVD_DISC_SIDE;
typedef enum tagDVD_PREFERRED_DISPLAY_MODE
{
// DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's
// preferred window aspect ratio and preferred method of converion of
// 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are
// the two conversion methods. This enum is used to indicate only a preference of
// conversion mechinism since some content can only be converted using one
// of these methods. 4*3 content is converted to a 16*9 window always by using
// "reverse" letterboxing where black bars are added to the right and left
// sides of the display instead of the top and bottom of the display as in the 16*9
// to 4*3 conversion useing letterboxing.
DISPLAY_CONTENT_DEFAULT = 0, // default to content
DISPLAY_16x9 = 1, // 16x9 display
DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence
DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence
} DVD_PREFERRED_DISPLAY_MODE;
typedef WORD DVD_REGISTER;
typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers
typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers
// these are only for IDVDInfo1 compatibility and require the DVD-Video 1.0 specification
// Please use the IDVDInfo2's DVD_Title/MenuAttributes, DVD_VideoAttributes, DVD_AudioAttributes, and DVD_SubpictureAttributes
typedef struct tagDVD_ATR
{
//
// Refer to the DVD-Video 1.0 spec to parse these structures.
//
ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT
// if this is for a Video Title Set (VTS)
BYTE pbATRI[768];// All stream attributes for menu and title from bytes
// 256 to 1023 of VMGI or VTSI.
} DVD_ATR;
typedef BYTE DVD_VideoATR[2]; // video stream attributes.
typedef BYTE DVD_AudioATR[8]; // audio stream attributes.
typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes.
// DVD1.0 Timecode is BCD encoded in this format: 0xHhMmSsFf, where
// H is tens of hours
// h is hours
// M is tens of minutes
// m is minutes
// S is tens of seconds
// s is seconds
// F is tens of frames
// f is frames
// Note that you must know the frame rate to interperate the frame count as time.
typedef enum tagDVD_FRAMERATE
{
DVD_FPS_25 =1, // 25 frames per second
DVD_FPS_30NonDrop = 3 // exactly 30 frames per second
} DVD_FRAMERATE;
cpp_quote("typedef struct tagDVD_TIMECODE")
cpp_quote("{")
cpp_quote(" ULONG Hours1 :4; // Hours")
cpp_quote(" ULONG Hours10 :4; // Tens of Hours ")
cpp_quote("")
cpp_quote(" ULONG Minutes1 :4; // Minutes ")
cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ")
cpp_quote("")
cpp_quote(" ULONG Seconds1 :4; // Seconds ")
cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ")
cpp_quote("")
cpp_quote(" ULONG Frames1 :4; // Frames ")
cpp_quote(" ULONG Frames10 :2; // Tens of Frames ")
cpp_quote("")
cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop")
cpp_quote("} DVD_TIMECODE;")
//
// Newer IDVD2 methods can use the HMSF format instead
// Call SetOption( DVD_HMSF_TimeCodeEvents, TRUE) to return EC_DVD_CURRENT_HMSF_TIME
// instead of EC_DVD_CURRENT_TIME events
//
typedef enum tagDVD_TIMECODE_FLAGS
{
DVD_TC_FLAG_25fps = 0x00000001, // 25 frames per second
DVD_TC_FLAG_30fps = 0x00000002, // 30 frames per second
DVD_TC_FLAG_DropFrame = 0x00000004, // 29.97 instead of 30 fps
DVD_TC_FLAG_Interpolated = 0x00000008, // timecode may be inaccurate
// remainder of bits are reserved and should not be read
} DVD_TIMECODE_FLAGS;
// this can be cast to/from a ULONG
typedef struct tagDVD_HMSF_TIMECODE
{
BYTE bHours;
BYTE bMinutes;
BYTE bSeconds;
BYTE bFrames;
} DVD_HMSF_TIMECODE;
typedef struct tagDVD_PLAYBACK_LOCATION2
{
//
// TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
// playback location for One_Sequential_PGC_Titles.
//
ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
DVD_HMSF_TIMECODE TimeCode; // use DVD_TIMECODE for current playback time.
ULONG TimeCodeFlags; // union of DVD_TIMECODE_EVENT_FLAGS
} DVD_PLAYBACK_LOCATION2;
typedef struct tagDVD_PLAYBACK_LOCATION
{
//
// TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
// playback location for One_Sequential_PGC_Titles.
//
ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title
} DVD_PLAYBACK_LOCATION;
typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
typedef enum {
//
// Annex J User Functions ---
//
UOP_FLAG_Play_Title_Or_AtTime = 0x00000001, // Title_Or_Time_Play
UOP_FLAG_Play_Chapter = 0x00000002, // Chapter_Search_Or_Play
UOP_FLAG_Play_Title = 0x00000004, // Title_Play
UOP_FLAG_Stop = 0x00000008, // Stop
UOP_FLAG_ReturnFromSubMenu = 0x00000010, // GoUp
UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020, // Time_Or_Chapter_Search
UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040, // Prev_Or_Top_PG_Search
UOP_FLAG_PlayNext_Chapter = 0x00000080, // Next_PG_Search
UOP_FLAG_Play_Forwards = 0x00000100, // Forward_Scan
UOP_FLAG_Play_Backwards = 0x00000200, // Backward_Scan
UOP_FLAG_ShowMenu_Title = 0x00000400, // Title_Menu_Call
UOP_FLAG_ShowMenu_Root = 0x00000800, // Root_Menu_Call
UOP_FLAG_ShowMenu_SubPic = 0x00001000, // SubPic_Menu_Call
UOP_FLAG_ShowMenu_Audio = 0x00002000, // Audio_Menu_Call
UOP_FLAG_ShowMenu_Angle = 0x00004000, // Angle_Menu_Call
UOP_FLAG_ShowMenu_Chapter = 0x00008000, // Chapter_Menu_Call
UOP_FLAG_Resume = 0x00010000, // Resume
UOP_FLAG_Select_Or_Activate_Button = 0x00020000, // Button_Select_Or_Activate
UOP_FLAG_Still_Off = 0x00040000, // Still_Off
UOP_FLAG_Pause_On = 0x00080000, // Pause_On
UOP_FLAG_Select_Audio_Stream = 0x00100000, // Audio_Stream_Change
UOP_FLAG_Select_SubPic_Stream = 0x00200000, // SubPic_Stream_Change
UOP_FLAG_Select_Angle = 0x00400000, // Angle_Change
UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000, // Karaoke_Audio_Pres_Mode_Change
UOP_FLAG_Select_Video_Mode_Preference = 0x01000000 // Video_Pres_Mode_Change
} VALID_UOP_FLAG ;
typedef enum {
DVD_CMD_FLAG_None = 0x00000000,
DVD_CMD_FLAG_Flush = 0x00000001,
DVD_CMD_FLAG_SendEvents = 0x00000002,
DVD_CMD_FLAG_Block = 0x00000004, // block end
DVD_CMD_FLAG_StartWhenRendered = 0x00000008, // command "start" when the first frame is rendered
DVD_CMD_FLAG_EndAfterRendered = 0x00000010, // command "ends" after the last frame is rendered
} DVD_CMD_FLAGS;
// For IDVDControl2::SetOption flags
typedef enum {
DVD_ResetOnStop = 1, // default TRUE
DVD_NotifyParentalLevelChange = 2, // default FALSE
DVD_HMSF_TimeCodeEvents = 3, // default FALSE (send DVD_CURRENT_TIME events)
} DVD_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_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
}