/[cvs]/api/include/DShowIDL/dvdif.idl
ViewVC logotype

Annotation of /api/include/DShowIDL/dvdif.idl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Sun Jul 1 20:47:59 2001 UTC (23 years ago) by bearsoft
Branch point for: lazy, MAIN
Initial revision

1 bearsoft 1.1 //------------------------------------------------------------------------------
2     // File: DVDIf.idl
3     //
4     // Desc: DirectShow interfaces to control playback of a DVD filter graph.
5     //
6     // Copyright (c) 1992-2000, Microsoft Corporation. All rights reserved.
7     //------------------------------------------------------------------------------
8    
9    
10     // forward declarations - these are the interfaces declared in this file
11    
12     import "unknwn.idl";
13     import "objidl.idl";
14    
15     cpp_quote("#include <ddraw.h>")
16    
17     interface IDvdControl;
18     interface IDvdInfo;
19     interface IDirectDraw;
20     interface IDirectDrawSurface;
21     interface IDvdGraphBuilder ;
22     interface IDDrawExclModeVideo;
23     interface IDDrawExclModeVideoCallback;
24     interface IDvdCmd;
25     interface IDvdState;
26    
27    
28     //==========================================================================
29     //==========================================================================
30     //
31     // typedefs used by IDvdControl and IDvdInfo interfaces.
32     //
33     //==========================================================================
34     //==========================================================================
35    
36     typedef enum tagDVD_DOMAIN {
37     // The DVD_DOMAIN is used to indicate the stat of a DVD player.
38     DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc
39     DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc
40     DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set
41     DVD_DOMAIN_Title, // displaying current title
42     DVD_DOMAIN_Stop // player is in stopped state
43     } DVD_DOMAIN;
44    
45     typedef enum tagDVD_MENU_ID {
46     DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume
47     DVD_MENU_Root = 3, // main menu for a specific VTS
48     DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS
49     DVD_MENU_Audio = 5, // to choose audio stream in a VTS
50     DVD_MENU_Angle = 6, // to choose angle num in a VTS
51     DVD_MENU_Chapter = 7 // to choose a chapter in a VTS
52     // the Root menu always provides a means of getting to to Subpicture, Audio,
53     // Angle and Chapter menus if they exist.
54     } DVD_MENU_ID;
55    
56     typedef enum tagDVD_DISC_SIDE {
57     DVD_SIDE_A = 1,
58     DVD_SIDE_B = 2
59     } DVD_DISC_SIDE;
60    
61    
62     typedef enum tagDVD_PREFERRED_DISPLAY_MODE
63     {
64     // DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's
65     // preferred window aspect ratio and preferred method of converion of
66     // 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are
67     // the two conversion methods. This enum is used to indicate only a preference of
68     // conversion mechinism since some content can only be converted using one
69     // of these methods. 4*3 content is converted to a 16*9 window always by using
70     // "reverse" letterboxing where black bars are added to the right and left
71     // sides of the display instead of the top and bottom of the display as in the 16*9
72     // to 4*3 conversion useing letterboxing.
73     DISPLAY_CONTENT_DEFAULT = 0, // default to content
74     DISPLAY_16x9 = 1, // 16x9 display
75     DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence
76     DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence
77    
78     } DVD_PREFERRED_DISPLAY_MODE;
79    
80     typedef WORD DVD_REGISTER;
81     typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers
82     typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers
83    
84    
85    
86     // these are only for IDVDInfo1 compatibility and require the DVD-Video 1.0 specification
87     // Please use the IDVDInfo2's DVD_Title/MenuAttributes, DVD_VideoAttributes, DVD_AudioAttributes, and DVD_SubpictureAttributes
88     typedef struct tagDVD_ATR
89     {
90     //
91     // Refer to the DVD-Video 1.0 spec to parse these structures.
92     //
93     ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT
94     // if this is for a Video Title Set (VTS)
95     BYTE pbATRI[768];// All stream attributes for menu and title from bytes
96     // 256 to 1023 of VMGI or VTSI.
97     } DVD_ATR;
98     typedef BYTE DVD_VideoATR[2]; // video stream attributes.
99     typedef BYTE DVD_AudioATR[8]; // audio stream attributes.
100     typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes.
101    
102     // DVD1.0 Timecode is BCD encoded in this format: 0xHhMmSsFf, where
103     // H is tens of hours
104     // h is hours
105     // M is tens of minutes
106     // m is minutes
107     // S is tens of seconds
108     // s is seconds
109     // F is tens of frames
110     // f is frames
111     // Note that you must know the frame rate to interperate the frame count as time.
112     typedef enum tagDVD_FRAMERATE
113     {
114     DVD_FPS_25 =1, // 25 frames per second
115     DVD_FPS_30NonDrop = 3 // exactly 30 frames per second
116     } DVD_FRAMERATE;
117    
118     cpp_quote("typedef struct tagDVD_TIMECODE")
119     cpp_quote("{")
120     cpp_quote(" ULONG Hours1 :4; // Hours")
121     cpp_quote(" ULONG Hours10 :4; // Tens of Hours ")
122     cpp_quote("")
123     cpp_quote(" ULONG Minutes1 :4; // Minutes ")
124     cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ")
125     cpp_quote("")
126     cpp_quote(" ULONG Seconds1 :4; // Seconds ")
127     cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ")
128     cpp_quote("")
129     cpp_quote(" ULONG Frames1 :4; // Frames ")
130     cpp_quote(" ULONG Frames10 :2; // Tens of Frames ")
131     cpp_quote("")
132     cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop")
133     cpp_quote("} DVD_TIMECODE;")
134    
135     //
136     // Newer IDVD2 methods can use the HMSF format instead
137     // Call SetOption( DVD_HMSF_TimeCodeEvents, TRUE) to return EC_DVD_CURRENT_HMSF_TIME
138     // instead of EC_DVD_CURRENT_TIME events
139     //
140     typedef enum tagDVD_TIMECODE_FLAGS
141     {
142     DVD_TC_FLAG_25fps = 0x00000001, // 25 frames per second
143     DVD_TC_FLAG_30fps = 0x00000002, // 30 frames per second
144     DVD_TC_FLAG_DropFrame = 0x00000004, // 29.97 instead of 30 fps
145     DVD_TC_FLAG_Interpolated = 0x00000008, // timecode may be inaccurate
146     // remainder of bits are reserved and should not be read
147     } DVD_TIMECODE_FLAGS;
148    
149     // this can be cast to/from a ULONG
150     typedef struct tagDVD_HMSF_TIMECODE
151     {
152     BYTE bHours;
153     BYTE bMinutes;
154     BYTE bSeconds;
155     BYTE bFrames;
156     } DVD_HMSF_TIMECODE;
157    
158     typedef struct tagDVD_PLAYBACK_LOCATION2
159     {
160     //
161     // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
162     // playback location for One_Sequential_PGC_Titles.
163     //
164     ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
165     ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
166     DVD_HMSF_TIMECODE TimeCode; // use DVD_TIMECODE for current playback time.
167     ULONG TimeCodeFlags; // union of DVD_TIMECODE_EVENT_FLAGS
168    
169     } DVD_PLAYBACK_LOCATION2;
170    
171     typedef struct tagDVD_PLAYBACK_LOCATION
172     {
173     //
174     // TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
175     // playback location for One_Sequential_PGC_Titles.
176     //
177     ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
178     ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
179     ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title
180    
181     } DVD_PLAYBACK_LOCATION;
182    
183     typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
184    
185     typedef enum {
186     //
187     // Annex J User Functions ---
188     //
189     UOP_FLAG_Play_Title_Or_AtTime = 0x00000001, // Title_Or_Time_Play
190     UOP_FLAG_Play_Chapter = 0x00000002, // Chapter_Search_Or_Play
191     UOP_FLAG_Play_Title = 0x00000004, // Title_Play
192     UOP_FLAG_Stop = 0x00000008, // Stop
193     UOP_FLAG_ReturnFromSubMenu = 0x00000010, // GoUp
194     UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020, // Time_Or_Chapter_Search
195     UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040, // Prev_Or_Top_PG_Search
196     UOP_FLAG_PlayNext_Chapter = 0x00000080, // Next_PG_Search
197     UOP_FLAG_Play_Forwards = 0x00000100, // Forward_Scan
198     UOP_FLAG_Play_Backwards = 0x00000200, // Backward_Scan
199     UOP_FLAG_ShowMenu_Title = 0x00000400, // Title_Menu_Call
200     UOP_FLAG_ShowMenu_Root = 0x00000800, // Root_Menu_Call
201     UOP_FLAG_ShowMenu_SubPic = 0x00001000, // SubPic_Menu_Call
202     UOP_FLAG_ShowMenu_Audio = 0x00002000, // Audio_Menu_Call
203     UOP_FLAG_ShowMenu_Angle = 0x00004000, // Angle_Menu_Call
204     UOP_FLAG_ShowMenu_Chapter = 0x00008000, // Chapter_Menu_Call
205     UOP_FLAG_Resume = 0x00010000, // Resume
206     UOP_FLAG_Select_Or_Activate_Button = 0x00020000, // Button_Select_Or_Activate
207     UOP_FLAG_Still_Off = 0x00040000, // Still_Off
208     UOP_FLAG_Pause_On = 0x00080000, // Pause_On
209     UOP_FLAG_Select_Audio_Stream = 0x00100000, // Audio_Stream_Change
210     UOP_FLAG_Select_SubPic_Stream = 0x00200000, // SubPic_Stream_Change
211     UOP_FLAG_Select_Angle = 0x00400000, // Angle_Change
212     UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000, // Karaoke_Audio_Pres_Mode_Change
213     UOP_FLAG_Select_Video_Mode_Preference = 0x01000000 // Video_Pres_Mode_Change
214     } VALID_UOP_FLAG ;
215    
216     typedef enum {
217     DVD_CMD_FLAG_None = 0x00000000,
218     DVD_CMD_FLAG_Flush = 0x00000001,
219     DVD_CMD_FLAG_SendEvents = 0x00000002,
220     DVD_CMD_FLAG_Block = 0x00000004, // block end
221     DVD_CMD_FLAG_StartWhenRendered = 0x00000008, // command "start" when the first frame is rendered
222     DVD_CMD_FLAG_EndAfterRendered = 0x00000010, // command "ends" after the last frame is rendered
223     } DVD_CMD_FLAGS;
224    
225     // For IDVDControl2::SetOption flags
226     typedef enum {
227     DVD_ResetOnStop = 1, // default TRUE
228     DVD_NotifyParentalLevelChange = 2, // default FALSE
229     DVD_HMSF_TimeCodeEvents = 3, // default FALSE (send DVD_CURRENT_TIME events)
230     } DVD_OPTION_FLAG;
231    
232     typedef enum {
233     DVD_Relative_Upper = 1,
234     DVD_Relative_Lower = 2,
235     DVD_Relative_Left = 3,
236     DVD_Relative_Right = 4
237     } DVD_RELATIVE_BUTTON;
238    
239     // Parental Level Information
240     typedef enum tagDVD_PARENTAL_LEVEL
241     {
242     DVD_PARENTAL_LEVEL_8 = 0x8000,
243     DVD_PARENTAL_LEVEL_7 = 0x4000,
244     DVD_PARENTAL_LEVEL_6 = 0x2000,
245     DVD_PARENTAL_LEVEL_5 = 0x1000,
246     DVD_PARENTAL_LEVEL_4 = 0x0800,
247     DVD_PARENTAL_LEVEL_3 = 0x0400,
248     DVD_PARENTAL_LEVEL_2 = 0x0200,
249     DVD_PARENTAL_LEVEL_1 = 0x0100
250     } DVD_PARENTAL_LEVEL;
251    
252    
253     typedef enum tagDVD_AUDIO_LANG_EXT
254     {
255     DVD_AUD_EXT_NotSpecified =0,
256     DVD_AUD_EXT_Captions =1,
257     DVD_AUD_EXT_VisuallyImpaired =2,
258     DVD_AUD_EXT_DirectorComments1 =3,
259     DVD_AUD_EXT_DirectorComments2 =4,
260     } DVD_AUDIO_LANG_EXT;
261    
262     typedef enum tagDVD_SUBPICTURE_LANG_EXT
263     {
264     DVD_SP_EXT_NotSpecified =0,
265     DVD_SP_EXT_Caption_Normal =1,
266     DVD_SP_EXT_Caption_Big =2,
267     DVD_SP_EXT_Caption_Children =3,
268     DVD_SP_EXT_CC_Normal =5,
269     DVD_SP_EXT_CC_Big =6,
270     DVD_SP_EXT_CC_Children =7,
271     DVD_SP_EXT_Forced =9,
272     DVD_SP_EXT_DirectorComments_Normal =13,
273     DVD_SP_EXT_DirectorComments_Big =14,
274     DVD_SP_EXT_DirectorComments_Children =15,
275     } DVD_SUBPICTURE_LANG_EXT;
276    
277     typedef enum tagDVD_AUDIO_APPMODE
278     {
279     DVD_AudioMode_None = 0, // no special mode
280     DVD_AudioMode_Karaoke = 1,
281     DVD_AudioMode_Surround = 2,
282     DVD_AudioMode_Other = 3,
283     } DVD_AUDIO_APPMODE;
284    
285     typedef enum tagDVD_AUDIO_FORMAT
286     {
287     DVD_AudioFormat_AC3 = 0,
288     DVD_AudioFormat_MPEG1 = 1,
289     DVD_AudioFormat_MPEG1_DRC = 2, // MPEG1 with dynamic range control
290     DVD_AudioFormat_MPEG2 = 3,
291     DVD_AudioFormat_MPEG2_DRC = 4, // MPEG2 with dynamic range control
292     DVD_AudioFormat_LPCM = 5,
293     DVD_AudioFormat_DTS = 6,
294     DVD_AudioFormat_SDDS = 7,
295     DVD_AudioFormat_Other = 8
296     } DVD_AUDIO_FORMAT;
297    
298     // flags for SelectKaraokeAudioPresentationMode
299     typedef enum tagDVD_KARAOKE_DOWNMIX
300     {
301     DVD_Mix_0to0 = 0x0001, // unused - reserved for future use
302     DVD_Mix_1to0 = 0x0002, // unused - reserved for future use
303     DVD_Mix_2to0 = 0x0004,
304     DVD_Mix_3to0 = 0x0008,
305     DVD_Mix_4to0 = 0x0010,
306     DVD_Mix_Lto0 = 0x0020, // mix auxillary L to channel 0 (left speaker)
307     DVD_Mix_Rto0 = 0x0040, // mix auxillary R to channel 0 (left speaker)
308    
309     DVD_Mix_0to1 = 0x0100, // unused - reserved for future use
310     DVD_Mix_1to1 = 0x0200, // unused - reserved for future use
311     DVD_Mix_2to1 = 0x0400,
312     DVD_Mix_3to1 = 0x0800,
313     DVD_Mix_4to1 = 0x1000,
314     DVD_Mix_Lto1 = 0x2000, // mix auxillary L to channel 1 (right speaker)
315     DVD_Mix_Rto1 = 0x4000, // mix auxillary R to channel 1 (right speaker)
316     } DVD_KARAOKE_DOWNMIX;
317    
318    
319     typedef struct tagDVD_AudioAttributes
320     {
321     DVD_AUDIO_APPMODE AppMode;
322     BYTE AppModeData;
323     DVD_AUDIO_FORMAT AudioFormat; // Use GetKaraokeAttributes()
324     LCID Language; // 0 if no language is present
325     DVD_AUDIO_LANG_EXT LanguageExtension; // (captions, if for children etc)
326     BOOL fHasMultichannelInfo; // multichannel attributes are present (Use GetMultiChannelAudioAttributes())
327     DWORD dwFrequency; // in hertz (48k, 96k)
328     BYTE bQuantization; // resolution (16, 20, 24 bits etc), 0 is unknown
329     BYTE bNumberOfChannels; // 5.1 AC3 has 6 channels
330     DWORD dwReserved[2];
331     } DVD_AudioAttributes;
332    
333     typedef struct tagDVD_MUA_MixingInfo
334     {
335     // surround sound mixing information applied when:
336     // AppMode = DVD_AudioMode_Surround
337     // AudioFormat = DVD_AudioFormat_LPCM,
338     // fHasMultichannelInfo=1 modes are all on
339     //
340     BOOL fMixTo0;
341     BOOL fMixTo1;
342    
343     //
344     BOOL fMix0InPhase;
345     BOOL fMix1InPhase;
346    
347     DWORD dwSpeakerPosition; // see ksmedia.h: SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, etc
348     } DVD_MUA_MixingInfo;
349    
350     // The alpha coeff is used to mix to ACH0 and beta is used to mix to ACH1
351     //
352     // In general:
353     // ACH0 = coeff[0].alpha * value[0] + coeff[1].alpha * value[1] + ...
354     // ACH1 = coeff[0].beta * value[0] + coeff[1].beta * value[1] + ...
355     typedef struct tagDVD_MUA_Coeff
356     {
357     double log2_alpha; // actual coeff = 2^alpha
358     double log2_beta; // actual coeff = 2^beta
359     } DVD_MUA_Coeff;
360    
361     typedef struct tagDVD_MultichannelAudioAttributes
362     {
363     // actual Data for each data stream
364     DVD_MUA_MixingInfo Info[8];
365     DVD_MUA_Coeff Coeff[8];
366     } DVD_MultichannelAudioAttributes;
367    
368     // bitwise OR of these flags descript the contents of each channel
369     typedef enum tagDVD_KARAOKE_CONTENTS
370     {
371     DVD_Karaoke_GuideVocal1 = 0x0001,
372     DVD_Karaoke_GuideVocal2 = 0x0002,
373     DVD_Karaoke_GuideMelody1 = 0x0004,
374     DVD_Karaoke_GuideMelody2 = 0x0008,
375     DVD_Karaoke_GuideMelodyA = 0x0010,
376     DVD_Karaoke_GuideMelodyB = 0x0020,
377     DVD_Karaoke_SoundEffectA = 0x0040,
378     DVD_Karaoke_SoundEffectB = 0x0080
379     } DVD_KARAOKE_CONTENTS;
380    
381     typedef enum tagDVD_KARAOKE_ASSIGNMENT
382     {
383     DVD_Assignment_reserved0 = 0,
384     DVD_Assignment_reserved1 = 1,
385     DVD_Assignment_LR = 2, // left right
386     DVD_Assignment_LRM = 3, // left right middle
387     DVD_Assignment_LR1 = 4, // left right audio1
388     DVD_Assignment_LRM1 = 5, // left right middle audio1
389     DVD_Assignment_LR12 = 6, // left right audio1 audio2
390     DVD_Assignment_LRM12 = 7 // left right middle audio1 audio2
391     } DVD_KARAOKE_ASSIGNMENT;
392    
393     typedef struct tagDVD_KaraokeAttributes
394     {
395     BYTE bVersion;
396     BOOL fMasterOfCeremoniesInGuideVocal1;
397     BOOL fDuet; // false = solo
398     DVD_KARAOKE_ASSIGNMENT ChannelAssignment;
399     WORD wChannelContents[8]; // logical OR of DVD_KARAOKE_CONTENTS
400     } DVD_KaraokeAttributes;
401    
402     typedef enum tagDVD_VIDEO_COMPRESSION
403     {
404     DVD_VideoCompression_Other = 0,
405     DVD_VideoCompression_MPEG1 = 1,
406     DVD_VideoCompression_MPEG2 = 2,
407     } DVD_VIDEO_COMPRESSION;
408    
409     typedef struct tagDVD_VideoAttributes
410     {
411     BOOL fPanscanPermitted; // if a 4x3 display, can be shown as PanScan
412     BOOL fLetterboxPermitted; // if a 4x3 display, can be shown as Letterbox
413     ULONG ulAspectX; // 4x3 or 16x9
414     ULONG ulAspectY;
415     ULONG ulFrameRate; // 50hz or 60hz
416     ULONG ulFrameHeight; // 525 (60hz) or 625 (50hz)
417     DVD_VIDEO_COMPRESSION Compression;// MPEG1 or MPEG2
418    
419     BOOL fLine21Field1InGOP; // true if there is user data in field 1 of GOP of video stream
420     BOOL fLine21Field2InGOP; // true if there is user data in field 1 of GOP of video stream
421    
422     ULONG ulSourceResolutionX; // X source resolution (352,704, or 720)
423     ULONG ulSourceResolutionY; // Y source resolution (240,480, 288 or 576)
424    
425     BOOL fIsSourceLetterboxed; // subpictures and highlights (e.g. subtitles or menu buttons) are only
426     // displayed in the active video area and cannot be displayed in the top/bottom 'black' bars
427     BOOL fIsFilmMode; // for 625/50hz systems, is film mode (true) or camera mode (false)
428     } DVD_VideoAttributes;
429    
430     typedef enum tagDVD_SUBPICTURE_TYPE
431     {
432     DVD_SPType_NotSpecified = 0,
433     DVD_SPType_Language = 1,
434     DVD_SPType_Other = 2,
435     } DVD_SUBPICTURE_TYPE;
436    
437     typedef enum tagDVD_SUBPICTURE_CODING
438     {
439     DVD_SPCoding_RunLength = 0,
440     DVD_SPCoding_Extended = 1,
441     DVD_SPCoding_Other = 2,
442     } DVD_SUBPICTURE_CODING;
443    
444     typedef struct tagDVD_SubpictureAttributes
445     {
446     DVD_SUBPICTURE_TYPE Type;
447     DVD_SUBPICTURE_CODING CodingMode;
448     LCID Language;
449     DVD_SUBPICTURE_LANG_EXT LanguageExtension;
450     } DVD_SubpictureAttributes;
451    
452     typedef enum tagDVD_TITLE_APPMODE
453     {
454     DVD_AppMode_Not_Specified = 0, // no special mode
455     DVD_AppMode_Karaoke = 1,
456     DVD_AppMode_Other = 3,
457     } DVD_TITLE_APPMODE;
458    
459     typedef struct tagDVD_TitleMainAttributes
460     {
461     // for Titles
462     DVD_TITLE_APPMODE AppMode;
463    
464     // Attributes about the 'main' video of the menu or title
465     DVD_VideoAttributes VideoAttributes;
466    
467     ULONG ulNumberOfAudioStreams;
468     DVD_AudioAttributes AudioAttributes[8];
469     // present if the multichannel bit is set in the corresponding stream's audio attributes
470     DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8];
471    
472     ULONG ulNumberOfSubpictureStreams;
473     DVD_SubpictureAttributes SubpictureAttributes[32];
474     } DVD_TitleAttributes;
475    
476     typedef struct tagDVD_MenuAttributes
477     {
478     // for VMG only
479     BOOL fCompatibleRegion[8]; // indeces 0..7 correspond to regions 1..8
480    
481     // Attributes about the main menu (VMGM or VTSM)
482     DVD_VideoAttributes VideoAttributes;
483    
484     BOOL fAudioPresent;
485     DVD_AudioAttributes AudioAttributes;
486    
487     BOOL fSubpicturePresent;
488     DVD_SubpictureAttributes SubpictureAttributes;
489     } DVD_MenuAttributes;
490    
491     //==========================================================================
492     //==========================================================================
493     // IDvdControl interface -- Basic DVD-Video playback control.
494     // This modeled after the app control of a player specified in Annex J
495     // of the DVD Video spec. IDvdInfo can be used to get information useful
496     // in using IDvdControl
497     //==========================================================================
498     //==========================================================================
499    
500     [
501     object,
502     uuid(A70EFE61-E2A3-11d0-A9BE-00AA0061BE93),
503     pointer_default(unique)
504     ]
505    
506     interface IDvdControl : IUnknown {
507     import "unknwn.idl";
508    
509     // TitlePlay
510     // Start playing the specified title number.
511     // Title numbers range between 1 and 99.
512     HRESULT TitlePlay
513     ( [in] ULONG ulTitle
514     );
515    
516     // ChapterPlay
517     // Start playing at the specified chapter (or part-of-title)
518     // within the specified title. Chapters range from 1 to 999.
519     HRESULT ChapterPlay
520     ( [in] ULONG ulTitle,
521     [in] ULONG ulChapter
522     );
523    
524     // TimePlay
525     // Start playing at the specified time within the specified title.
526     // NOTE: the actual start time will be the closest sync point before
527     // or equal to the specified frame number.
528     HRESULT TimePlay
529     ( [in] ULONG ulTitle,
530     [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
531     );
532    
533     // StopForResume
534     // Stop playback after saving resume information. DVD Navigator transfers to the DVD "Stop State" and
535     // (same as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
536     HRESULT StopForResume();
537    
538     // GoUp
539     // Start playback of the program chain currently authored as the "GoUp_PGCN".
540     HRESULT GoUp();
541    
542     // TimeSearch
543     // Start playing at the specified time within the current title.
544     // NOTE: the actual start time will be the closest sync point before
545     // or equal to the specified frame number.
546     HRESULT TimeSearch
547     ( [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
548     );
549    
550     // ChapterSearch
551     // Start playing at the specified chapter (or part-of-title) within
552     // the current title.
553     HRESULT ChapterSearch
554     ( [in] ULONG ulChapter
555     );
556    
557     // PrevPGSearch
558     // Start playing at the beginning of the previous DVD "program".
559     // For One-Sequential_PGC_Titles (which includes most titles) a program
560     // is equivalent to a chapter, otherwise a program is part of a chapter.
561     HRESULT PrevPGSearch();
562    
563     // TopPGSearch
564     // Start playing from the beginning of they current program.
565     HRESULT TopPGSearch();
566    
567     // NextPGSearch
568     // Start playing from the beginning of the next program.
569     HRESULT NextPGSearch();
570    
571     // ForwardScan
572     // Set forward play at the specified speed.
573     // dwSpeed == 1 is normal play
574     // dwSpeed < 1 is slow play
575     // dwSpeed > 1 is fast play
576     // For dwSpeed != 1, audio and subpicture is muted.
577     HRESULT ForwardScan
578     ( [in] double dwSpeed
579     );
580    
581     // BackwardScan
582     // Set reverse play at the specified speed.
583     // dwSpeed == 1 is normal play speed in reverse
584     // dwSpeed < 1 is slow play in reverse
585     // dwSpeed > 1 is fast play in reverse
586     // For reverse play, audio and subpicture are always muted.
587     HRESULT BackwardScan
588     ( [in] double dwSpeed
589     );
590    
591     // MenuCall
592     // Start playback of the Menu specified by an enum DVD_MENU_ID.
593     HRESULT MenuCall
594     ( [in] DVD_MENU_ID MenuID
595     );
596    
597     // Resume
598     // Returns to title playback in DVD_DOMAIN_Title. This is typically
599     // done after MenuCall which puts the DVD Navigator in
600     // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
601     HRESULT Resume();
602    
603     // UpperButtonSelect
604     // Selects the button above the current button.
605     // "Selecting" a DVD button simply highlights the button but does
606     // not "Activate" the button. Selecting is the Windows equivalent
607     // to tabbing to a button but not pressing the space bar or enter key.
608     // Activating is the Windows equivalent of pressing the space bar or
609     // enter key after tabbing to a button.
610     HRESULT UpperButtonSelect();
611    
612     // LowerButtonSelect
613     // Selects the button below the current button.
614     HRESULT LowerButtonSelect();
615    
616     // LeftButtonSelect
617     // Selects the button to the left of the current button.
618     HRESULT LeftButtonSelect();
619    
620     // RightButtonSelect
621     // Selects the button to the right of the current button.
622     HRESULT RightButtonSelect();
623    
624     // ButtonActivate
625     // Activates current button.
626     HRESULT ButtonActivate();
627    
628     // ButtonSelectAndActivate
629     // Selects and then activates the button specified by the user.
630     // ulButton is intended to be a number entered by a user corresponding
631     // to button numbers currently displayed on screen.
632     // Button numbers range from 1 to 36.
633     HRESULT ButtonSelectAndActivate
634     ( [in] ULONG ulButton
635     );
636    
637     // StillOff
638     // Releases any current still if there are no available buttons.
639     // This includes VOBU stills, Cell stills, and PGC stills, whether the
640     // still is infinite. When buttons are available, stills are released by
641     // activating a button. Note this does not release a Pause.
642     HRESULT StillOff();
643    
644     // PauseOn
645     // Freezes playback and any internal timers. This is similar to
646     // IMediaControl::Pause()
647     HRESULT PauseOn();
648    
649     // PauseOff
650     // Releases a Pause.
651     HRESULT PauseOff();
652    
653     // MenuLanguageSelect
654     // Selects the default language for menus. Languages are specified with
655     // Windows standard LCIDs. LCIDs can be created from ISO-639 codes with
656     // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT )
657     // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
658     // instead of 'ja' for the ISO639 code for Japanese.
659     // MenuLanguageSelect may only called from the DVD Stop state (DVD_DOMAIN_Stop).
660     HRESULT MenuLanguageSelect
661     ( [in] LCID Language
662     );
663    
664     // AudioStreamChange
665     // Changes the current audio stream.
666     HRESULT AudioStreamChange
667     ( [in] ULONG ulAudio
668     );
669    
670     // SubpictureStreamChange
671     // Changes the current subpicture stream number to nSubpic, and toggles
672     // its display.
673     HRESULT SubpictureStreamChange
674     ( [in] ULONG ulSubPicture,
675     [in] BOOL bDisplay
676     );
677    
678     // AngleChange
679     // Changes the current angle number.
680     HRESULT AngleChange
681     ( [in] ULONG ulAngle
682     );
683    
684     // ParentalLevelSelect
685     // Selects the current player parental level between 1 and 8. The
686     // defined parental levels are listed below :
687     //
688     // Level Rating
689     // ----- ------
690     //
691     // 1 G
692     // 3 PG
693     // 4 PG13
694     // 6 R
695     // 7 NC17
696     // Higher levels can play lower level content; lower levels cannot play
697     // higher level content. The DVD Navigator provides no restriction on
698     // setting the parental level. DVD player application may enforce
699     // restriction on parental level setting, such as password protection for
700     // raising the current parental level. Parental Management is disabled in
701     // the Navigator by default.
702     //
703     // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
704     // If parental management is disabled, then the player will play the
705     // first PGC in a parental block regardless of parental IDs.
706     //
707     HRESULT ParentalLevelSelect
708     ( [in] ULONG ulParentalLevel
709     );
710    
711     // ParentalCountrySelect
712     // Sets the country in which to interpret the the Parental Level.
713     // The country specified using the Alpha-2 code of the ISO-3166 standard,
714     // with the addition of 'ZZ'
715     HRESULT ParentalCountrySelect
716     ( [in] WORD wCountry
717     );
718    
719     // KaraokeAudioPresentationModeChange
720     // Sets the Karaoke audio mode.
721     // NOTE: This and all other Karoke support is currently not implemented.
722     HRESULT KaraokeAudioPresentationModeChange
723     ( [in] ULONG ulMode
724     );
725    
726     // VideoModePreferrence
727     // The user can specify the preferred display mode that should
728     // be used to display content. The parameter is a ULONG that has
729     // one of the values defined in DVD_PREFERRED_DISPLAY_MODE
730     HRESULT VideoModePreferrence
731     ( [in] ULONG ulPreferredDisplayMode
732     );
733    
734     // SetRoot
735     // Sets the root directory containing the DVD-Video volume.
736     // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
737     // If the root directory is not successfully set before
738     // IMediaControl::Play is called, the first drive starting from c:
739     // containing a VIDEO_TS directory in the top level directory
740     // will be used as the root.
741     HRESULT SetRoot
742     ( [in] LPCWSTR pszPath
743     );
744    
745     // MouseActivate
746     // This is typically called in response to a mouse click.
747     // The specified point within the display window is to see if it is
748     // within a current DVD button's highlight rect. If it is, that
749     // button is first selected, then activated.
750     // NOTE: DVD Buttons do not all necessarily have highlight rects,
751     // button rects can overlap, and button rects do not always
752     // correspond to the visual representation of DVD buttons.
753     HRESULT MouseActivate // typically called after a mouse click
754     ( [in] POINT point
755     );
756    
757     // MouseSelect
758     // This is typically called in response to a mouse move within the
759     // display window.
760     // The specified point within the display window is to see if it is
761     // within a current DVD button's highlight rect. If it is, that
762     // button is selected.
763     // NOTE: DVD Buttons do not all necessarily have highlight rects,
764     // button rects can overlap, and button rects do not always
765     // correspond to the visual representation of DVD buttons.
766     HRESULT MouseSelect // typically called after a mouse move
767     ( [in] POINT point
768     );
769    
770     // ChapterPlayAutoStop
771     // Start playing at the specified chapter within the specified title
772     // and play the number of chapters specified by the third parameter.
773     // Chapters range from 1 to 999.
774     HRESULT ChapterPlayAutoStop
775     ( [in] ULONG ulTitle, // title number
776     [in] ULONG ulChapter, // chapter number to start playback
777     [in] ULONG ulChaptersToPlay // number of chapters to play from the start chapter
778     );
779     }
780    
781    
782    
783     //==========================================================================
784     //==========================================================================
785     // IDvdInfo interface -- allow an app to query for attributes of available
786     // DVD titles and DVD player status. Also allow for control of a DVD
787     // player beyond Annex J in the DVD spec.
788     //==========================================================================
789     //==========================================================================
790    
791     [
792     object,
793     uuid(A70EFE60-E2A3-11d0-A9BE-00AA0061BE93),
794     pointer_default(unique)
795     ]
796    
797     interface IDvdInfo : IUnknown {
798     import "unknwn.idl";
799    
800     // GetCurrentDomain
801     // Returns the current DVD Domain of the DVD player.
802     HRESULT GetCurrentDomain
803     ( [out] DVD_DOMAIN *pDomain
804     );
805    
806     // GetCurrentLocation
807     // Returns information sufficient to restart playback of a video
808     // from the current playback location in titles that don't explicitly
809     // disable seeking to the current location.
810     HRESULT GetCurrentLocation
811     ( [out] DVD_PLAYBACK_LOCATION *pLocation
812     );
813    
814     // GetTotalTitleTime
815     // Return the total playback time for the current title. Only works
816     // for One_Sequential_PGC_Titles.
817     HRESULT GetTotalTitleTime
818     ( [out] ULONG * pulTotalTime // use DVD_TIMECODE.
819     );
820    
821     // GetCurrentButton
822     // Indicates the number of currently available buttons and the current
823     // selected button number. If buttons are not present it returns 0 for
824     // both pulButtonsAvailable and pulCurrentButton
825     HRESULT GetCurrentButton
826     ( [out] ULONG * pulButtonsAvailable,
827     [out] ULONG * pulCurrentButton
828     );
829    
830     // GetCurrentAngle
831     // Indicates the number of currently available angles and the current
832     // selected angle number. If *pnAnglesAvailable==1, then the current
833     // video is not multiangle.
834     HRESULT GetCurrentAngle
835     ( [out] ULONG * pulAnglesAvailable,
836     [out] ULONG * pulCurrentAngle
837     );
838    
839     // GetCurrentAudio
840     // Indicates the number of currently available audio streams and
841     // the current selected audio stream number.
842     // This only work when in DVD_DOMAIN_Title.
843     HRESULT GetCurrentAudio
844     ( [out] ULONG * pulStreamsAvailable,
845     [out] ULONG * pulCurrentStream
846     );
847    
848     // GetCurrentSubpicture
849     // Indicates the number of currently available subpicture streams,
850     // the current selected subpicture stream number, and if the
851     // subpicture display is currently disabled. Subpicture streams
852     // authored as Forcedly Activated stream will be displayed even if
853     // subpicture display has been disabled by the app with
854     // IDVDControl::SubpictureChangeStream.
855     // This only work when in DVD_DOMAIN_Title.
856     HRESULT GetCurrentSubpicture
857     ( [out] ULONG * pulStreamsAvailable,
858     [out] ULONG * pulCurrentStream,
859     [out] BOOL * pIsDisabled
860     );
861    
862     // GetCurrentUOPS
863     // Indicates which IDVDControl methods are currently valid. DVD titles
864     // can enable or disable individual user operations at almost any point
865     // during playback.
866     HRESULT GetCurrentUOPS
867     ( [out] VALID_UOP_SOMTHING_OR_OTHER * pUOP
868     );
869    
870     // GetAllSPRMs
871     // Returns the current contents of all System Parameter Registers.
872     // See DVD-Video spec for use of individual registers.
873     HRESULT GetAllSPRMs
874     ( [out] SPRMARRAY * pRegisterArray
875     );
876    
877     // GetAllGPRMs
878     // Returns the current contents of all General Parameter Registers.
879     // Use of GPRMs is title specific.
880     HRESULT GetAllGPRMs
881     ( [out] GPRMARRAY * pRegisterArray
882     );
883    
884     // GetAudioLanguage
885     // Returns the language of the specified stream within the current
886     // title. Does not return languages for menus. Sets *pLanguage=0 if
887     // if the stream does not include language.
888     // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
889     // to create a human readable string name from the result LCID.
890     HRESULT GetAudioLanguage
891     ( [in] ULONG ulStream,
892     [out] LCID * pLanguage
893     );
894    
895     // GetSubpictureLanguage
896     // Returns the language of the specified stream within the current
897     // title. Does not return languages for menus. Sets *pLanguage=0 if
898     // if the stream does not include language.
899     // Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
900     // to create a human readable string name from the result LCID.
901     HRESULT GetSubpictureLanguage
902     ( [in] ULONG ulStream,
903     [out] LCID * pLanguage
904     );
905    
906     // GetTitleAttributes
907     // Returns attributes of all video, audio, and subpicture
908     // streams for the specified title including menus.
909     // If nTitle == 0xffffffff, attributes for the current title are returned.
910     HRESULT GetTitleAttributes
911     ( [in] ULONG ulTitle, // requested title number
912     [out] DVD_ATR * pATR
913     );
914    
915     // GetVMGAttributes
916     // Returns attributes of all video, audio, and subpicture
917     // streams for Video Manager Menus. Some menus, such as the DVD_MENU_Title
918     // are in a separate group of streams called the VMG (Video Manager) and
919     // are not associated with any particular title number.
920     HRESULT GetVMGAttributes
921     ( [out] DVD_ATR * pATR
922     );
923    
924     // GetCurrentVideoAttributes
925     // Returns the video attributes for the current title or menu.
926     HRESULT GetCurrentVideoAttributes
927     ( [out] DVD_VideoATR *pATR
928     );
929    
930     // GetCurrentAudioAttributes
931     // Returns the video attributes for the stream in the current
932     // title or menu.
933     HRESULT GetCurrentAudioAttributes
934     ( [out] DVD_AudioATR *pATR
935     );
936    
937     // GetCurrentSubpictureAttributes
938     // Returns the video attributes for the stream in the current
939     // title or menu.
940     HRESULT GetCurrentSubpictureAttributes
941     ( [out] DVD_SubpictureATR *pATR
942     );
943    
944    
945     // GetCurrentVolumeInfo
946     // Returns current DVD volume info.
947     HRESULT GetCurrentVolumeInfo
948     ( [out] ULONG *pulNumOfVol, // number of volumes (disc sides?) in a volume set
949     [out] ULONG *pulThisVolNum, // volume number for this root directory
950     [out] DVD_DISC_SIDE *pSide, // current disc side
951     [out] ULONG *pulNumOfTitles // number of titles available in this volume
952     );
953    
954    
955     // GetDVDTextInfo
956     // Returns the TXTDT_MG structure, which can contain text descriptions for title
957     // name, volume name, producer name, vocalist name, etc. in various languages.
958     // refer to Section 4.1.6 and Annex A of the DVD-Video spec.
959     // If the buffer size passed in is insufficient (for example if cbBufSize==0),
960     // then E_OUTOFMEMORY is returned, and *pcbActualSize is set to the required size.
961     HRESULT GetDVDTextInfo
962     ( [out, size_is(ulBufSize)] BYTE *pTextManager,
963     [in] ULONG ulBufSize, // buffer size passed in
964     [out] ULONG *pulActualSize // amount of actual data return
965     );
966    
967     // GetPlayerParentalLevel
968     // Returns the current parental level and the current country code
969     // that has been set in the system registers in player.
970     // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
971     // Valid Parental Levels = 1..8 if parental management is enabled
972     // 0xffffffff if parental management is disabled
973     // See ISO3166 : Alpha-2 Code for the country codes.
974     HRESULT GetPlayerParentalLevel
975     ( [out] ULONG *pulParentalLevel, // current parental level
976     [out] ULONG *pulCountryCode // current country code
977     );
978    
979     // GetNumberOfChapters
980     // Returns the number of chapters that are defined for a
981     // given title.
982     HRESULT GetNumberOfChapters
983     ( [in] ULONG ulTitle, // Title for which number of chapters is requested
984     [out] ULONG *pulNumberOfChapters // Number of chapters for the specified title
985     );
986    
987     // GetTitleParentalLevels
988     // Returns the parental levels that are defined for a
989     // particular title. pParentalLevels will be combination
990     // of DVD_PARENTAL_LEVEL_8, DVD_PARENTAL_LEVEL_6, or
991     // DVD_PARENTAL_LEVEL_1 "OR"ed together
992     HRESULT GetTitleParentalLevels
993     ( [in] ULONG ulTitle, // Title for which parental levels are requested
994     [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
995     );
996    
997     // GetRoot
998     // Returns the root directory that is set in the player. If a valid root
999     // has been found, it returns the root string. Otherwise, it returns 0 for
1000     // pcbActualSize indicating that a valid root directory has not been found
1001     // or initialized.
1002     //
1003     // !!! used to return LPTSTR. interface was changed to return
1004     // LPSTR (ansi) for compatibility. COM APIs should pass with
1005     // UNICODE strings only.
1006     //
1007     HRESULT GetRoot
1008     ( [out, size_is(ulBufSize)] LPSTR pRoot, // pointer to buffer to get root string
1009     [in] ULONG ulBufSize, // size of buffer passed in
1010     [out] ULONG *pulActualSize // size of actual data returned
1011     );
1012     }
1013    
1014     //==========================================================================
1015     //==========================================================================
1016     // IDvdCmd interface -- the IDVDControl2 command sequencing object.
1017     //
1018     // For the IDVDControl2 interface, the application can track the status of
1019     // commands that have been issued to the navigator. Each command is identified
1020     // by an IDvdCmd object. The IDvdCmd object stores the results of the command
1021     // at both the start (when the command has begun processing) and the end after
1022     // it has completed. It also allows the app to synchronize with the processing
1023     // of the command.
1024     //
1025     // The command object also allows the app to uniquely identify and correlate
1026     // completion events (if it prefers to process events in a message loop instead
1027     // of creating another process).
1028     //
1029     // Allows the app to track the status of an issued command to the nav.
1030     //==========================================================================
1031     //==========================================================================
1032    
1033     [
1034     object,
1035     uuid(5a4a97e4-94ee-4a55-9751-74b5643aa27d),
1036     pointer_default(unique)
1037     ]
1038    
1039     interface IDvdCmd : IUnknown {
1040     import "unknwn.idl";
1041    
1042     //
1043     // WaitForStart
1044     //
1045     // Blocks the application until the command has begun.
1046     //
1047     HRESULT WaitForStart();
1048    
1049     //
1050     // WaitForEnd
1051     //
1052     // Blocks until the command has completed or has been cancelled.
1053     HRESULT WaitForEnd();
1054     }
1055    
1056     //==========================================================================
1057     //==========================================================================
1058     // IDvdState interface -- the State state object.
1059     //
1060     // Whenever the application wishes to save or restore a location on the disc,
1061     // it needs to store the DVD state into an object.
1062     // The State object supports the IPersistStream
1063     //
1064     //==========================================================================
1065     //==========================================================================
1066    
1067     [
1068     object,
1069     uuid(86303d6d-1c4a-4087-ab42-f711167048ef),
1070     pointer_default(unique)
1071     ]
1072    
1073     interface IDvdState : IUnknown
1074     {
1075     //
1076     // GetDiscID
1077     //
1078     // Returns the disc ID from which the bookmark was made.
1079     //
1080     HRESULT GetDiscID
1081     ( [out] ULONGLONG* pullUniqueID ); // 64-bit unique id for the disc
1082    
1083     //
1084     // GetParentalLevel
1085     //
1086     // Returns the state's parental level
1087     //
1088     HRESULT GetParentalLevel
1089     ( [out] ULONG* pulParentalLevel );
1090     }
1091    
1092     //==========================================================================
1093     //==========================================================================
1094     // IDvdControl2 interface -- Basic DVD-Video playback control.
1095     // This is modeled after the app control of a player specified in Annex J
1096     // of the DVD Video spec. IDvdInfo2 can be used to get information useful
1097     // in using IDvdControl2
1098     //==========================================================================
1099     //==========================================================================
1100    
1101     [
1102     object,
1103     uuid(33BC7430-EEC0-11D2-8201-00A0C9D74842),
1104     pointer_default(unique)
1105     ]
1106    
1107     interface IDvdControl2 : IUnknown {
1108     import "unknwn.idl";
1109    
1110     // PlayTitle
1111     //
1112     // Start playing from the beginning of the specified title number.
1113     // Annex J: Title_Play
1114     // Title numbers range between 1 and 99.
1115     HRESULT PlayTitle
1116     ( [in] ULONG ulTitle,
1117     [in] DWORD dwFlags,
1118     [out] IDvdCmd** ppCmd
1119     );
1120    
1121     // PlayChapterInTitle
1122     //
1123     // Start playing from the beginning of the given chapter (or part-of-title) number
1124     // within the specified title number.
1125     // Annex J: PTT_Play
1126     // Title numbers range between 1 and 99.
1127     // Chapters range from 1 to 999.
1128     HRESULT PlayChapterInTitle
1129     ( [in] ULONG ulTitle,
1130     [in] ULONG ulChapter,
1131     [in] DWORD dwFlags,
1132     [out] IDvdCmd** ppCmd
1133     );
1134    
1135     // PlayAtTimeInTitle
1136     //
1137     // Start playing from the specified time within the specified title number.
1138     // NOTE: the actual start time will be the closest sync point before
1139     // or equal to the specified frame number.
1140     // Annex J: Time_Play
1141     // Title numbers range between 1 and 99.
1142     HRESULT PlayAtTimeInTitle
1143     ( [in] ULONG ulTitle,
1144     [in] DVD_HMSF_TIMECODE* pStartTime,
1145     [in] DWORD dwFlags,
1146     [out] IDvdCmd** ppCmd
1147     );
1148    
1149     // Stop
1150     // Stop playback by transferring DVD Navigator to the DVD "Stop State" (same
1151     // as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
1152     // Annex J: Stop
1153     HRESULT Stop();
1154    
1155     // ReturnFromSubmenu
1156     //
1157     // Stop playback of current program chain (PGC) and start playing the PGC
1158     // specified by "GoUp_PGCN".in the PGCI.
1159     // If the GoUp_PGCN value is 0xFFFF the Resume() operation is carried out.
1160     // Annex J: GoUp
1161     HRESULT ReturnFromSubmenu(
1162     [in] DWORD dwFlags,
1163     [out] IDvdCmd** ppCmd );
1164    
1165     // PlayAtTime
1166     // Start playing at the specified time within the current title.
1167     // NOTE: the actual start time will be the closest sync point before
1168     // or equal to the specified frame number.
1169     // Annex J: Time_Search
1170     // The time is in BCD format, passed in as a ULONG.
1171     HRESULT PlayAtTime
1172     ( [in] DVD_HMSF_TIMECODE* pTime,
1173     [in] DWORD dwFlags,
1174     [out] IDvdCmd** ppCmd
1175     );
1176    
1177     // PlayChapter
1178     // Start playing at the specified chapter (or part-of-title) within
1179     // the current title.
1180     // Annex J: PTT_Search
1181     // Chapters range from 1 to 999.
1182     HRESULT PlayChapter
1183     ( [in] ULONG ulChapter,
1184     [in] DWORD dwFlags,
1185     [out] IDvdCmd** ppCmd
1186     );
1187    
1188     // PlayPrevChapter
1189     // Start playing at the beginning of the previous DVD "program".
1190     // For One-Sequential_PGC_Titles (which includes most titles) a program
1191     // is equivalent to a chapter, otherwise a program is part of a chapter.
1192     // Annex J: PrevPG_Search
1193     HRESULT PlayPrevChapter(
1194     [in] DWORD dwFlags,
1195     [out] IDvdCmd** ppCmd );
1196    
1197     // ReplayChapter
1198     // Start playing from the beginning of they current program.
1199     // Annex J: TopPG_Search
1200     HRESULT ReplayChapter(
1201     [in] DWORD dwFlags,
1202     [out] IDvdCmd** ppCmd );
1203    
1204     // PlayNextChapter
1205     // Start playing from the beginning of the next program.
1206     // Annex J: NextPG_Search
1207     HRESULT PlayNextChapter(
1208     [in] DWORD dwFlags,
1209     [out] IDvdCmd** ppCmd );
1210    
1211     // PlayForwards
1212     // Set forward play at the specified speed.
1213     // Annex J: Forward_Scan
1214     // dSpeed == 1 is normal play
1215     // dSpeed < 1 is slow play
1216     // dSpeed > 1 is fast play
1217     // For dSpeed != 1, audio and subpicture is muted.
1218     HRESULT PlayForwards
1219     ( [in] double dSpeed,
1220     [in] DWORD dwFlags,
1221     [out] IDvdCmd** ppCmd
1222     );
1223    
1224     // PlayBackwards
1225     // Set reverse play at the specified speed.
1226     // Annex J: Backward_Scan
1227     // dSpeed == 1 is normal play speed in reverse
1228     // dSpeed < 1 is slow play in reverse
1229     // dSpeed > 1 is fast play in reverse
1230     // For reverse play, audio and subpicture are always muted.
1231     HRESULT PlayBackwards
1232     ( [in] double dSpeed,
1233     [in] DWORD dwFlags,
1234     [out] IDvdCmd** ppCmd
1235     );
1236    
1237     // ShowMenu
1238     // Start playback of the Menu specified by an enum DVD_MENU_ID.
1239     // Annex J: Menu_Call
1240     HRESULT ShowMenu
1241     ( [in] DVD_MENU_ID MenuID,
1242     [in] DWORD dwFlags,
1243     [out] IDvdCmd** ppCmd
1244     );
1245    
1246     // Resume
1247     // Returns to title playback in DVD_DOMAIN_Title. This is typically
1248     // done after MenuCall which puts the DVD Navigator in
1249     // DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
1250     // Annex J: Resume
1251     HRESULT Resume(
1252     [in] DWORD dwFlags,
1253     [out] IDvdCmd** ppCmd );
1254    
1255     // SelectRelativeButton
1256     // Moves the selection highlight above, below, to the left of, or to the right of the
1257     // currently selected.
1258     // "Selecting" a DVD button simply highlights the button but does
1259     // not "Activate" the button. Selecting is the Windows equivalent
1260     // to tabbing to a button but not pressing the space bar or enter key.
1261     // Activating is the Windows equivalent of pressing the space bar or
1262     // enter key after tabbing to a button.
1263     // Annex J: Upper_button_Select, Lower_button_Select, Left_button_Select, Right_button_Select
1264     HRESULT SelectRelativeButton( DVD_RELATIVE_BUTTON buttonDir );
1265    
1266     // ActivateButton
1267     // Activates current button.
1268     // Annex J: Button_Activate
1269     HRESULT ActivateButton();
1270    
1271     // SelectButton
1272     // Selects a specific button (with the index from 1 to 36).
1273     // ulButton is intended to be a number entered by a user corresponding
1274     // to button numbers currently displayed on screen.
1275     // Button numbers range from 1 to 36.
1276     HRESULT SelectButton
1277     ( [in] ULONG ulButton
1278     );
1279    
1280     // SelectAndActivateButton
1281     // Selects and then activates the button specified by the user.
1282     // ulButton is intended to be a number entered by a user corresponding
1283     // to button numbers currently displayed on screen.
1284     // Annex J: Button_Select_And_Activate
1285     // Button numbers range from 1 to 36.
1286     HRESULT SelectAndActivateButton
1287     ( [in] ULONG ulButton
1288     );
1289    
1290     // StillOff
1291     // Releases any current still if there are no available buttons.
1292     // This includes VOBU stills, Cell stills, and PGC stills, whether the
1293     // still is infinite. When buttons are available, stills are released by
1294     // activating a button. Note this does not release a Pause.
1295     // Annex J: Still_Off
1296     HRESULT StillOff();
1297    
1298     // Pause
1299     // Freezes / unfreezes playback and any internal timers. This is similar to
1300     // IMediaControl::Pause(), but not the same in effect as IMediaControl::Pause
1301     // puts the filter (all filters, if done to the graph) in paused state.
1302     // Annex J: Pause_On and Pause_Off
1303     // bState is TRUE or FALSE to indicate whether to do Puase_on/Pause_Off according
1304     // to Annex J terminology.
1305     HRESULT Pause
1306     ( [in] BOOL bState
1307     );
1308    
1309     // SelectAudioStream
1310     // Changes the current audio stream to ulAudio.
1311     // Annex J: Audio_Stream_Change
1312     // Audio stream number ranges between 0 and 7 or DEFAULT_AUDIO_STREAM (15 - default based on default language & language extension)
1313     HRESULT SelectAudioStream
1314     ( [in] ULONG ulAudio,
1315     [in] DWORD dwFlags,
1316     [out] IDvdCmd** ppCmd
1317    
1318     );
1319    
1320     // SelectSubpictureStream
1321     // Changes the current subpicture stream number to ulSubPicture
1322     // Annex J: Sub-picture_Stream_Change (first param)
1323     // Subpicture stream number should be between 0 and 31 or 63.
1324     HRESULT SelectSubpictureStream
1325     ( [in] ULONG ulSubPicture,
1326     [in] DWORD dwFlags,
1327     [out] IDvdCmd** ppCmd
1328    
1329     );
1330    
1331     // SetSubpictureState
1332     // Turns on/off current subpicture stream display.
1333     // Annex J: Sub-picture_Stream_Change (second param)
1334     // Subpicture state is On or Off (TRUE or FALSE)
1335     HRESULT SetSubpictureState
1336     ( [in] BOOL bState,
1337     [in] DWORD dwFlags,
1338     [out] IDvdCmd** ppCmd
1339     );
1340    
1341     // SelectAngle
1342     // Changes the current angle number.
1343     // Annex J: Angle_Change
1344     // Angle number is between 1 and 9.
1345     HRESULT SelectAngle
1346     ( [in] ULONG ulAngle,
1347     [in] DWORD dwFlags,
1348     [out] IDvdCmd** ppCmd
1349     );
1350    
1351     // SelectParentalLevel
1352     // Selects the current player parental level.
1353     // Annex J: Parental_Level_Select
1354     // Parental level ranges between 1 and 8.
1355     // The defined parental levels are listed below :
1356     //
1357     // Level Rating
1358     // ----- ------
1359     // 1 G
1360     // 3 PG
1361     // 4 PG13
1362     // 6 R
1363     // 7 NC17
1364     // Higher levels can play lower level content; lower levels cannot play
1365     // higher level content. The DVD Navigator provides no restriction on
1366     // setting the parental level. DVD player application may enforce
1367     // restriction on parental level setting, such as password protection for
1368     // raising the current parental level. Parental Management is disabled in
1369     // the Navigator by default.
1370     //
1371     // Note : To disable parental management, pass 0xffffffff for ulParentalLevel
1372     // If parental management is disabled, then the player will play the
1373     // first PGC in a parental block regardless of parental IDs.
1374     //
1375     HRESULT SelectParentalLevel
1376     ( [in] ULONG ulParentalLevel
1377     );
1378    
1379     // SelectParentalCountry
1380     // Sets the country in which to interpret the Parental Level.
1381     // Annex J: Parental_Country_Select
1382     // The country specified using the Alpha-2 code of the ISO-3166 standard,
1383     HRESULT SelectParentalCountry
1384     ( [in] BYTE bCountry[2]
1385     );
1386    
1387     // SelectKaraokeAudioPresentationMode
1388     // Sets the Karaoke audio mode.
1389     // Annex J: Karaoke_Audio_Presentation_Mode_Change
1390     // NOTE: This and all other Karoke support is currently not implemented.
1391     // Mode represents the audio mixing mode for Karaoke (same info as SPRM11).
1392     // Use a bitwise OR of the bits in DVD_KARAOKE_DOWNMIX
1393     HRESULT SelectKaraokeAudioPresentationMode
1394     ( [in] ULONG ulMode
1395     );
1396    
1397     // SelectVideoModePreference
1398     // The user can specify the (initial) preferred display mode (aspect ratio)
1399     // (wide / letterbox / pan-scan) that should be used to display content
1400     // (16 : 9).
1401     // Annex J: Video_Presentation_Mode_Change
1402     // The parameter is a ULONG that has one of the values defined in
1403     // DVD_PREFERRED_DISPLAY_MODE
1404     HRESULT SelectVideoModePreference
1405     ( [in] ULONG ulPreferredDisplayMode
1406     );
1407    
1408     // SetDVDDirectory
1409     // Sets the root directory containing the DVD-Video volume.
1410     // Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
1411     // If the root directory is not successfully set before
1412     // IMediaControl::Play is called, the first drive starting from c:
1413     // containing a VIDEO_TS directory in the top level directory
1414     // will be used as the root.
1415     HRESULT SetDVDDirectory
1416     ( [in] LPCWSTR pszwPath
1417     );
1418    
1419     // ActivateAtPosition
1420     // This is typically called in response to a mouse click.
1421     // The specified point within the display window is to see if it is
1422     // within a current DVD button's highlight rect. If it is, that
1423     // button is first selected, then activated.
1424     // NOTE: DVD Buttons do not all necessarily have highlight rects,
1425     // button rects can overlap, and button rects do not always
1426     // correspond to the visual representation of DVD buttons.
1427     HRESULT ActivateAtPosition // typically called after a mouse click
1428     ( [in] POINT point
1429     );
1430    
1431     // SelectAtPosition
1432     // This is typically called in response to a mouse move within the
1433     // display window.
1434     // The specified point within the display window is to see if it is
1435     // within a current DVD button's highlight rect. If it is, that
1436     // button is selected.
1437     // NOTE: DVD Buttons do not all necessarily have highlight rects,
1438     // button rects can overlap, and button rects do not always
1439     // correspond to the visual representation of DVD buttons.
1440     HRESULT SelectAtPosition // typically called after a mouse move
1441     ( [in] POINT point
1442     );
1443    
1444     // PlayChaptersAutoStop
1445     // Start playing at the specified chapter within the specified title
1446     // and play the number of chapters specified by the third parameter.
1447     // Then the playback stops by sending an event EC_DVD_CHAPTER_AUTOSTOP.
1448     // Title ranges from 1 to 99.
1449     // Chapter (and number of chapters to play) ranges from 1 to 999.
1450     HRESULT PlayChaptersAutoStop
1451     ( [in] ULONG ulTitle, // title number
1452     [in] ULONG ulChapter, // chapter number to start playback
1453     [in] ULONG ulChaptersToPlay, // number of chapters to play from the start chapter
1454     [in] DWORD dwFlags,
1455     [out] IDvdCmd** ppCmd
1456     );
1457    
1458     // AcceptParentalLevelChange
1459     //
1460     // Application's way of informing the Navigator that the required parental
1461     // level change indicated through a previous event was accepted or rejected
1462     // by the app (and unblock the Navigator).
1463     //
1464     // FALSE - reject the disc's request to change the current parental level.
1465     // TRUE - change the parental level as required by the disc.
1466     HRESULT AcceptParentalLevelChange
1467     ( [in] BOOL bAccept
1468     );
1469    
1470     // SetOption(flag, true/false )
1471     // Flags:
1472     //
1473     // DVD_ResetOnStop
1474     // Disable reset of the Navigator's internal state on the
1475     // subsequent IMediaControl::Stop() call(s).
1476     //
1477     // FALSE - Navigator does not reset its state on the subsequent Stop calls
1478     // (play from the current location on next Run call).
1479     // TRUE - (default) Navigator resets its state on the subsequent Stop call
1480     // (play from the first play PGC on the Run call after the Stop).
1481     //
1482     // DVD_NotifyParentalLevelChange
1483     //
1484     // Allows the application to indicate to the Navigator that it wants to control
1485     // parent level change (e.g., through a dialog box) and indicate the acceptance
1486     // or rejection of the new parental level to the Navigator through
1487     // AcceptParentalLevelChange().
1488     //
1489     // FALSE - disable (default). Always reject request by the disc to change parental level.
1490     // TRUE - enable. Navigator will send the app a 'EC_DVD_PARENTAL_LEVEL_CHANGE' event
1491     // and block until AcceptParentalLevelChange() is called by the app.
1492     //
1493     // DVD_HMSF_TimeCodeEvents
1494     //
1495     // Lets the application specify to the Navigator if it wants to get the new time
1496     // event EC_DVD_CURRENT_HMSF_TIME with the HMSF format rather than the older
1497     // EC_DVD_CURRENT_TIME events.
1498     //
1499     // FALSE - disable (default). Older EC_DVD_CURRENT_TIME events are returned.
1500     // TRUE - enable. Navigator will send the app EC_DVD_CURRENT_HMSF_TIME events.
1501    
1502     HRESULT SetOption
1503     ( [in] DVD_OPTION_FLAG flag,
1504     [in] BOOL fState
1505     );
1506    
1507     // SetState
1508     //
1509     // The navigator will use the location information in the given state object to restore
1510     // the navigator's position to a specific location on the disc.
1511     // A valid state object is returned by either calling GetState(), or by using
1512     // "CoCreateInstance( CLSID_DVDState, NULL, CLSCTX_INPROC_SERVER, IID_IDvdState, (void **) ppState )"
1513     // to create a state object, followed by pState->IPersist::Load() to read it from memory or disk.
1514     //
1515     HRESULT SetState
1516     ( [in] IDvdState* pState,
1517     [in] DWORD dwFlags,
1518     [out] IDvdCmd** ppCmd
1519    
1520     );
1521    
1522     // PlayPeriodInTitleAutoStop
1523     //
1524     // Start playing from the specified time within the specified title number until the specified end time.
1525     // NOTE: the actual start and end times will be the closest sync points before
1526     // or equal to the specified frame number.
1527     // Annex J: Time_Play for a limited range
1528     // Title numbers range between 1 and 99.
1529     HRESULT PlayPeriodInTitleAutoStop
1530     ( [in] ULONG ulTitle,
1531     [in] DVD_HMSF_TIMECODE* pStartTime,
1532     [in] DVD_HMSF_TIMECODE* pEndTime,
1533     [in] DWORD dwFlags,
1534     [out] IDvdCmd** ppCmd
1535     );
1536    
1537     // SetGPRM
1538     // Sets the current contents of a DVD General Parameter Register.
1539     // Use of GPRMs is title specific.
1540    
1541     HRESULT SetGPRM
1542     ( [in] ULONG ulIndex,
1543     [in] WORD wValue,
1544     [in] DWORD dwFlags,
1545     [out] IDvdCmd** ppCmd
1546     );
1547    
1548     // SelectDefaultMenuLanguage
1549     // Selects the default language for menus.
1550     // Languages are specified with Windows standard LCIDs. LCIDs can be created
1551     // from ISO-639 codes with
1552     // MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT ).
1553     // SelectMenuLanguage may only called from the DVD Stop state (DVD_DOMAIN_Stop).
1554     // Annex J: Menu_Language_Select
1555     //
1556     // NOT TRUE ANYMORE:
1557     // NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
1558     // instead of 'ja' for the ISO639 code for Japanese.
1559     HRESULT SelectDefaultMenuLanguage
1560     ( [in] LCID Language
1561     );
1562    
1563     // SelectDefaultAudioLanguage
1564     // Selects the default audio language.
1565     // Languages are specified with Windows standard LCIDs.
1566     HRESULT SelectDefaultAudioLanguage
1567     ( [in] LCID Language,
1568     [in] DVD_AUDIO_LANG_EXT audioExtension
1569     );
1570    
1571     // SelectDefaultSubpictureLanguage
1572     // Selects the default subpicture language.
1573     // Languages are specified with Windows standard LCIDs.
1574     HRESULT SelectDefaultSubpictureLanguage
1575     ( [in] LCID Language,
1576     [in] DVD_SUBPICTURE_LANG_EXT subpictureExtension
1577     );
1578     }
1579    
1580    
1581     //==========================================================================
1582     //==========================================================================
1583     // IDvdInfo2 interface -- allows an app to query for attributes of available
1584     // DVD titles and DVD player status. Also allows for control of a DVD
1585     // player beyond Annex J in the DVD spec.
1586     //==========================================================================
1587     //==========================================================================
1588    
1589     enum DVD_TextStringType {
1590     // disc structure (0x00..0x0f)
1591     DVD_Struct_Volume = 0x01,
1592     DVD_Struct_Title = 0x02,
1593     DVD_Struct_ParentalID = 0x03,
1594     DVD_Struct_PartOfTitle = 0x04,
1595     DVD_Struct_Cell = 0x05,
1596     // stream (0x10..0x1f)
1597     DVD_Stream_Audio = 0x10,
1598     DVD_Stream_Subpicture = 0x11,
1599     DVD_Stream_Angle = 0x12,
1600     // channel in stream (0x20..0x2f)
1601     DVD_Channel_Audio = 0x20,
1602    
1603     // Application information
1604     // General (0x30..0x37)
1605     DVD_General_Name = 0x30,
1606     DVD_General_Comments = 0x31,
1607    
1608     // Title (0x38..0x3f)
1609     DVD_Title_Series = 0x38,
1610     DVD_Title_Movie = 0x39,
1611     DVD_Title_Video = 0x3a,
1612     DVD_Title_Album = 0x3b,
1613     DVD_Title_Song = 0x3c,
1614     DVD_Title_Other = 0x3f,
1615    
1616     // Title (sub) (0x40..0x47)
1617     DVD_Title_Sub_Series = 0x40,
1618     DVD_Title_Sub_Movie = 0x41,
1619     DVD_Title_Sub_Video = 0x42,
1620     DVD_Title_Sub_Album = 0x43,
1621     DVD_Title_Sub_Song = 0x44,
1622     DVD_Title_Sub_Other = 0x47,
1623    
1624     // Title (original) (0x48..0x4f)
1625     DVD_Title_Orig_Series = 0x48,
1626     DVD_Title_Orig_Movie = 0x49,
1627     DVD_Title_Orig_Video = 0x4a,
1628     DVD_Title_Orig_Album = 0x4b,
1629     DVD_Title_Orig_Song = 0x4c,
1630     DVD_Title_Orig_Other = 0x4f,
1631    
1632     // Other info (0x50..0x57)
1633     DVD_Other_Scene = 0x50,
1634     DVD_Other_Cut = 0x51,
1635     DVD_Other_Take = 0x52,
1636    
1637     // Language 0x58..0x5b
1638     // Work 0x5c..0x6b
1639     // Character 0x6c..0x8f
1640     // Data 0x90..0x93
1641     // Karaoke 0x94..0x9b
1642     // Category 0x9c..0x9f
1643     // Lyrics 0xa0..0xa3
1644     // Document 0xa4..0xa7
1645     // Others 0xa8..0xab
1646     // Reserved 0xac..0xaf
1647     // Admin 0xb0..0xb7
1648     // more admin 0xb8..0xc0
1649     // Reserved 0xd0..0xdf
1650     // vendor 0xe0..0xef
1651     // extension 0xf0..0xf7
1652     // reserved 0xf8..0xff
1653     };
1654    
1655     enum DVD_TextCharSet {
1656     DVD_CharSet_Unicode = 0,
1657     DVD_CharSet_ISO646 = 1,
1658     DVD_CharSet_JIS_Roman_Kanji = 2,
1659     DVD_CharSet_ISO8859_1 = 3,
1660     DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4
1661     };
1662    
1663     cpp_quote ("#define DVD_TITLE_MENU 0x000")
1664     cpp_quote ("#define DVD_STREAM_DATA_CURRENT 0x800")
1665     cpp_quote ("#define DVD_STREAM_DATA_VMGM 0x400")
1666     cpp_quote ("#define DVD_STREAM_DATA_VTSM 0x401")
1667     cpp_quote ("#define DVD_DEFAULT_AUDIO_STREAM 0x0f")
1668    
1669     // DVD Decoder Caps data
1670     typedef struct tagDVD_DECODER_CAPS
1671     {
1672     DWORD dwSize ; // size of this struct
1673     DWORD dwAudioCaps ; // bits indicating audio support (AC3, DTS, SDDS, LPCM etc.) of decoder
1674     double dFwdMaxRateVideo ; // max data rate for video going forward
1675     double dFwdMaxRateAudio ; // ... .. .. ... audio ... ...
1676     double dFwdMaxRateSP ; // ... .. .. ... SP ... ...
1677     double dBwdMaxRateVideo ; // if smooth reverse is not available, this will be set to 0
1678     double dBwdMaxRateAudio ; // -- ditto --
1679     double dBwdMaxRateSP ; // -- ditto --
1680     DWORD dwRes1 ; // reserved for future expansion
1681     DWORD dwRes2 ; // -- ditto --
1682     DWORD dwRes3 ; // -- ditto --
1683     DWORD dwRes4 ; // -- ditto --
1684     } DVD_DECODER_CAPS ;
1685    
1686     // Bits for decoder's audio format support
1687     cpp_quote ("#define DVD_AUDIO_CAPS_AC3 0x00000001")
1688     cpp_quote ("#define DVD_AUDIO_CAPS_MPEG2 0x00000002")
1689     cpp_quote ("#define DVD_AUDIO_CAPS_LPCM 0x00000004")
1690     cpp_quote ("#define DVD_AUDIO_CAPS_DTS 0x00000008")
1691     cpp_quote ("#define DVD_AUDIO_CAPS_SDDS 0x00000010")
1692    
1693    
1694     [
1695     object,
1696     uuid(34151510-EEC0-11D2-8201-00A0C9D74842),
1697     pointer_default(unique)
1698     ]
1699    
1700     interface IDvdInfo2 : IUnknown {
1701     import "unknwn.idl";
1702    
1703     // GetCurrentDomain
1704     // Returns the current DVD Domain of the DVD player.
1705     HRESULT GetCurrentDomain
1706     ( [out] DVD_DOMAIN *pDomain
1707     );
1708    
1709     // GetCurrentLocation
1710     // Returns information sufficient to restart playback of a video
1711     // from the current playback location in titles that don't explicitly
1712     // disable seeking to the current location.
1713     HRESULT GetCurrentLocation
1714     ( [out] DVD_PLAYBACK_LOCATION2 *pLocation
1715     );
1716    
1717     // GetTotalTitleTime
1718     // Returns the total playback time for the current title. Only works
1719     // for One_Sequential_PGC_Titles.
1720     // THIS SHOULD CHANGE, RIGHT?
1721     HRESULT GetTotalTitleTime
1722     ( [out] DVD_HMSF_TIMECODE* pTotalTime,
1723     [out] ULONG* ulTimeCodeFlags // union of DVD_TIMECODE_FLAGS
1724     );
1725    
1726     // GetCurrentButton
1727     // Indicates the number of currently available buttons and the current
1728     // selected button number. If buttons are not present it returns 0 for
1729     // both pulButtonsAvailable and pulCurrentButton
1730     HRESULT GetCurrentButton
1731     ( [out] ULONG * pulButtonsAvailable,
1732     [out] ULONG * pulCurrentButton
1733     );
1734    
1735     // GetCurrentAngle
1736     // Indicates the number of currently available angles and the current
1737     // selected angle number. If *pulAnglesAvailable is returned as 1 then
1738     // the current content is not multiangle.
1739     HRESULT GetCurrentAngle
1740     ( [out] ULONG * pulAnglesAvailable,
1741     [out] ULONG * pulCurrentAngle
1742     );
1743    
1744     // GetCurrentAudio
1745     // Indicates the number of currently available audio streams and
1746     // the currently selected audio stream number.
1747     // This only works inside the Title domain.
1748     HRESULT GetCurrentAudio
1749     ( [out] ULONG * pulStreamsAvailable,
1750     [out] ULONG * pulCurrentStream
1751     );
1752    
1753     // GetCurrentSubpicture
1754     // Indicates the number of currently available subpicture streams,
1755     // the currently selected subpicture stream number, and if the
1756     // subpicture display is currently disabled. Subpicture streams
1757     // authored as "Forcedly Activated" stream will be displayed even if
1758     // subpicture display has been disabled by the app with
1759     // IDVDControl::SetSubpictureState.
1760     // This only works inside the Title domain.
1761     HRESULT GetCurrentSubpicture
1762     ( [out] ULONG * pulStreamsAvailable,
1763     [out] ULONG * pulCurrentStream,
1764     [out] BOOL * pbIsDisabled
1765     );
1766    
1767     // GetCurrentUOPS
1768     // Indicates which IDVDControl methods (Annex J user operations) are
1769     // currently valid. DVD titles can enable or disable individual user
1770     // operations at almost any point during playback.
1771     HRESULT GetCurrentUOPS
1772     ( [out] ULONG * pulUOPs
1773     );
1774    
1775     // GetAllSPRMs
1776     // Returns the current contents of all DVD System Parameter Registers.
1777     // See DVD-Video spec for use of individual registers.
1778     // WE SHOULD DOC THE SPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
1779     HRESULT GetAllSPRMs
1780     ( [out] SPRMARRAY * pRegisterArray
1781     );
1782    
1783     // GetAllGPRMs
1784     // Returns the current contents of all DVD General Parameter Registers.
1785     // Use of GPRMs is title specific.
1786     // WE SHOULD DOC THE GPRMs RATHER THAN ASKING TO REFER TO DVD SPEC.
1787     HRESULT GetAllGPRMs
1788     ( [out] GPRMARRAY * pRegisterArray
1789     );
1790    
1791     // GetAudioLanguage
1792     // Returns the language of the specified stream within the current title.
1793     // Does not return languages for menus. Returns *pLanguage as 0 if the
1794     // stream does not include language.
1795     // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
1796     // to create a human readable string name from the returned LCID.
1797     HRESULT GetAudioLanguage
1798     ( [in] ULONG ulStream,
1799     [out] LCID * pLanguage
1800     );
1801    
1802     // GetSubpictureLanguage
1803     // Returns the language of the specified stream within the current title.
1804     // Does not return languages for menus. Returns *pLanguage=0 as 0 if the
1805     // stream does not include language.
1806     // Use Win32 API GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
1807     // to create a human readable string name from the returned LCID.
1808     HRESULT GetSubpictureLanguage
1809     ( [in] ULONG ulStream,
1810     [out] LCID * pLanguage
1811     );
1812    
1813     // GetTitleAttributes
1814     // Returns attributes of all video, audio, and subpicture streams for the
1815     // specified title including menus.
1816     // If 0xffffffff is specified as ulTitle, attributes for the current title
1817     // are returned.
1818     HRESULT GetTitleAttributes
1819     ( [in] ULONG ulTitle, // requested title number
1820     [out] DVD_MenuAttributes * pMenu,
1821     [out] DVD_TitleAttributes * pTitle
1822     );
1823    
1824     // GetVMGAttributes
1825     // Returns attributes of all video, audio, and subpicture
1826     // streams for Video Manager Menus. This method suppliments GetTitleAttributes()
1827     // for some menus, such as the Title menu, which are in a separate group of
1828     // streams called the VMG (Video Manager) and are not associated with any
1829     // particular title number.
1830     HRESULT GetVMGAttributes
1831     ( [out] DVD_MenuAttributes* pATR
1832     );
1833    
1834     // GetCurrentVideoAttributes
1835     // Returns the video attributes for the current title or menu.
1836     //
1837     HRESULT GetCurrentVideoAttributes
1838     ( [out] DVD_VideoAttributes * pATR
1839     );
1840    
1841     // GetAudioAttributes
1842     // Returns the audio attributes for the specified stream in the current title
1843     // or menu.
1844     HRESULT GetAudioAttributes
1845     ( [in] ULONG ulStream,
1846     [out] DVD_AudioAttributes *pATR
1847     );
1848    
1849     // GetKaraokeChannelContents
1850     // Returns the karaoke contents of each channel of the specified stream in the current title
1851     // or menu.
1852     HRESULT GetKaraokeAttributes
1853     ( [in] ULONG ulStream,
1854     [out] DVD_KaraokeAttributes* pAttributes
1855     );
1856    
1857     // GetSubpictureAttributes
1858     // Returns the subpicture attributes for the specified stream in the current
1859     // title or menu.
1860     HRESULT GetSubpictureAttributes
1861     ( [in] ULONG ulStream,
1862     [out] DVD_SubpictureAttributes *pATR
1863     );
1864    
1865     // GetDVDVolumeInfo
1866     // Returns current DVD volume information.
1867     HRESULT GetDVDVolumeInfo
1868     ( [out] ULONG *pulNumOfVolumes, // number of volumes (disc sides?) in a volume set
1869     [out] ULONG *pulVolume, // volume number for current DVD directory
1870     [out] DVD_DISC_SIDE *pSide, // current disc side
1871     [out] ULONG *pulNumOfTitles // number of titles available in this volume
1872     );
1873    
1874     // GetDVDTextNumberOfLanguages
1875     // Returns the number of text languages for the current DVD directory.
1876     // Should return some error code if no root directory is found.
1877     HRESULT GetDVDTextNumberOfLanguages
1878     ( [out] ULONG * pulNumOfLangs
1879     );
1880    
1881     // GetDVDTextLanguageInfo
1882     // Returns the text languages information (number of strings, language code,
1883     // char set) for the specified language index.
1884     // Should return some error code if an invalid text index is specified.
1885     HRESULT GetDVDTextLanguageInfo
1886     ( [in] ULONG ulLangIndex,
1887     [out] ULONG* pulNumOfStrings,
1888     [out] LCID* pLangCode,
1889     [out] enum DVD_TextCharSet * pbCharacterSet
1890     );
1891    
1892     // GetDVDTextStringAsNative
1893     // Returns the text string as an array of bytes for the specified language
1894     // index.and string index.
1895     // Should return some error code if an invalid text or string index is specified.
1896     // It also just returns the length of the string if pchBuffer is specified as NULL.
1897     HRESULT GetDVDTextStringAsNative
1898     ( [in] ULONG ulLangIndex,
1899     [in] ULONG ulStringIndex,
1900     [out] BYTE* pbBuffer,
1901     [in] ULONG ulMaxBufferSize,
1902     [out] ULONG* pulActualSize,
1903     [out] enum DVD_TextStringType* pType
1904     );
1905    
1906     // GetDVDTextStringAsUnicode
1907     // Returns the text string in Unicode for the specified language index.and string index.
1908     // Should return some error code if an invalid text or string index is specified.
1909     // It also just returns the length of the string if pchBuffer is specified as NULL.
1910     HRESULT GetDVDTextStringAsUnicode
1911     ( [in] ULONG ulLangIndex,
1912     [in] ULONG ulStringIndex,
1913     [out] WCHAR* pchwBuffer,
1914     [in] ULONG ulMaxBufferSize,
1915     [out] ULONG* pulActualSize,
1916     [out] enum DVD_TextStringType* pType
1917     );
1918    
1919     // GetPlayerParentalLevel
1920     // Returns the current parental level and the current country code that has
1921     // been set in the system registers in player.
1922     // See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
1923     // Valid Parental Levels range from 1 to 8 if parental management is enabled.
1924     // Returns 0xffffffff if parental management is disabled
1925     // See ISO3166 : Alpha-2 Code for the country codes.
1926     HRESULT GetPlayerParentalLevel
1927     ( [out] ULONG *pulParentalLevel, // current parental level
1928     [out] BYTE pbCountryCode[2] // current country code
1929     );
1930    
1931     // GetNumberOfChapters
1932     // Returns the number of chapters that are defined for a
1933     // given title.
1934     HRESULT GetNumberOfChapters
1935     ( [in] ULONG ulTitle, // Title for which number of chapters is requested
1936     [out] ULONG *pulNumOfChapters // Number of chapters for the specified title
1937     );
1938    
1939     // GetTitleParentalLevels
1940     // Returns the parental levels that are defined for a particular title.
1941     // pulParentalLevels will be combination of DVD_PARENTAL_LEVEL_8,
1942     // DVD_PARENTAL_LEVEL_6, or DVD_PARENTAL_LEVEL_1 OR-ed together
1943     HRESULT GetTitleParentalLevels
1944     ( [in] ULONG ulTitle, // Title for which parental levels are requested
1945     [out] ULONG *pulParentalLevels // Parental levels defined for the title "OR"ed together
1946     );
1947    
1948     // GetDVDDirectory
1949     // Returns the root directory that is set in the player. If a valid root
1950     // has been found, it returns the root string. Otherwise, it returns 0 for
1951     // pcbActualSize indicating that a valid root directory has not been found
1952     // or initialized.
1953     //
1954     // !!! used to return LPTSTR. interface was changed to return
1955     // LPSTR (ansi) for compatibility. COM APIs should pass with
1956     // UNICODE strings only.
1957     //
1958     HRESULT GetDVDDirectory
1959     ( [out, size_is(ulMaxSize)] LPWSTR pszwPath, // pointer to buffer to get root string
1960     [in] ULONG ulMaxSize, // size of buffer in WCHARs passed in
1961     [out] ULONG *pulActualSize // size of actual data returned (in WCHARs)
1962     );
1963    
1964    
1965     // IsAudioStreamEnabled
1966     //
1967     // Determines if the specified audio stream is enabled/disabled in the current PGC.
1968     //
1969     // ulStreamNum - audio stream number to test
1970     // pbEnabled - where to place the result
1971     HRESULT IsAudioStreamEnabled
1972     ( [in] ULONG ulStreamNum, // stream number to test
1973     [out] BOOL *pbEnabled // returned state
1974     );
1975    
1976     // GetDiscID
1977     //
1978     // If pszwPath is specified as NULL, DVD Navigator will use the current path
1979     // that would be returned by GetDVDDirectory() at this point.
1980     //
1981     // Returns a 64-bit identification number for the specified DVD disc.
1982     HRESULT GetDiscID
1983     ( [in] LPCWSTR pszwPath, // root path (should we rather use const WCHAR*?)
1984     [out] ULONGLONG* pullDiscID // 64-bit unique id for the disc
1985     ) ;
1986    
1987     // GetState
1988     //
1989     // The navigator will create a new state object and save the current location into it.
1990     // The state object can be used to restore the navigator the saved location at a later time.
1991     // A new IDvdState object is created (with a single AddRef) and returned in *pStateData.
1992     // The object must be Released() when the application is finished with it.
1993     //
1994     HRESULT GetState
1995     ( [out] IDvdState **pStateData // returned object
1996     );
1997    
1998     //
1999     // GetMenuLanguages
2000     //
2001     // Navigator gets all of the menu languages for the VMGM and VTSM domains.
2002     //
2003     HRESULT GetMenuLanguages
2004     ( [out] LCID *pLanguages, // data buffer (NULL returns #languages)
2005     [in] ULONG ulMaxLanguages, // maxiumum number of languages to retrieve
2006     [out] ULONG *pulActualLanguages // actual number of languages retrieved
2007     );
2008    
2009     //
2010     // GetButtonAtPosition
2011     //
2012     // This is typically called in response to a mouse move within the
2013     // display window.
2014     // It returns the button located at the specified point within the display window.
2015     // If no button is present at that position, then VFW_E_DVD_NO_BUTTON is returned.
2016     // Button indices start at 1.
2017     //
2018     // NOTE: DVD Buttons do not all necessarily have highlight rects,
2019     // button rects can overlap, and button rects do not always
2020     // correspond to the visual representation of DVD buttons.
2021     HRESULT GetButtonAtPosition // typically called after a mouse move
2022     ( [in] POINT point,
2023     [out] ULONG *pulButtonIndex
2024     );
2025    
2026     //
2027     // GetCmdFromEvent
2028     //
2029     // This method maps an EC_DVD_CMD_BEGIN/COMPLETE/CANCEL event's lParam1 into an AddRef'd
2030     // IDvdCmd pointer. You must Release the returned pointer. NULL is returned if the function
2031     // fails.
2032     //
2033     HRESULT GetCmdFromEvent
2034     ( [in] LONG_PTR lParam1,
2035     [out] IDvdCmd **pCmdObj
2036     );
2037    
2038     // GetDefaultMenuLanguage
2039     // Returns the default language for menus.
2040     HRESULT GetDefaultMenuLanguage
2041     ( [out] LCID * pLanguage
2042     );
2043    
2044     // GetDefaultAudioLanguage
2045     // Gets the default audio language.
2046     // Languages are specified with Windows standard LCIDs.
2047     HRESULT GetDefaultAudioLanguage
2048     ( [out] LCID* pLanguage,
2049     [out] DVD_AUDIO_LANG_EXT* pAudioExtension
2050     );
2051    
2052     // GetDefaultSubpictureLanguage
2053     // Gets the default subpicture language.
2054     // Languages are specified with Windows standard LCIDs.
2055     HRESULT GetDefaultSubpictureLanguage
2056     ( [out] LCID* pLanguage,
2057     [out] DVD_SUBPICTURE_LANG_EXT* pSubpictureExtension
2058     );
2059    
2060     //
2061     // GetDecoderCaps:
2062     // Retrieves the DVD decoder's details about max data rate for video, audio
2063     // and subpicture (going backward and forward) as well as support for various
2064     // types of audio (AC3, MPEG2, DTS, SDDS, LPCM).
2065     //
2066     HRESULT GetDecoderCaps
2067     ( [out] DVD_DECODER_CAPS *pCaps
2068     ) ;
2069    
2070     //
2071     // GetButtonRect:
2072     // Retrieves the coordinates for a given button number
2073     //
2074     HRESULT GetButtonRect
2075     ( [in] ULONG ulButton,
2076     [out] RECT *pRect
2077     ) ;
2078    
2079     // IsSubpictureStreamEnabled
2080     //
2081     // Determines if the specified subpicture stream is enabled/disabled in the current PGC.
2082     //
2083     // ulStreamNum - Subpicture stream number to test
2084     // pbEnabled - where to place the result
2085     HRESULT IsSubpictureStreamEnabled
2086     ( [in] ULONG ulStreamNum, // stream number to test
2087     [out] BOOL *pbEnabled // returned state
2088     );
2089     }
2090    
2091    
2092    
2093     //==========================================================================
2094     //==========================================================================
2095     //
2096     // typedefs used by IDvdGraphBuilder interface.
2097     //
2098     //==========================================================================
2099     //==========================================================================
2100    
2101     typedef enum _AM_DVD_GRAPH_FLAGS {
2102     AM_DVD_HWDEC_PREFER = 0x01, // default
2103     AM_DVD_HWDEC_ONLY = 0x02,
2104     AM_DVD_SWDEC_PREFER = 0x04,
2105     AM_DVD_SWDEC_ONLY = 0x08,
2106     AM_DVD_NOVPE = 0x100
2107     } AM_DVD_GRAPH_FLAGS ;
2108    
2109     typedef enum _AM_DVD_STREAM_FLAGS {
2110     AM_DVD_STREAM_VIDEO = 0x01,
2111     AM_DVD_STREAM_AUDIO = 0x02,
2112     AM_DVD_STREAM_SUBPIC = 0x04
2113     } AM_DVD_STREAM_FLAGS ;
2114    
2115     typedef struct {
2116     HRESULT hrVPEStatus ; // VPE mixing error code (0 => success)
2117     BOOL bDvdVolInvalid ; // Is specified DVD volume invalid?
2118     BOOL bDvdVolUnknown ; // Is DVD volume to be played not specified/not found?
2119     BOOL bNoLine21In ; // video decoder doesn't produce line21 (CC) data
2120     BOOL bNoLine21Out ; // can't show decoded line21 data as CC on video
2121     int iNumStreams ; // number of DVD streams to render
2122     int iNumStreamsFailed ; // number of streams failed to render
2123     DWORD dwFailedStreamsFlag ; // combination of flags to indicate failed streams
2124     } AM_DVD_RENDERSTATUS ;
2125    
2126    
2127     //
2128     // IDvdGraphBuilder interface to build a filter graph for DVD-Video playback.
2129     //
2130    
2131     [
2132     object,
2133     local,
2134     uuid(FCC152B6-F372-11d0-8E00-00C04FD7C08B),
2135     pointer_default(unique)
2136     ]
2137     interface IDvdGraphBuilder : IUnknown {
2138    
2139     // Returns the IGraphBuilder interface for the filtergraph used by the
2140     // CDvdGraphBuilder object.
2141     // Remember to *ppGB->Release() when you're done with it
2142     HRESULT GetFiltergraph
2143     ( [out] IGraphBuilder **ppGB
2144     ) ;
2145    
2146     // Gets specific interface pointers in the DVD-Video playback graph to
2147     // make DVD-Video playback development easier.
2148     // It helps get the following interfaces to control playback/show CC/
2149     // position window/control volume etc:
2150     // - IDvdControl, IDvdInfo
2151     // - IAMLine21Decoder
2152     // - IVideoWindow, IBasicVideo
2153     // - IBasicAudio
2154     // This method will return
2155     // a) E_INVALIDARG if ppvIF is invalid
2156     // b) E_NOINTERFACE if riid is an IID we don't know about
2157     // c) VFW_E_DVD_GRAPHNOTREADY if the graph has not been built through
2158     // RenderDvdVideoVolume() yet.
2159     // Remember to *ppvIF->Release() when you're done with it
2160     HRESULT GetDvdInterface
2161     ( [in] REFIID riid, // IID of the interface required
2162     [out] void **ppvIF // returns pointer to the required interface
2163     ) ;
2164    
2165     // Builds a filter graph according to user specs for playing back a
2166     // DVD-Video volume.
2167     // This method returns S_FALSE if
2168     // 1. the graph has been either built, but either
2169     // a) VPE mixing doesn't work (app didn't use AM_DVD_NOVPE flag)
2170     // b) video decoder doesn't produce line21 data
2171     // c) line21 data couldn't be rendered (decoding/mixing problem)
2172     // d) the call specified an invalid volume path or DVD Nav couldn't
2173     // locate any DVD-Video volume to be played.
2174     // 2. some streams didn't render (completely), but the others have
2175     // been rendered so that the volume can be partially played back.
2176     // The status is indicated through the fields of the pStatus (out)
2177     // parameter.
2178     // About 1(a), the app will have enough info to tell the user that the
2179     // video won't be visible unless a TV is connected to the NTSC out
2180     // port of the DVD decoder (presumably HW in this case).
2181     // For case 1(b) & (c), the app "can" put up a warning/informative message
2182     // that closed captioning is not available because of the decoder.
2183     // 1(d) helps an app to ask the user to insert a DVD-Video disc if none
2184     // is specified/available in the drive when playback is started.
2185     // This method builds the graph even if
2186     // - an invalid DVD-Video volume is specified
2187     // - the caller uses lpwszPathName = NULL to make the DVD Nav to locate
2188     // the default volume to be played back, but DVD Nav doesn't find a
2189     // default DVD-Video volume to be played back.
2190     // An app can later specify the volume using IDvdControl::SetRoot()
2191     // method.
2192     // #2 will help the app indicate to the user that some of the streams
2193     // can't be played.
2194     //
2195     // The graph is built using filters based on the dwFlags value (to use
2196     // HW decoders or SW decoders or a mix of them).
2197     // The dwFlags value is one of the values in AM_DVD_GRAPH_FLAGS enum
2198     // type. The default value is AM_DVD_HWDEC_PREFER. None of the
2199     // AM_DVD_HWDEC_xxx or AM_DVD_SWDEC_xxx flags can be mixed. However
2200     // AM_DVD_NOVPE can be OR-ed with any of the AM_DVD_HWDEC_xxx flags.
2201     //
2202     // The method returns S_OK if the playback graph is built successfully
2203     // with all the streams completely rendered and a valid DVD-Video volume
2204     // is specified or a default one has been located.
2205     //
2206     // If the dwFlags specify conflicting options, E_INVALIDARG is returned.
2207     // If the graph building fails, the method returns one of the following
2208     // error codes:
2209     // VFW_E_DVD_RENDERFAIL, VFW_E_DVD_DECNOTENOUGH
2210     //
2211     HRESULT RenderDvdVideoVolume
2212     ( [in] LPCWSTR lpcwszPathName, // Can be NULL too
2213     [in] DWORD dwFlags, // 0 is the default (use max HW)
2214     [out] AM_DVD_RENDERSTATUS *pStatus // returns indications of ANY failure
2215     ) ;
2216     }
2217    
2218    
2219     //
2220     // DDraw Exclusive Mode Video standard COM interface for Overlay Mixer
2221     //
2222     [
2223     object,
2224     local,
2225     uuid(153ACC21-D83B-11d1-82BF-00A0C9696C8F),
2226     pointer_default(unique)
2227     ]
2228     interface IDDrawExclModeVideo : IUnknown {
2229     // set a ddraw object to be used by the overlay mixer. If even one of the pins
2230     // of the ovmixer is connected, then it won't start using the new ddraw obect
2231     // immediately but just cache it. It will start using it the next time, all its
2232     // pins are disconnected.
2233     HRESULT SetDDrawObject([in] IDirectDraw *pDDrawObject);
2234    
2235     // gets the ddraw object currently being used by the overlay mixer. If the app has not
2236     // set any ddraw object and the ovmixer has not yet allocated one, then *ppDDrawObject
2237     // will be set to NULL and *pbUsingExternal will be set TO FALSE. Otherwise *pbUsingExternal
2238     // will be set to TRUE if the ovmixer is currently USING an app given ddraw object and FALSE
2239     // othewise
2240     HRESULT GetDDrawObject([out] IDirectDraw **ppDDrawObject,
2241     [out] BOOL *pbUsingExternal);
2242    
2243     // set a primary surface to be used by the overlay mixer. If even one of the pins
2244     // of the ovmixer is connected, then it won't start using the new primary surface
2245     // immediately but just cache it. It will start using it the next time, all its
2246     // pins are disconnected.
2247     // Also when the ovmixer does start using an app given primary surface, it will delete
2248     // its output pin (and not draw its own colorkey) since the app is expected to do the
2249     // window management and drawing colorkey etc on the primary surface
2250     // This function makes sure that the surface provided exposes IDirectDrawSurface3, and
2251     // is consistent with the ddraw object provided.
2252     HRESULT SetDDrawSurface([in] IDirectDrawSurface *pDDrawSurface);
2253    
2254     // gets the ddraw surface currently being used by the overlay mixer. If the app has not
2255     // set any ddraw surface and the ovmixer has not yet allocated one, then *ppDDrawSurface
2256     // will be set to NULL and *pbUsingExternal will be set to FALSE. Otherwise *pbUsingExternal
2257     // will be set to TRUE if the ovmixer is curretnly USING an app given ddraw surface and FALSE
2258     // otherwise
2259     HRESULT GetDDrawSurface([out] IDirectDrawSurface **ppDDrawSurface,
2260     [out] BOOL *pbUsingExternal);
2261    
2262     // set draw paramters on the ovmixer (src and dest rect). Note that if the mode
2263     // of the ovmixer is set to LETTER_BOX, then the ovmixer might show the video in
2264     // only a subrect of *prcTarget (see IMixerPinConfig for details).
2265     HRESULT SetDrawParameters([in] const RECT * prcSource,
2266     [in] const RECT * prcTarget);
2267    
2268     // gets the current video size and picture aspect ratio of the primary stream of the overlay mixer
2269     // The app should look for the evene EC_VIDEO_SIZE_AR_CHANGED and on its receipt
2270     // call this function again
2271     HRESULT GetNativeVideoProps([out] DWORD *pdwVideoWidth,
2272     [out] DWORD *pdwVideoHeight,
2273     [out] DWORD *pdwPictAspectRatioX,
2274     [out] DWORD *pdwPictAspectRatioY);
2275    
2276     // Set the callback interface - the callback interface will be defined in a later release
2277     // Currently returns E_NOTIMPL
2278     HRESULT SetCallbackInterface([in] IDDrawExclModeVideoCallback *pCallback,
2279     [in] DWORD dwFlags);
2280     }
2281    
2282    
2283     //
2284     // DDraw Exclusive Mode Video callbacks
2285     //
2286    
2287     // enum for flags
2288     enum _AM_OVERLAY_NOTIFY_FLAGS {
2289     AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001,
2290     AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002,
2291     AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004
2292     };
2293     [
2294     object,
2295     local,
2296     uuid(913c24a0-20ab-11d2-9038-00a0c9697298),
2297     pointer_default(unique)
2298     ]
2299     interface IDDrawExclModeVideoCallback : IUnknown {
2300    
2301     // Called once before UpdateOverlay is called with bBefore == TRUE
2302     // and once after it is called with bBefore == FALSE and otherwise
2303     // identical parameters
2304     HRESULT OnUpdateOverlay(
2305     [in] BOOL bBefore, // After UpdateOverlayCalled?
2306     [in] DWORD dwFlags,// _AM_OVERLAY_NOTIFY enum
2307     [in] BOOL bOldVisible,
2308     [in] const RECT *prcOldSrc,
2309     [in] const RECT *prcOldDest,
2310     [in] BOOL bNewVisible,
2311     [in] const RECT *prcNewSrc,
2312     [in] const RECT *prcNewDest);
2313    
2314     // Called when the surface color key is changed
2315     HRESULT OnUpdateColorKey(
2316     [in] const COLORKEY *pKey,
2317     [in] DWORD dwColor);
2318    
2319     // Called when the video size or aspect ratio changes
2320     HRESULT OnUpdateSize( [in] DWORD dwWidth, // Movie pixel width
2321     [in] DWORD dwHeight, // Movie pixel height
2322     [in] DWORD dwARWidth, // Aspect ratio horizontal
2323     [in] DWORD dwARHeight); // Aspect ratio vertical
2324     }

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26