Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
915 lines
36 KiB
Plaintext
915 lines
36 KiB
Plaintext
//==========================================================================;
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE.
|
|
//
|
|
// Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
//
|
|
// DirectShow interfaces to control playback of a DVD filter graph.
|
|
//
|
|
|
|
// forward declarations - these are the interfaces declared in this file
|
|
|
|
import "unknwn.idl";
|
|
import "objidl.idl";
|
|
|
|
cpp_quote("#include <ddraw.h>")
|
|
|
|
interface IDvdControl;
|
|
interface IDvdInfo;
|
|
interface IDirectDraw;
|
|
interface IDirectDrawSurface;
|
|
interface IDvdGraphBuilder ;
|
|
interface IDDrawExclModeVideo;
|
|
interface IDDrawExclModeVideoCallback;
|
|
|
|
|
|
//==========================================================================
|
|
//==========================================================================
|
|
//
|
|
// typedefs used by IDvdControl and IDvdInfo interfaces.
|
|
//
|
|
//==========================================================================
|
|
//==========================================================================
|
|
|
|
typedef enum tagDVD_DOMAIN {
|
|
// The DVD_DOMAIN is used to indicate the stat of a DVD player.
|
|
DVD_DOMAIN_FirstPlay=1, // doing default initialization of a dvd disc
|
|
DVD_DOMAIN_VideoManagerMenu, // displaying menus for whole disc
|
|
DVD_DOMAIN_VideoTitleSetMenu, // displaying menus for current title set
|
|
DVD_DOMAIN_Title, // displaying current title
|
|
DVD_DOMAIN_Stop // player is in stopped state
|
|
} DVD_DOMAIN;
|
|
|
|
typedef enum tagDVD_MENU_ID {
|
|
DVD_MENU_Title = 2, // to choose a title from any VTS in a DVD-Video volume
|
|
DVD_MENU_Root = 3, // main menu for a specific VTS
|
|
DVD_MENU_Subpicture =4, // to choose subpicture stream in a VTS
|
|
DVD_MENU_Audio = 5, // to choose audio stream in a VTS
|
|
DVD_MENU_Angle = 6, // to choose angle num in a VTS
|
|
DVD_MENU_Chapter = 7 // to choose a chapter in a VTS
|
|
// the Root menu always provides a means of getting to to Subpicture, Audio,
|
|
// Angle and Chapter menus if they exist.
|
|
} DVD_MENU_ID;
|
|
|
|
typedef enum tagDVD_DISC_SIDE {
|
|
DVD_SIDE_A = 1,
|
|
DVD_SIDE_B = 2
|
|
} DVD_DISC_SIDE;
|
|
|
|
|
|
typedef enum tagDVD_PREFERRED_DISPLAY_MODE
|
|
{
|
|
// DVD_PREFERRED_DISPLAY_MODE is used to indicate the user's
|
|
// preferred window aspect ratio and preferred method of converion of
|
|
// 16*9 content to a 4*3 window aspect ratio. Pan-scan and letterboxing are
|
|
// the two conversion methods. This enum is used to indicate only a preference of
|
|
// conversion mechinism since some content can only be converted using one
|
|
// of these methods. 4*3 content is converted to a 16*9 window always by using
|
|
// "reverse" letterboxing where black bars are added to the right and left
|
|
// sides of the display instead of the top and bottom of the display as in the 16*9
|
|
// to 4*3 conversion useing letterboxing.
|
|
DISPLAY_CONTENT_DEFAULT = 0, // default to content
|
|
DISPLAY_16x9 = 1, // 16x9 display
|
|
DISPLAY_4x3_PANSCAN_PREFERRED = 2, // 4x3 display with pan-scan preferrence
|
|
DISPLAY_4x3_LETTERBOX_PREFERRED = 3 // 4x3 display with letterbox preferrence
|
|
|
|
} DVD_PREFERRED_DISPLAY_MODE;
|
|
|
|
typedef WORD DVD_REGISTER;
|
|
typedef DVD_REGISTER GPRMARRAY[16]; // DVD-Video 1.0 has 16 16-bit General Parameter Registers
|
|
typedef DVD_REGISTER SPRMARRAY[24]; // DVD-Video 1.0 has 24 16-bit System Parameter Registers
|
|
|
|
typedef struct tagDVD_ATR
|
|
{
|
|
//
|
|
// Refer to the DVD-Video 1.0 spec to parse these structures.
|
|
//
|
|
ULONG ulCAT; // VMG_CAT if this is for a volume; or VTS_CAT
|
|
// if this is for a Video Title Set (VTS)
|
|
BYTE pbATRI[768];// All stream attributes for menu and title from bytes
|
|
// 256 to 1023 of VMGI or VTSI.
|
|
} DVD_ATR;
|
|
|
|
|
|
typedef BYTE DVD_VideoATR[2]; // video stream attributes. See DVD-Video spec.
|
|
typedef BYTE DVD_AudioATR[8]; // audio stream attributes. See DVD-Video spec.
|
|
typedef BYTE DVD_SubpictureATR[6]; // subpicture stream attributes. See DVD-Video spec.
|
|
|
|
|
|
// DVD Timecode is BCD encoded in this format: 0xHhMmSsFf, where
|
|
// H is tens of hours
|
|
// h is hours
|
|
// M is tens of minutes
|
|
// m is minutes
|
|
// S is tens of seconds
|
|
// s is seconds
|
|
// F is tens of frames
|
|
// f is frames
|
|
// Note that you must know the frame rate to interperate the frame count as time.
|
|
typedef enum tagDVD_FRAMERATE
|
|
{
|
|
DVD_FPS_25 =1, // 25 frames per second
|
|
DVD_FPS_30NonDrop = 3 // exactly 30 frames per second
|
|
} DVD_FRAMERATE;
|
|
|
|
cpp_quote("typedef struct tagDVD_TIMECODE")
|
|
cpp_quote("{")
|
|
cpp_quote(" ULONG Hours1 :4; // Hours")
|
|
cpp_quote(" ULONG Hours10 :4; // Tens of Hours ")
|
|
cpp_quote("")
|
|
cpp_quote(" ULONG Minutes1 :4; // Minutes ")
|
|
cpp_quote(" ULONG Minutes10:4; // Tens of Minutes ")
|
|
cpp_quote("")
|
|
cpp_quote(" ULONG Seconds1 :4; // Seconds ")
|
|
cpp_quote(" ULONG Seconds10:4; // Tens of Seconds ")
|
|
cpp_quote("")
|
|
cpp_quote(" ULONG Frames1 :4; // Frames ")
|
|
cpp_quote(" ULONG Frames10 :2; // Tens of Frames ")
|
|
cpp_quote("")
|
|
cpp_quote(" ULONG FrameRateCode: 2; // use DVD_FRAMERATE to indicate frames/sec and drop/non-drop")
|
|
cpp_quote("} DVD_TIMECODE;")
|
|
|
|
|
|
typedef struct tagDVD_PLAYBACK_LOCATION
|
|
{
|
|
//
|
|
// TitleNum & ChapterNum or TitleNum & TimeCode are sufficient to save
|
|
// playback location for Once_Sequential_PGC_Titles.
|
|
//
|
|
ULONG TitleNum; // title number for whole disc (TTN not VTS_TTN)
|
|
ULONG ChapterNum; // part-of-title number with title. 0xffffffff if not Once_Sequential_PGC_Title
|
|
ULONG TimeCode; // use DVD_TIMECODE for current playback time. 0xffffffff if not Once_Sequential_PGC_Title
|
|
|
|
} DVD_PLAYBACK_LOCATION;
|
|
|
|
typedef DWORD VALID_UOP_SOMTHING_OR_OTHER;
|
|
|
|
// Parental Level Information
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_8 0x8000")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_7 0x4000")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_6 0x2000")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_5 0x1000")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_4 0x0800")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_3 0x0400")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_2 0x0200")
|
|
cpp_quote ("#define DVD_PARENTAL_LEVEL_1 0x0100")
|
|
|
|
|
|
//==========================================================================
|
|
//==========================================================================
|
|
// IDvdControl interface -- Basic DVD-Video playback control.
|
|
// This modeled after the app control of a player specified in Annex J
|
|
// of the DVD Video spec. IDvdInfo can be used to get information useful
|
|
// in using IDvdControl
|
|
//==========================================================================
|
|
//==========================================================================
|
|
|
|
[
|
|
object,
|
|
uuid(A70EFE61-E2A3-11d0-A9BE-00AA0061BE93),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IDvdControl : IUnknown {
|
|
import "unknwn.idl";
|
|
|
|
// TitlePlay
|
|
// Start playing the specified title number.
|
|
// Title numbers range between 1 and 99.
|
|
HRESULT TitlePlay
|
|
( [in] ULONG uiTitle
|
|
);
|
|
|
|
// ChapterPlay
|
|
// Start playing at the specified chapter (or part-of-title)
|
|
// within the specified title. Chapters range from 1 to 999.
|
|
HRESULT ChapterPlay
|
|
( [in] ULONG uiTitle,
|
|
[in] ULONG uiChapter
|
|
);
|
|
|
|
// TimePlay
|
|
// Start playing at the specified time within the specified title.
|
|
// NOTE: the actual start time will be the closest sync point before
|
|
// or equal to the specified frame number.
|
|
HRESULT TimePlay
|
|
( [in] ULONG uiTitle,
|
|
[in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
|
|
);
|
|
|
|
// StopForResume
|
|
// Stop playback after saving resume information. DVD Navigator transfers to the DVD "Stop State" and
|
|
// (same as DVD_DOMAIN_Stop), but filter graph remains in DirectShow's Run state.
|
|
HRESULT StopForResume();
|
|
|
|
// GoUp
|
|
// Start playback of the program chain currently authored as the "GoUp_PGCN".
|
|
HRESULT GoUp();
|
|
|
|
// TimeSearch
|
|
// Start playing at the specified time within the current title.
|
|
// NOTE: the actual start time will be the closest sync point before
|
|
// or equal to the specified frame number.
|
|
HRESULT TimeSearch
|
|
( [in] ULONG bcdTime // use DVD_TIMECODE. Framerate code is ignored.
|
|
);
|
|
|
|
// ChapterSearch
|
|
// Start playing at the specified chapter (or part-of-title) within
|
|
// the current title.
|
|
HRESULT ChapterSearch
|
|
( [in] ULONG Chapter
|
|
);
|
|
|
|
// PrevPGSearch
|
|
// Start playing at the beginning of the previous DVD "program".
|
|
// For One-Sequential_PGC_Titles (which includes most titles) a program
|
|
// is equivalent to a chapter, otherwise a program is part of a chapter.
|
|
HRESULT PrevPGSearch();
|
|
|
|
// TopPGSearch
|
|
// Start playing from the beginning of they current program.
|
|
HRESULT TopPGSearch();
|
|
|
|
// NextPGSearch
|
|
// Start playing from the beginning of the next program.
|
|
HRESULT NextPGSearch();
|
|
|
|
// ForwardScan
|
|
// Set forward play at the specified speed.
|
|
// dwSpeed == 1 is normal play
|
|
// dwSpeed < 1 is slow play
|
|
// dwSpeed > 1 is fast play
|
|
// For dwSpeed != 1, audio and subpicture is muted.
|
|
HRESULT ForwardScan
|
|
( [in] double dwSpeed
|
|
);
|
|
|
|
// BackwardScan
|
|
// Set reverse play at the specified speed.
|
|
// dwSpeed == 1 is normal play speed in reverse
|
|
// dwSpeed < 1 is slow play in reverse
|
|
// dwSpeed > 1 is fast play in reverse
|
|
// For reverse play, audio and subpicture are always muted.
|
|
HRESULT BackwardScan
|
|
( [in] double dwSpeed
|
|
);
|
|
|
|
// MenuCall
|
|
// Start playback of the Menu specified by an enum DVD_MENU_ID.
|
|
HRESULT MenuCall
|
|
( [in] DVD_MENU_ID MenuID
|
|
);
|
|
|
|
// Resume
|
|
// Returns to title playback in DVD_DOMAIN_Title. This is typically
|
|
// done after MenuCall which puts the DVD Navigator in
|
|
// DVD_DOMAIN_VideoTitleSetMenu or DVD_DOMAIN_VideoManagerMenu.
|
|
HRESULT Resume();
|
|
|
|
// UpperButtonSelect
|
|
// Selects the button above the current button.
|
|
// "Selecting" a DVD button simply highlights the button but does
|
|
// not "Activate" the button. Selecting is the Windows equivalent
|
|
// to tabbing to a button but not pressing the space bar or enter key.
|
|
// Activating is the Windows equivalent of pressing the space bar or
|
|
// enter key after tabbing to a button.
|
|
HRESULT UpperButtonSelect();
|
|
|
|
// LowerButtonSelect
|
|
// Selects the button below the current button.
|
|
HRESULT LowerButtonSelect();
|
|
|
|
// LeftButtonSelect
|
|
// Selects the button to the left of the current button.
|
|
HRESULT LeftButtonSelect();
|
|
|
|
// RightButtonSelect
|
|
// Selects the button to the right of the current button.
|
|
HRESULT RightButtonSelect();
|
|
|
|
// ButtonActivate
|
|
// Activates current button.
|
|
HRESULT ButtonActivate();
|
|
|
|
// ButtonSelectAndActivate
|
|
// Selects and then activates the button specified by the user.
|
|
// uiButton is intended to be a number entered by a user corresponding
|
|
// to button numbers currently displayed on screen.
|
|
// Button numbers range from 1 to 36.
|
|
HRESULT ButtonSelectAndActivate
|
|
( [in] ULONG uiButton
|
|
);
|
|
|
|
// StillOff
|
|
// Releases any current still if there are no available buttons.
|
|
// This includes VOBU stills, Cell stills, and PGC stills, whether the
|
|
// still is infinite. When buttons are available, stills are released by
|
|
// activating a button. Note this does not release a Pause.
|
|
HRESULT StillOff();
|
|
|
|
// PauseOn
|
|
// Freezes playback and any internal timers. This is similar to
|
|
// IMediaControl::Pause()
|
|
HRESULT PauseOn();
|
|
|
|
// PauseOff
|
|
// Releases a Pause.
|
|
HRESULT PauseOff();
|
|
|
|
// MenuLanguageSelect
|
|
// Selects the default language for menus. Languages are specified with
|
|
// Windows standard LCIDs. LCIDs can be created from ISO-639 codes with
|
|
// MAKELCID( MAKELANGID(wISO639LangID ,SUBLANG_DEFAULT ), SORT_DEFAULT )
|
|
// NOTE: MAKELANGID seems to have a bug so 'jp' may have to be used
|
|
// instead of 'ja' for the ISO639 code for Japanese.
|
|
// MenuLanguageSelect may only called from the DVD Stop state (DVD_DOMAIN_Stop).
|
|
HRESULT MenuLanguageSelect
|
|
( [in] LCID Language
|
|
);
|
|
|
|
// AudioStreamChange
|
|
// Changes the current audio stream.
|
|
HRESULT AudioStreamChange
|
|
( [in] ULONG nAudio
|
|
);
|
|
|
|
// SubpictureStreamChange
|
|
// Changes the current subpicture stream number to nSubpic, and toggles
|
|
// its display.
|
|
HRESULT SubpictureStreamChange
|
|
( [in] ULONG nSubPicture,
|
|
[in] BOOL bDisplay
|
|
);
|
|
|
|
// AngleChange
|
|
// Changes the current angle number.
|
|
HRESULT AngleChange
|
|
( [in] ULONG ulAngle
|
|
);
|
|
|
|
// ParentalLevelSelect
|
|
// Selects the current player parental level between 1 and 8. The
|
|
// defined parental levels are listed below :
|
|
//
|
|
// Level Rating
|
|
// ----- ------
|
|
//
|
|
// 1 G
|
|
// 3 PG
|
|
// 4 PG13
|
|
// 6 R
|
|
// 7 NC17
|
|
// Higher levels can play lower level content; lower levels cannot play
|
|
// higher level content. The DVD Navigator provides no restriction on
|
|
// setting the parental level. DVD player application may enforce
|
|
// restriction on parental level setting, such as password protection for
|
|
// raising the current parental level. Parental Management is disabled in
|
|
// the Navigator by default.
|
|
//
|
|
// Note : To disable parental management, pass 0xffffffff for ulParentalLevel
|
|
// If parental management is disabled, then the player will play the
|
|
// first PGC in a parental block regardless of parental IDs.
|
|
//
|
|
HRESULT ParentalLevelSelect
|
|
( [in] ULONG ulParentalLevel
|
|
);
|
|
|
|
// ParentalCountrySelect
|
|
// Sets the country in which to interpret the the Parental Level.
|
|
// The country specified using the Alpha-2 code of the ISO-3166 standard,
|
|
// with the addition of 'ZZ'
|
|
HRESULT ParentalCountrySelect
|
|
( [in] WORD wCountry
|
|
);
|
|
|
|
// KaraokeAudioPresentationModeChange
|
|
// Sets the Karaoke audio mode.
|
|
// NOTE: This and all other Karoke support is currently not implemented.
|
|
HRESULT KaraokeAudioPresentationModeChange
|
|
( [in] ULONG ulMode
|
|
);
|
|
|
|
// VideoModePreferrence
|
|
// The user can specify the preferred display mode that should
|
|
// be used to display content. The parameter is a ULONG that has
|
|
// one of the values defined in DVD_PREFERRED_DISPLAY_MODE
|
|
HRESULT VideoModePreferrence
|
|
( [in] ULONG ulPreferredDisplayMode
|
|
);
|
|
|
|
// SetRoot
|
|
// Sets the root directory containing the DVD-Video volume.
|
|
// Can only be called from the DVD Stop State (DVD_DOMAIN_Stop).
|
|
// If the root directory is not successfully set before
|
|
// IMediaControl::Play is called, the first drive starting from c:
|
|
// containing a VIDEO_TS directory in the top level directory
|
|
// will be used as the root.
|
|
HRESULT SetRoot
|
|
( [in] LPCWSTR pszPath
|
|
);
|
|
|
|
// MouseActivate
|
|
// This is typically called in response to a mouse click.
|
|
// The specified point within the display window is to see if it is
|
|
// within a current DVD button's highlight rect. If it is, that
|
|
// button is first selected, then activated.
|
|
// NOTE: DVD Buttons do not all necessarily have highlight rects,
|
|
// button rects can overlap, and button rects do not always
|
|
// correspond to the visual representation of DVD buttons.
|
|
HRESULT MouseActivate // typically called after a mouse click
|
|
( [in] POINT point
|
|
);
|
|
|
|
// MouseSelect
|
|
// This is typically called in response to a mouse move within the
|
|
// display window.
|
|
// The specified point within the display window is to see if it is
|
|
// within a current DVD button's highlight rect. If it is, that
|
|
// button is selected.
|
|
// NOTE: DVD Buttons do not all necessarily have highlight rects,
|
|
// button rects can overlap, and button rects do not always
|
|
// correspond to the visual representation of DVD buttons.
|
|
HRESULT MouseSelect // typically called after a mouse move
|
|
( [in] POINT point
|
|
);
|
|
|
|
// ChapterPlayAutoStop
|
|
// Start playing at the specified chapter within the specified title
|
|
// and play the number of chapters specified by the third parameter.
|
|
// Chapters range from 1 to 999.
|
|
HRESULT ChapterPlayAutoStop
|
|
( [in] ULONG ulTitle, // title number
|
|
[in] ULONG ulChapter, // chapter number to start playback
|
|
[in] ULONG ulChaptersToPlay // number of chapters to play from the start chapter
|
|
);
|
|
}
|
|
|
|
|
|
|
|
//==========================================================================
|
|
//==========================================================================
|
|
// IDvdInfo interface -- allow an app to query for attributes of available
|
|
// DVD titles and DVD player status. Also allow for control of a DVD
|
|
// player beyond Annex J in the DVD spec.
|
|
//==========================================================================
|
|
//==========================================================================
|
|
|
|
[
|
|
object,
|
|
uuid(A70EFE60-E2A3-11d0-A9BE-00AA0061BE93),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IDvdInfo : IUnknown {
|
|
import "unknwn.idl";
|
|
|
|
// GetCurrentDomain
|
|
// Returns the current DVD Domain of the DVD player.
|
|
HRESULT GetCurrentDomain
|
|
( [out] DVD_DOMAIN *pDomain
|
|
);
|
|
|
|
// GetCurrentLocation
|
|
// Returns information sufficient to restart playback of a video
|
|
// from the current playback location in titles that don't explicitly
|
|
// disable seeking to the current location.
|
|
HRESULT GetCurrentLocation
|
|
( [out] DVD_PLAYBACK_LOCATION *pLocation
|
|
);
|
|
|
|
// GetTotalTitleTime
|
|
// Return the total playback time for the current title. Only works
|
|
// for One_Sequential_PGC_Titles.
|
|
HRESULT GetTotalTitleTime
|
|
( [out] ULONG * pTotalTime // use DVD_TIMECODE.
|
|
);
|
|
|
|
// GetCurrentButton
|
|
// Indicates the number of currently available buttons and the current
|
|
// selected button number. If buttons are not present it returns 0 for
|
|
// both pnButtonsAvailable and pnCurrentButton
|
|
HRESULT GetCurrentButton
|
|
( [out] ULONG * pnButtonsAvailable,
|
|
[out] ULONG * pnCurrentButton
|
|
);
|
|
|
|
// GetCurrentAngle
|
|
// Indicates the number of currently available angles and the current
|
|
// selected angle number. If *pnAnglesAvailable==1, then the current
|
|
// video is not multiangle.
|
|
HRESULT GetCurrentAngle
|
|
( [out] ULONG * pnAnglesAvailable,
|
|
[out] ULONG * pnCurrentAngle
|
|
);
|
|
|
|
// GetCurrentAudio
|
|
// Indicates the number of currently available audio streams and
|
|
// the current selected audio stream number.
|
|
// This only work when in DVD_DOMAIN_Title.
|
|
HRESULT GetCurrentAudio
|
|
( [out] ULONG * pnStreamsAvailable,
|
|
[out] ULONG * pnCurrentStream
|
|
);
|
|
|
|
// GetCurrentSubpicture
|
|
// Indicates the number of currently available subpicture streams,
|
|
// the current selected subpicture stream number, and if the
|
|
// subpicture display is currently disabled. Subpicture streams
|
|
// authored as Forcedly Activated stream will be displayed even if
|
|
// subpicture display has been disabled by the app with
|
|
// IDVDControl::SubpictureChangeStream.
|
|
// This only work when in DVD_DOMAIN_Title.
|
|
HRESULT GetCurrentSubpicture
|
|
( [out] ULONG * pnStreamsAvailable,
|
|
[out] ULONG * pnCurrentStream,
|
|
[out] BOOL * pIsDisabled
|
|
);
|
|
|
|
// GetCurrentUOPS
|
|
// Indicates which IDVDControl methods are currently valid. DVD titles
|
|
// can enable or disable individual user operations at almost any point
|
|
// during playback.
|
|
HRESULT GetCurrentUOPS
|
|
( [out] VALID_UOP_SOMTHING_OR_OTHER * pUOP
|
|
);
|
|
|
|
// GetAllSPRMs
|
|
// Returns the current contents of all System Parameter Registers.
|
|
// See DVD-Video spec for use of individual registers.
|
|
HRESULT GetAllSPRMs
|
|
( [out] SPRMARRAY * pRegisterArray
|
|
);
|
|
|
|
// GetAllGPRMs
|
|
// Returns the current contents of all General Parameter Registers.
|
|
// Use of GPRMs is title specific.
|
|
HRESULT GetAllGPRMs
|
|
( [out] GPRMARRAY * pRegisterArray
|
|
);
|
|
|
|
// GetAudioLanguageString
|
|
// Returns the language of the specified stream within the current
|
|
// title. Does not return languages for menus. Sets *pLanguage=0 if
|
|
// if the stream does not include language.
|
|
// Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
|
|
// to create a human readable string name from the result LCID.
|
|
HRESULT GetAudioLanguage
|
|
( [in] ULONG nStream,
|
|
[out] LCID * pLanguage
|
|
);
|
|
|
|
// GetSubpictureLanguageString
|
|
// Returns the language of the specified stream within the current
|
|
// title. Does not return languages for menus. Sets *pLanguage=0 if
|
|
// if the stream does not include language.
|
|
// Use GetLocaleInfo(*pLanguage, LOCALE_SENGLANGUAGE, pszString, cbSize)
|
|
// to create a human readable string name from the result LCID.
|
|
HRESULT GetSubpictureLanguage
|
|
( [in] ULONG nStream,
|
|
[out] LCID * pLanguage
|
|
);
|
|
|
|
// GetTitleAttributes
|
|
// Returns attributes of all video, audio, and subpicture
|
|
// streams for the specified title including menus.
|
|
// If nTitle == 0xffffffff, attributes for the current title are returned.
|
|
HRESULT GetTitleAttributes
|
|
( [in] ULONG nTitle, // requested title number
|
|
[out] DVD_ATR * pATR
|
|
);
|
|
|
|
// GetVMGAttributes
|
|
// Returns attributes of all video, audio, and subpicture
|
|
// streams for Video Manager Menus. Some menus, such as the DVD_MENU_Title
|
|
// are in a separate group of streams called the VMG (Video Manager) and
|
|
// are not associated with any particular title number.
|
|
HRESULT GetVMGAttributes
|
|
( [out] DVD_ATR * pATR
|
|
);
|
|
|
|
// GetCurrentVideoAttributes
|
|
// Returns the video attributes for the current title or menu.
|
|
HRESULT GetCurrentVideoAttributes
|
|
( [out] DVD_VideoATR *pATR
|
|
);
|
|
|
|
// GetCurrentAudioAttributes
|
|
// Returns the video attributes for the stream in the current
|
|
// title or menu.
|
|
HRESULT GetCurrentAudioAttributes
|
|
( [out] DVD_AudioATR *pATR
|
|
);
|
|
|
|
// GetCurrentSubpictureAttributes
|
|
// Returns the video attributes for the stream in the current
|
|
// title or menu.
|
|
HRESULT GetCurrentSubpictureAttributes
|
|
( [out] DVD_SubpictureATR *pATR
|
|
);
|
|
|
|
|
|
// GetCurrentVolumeInfo
|
|
// Returns current DVD volume info.
|
|
HRESULT GetCurrentVolumeInfo
|
|
( [out] ULONG *pNumOfVol, // number of volumes (disc sides?) in a volume set
|
|
[out] ULONG *pThisVolNum, // volume number for this root directory
|
|
[out] DVD_DISC_SIDE *pSide, // current disc side
|
|
[out] ULONG *pNumOfTitles // number of titles available in this volume
|
|
);
|
|
|
|
|
|
// GetDVDTextInfo
|
|
// Returns the TXTDT_MG structure, which can contain text descriptions for title
|
|
// name, volume name, producer name, vocalist name, etc. in various languages.
|
|
// refer to Section 4.1.6 and Annex A of the DVD-Video spec.
|
|
// If the buffer size passed in is insufficient (for example if cbBufSize==0),
|
|
// then E_OUTOFMEMORY is returned, and *pcbActualSize is set to the required size.
|
|
HRESULT GetDVDTextInfo
|
|
( [out, size_is(cbBufSize)] BYTE *pTextManager,
|
|
[in] ULONG cbBufSize, // buffer size passed in
|
|
[out] ULONG *pcbActualSize // amount of actual data return
|
|
);
|
|
|
|
// GetPlayerParentalLevel
|
|
// Returns the current parental level and the current country code
|
|
// that has been set in the system registers in player.
|
|
// See Table 3.3.4-1 of the DVD-Video spec for the defined parental levels.
|
|
// Valid Parental Levels = 1..8 if parental management is enabled
|
|
// 0xffffffff if parental management is disabled
|
|
// See ISO3166 : Alpha-2 Code for the country codes.
|
|
HRESULT GetPlayerParentalLevel
|
|
( [out] ULONG *pParentalLevel, // current parental level
|
|
[out] ULONG *pCountryCode // current country code
|
|
);
|
|
|
|
// GetNumberOfChapters
|
|
// Returns the number of chapters that are defined for a
|
|
// given title.
|
|
HRESULT GetNumberOfChapters
|
|
( [in] ULONG ulTitle, // Title for which number of chapters is requested
|
|
[out] ULONG *pNumberOfChapters // Number of chapters for the specified title
|
|
);
|
|
|
|
// GetTitleParentalLevels
|
|
// Returns the parental levels that are defined for a
|
|
// particular title. pParentalLevels will be combination
|
|
// of DVD_PARENTAL_LEVEL_8, DVD_PARENTAL_LEVEL_6, or
|
|
// DVD_PARENTAL_LEVEL_1 "OR"ed together
|
|
HRESULT GetTitleParentalLevels
|
|
( [in] ULONG ulTitle, // Title for which parental levels are requested
|
|
[out] ULONG *pParentalLevels // Parental levels defined for the title "OR"ed together
|
|
);
|
|
|
|
// GetRoot
|
|
// Returns the root directory that is set in the player. If a valid root
|
|
// has been found, it returns the root string. Otherwise, it returns 0 for
|
|
// pcbActualSize indicating that a valid root directory has not been found
|
|
// or initialized.
|
|
HRESULT GetRoot
|
|
( [out, size_is(cbBufSize)] LPTSTR pRoot, // pointer to buffer to get root string
|
|
[in] ULONG cbBufSize, // size of buffer passed in
|
|
[out] ULONG *pcbActualSize // size of actual data returned
|
|
);
|
|
}
|
|
|
|
|
|
//==========================================================================
|
|
//==========================================================================
|
|
//
|
|
// typedefs used by IDvdGraphBuilder interface.
|
|
//
|
|
//==========================================================================
|
|
//==========================================================================
|
|
|
|
typedef enum _AM_DVD_GRAPH_FLAGS {
|
|
AM_DVD_HWDEC_PREFER = 0x01, // default
|
|
AM_DVD_HWDEC_ONLY = 0x02,
|
|
AM_DVD_SWDEC_PREFER = 0x04,
|
|
AM_DVD_SWDEC_ONLY = 0x08,
|
|
AM_DVD_NOVPE = 0x100
|
|
} AM_DVD_GRAPH_FLAGS ;
|
|
|
|
typedef enum _AM_DVD_STREAM_FLAGS {
|
|
AM_DVD_STREAM_VIDEO = 0x01,
|
|
AM_DVD_STREAM_AUDIO = 0x02,
|
|
AM_DVD_STREAM_SUBPIC = 0x04
|
|
} AM_DVD_STREAM_FLAGS ;
|
|
|
|
typedef struct {
|
|
HRESULT hrVPEStatus ; // VPE mixing error code (0 => success)
|
|
BOOL bDvdVolInvalid ; // Is specified DVD volume invalid?
|
|
BOOL bDvdVolUnknown ; // Is DVD volume to be played not specified/not found?
|
|
BOOL bNoLine21In ; // video decoder doesn't produce line21 (CC) data
|
|
BOOL bNoLine21Out ; // can't show decoded line21 data as CC on video
|
|
int iNumStreams ; // number of DVD streams to render
|
|
int iNumStreamsFailed ; // number of streams failed to render
|
|
DWORD dwFailedStreamsFlag ; // combination of flags to indicate failed streams
|
|
} AM_DVD_RENDERSTATUS ;
|
|
|
|
|
|
//
|
|
// IDvdGraphBuilder interface to build a filter graph for DVD-Video playback.
|
|
//
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(FCC152B6-F372-11d0-8E00-00C04FD7C08B),
|
|
pointer_default(unique)
|
|
]
|
|
interface IDvdGraphBuilder : IUnknown {
|
|
|
|
// Returns the IGraphBuilder interface for the filtergraph used by the
|
|
// CDvdGraphBuilder object.
|
|
// Remember to *ppGB->Release() when you're done with it
|
|
HRESULT GetFiltergraph
|
|
( [out] IGraphBuilder **ppGB
|
|
) ;
|
|
|
|
// Gets specific interface pointers in the DVD-Video playback graph to
|
|
// make DVD-Video playback development easier.
|
|
// It helps get the following interfaces to control playback/show CC/
|
|
// position window/control volume etc:
|
|
// - IDvdControl, IDvdInfo
|
|
// - IAMLine21Decoder
|
|
// - IVideoWindow, IBasicVideo
|
|
// - IBasicAudio
|
|
// This method will return
|
|
// a) E_INVALIDARG if ppvIF is invalid
|
|
// b) E_NOINTERFACE if riid is an IID we don't know about
|
|
// c) VFW_E_DVD_GRAPHNOTREADY if the graph has not been built through
|
|
// RenderDvdVideoVolume() yet.
|
|
// Remember to *ppvIF->Release() when you're done with it
|
|
HRESULT GetDvdInterface
|
|
( [in] REFIID riid, // IID of the interface required
|
|
[out] void **ppvIF // returns pointer to the required interface
|
|
) ;
|
|
|
|
// Builds a filter graph according to user specs for playing back a
|
|
// DVD-Video volume.
|
|
// This method returns S_FALSE if
|
|
// 1. the graph has been either built, but either
|
|
// a) VPE mixing doesn't work (app didn't use AM_DVD_NOVPE flag)
|
|
// b) video decoder doesn't produce line21 data
|
|
// c) line21 data couldn't be rendered (decoding/mixing problem)
|
|
// d) the call specified an invalid volume path or DVD Nav couldn't
|
|
// locate any DVD-Video volume to be played.
|
|
// 2. some streams didn't render (completely), but the others have
|
|
// been rendered so that the volume can be partially played back.
|
|
// The status is indicated through the fields of the pStatus (out)
|
|
// parameter.
|
|
// About 1(a), the app will have enough info to tell the user that the
|
|
// video won't be visible unless a TV is connected to the NTSC out
|
|
// port of the DVD decoder (presumably HW in this case).
|
|
// For case 1(b) & (c), the app "can" put up a warning/informative message
|
|
// that closed captioning is not available because of the decoder.
|
|
// 1(d) helps an app to ask the user to insert a DVD-Video disc if none
|
|
// is specified/available in the drive when playback is started.
|
|
// This method builds the graph even if
|
|
// - an invalid DVD-Video volume is specified
|
|
// - the caller uses lpwszPathName = NULL to make the DVD Nav to locate
|
|
// the default volume to be played back, but DVD Nav doesn't find a
|
|
// default DVD-Video volume to be played back.
|
|
// An app can later specify the volume using IDvdControl::SetRoot()
|
|
// method.
|
|
// #2 will help the app indicate to the user that some of the streams
|
|
// can't be played.
|
|
//
|
|
// The graph is built using filters based on the dwFlags value (to use
|
|
// HW decoders or SW decoders or a mix of them).
|
|
// The dwFlags value is one of the values in AM_DVD_GRAPH_FLAGS enum
|
|
// type. The default value is AM_DVD_HWDEC_PREFER. None of the
|
|
// AM_DVD_HWDEC_xxx or AM_DVD_SWDEC_xxx flags can be mixed. However
|
|
// AM_DVD_NOVPE can be OR-ed with any of the AM_DVD_HWDEC_xxx flags.
|
|
//
|
|
// The method returns S_OK if the playback graph is built successfully
|
|
// with all the streams completely rendered and a valid DVD-Video volume
|
|
// is specified or a default one has been located.
|
|
//
|
|
// If the dwFlags specify conflicting options, E_INVALIDARG is returned.
|
|
// If the graph building fails, the method returns one of the following
|
|
// error codes:
|
|
// VFW_E_DVD_RENDERFAIL, VFW_E_DVD_DECNOTENOUGH
|
|
//
|
|
HRESULT RenderDvdVideoVolume
|
|
( [in] LPCWSTR lpcwszPathName, // Can be NULL too
|
|
[in] DWORD dwFlags, // 0 is the default (use max HW)
|
|
[out] AM_DVD_RENDERSTATUS *pStatus // returns indications of ANY failure
|
|
) ;
|
|
}
|
|
|
|
|
|
//
|
|
// DDraw Exclusive Mode Video standard COM interface for Overlay Mixer
|
|
//
|
|
[
|
|
object,
|
|
local,
|
|
uuid(153ACC21-D83B-11d1-82BF-00A0C9696C8F),
|
|
pointer_default(unique)
|
|
]
|
|
interface IDDrawExclModeVideo : IUnknown {
|
|
// set a ddraw object to be used by the overlay mixer. If even one of the pins
|
|
// of the ovmixer is connected, then it won't start using the new ddraw obect
|
|
// immediately but just cache it. It will start using it the next time, all its
|
|
// pins are disconnected.
|
|
HRESULT SetDDrawObject([in] IDirectDraw *pDDrawObject);
|
|
|
|
// gets the ddraw object currently being used by the overlay mixer. If the app has not
|
|
// set any ddraw object and the ovmixer has not yet allocated one, then *ppDDrawObject
|
|
// will be set to NULL and *pbUsingExternal will be set TO FALSE. Otherwise *pbUsingExternal
|
|
// will be set to TRUE if the ovmixer is currently USING an app given ddraw object and FALSE
|
|
// othewise
|
|
HRESULT GetDDrawObject([out] IDirectDraw **ppDDrawObject,
|
|
[out] BOOL *pbUsingExternal);
|
|
|
|
// set a primary surface to be used by the overlay mixer. If even one of the pins
|
|
// of the ovmixer is connected, then it won't start using the new primary surface
|
|
// immediately but just cache it. It will start using it the next time, all its
|
|
// pins are disconnected.
|
|
// Also when the ovmixer does start using an app given primary surface, it will delete
|
|
// its output pin (and not draw its own colorkey) since the app is expected to do the
|
|
// window management and drawing colorkey etc on the primary surface
|
|
// This function makes sure that the surface provided exposes IDirectDrawSurface3, and
|
|
// is consistent with the ddraw object provided.
|
|
HRESULT SetDDrawSurface([in] IDirectDrawSurface *pDDrawSurface);
|
|
|
|
// gets the ddraw surface currently being used by the overlay mixer. If the app has not
|
|
// set any ddraw surface and the ovmixer has not yet allocated one, then *ppDDrawSurface
|
|
// will be set to NULL and *pbUsingExternal will be set to FALSE. Otherwise *pbUsingExternal
|
|
// will be set to TRUE if the ovmixer is curretnly USING an app given ddraw surface and FALSE
|
|
// otherwise
|
|
HRESULT GetDDrawSurface([out] IDirectDrawSurface **ppDDrawSurface,
|
|
[out] BOOL *pbUsingExternal);
|
|
|
|
// set draw paramters on the ovmixer (src and dest rect). Note that if the mode
|
|
// of the ovmixer is set to LETTER_BOX, then the ovmixer might show the video in
|
|
// only a subrect of *prcTarget (see IMixerPinConfig for details).
|
|
HRESULT SetDrawParameters([in] const RECT * prcSource,
|
|
[in] const RECT * prcTarget);
|
|
|
|
// gets the current video size and picture aspect ratio of the primary stream of the overlay mixer
|
|
// The app should look for the evene EC_VIDEO_SIZE_AR_CHANGED and on its receipt
|
|
// call this function again
|
|
HRESULT GetNativeVideoProps([out] DWORD *pdwVideoWidth,
|
|
[out] DWORD *pdwVideoHeight,
|
|
[out] DWORD *pdwPictAspectRatioX,
|
|
[out] DWORD *pdwPictAspectRatioY);
|
|
|
|
// Set the callback interface - the callback interface will be defined in a later release
|
|
// Currently returns E_NOTIMPL
|
|
HRESULT SetCallbackInterface([in] IDDrawExclModeVideoCallback *pCallback,
|
|
[in] DWORD dwFlags);
|
|
}
|
|
|
|
|
|
//
|
|
// DDraw Exclusive Mode Video callbacks
|
|
//
|
|
|
|
// enum for flags
|
|
enum _AM_OVERLAY_NOTIFY_FLAGS {
|
|
AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001,
|
|
AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002,
|
|
AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004
|
|
};
|
|
[
|
|
object,
|
|
local,
|
|
uuid(913c24a0-20ab-11d2-9038-00a0c9697298),
|
|
pointer_default(unique)
|
|
]
|
|
interface IDDrawExclModeVideoCallback : IUnknown {
|
|
|
|
// Called once before UpdateOverlay is called with bBefore == TRUE
|
|
// and once after it is called with bBefore == FALSE and otherwise
|
|
// identical parameters
|
|
HRESULT OnUpdateOverlay(
|
|
[in] BOOL bBefore, // After UpdateOverlayCalled?
|
|
[in] DWORD dwFlags,// _AM_OVERLAY_NOTIFY enum
|
|
[in] BOOL bOldVisible,
|
|
[in] const RECT *prcOldSrc,
|
|
[in] const RECT *prcOldDest,
|
|
[in] BOOL bNewVisible,
|
|
[in] const RECT *prcNewSrc,
|
|
[in] const RECT *prcNewDest);
|
|
|
|
// Called when the surface color key is changed
|
|
HRESULT OnUpdateColorKey(
|
|
[in] const COLORKEY *pKey,
|
|
[in] DWORD dwColor);
|
|
|
|
// Called when the video size or aspect ratio changes
|
|
HRESULT OnUpdateSize( [in] DWORD dwWidth, // Movie pixel width
|
|
[in] DWORD dwHeight, // Movie pixel height
|
|
[in] DWORD dwARWidth, // Aspect ratio horizontal
|
|
[in] DWORD dwARHeight); // Aspect ratio vertical
|
|
}
|