DSPack.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:221k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1.     (*********************************************************************
  2.      *  DSPack 2.3.3                                                     *
  3.      *                                                                   *
  4.      *  home page : http://www.progdigy.com                              *
  5.      *  email     : hgourvest@progdigy.com                               *
  6.      *   Thanks to Michael Andersen. (DSVideoWindowEx)                   *
  7.      *                                                                   *
  8.      *  date      : 2003-09-08                                           *
  9.      *                                                                   *
  10.      *  The contents of this file are used with permission, subject to   *
  11.      *  the Mozilla Public License Version 1.1 (the "License"); you may  *
  12.      *  not use this file except in compliance with the License. You may *
  13.      *  obtain a copy of the License at                                  *
  14.      *  http://www.mozilla.org/MPL/MPL-1.1.html                          *
  15.      *                                                                   *
  16.      *  Software distributed under the License is distributed on an      *
  17.      *  "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   *
  18.      *  implied. See the License for the specific language governing     *
  19.      *  rights and limitations under the License.                        *
  20.      *                                                                   *
  21.      *  Contributor(s)                                                   *
  22.      *    Peter J. Haas     <DSPack@pjh2.de>                             *
  23.      *    Andriy Nevhasymyy <a.n@email.com>                              *
  24.      *    Milenko Mitrovic  <dcoder@dsp-worx.de>                         *
  25.      *    Michael Andersen  <michael@mechdata.dk>                        *
  26.      *    Martin Offenwanger <coder@dsplayer.de>                         *
  27.      *                                                                   *
  28.      *********************************************************************)
  29. {
  30.   @abstract(DSPack Components.)
  31.   @author(Henri Gourvest: hgourvest@progdigy.com)
  32.   @created(Mar 14, 2002)
  33.   @lastmod(Oct 24, 2003)
  34. }
  35. {$I jedi.inc}
  36. {$IFDEF COMPILER6_UP}
  37.   {$WARN SYMBOL_DEPRECATED OFF}
  38. {$ENDIF}
  39. {$IFDEF COMPILER7_UP}
  40.   {$WARN SYMBOL_DEPRECATED OFF}
  41.   {$WARN UNSAFE_CODE OFF}
  42.   {$WARN UNSAFE_TYPE OFF}
  43.   {$WARN UNSAFE_CAST OFF}
  44. {$ENDIF}
  45. {$ALIGN ON}
  46. {$MINENUMSIZE 4}
  47. unit DSPack;
  48. interface
  49. uses
  50.   Windows, Classes, SysUtils, Messages, Graphics, Forms, Controls, ActiveX, DirectShow9,
  51.   DirectDraw, DSUtil, ComCtrls, MMSystem, Math, Consts, ExtCtrls,
  52.   MultiMon, Dialogs, Registry, SyncObjs, Direct3D9, WMF9;
  53. const
  54.   { Filter Graph message identifier. }
  55.   WM_GRAPHNOTIFY = WM_APP + 1;
  56.   { Sample Grabber message identifier. }
  57.   WM_CAPTURE_BITMAP = WM_APP + 2;
  58. type
  59.   { Video mode to use with @link(TVideoWindow). }
  60.   TVideoMode = (
  61.     vmNormal,
  62.     vmVMR
  63.   );
  64.   { Graph Mode to use with @link(TFilterGraph).}
  65.   TGraphMode = (
  66.     gmNormal,
  67.     gmCapture,
  68.     gmDVD
  69.   );
  70.   { Render device returned by then OnGraphVMRRenderDevice event. }
  71. {$IFDEF VER140}
  72.   TVMRRenderDevice = (
  73.     rdOverlay = 1,
  74.     rdVidMem  = 2,
  75.     rdSysMem  = 4
  76.   );
  77. {$ELSE}
  78.   TVMRRenderDevice = Integer;
  79.   const
  80.     rdOverlay = 1;
  81.     rdVidMem  = 2;
  82.     rdSysMem  = 4;
  83. type
  84. {$ENDIF}
  85.   {@exclude}
  86.   TGraphState = (
  87.     gsUninitialized,
  88.     gsStopped,
  89.     gsPaused,
  90.     gsPlaying
  91.   );
  92.   { Specifies the seeking capabilities of a media stream. }
  93.   TSeekingCap = (
  94.     CanSeekAbsolute,   // The stream can seek to an absolute position.
  95.     CanSeekForwards,   // The stream can seek forward.
  96.     CanSeekBackwards,  // The stream can seek backward.
  97.     CanGetCurrentPos,  // The stream can report its current position.
  98.     CanGetStopPos,     // The stream can report its stop position.
  99.     CanGetDuration,    // The stream can report its duration.
  100.     CanPlayBackwards,  // The stream can play backward.
  101.     CanDoSegments,     // The stream can do seamless looping (see IMediaSeeking.SetPositions).
  102.     Source             // Reserved.
  103.   );
  104.   { Specifies the seeking capabilities of a media stream. }
  105.   TSeekingCaps = set of TSeekingCap;
  106.   { Video Mixer Render Preferences: <br>
  107.     <b>vpForceOffscreen:</b> Indicates that the VMR should use only offscreen surfaces for rendering.<br>
  108.     <b>vpForceOverlays:</b> Indicates that the VMR should fail if no overlay surfaces are available.<br>
  109.     <b>vpForceMixer:</b> Indicates that the VMR must use Mixer when the number of streams is 1.<br>
  110.     <b>vpDoNotRenderColorKeyAndBorder:</b> Indicates that the application is responsible for painting the color keys.<br>
  111.     <b>vpRestrictToInitialMonitor:</b> Indicates that the VMR should output only to the initial monitor.<br>
  112.     <b>vpPreferAGPMemWhenMixing:</b> Indicates that the VMR should attempt to use AGP memory when allocating texture surfaces.}
  113.   TVMRPreference = (
  114.     vpForceOffscreen,
  115.     vpForceOverlays,
  116.     vpForceMixer,
  117.     vpDoNotRenderColorKeyAndBorder,
  118.     vpRestrictToInitialMonitor,
  119.     vpPreferAGPMemWhenMixing
  120.   );
  121.   { Pointer to @link(TVMRPreferences).}
  122.   PVMRPreferences = ^TVMRPreferences;
  123.   { Set of @link(TVMRPreference).}
  124.   TVMRPreferences = set of TVMRPreference;
  125.   TOnDSEvent                   = procedure(sender: TComponent; Event, Param1, Param2: Integer) of object;
  126.                                                                                                                                    {@exclude}
  127.   TOnGraphBufferingData        = procedure(sender: TObject; Buffering: boolean) of object ;                                        {@exclude}
  128.   TOnGraphComplete             = procedure(sender: TObject; Result: HRESULT; Renderer: IBaseFilter) of object ;                    {@exclude}
  129.   TOnGraphDeviceLost           = procedure(sender: TObject; Device: IUnknown; Removed: Boolean) of object ;                        {@exclude}
  130.   TOnGraphEndOfSegment         = procedure(sender: TObject; StreamTime: TReferenceTime; NumSegment: Cardinal) of object ;         {@exclude}
  131.   TOnDSResult                  = procedure(sender: TObject; Result: HRESULT) of object ;                                           {@exclude}
  132.   TOnGraphFullscreenLost       = procedure(sender: TObject; Renderer: IBaseFilter) of object ;                                     {@exclude}
  133.   TOnGraphOleEvent             = procedure(sender: TObject; String1, String2: WideString) of object ;                              {@exclude}
  134.   TOnGraphOpeningFile          = procedure(sender: TObject; opening: boolean) of object ;                                          {@exclude}
  135.   TOnGraphSNDDevError          = procedure(sender: TObject; OccurWhen: TSndDevErr; ErrorCode: LongWord) of object ;               {@exclude}
  136.   TOnGraphStreamControl        = procedure(sender: TObject; PinSender: IPin; Cookie: LongWord) of object ;                         {@exclude}
  137.   TOnGraphStreamError          = procedure(sender: TObject; Operation: HRESULT; Value: LongWord) of object ;                       {@exclude}
  138.   TOnGraphVideoSizeChanged     = procedure(sender: TObject; Width, height: word) of object ;                                       {@exclude}
  139.   TOnGraphTimeCodeAvailable    = procedure(sender: TObject; From: IBaseFilter; DeviceID: LongWord) of object ;                     {@exclude}
  140.   TOnGraphEXTDeviceModeChange  = procedure(sender: TObject; NewMode, DeviceID: LongWord) of object ;                               {@exclude}
  141.   TOnGraphVMRRenderDevice      = procedure(sender: TObject; RenderDevice: TVMRRenderDevice) of object;
  142.                                                                                                                                    {@exclude}
  143.   TOnDVDAudioStreamChange      = procedure(sender: TObject; stream, lcid: Integer; Lang: string) of object;                        {@exclude}
  144.   TOnDVDCurrentTime            = procedure(sender: TObject; Hours, minutes,seconds,frames,frate : Integer) of object;              {@exclude}
  145.   TOnDVDTitleChange            = procedure(sender: TObject; title: Integer) of object;                                             {@exclude}
  146.   TOnDVDChapterStart           = procedure(sender: TObject; chapter: Integer) of object;                                           {@exclude}
  147.   TOnDVDValidUOPSChange        = procedure(sender: TObject; UOPS: Integer) of object;                                              {@exclude}
  148.   TOnDVDChange                 = procedure(sender: TObject; total,current: Integer) of object;                                     {@exclude}
  149.   TOnDVDStillOn                = procedure(sender: TObject; NoButtonAvailable: boolean; seconds: Integer) of object;               {@exclude}
  150.   TOnDVDSubpictureStreamChange = procedure(sender: TObject; SubNum, lcid: Integer; Lang: string) of object;                        {@exclude}
  151.   TOnDVDPlaybackRateChange     = procedure(sender: TObject; rate:  single) of object;                                              {@exclude}
  152.   TOnDVDParentalLevelChange    = procedure(sender: TObject; level: Integer) of object;                                             {@exclude}
  153.   TOnDVDAnglesAvailable        = procedure(sender: TObject; available: boolean) of object;                                         {@exclude}
  154.   TOnDVDButtonAutoActivated    = procedure(sender: TObject; Button: Cardinal) of object;                                           {@exclude}
  155.   TOnDVDCMD                    = procedure(sender: TObject; CmdID: Cardinal) of object;                                            {@exclude}
  156.   TOnDVDCurrentHMSFTime        = procedure(sender: TObject; HMSFTimeCode: TDVDHMSFTimeCode; TimeCode: TDVDTimeCode) of object;  {@exclude}
  157.   TOnDVDKaraokeMode            = procedure(sender: TObject; Played: boolean) of object;
  158.   {@exclude}
  159.   TOnBuffer = procedure(sender: TObject; SampleTime: Double; pBuffer: Pointer; BufferLen: longint) of object ;
  160.   TOnSelectedFilter = function (Moniker: IMoniker; FilterName: WideString; ClassID: TGuid): Boolean of Object;
  161.   TOnCreatedFilter  = function (Filter: IBaseFilter; ClassID: TGuid): Boolean of Object;
  162.   TOnUnableToRender = function (Pin: IPin): Boolean of Object;
  163. // *****************************************************************************
  164. //  IFilter
  165. // *****************************************************************************
  166.   {@exclude}
  167.   TFilterOperation = (
  168.     foAdding,    // Before the filter is added to graph.
  169.     foAdded,     // After the filter is added to graph.
  170.     foRemoving,  // Before the filter is removed from graph.
  171.     foRemoved,   // After the filter is removed from graph.
  172.     foRefresh    // Designer notification to Refresh the filter .
  173.   );
  174.   {@exclude}
  175.   IFilter = interface
  176.   ['{887F94DA-29E9-44C6-B48E-1FBF0FB59878}']
  177.     { Return the IBaseFilter Interface (All DirectShow filters expose this interface). }
  178.     function GetFilter: IBaseFilter;
  179.     { Return the filter name (generally the component name). }
  180.     function GetName: string;
  181.     { Called by the @link(TFilterGraph) component, this method receive notifications
  182.       on what the TFilterGraph is doing. if Operation = foGraphEvent then Param is the
  183.       event code received by the FilterGraph.}
  184.     procedure NotifyFilter(operation: TFilterOperation; Param: integer = 0);
  185.   end;
  186.   {@exclude}
  187.   TControlEvent = (
  188.     cePlay,
  189.     cePause,
  190.     ceStop,
  191.     ceFileRendering,
  192.     ceFileRendered,
  193.     ceDVDRendering,
  194.     ceDVDRendered,
  195.     ceActive
  196.   );
  197.   {@exclude}
  198.   IEvent = interface
  199.   ['{6C0DCD7B-1A98-44EF-A6D5-E23CBC24E620}']
  200.     { FilterGraph events. }
  201.     procedure GraphEvent(Event, Param1, Param2: integer);
  202.     { Control Events. }
  203.     procedure ControlEvent(Event: TControlEvent; Param: integer = 0);
  204.   end;
  205. // *****************************************************************************
  206. //  TFilterGraph
  207. // *****************************************************************************
  208.   { This component is the central component in DirectShow, the Filter Graph
  209.     handle synchronization, event notification, and other aspects of the
  210.     controlling the filter graph. }
  211.   TFilterGraph = class(TComponent, IAMGraphBuilderCallback, IAMFilterGraphCallback,
  212.                        IServiceProvider)
  213.   private
  214.     FActive     : boolean;
  215.     FAutoCreate : boolean;
  216.     FHandle     : THandle; // to capture events
  217.     FMode       : TGraphMode;
  218.     FVolume     : integer;
  219.     FBalance    : integer;
  220.     FRate       : Double;
  221.     FLinearVolume : Boolean;
  222.     FFilters: TInterfaceList;
  223.     FGraphEvents: TInterfaceList;
  224.     // builders
  225.     FFilterGraph  : IGraphBuilder;
  226.     FCaptureGraph : ICaptureGraphBuilder2;
  227.     FDVDGraph     : IDvdGraphBuilder;
  228.     // events interface
  229.     FMediaEventEx : IMediaEventEx;
  230.     // Graphedit
  231.     FGraphEdit    : boolean;
  232.     FGraphEditID  : Integer;
  233.     // Log File
  234.     FLogFileName: String;
  235.     FLogFile: TFileStream;
  236.     FOnActivate: TNotifyEvent;
  237.     // All Events Code
  238.     FOnDSEvent : TOnDSEvent;
  239.     // Generic Graph Events
  240.     FOnGraphBufferingData           : TOnGraphBufferingData;
  241.     FOnGraphClockChanged            : TNotifyEvent;
  242.     FOnGraphComplete                : TOnGraphComplete;
  243.     FOnGraphDeviceLost              : TOnGraphDeviceLost;
  244.     FOnGraphEndOfSegment            : TOnGraphEndOfSegment;
  245.     FOnGraphErrorStillPlaying       : TOnDSResult;
  246.     FOnGraphErrorAbort              : TOnDSResult;
  247.     FOnGraphFullscreenLost          : TOnGraphFullscreenLost;
  248.     FOnGraphChanged                 : TNotifyEvent;
  249.     FOnGraphOleEvent                : TOnGraphOleEvent;
  250.     FOnGraphOpeningFile             : TOnGraphOpeningFile;
  251.     FOnGraphPaletteChanged          : TNotifyEvent;
  252.     FOnGraphPaused                  : TOnDSResult;
  253.     FOnGraphQualityChange           : TNotifyEvent;
  254.     FOnGraphSNDDevInError           : TOnGraphSNDDevError;
  255.     FOnGraphSNDDevOutError          : TOnGraphSNDDevError;
  256.     FOnGraphStepComplete            : TNotifyEvent;
  257.     FOnGraphStreamControlStarted    : TOnGraphStreamControl;
  258.     FOnGraphStreamControlStopped    : TOnGraphStreamControl;
  259.     FOnGraphStreamErrorStillPlaying : TOnGraphStreamError;
  260.     FOnGraphStreamErrorStopped      : TOnGraphStreamError;
  261.     FOnGraphUserAbort               : TNotifyEvent;
  262.     FOnGraphVideoSizeChanged        : TOnGraphVideoSizeChanged;
  263.     FOnGraphTimeCodeAvailable       : TOnGraphTimeCodeAvailable;
  264.     FOnGraphEXTDeviceModeChange     : TOnGraphEXTDeviceModeChange;
  265.     FOnGraphClockUnset              : TNotifyEvent;
  266.     FOnGraphVMRRenderDevice         : TOnGraphVMRRenderDevice;
  267.     FOnDVDAudioStreamChange       : TOnDVDAudioStreamChange;
  268.     FOnDVDCurrentTime             : TOnDVDCurrentTime;
  269.     FOnDVDTitleChange             : TOnDVDTitleChange;
  270.     FOnDVDChapterStart            : TOnDVDChapterStart;
  271.     FOnDVDAngleChange             : TOnDVDChange;
  272.     FOnDVDValidUOPSChange         : TOnDVDValidUOPSChange;
  273.     FOnDVDButtonChange            : TOnDVDChange;
  274.     FOnDVDChapterAutoStop         : TNotifyEvent;
  275.     FOnDVDStillOn                 : TOnDVDStillOn;
  276.     FOnDVDStillOff                : TNotifyEvent;
  277.     FOnDVDSubpictureStreamChange  : TOnDVDSubpictureStreamChange;
  278.     FOnDVDNoFP_PGC                : TNotifyEvent;
  279.     FOnDVDPlaybackRateChange      : TOnDVDPlaybackRateChange;
  280.     FOnDVDParentalLevelChange     : TOnDVDParentalLevelChange;
  281.     FOnDVDPlaybackStopped         : TNotifyEvent;
  282.     FOnDVDAnglesAvailable         : TOnDVDAnglesAvailable;
  283.     FOnDVDPlayPeriodAutoStop      : TNotifyEvent;
  284.     FOnDVDButtonAutoActivated     : TOnDVDButtonAutoActivated;
  285.     FOnDVDCMDStart                : TOnDVDCMD;
  286.     FOnDVDCMDEnd                  : TOnDVDCMD;
  287.     FOnDVDDiscEjected             : TNotifyEvent;
  288.     FOnDVDDiscInserted            : TNotifyEvent;
  289.     FOnDVDCurrentHMSFTime         : TOnDVDCurrentHMSFTime;
  290.     FOnDVDKaraokeMode             : TOnDVDKaraokeMode;
  291.     // DVD Warning
  292.     FOnDVDWarningInvalidDVD1_0Disc  : TNotifyEvent;//=1,
  293.     FOnDVDWarningFormatNotSupported : TNotifyEvent;//=2,
  294.     FOnDVDWarningIllegalNavCommand  : TNotifyEvent;//=3
  295.     FOnDVDWarningOpen               : TNotifyEvent;//=4
  296.     FOnDVDWarningSeek               : TNotifyEvent;//=5
  297.     FOnDVDWarningRead               : TNotifyEvent;//=6
  298.     // DVDDomain
  299.     FOnDVDDomainFirstPlay         : TNotifyEvent;
  300.     FOnDVDDomainVideoManagerMenu  : TNotifyEvent;
  301.     FOnDVDDomainVideoTitleSetMenu : TNotifyEvent;
  302.     FOnDVDDomainTitle             : TNotifyEvent;
  303.     FOnDVDDomainStop              : TNotifyEvent;
  304.     // DVDError
  305.     FOnDVDErrorUnexpected                          : TNotifyEvent;
  306.     FOnDVDErrorCopyProtectFail                     : TNotifyEvent;
  307.     FOnDVDErrorInvalidDVD1_0Disc                   : TNotifyEvent;
  308.     FOnDVDErrorInvalidDiscRegion                   : TNotifyEvent;
  309.     FOnDVDErrorLowParentalLevel                    : TNotifyEvent;
  310.     FOnDVDErrorMacrovisionFail                     : TNotifyEvent;
  311.     FOnDVDErrorIncompatibleSystemAndDecoderRegions : TNotifyEvent;
  312.     FOnDVDErrorIncompatibleDiscAndDecoderRegions   : TNotifyEvent;
  313.     FOnSelectedFilter: TOnSelectedFilter;
  314.     FOnCreatedFilter: TOnCreatedFilter;
  315.     FOnUnableToRender: TOnUnableToRender;
  316.     procedure HandleEvents;
  317.     procedure WndProc(var Msg: TMessage);
  318.     procedure SetActive(Activate: boolean);
  319.     procedure SetGraphMode(Mode: TGraphMode);
  320.     procedure SetGraphEdit(enable: boolean);
  321.     procedure ClearOwnFilters;
  322.     procedure AddOwnFilters;
  323.     procedure GraphEvents(Event, Param1, Param2: integer);
  324.     procedure ControlEvents(Event: TControlEvent; Param: integer = 0);
  325.     procedure SetLogFile(FileName: String);
  326.     function GetState: TGraphState;
  327.     procedure SetState(Value: TGraphState);
  328.     procedure SetVolume(Volume: Integer);
  329.     procedure SetBalance(Balance: integer);
  330.     function GetSeekCaps: TSeekingCaps;
  331.     procedure SetRate(Rate: double);
  332.     function GetDuration: integer;
  333.     procedure SetLinearVolume(aEnabled: Boolean);
  334.     procedure UpdateGraph;
  335.     // IAMGraphBuilderCallback
  336.     function SelectedFilter(pMon: IMoniker): HResult; stdcall;
  337.     function CreatedFilter(pFil: IBaseFilter): HResult; stdcall;
  338.     // IAMFilterGraphCallback
  339.     function UnableToRender(ph1, ph2: integer; pPin: IPin): HResult; // thiscall
  340.   protected
  341.     {@exclude}
  342.     procedure DoEvent(Event, Param1, Param2: Integer); virtual;
  343.     {@exclude}
  344.     procedure InsertFilter(AFilter: IFilter);
  345.     {@exclude}
  346.     procedure RemoveFilter(AFilter: IFilter);
  347.     {@exclude}
  348.     procedure InsertEventNotifier(AEvent: IEvent);
  349.     {@exclude}
  350.     procedure RemoveEventNotifier(AEvent: IEvent);
  351.     {@exclude}
  352.     function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
  353.   public
  354.     { Retrieve the total duration of a stream. }
  355.     property Duration: Integer read GetDuration;
  356.     { Retrieve/Set the rate. }
  357.     property Rate: Double read fRate write SetRate;
  358.     { Retrieve the seeking capabilities. }
  359.     property SeekCapabilities: TSeekingCaps read GetSeekCaps;
  360.     { The volume balance. }
  361.     property Balance: integer read fBalance write SetBalance;
  362.     { The volume. }
  363.     property Volume: integer read fVolume write SetVolume;
  364.     { Current state of the filter graph. }
  365.     property State: TGraphState read GetState write SetState;
  366.     { TFilterGraph constructor. }
  367.     constructor Create(AOwner: TComponent); override;
  368.     { TFilterGraph destructor. }
  369.     destructor Destroy; override;
  370.     { @exclude}
  371.     procedure Loaded; override;
  372.     { Retrieve an Interface from the current Graph.<br>
  373.       <b>ex: </b> (FilterGraph <b>as</b> IGraphBuilder).RenderFile('C:speedis.avi', <b>nil</b>);<br>
  374.       <b>Remark: </b> The interfaces you can Query depend of the @link(Mode) you
  375.       have defined.<br>
  376.       <b>gmNormal: </b>IAMGraphStreams, IAMStats, IBasicAudio, IBasicVideo,
  377.                        IBasicVideo2, IFilterChain, IFilterGraph, IFilterGraph2,
  378.                        IFilterMapper2, IGraphBuilder, IGraphConfig, IGraphVersion,
  379.                        IMediaControl, IMediaEvent, IMediaEventEx, IMediaEventSink,
  380.                        IMediaFilter, IMediaPosition, IMediaSeeking, IQueueCommand,
  381.                        IRegisterServiceProvider, IResourceManager, IServiceProvider,
  382.                        IVideoFrameStep, IVideoWindow. <br>
  383.       <b>gmCapture: </b> all gmNormal interfaces and ICaptureGraphBuilder2.<br>
  384.       <b>gmDVD: </b> all gmNormal interfaces and IDvdGraphBuilder, IDvdControl2,
  385.                      IDvdInfo2, IAMLine21Decoder.}
  386.     function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
  387.     { The Run method runs all the filters in the filter graph. While the graph
  388.       is running, data moves through the graph and is rendered. }
  389.     function Play: boolean;
  390.     { The Pause method pauses all the filters in the filter graph. }
  391.     function Pause: boolean;
  392.     { The Stop method stops all the filters in the graph. }
  393.     function Stop: boolean;
  394.     { This method disconnect all pins.}
  395.     procedure DisconnectFilters;
  396.     { Disconnect and remove all filters from the filter graph excepting the custom components. }
  397.     procedure ClearGraph;
  398.     { Render a single file. }
  399.     function RenderFile(FileName: WideString): HRESULT;
  400.     function RenderFileEx(FileName: WideString): HRESULT;
  401.     { Render a DVD Video Volume or a File Name if specified. }
  402.     function RenderDVD(out status: TAMDVDRenderStatus;
  403.       FileName: WideString = ''; Mode: Integer = AM_DVD_HWDEC_PREFER): HRESULT;
  404.     { Save the current state and position of a DVD movie to a file.<br>
  405.       See also: @link(DVDRestoreBookmark).}
  406.     procedure DVDSaveBookmark(BookMarkFile: WideString);
  407.     { Restore the State and position of a DVD movie saved by @link(DVDSaveBookmark).}
  408.     procedure DVDRestoreBookmark(BookMarkFile: WideString);
  409.   published
  410.     { Specify a File Name to save the Filter Graph Log. }
  411.     property LogFile: String read FLogFileName write SetLogFile;
  412.     { Activate the Filter Graph.}
  413.     property Active: boolean read FActive write SetActive default False;
  414.     { Auto-Activate the Filter Graph when component is created.}
  415.     property AutoCreate: boolean read FAutoCreate write FAutoCreate default False;
  416.     { There is 3 modes: gmNormal, gmCapture and gmDVD. <br>
  417.       See also: @link(GraphInterFace).}
  418.     property Mode: TGraphMode read FMode write SetGraphMode default gmNormal;
  419.     { if true you can use GraphEdit application to connect with the Filter Graph.}
  420.     property GraphEdit: boolean read FGraphEdit write SetGraphEdit;
  421.     { if true, Volume and Balance is set by using a linear algorythm instead of
  422.       logatithmic. }
  423.     property LinearVolume: Boolean read FLinearVolume write SetLinearVolume;
  424.     // -------------------------------------------------------------------------
  425.     // Events
  426.     // -------------------------------------------------------------------------
  427.     property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
  428.     { Generic Filter Graph event.<br>
  429.         <b>Event:</b> message sent.<br>
  430.         <b>Param1:</b> first message parameter.<br>
  431.         <b>Param2:</b> second message parameter.}
  432.     property OnDSEvent: TOnDSEvent read FOnDSEvent write FOnDSEvent;
  433.     { The graph is buffering data, or has stopped buffering data.
  434.       A filter can send this event if it needs to buffer data from an external
  435.       source. (for example, it might be loading data from a network.)
  436.       The application can use this event to adjust its user interface.<br>
  437.       <b>buffering:</b> TRUE if the graph is starting to buffer, or FALSE if
  438.       the graph has stopped buffering. }
  439.     property OnGraphBufferingData: TOnGraphBufferingData read FOnGraphBufferingData write FOnGraphBufferingData;
  440.     { The reference clock has changed. The filter graph manager sends this event
  441.       when its IMediaFilter.SetSyncSource method is called.}
  442.     property OnGraphClockChanged: TNotifyEvent read FOnGraphClockChanged write FOnGraphClockChanged;
  443.     { All data from a particular stream has been rendered.
  444.       By default, the filter graph manager does not forward this event to the
  445.       application. However, after all the streams in the graph report EC_COMPLETE,
  446.       the filter graph manager posts a separate EC_COMPLETE event to the application.<br>
  447.         <b>Result:</b> HRESULT value; can be S_OK.<br>
  448.         <b>Renderer:</b> nil, or a reference to the renderer's IBaseFilter interface.}
  449.     property OnGraphComplete: TOnGraphComplete read FOnGraphComplete write FOnGraphComplete;
  450.     { A Plug and Play device was removed or became available again. When the
  451.       device becomes available again, the previous state of the device filter is
  452.       no longer valid. The application must rebuild the graph in order to use the device.<br>
  453.         <b>Device:</b> IUnknown interface of the filter that represents the device.<br>
  454.         <b>Removed:</b> True if the device was removed, or False if the device is available again.}
  455.     property OnGraphDeviceLost: TOnGraphDeviceLost read FOnGraphDeviceLost write FOnGraphDeviceLost;
  456.     { The end of a segment was reached.
  457.       This event code supports seamless looping. When a call to the IMediaSeeking.SetPositions
  458.       method includes the AM_SEEKING_Segment flag, the source filter sends this
  459.       event code instead of calling IPin.EndOfStream.<br>
  460.         <b>StreamTime:</b> TREFERENCE_TIME value that specifies the accumulated stream time since the start of the segment.<br>
  461.         <b>NumSegment:</b> Cardinal value indicating the segment number (zero-based).}
  462.     property OnGraphEndOfSegment: TOnGraphEndOfSegment read FOnGraphEndOfSegment write FOnGraphEndOfSegment;
  463.     { An asynchronous command to run the graph has failed.
  464.       if the filter graph manager issues an asynchronous run command that fails,
  465.       it sends this event to the application. The graph remains in a running state.
  466.       The state of the underlying filters is indeterminate. Some filters might be
  467.       running, others might not.<br>
  468.         <b>Result:</b> value of the operation that failed.}
  469.     property OnGraphErrorStillPlaying: TOnDSResult read FOnGraphErrorStillPlaying write FOnGraphErrorStillPlaying;
  470.     { An operation was aborted because of an error.<br>
  471.         <b>Result:</b> value of the operation that failed.}
  472.     property OnGraphErrorAbort: TOnDSResult read FOnGraphErrorAbort write FOnGraphErrorAbort;
  473.     { The video renderer is switching out of full-screen mode.
  474.       When the Full Screen Renderer loses activation, it sends this event. When
  475.       another video renderer switches out of full-screen mode, the filter graph
  476.       manager sends this event, in response to an EC_ACTIVATE event from the renderer.<br>
  477.         <b>Renderer:</b> the video renderer's IBaseFilter interface, or nil.}
  478.     property OnGraphFullscreenLost: TOnGraphFullscreenLost read FOnGraphFullscreenLost write FOnGraphFullscreenLost;
  479.     { The filter graph has changed.
  480.       This event code is intended for debugging. It is not sent for all graph changes.}
  481.     property OnGraphChanged: TNotifyEvent read FOnGraphChanged write FOnGraphChanged;
  482.     { A filter is passing a text string to the application.
  483.       By convention, the first parameter contains type information (for example, Text)
  484.       and the second parameter contains the text string.<br>
  485.         <b>String1, String2:</b> Wide Strings}
  486.     property OnGraphOleEvent: TOnGraphOleEvent read FOnGraphOleEvent write FOnGraphOleEvent;
  487.     { The graph is opening a file, or has finished opening a file.
  488.       A filter can send this event if it spends significant time opening a file.
  489.       (for example, the file might be located on a network.) The application can use
  490.       this event to adjust its user interface.<br>
  491.         <b>opening:</b> TRUE if the graph is starting to open a file, or FALSE
  492.                         if the graph is no longer opening the file.}
  493.     property OnGraphOpeningFile: TOnGraphOpeningFile read FOnGraphOpeningFile write FOnGraphOpeningFile;
  494.     {  The video palette has changed.
  495.        Video renderers send this event if they detect a palette change in the stream.}
  496.     property OnGraphPaletteChanged: TNotifyEvent read FOnGraphPaletteChanged write FOnGraphPaletteChanged;
  497.     { A pause request has completed.
  498.       The filter graph manager sends this event when it completes an asynchronous pause command.<br>
  499.         <b>Result:</b> value that indicates the result of the transition. if the
  500.                        value is S_OK, the filter graph is now in a paused state.}
  501.     property OnGraphPaused: TOnDSResult read FOnGraphPaused write FOnGraphPaused;
  502.     { The graph is dropping samples, for quality control.
  503.       A filter sends this event if it drops samples in response to a quality control
  504.       message. It sends the event only when it adjusts the quality level, not for each
  505.       sample that it drops. }
  506.     property OnGraphQualityChange: TNotifyEvent read FOnGraphQualityChange write FOnGraphQualityChange;
  507.     { An audio device error occurred on an input pin.<br>
  508.         <b>OccurWhen:</b> value from the TSNDDEV_ERR enumerated type, indicating how the device was being accessed when the failure occurred.<br>
  509.         <b>ErrorCode:</b> value indicating the error returned from the sound device call.}
  510.     property OnGraphSNDDevInError: TOnGraphSNDDevError read FOnGraphSNDDevInError write FOnGraphSNDDevInError;
  511.     { An audio device error occurred on an output pin.<br>
  512.         <b>OccurWhen:</b> value from the TSNDDEV_ERR enumerated type, indicating how the device was being accessed when the failure occurred.<br>
  513.         <b>ErrorCode:</b> value indicating the error returned from the sound device call.}
  514.     property OnGraphSNDDevOutError: TOnGraphSNDDevError read FOnGraphSNDDevOutError write FOnGraphSNDDevOutError;
  515.     { A filter has completed frame stepping.
  516.       The filter graph manager pauses the graph and passes the event to the application.}
  517.     property OnGraphStepComplete: TNotifyEvent read FOnGraphStepComplete write FOnGraphStepComplete;
  518.     { A stream-control start command has taken effect.
  519.       Filters send this event in response to the IAMStreamControl.StartAt method.
  520.       This method specifies a reference time for a pin to begin streaming.
  521.       When streaming does begin, the filter sends this event.<br>
  522.         <b>PinSender</b> parameter specifies the pin that executes the start command.
  523.                          Depending on the implementation, it might not be the pin that
  524.                          received the StartAt call.<br>
  525.         <b>Cookie</b> parameter is specified by the application in the StartAt method.
  526.                       This parameter enables the application to track multiple calls to the method.}
  527.     property OnGraphStreamControlStarted: TOnGraphStreamControl read FOnGraphStreamControlStarted  write FOnGraphStreamControlStarted;
  528.     { A stream-control start command has taken effect.
  529.       Filters send this event in response to the IAMStreamControl.StopAt method.
  530.       This method specifies a reference time for a pin to stop streaming.
  531.       When streaming does halt, the filter sends this event.<br>
  532.         <b>PinSender</b> parameter specifies the pin that executes the stop command.
  533.                          Depending on the implementation, it might not be the pin
  534.                          that received the StopAt call.<br>
  535.         <b>Cookie</b> parameter is specified by the application in the StopAt method.
  536.                       This parameter enables the application to track multiple calls to the method.}
  537.     property OnGraphStreamControlStopped: TOnGraphStreamControl read FOnGraphStreamControlStopped write FOnGraphStreamControlStopped;
  538.     { An error occurred in a stream, but the stream is still playing.<br>
  539.         <b>Operation:</b> HRESULT of the operation that failed.<br>
  540.         <b>Value:</b> LongWord value, generally zero. }
  541.     property OnGraphStreamErrorStillPlaying : TOnGraphStreamError read FOnGraphStreamErrorStillPlaying write FOnGraphStreamErrorStillPlaying;
  542.     { A stream has stopped because of an error.<br>
  543.         <b>Operation:</b> HRESULT of the operation that failed.<br>
  544.         <b>Value:</b> LongWord value, generally zero. }
  545.     property OnGraphStreamErrorStopped: TOnGraphStreamError read FOnGraphStreamErrorStopped write FOnGraphStreamErrorStopped;
  546.     { The user has terminated playback.<br>
  547.       This event code signals that the user has terminated normal graph playback.
  548.       for example, video renderers send this event if the user closes the video window.<br>
  549.       After sending this event, the filter should reject all samples and not send
  550.       any EC_REPAINT events, until the filter stops and is reset.}
  551.     property OnGraphUserAbort: TNotifyEvent read FOnGraphUserAbort write FOnGraphUserAbort;
  552.     { The native video size has changed.<br>
  553.         <b>width:</b> new width, in pixels.<br>
  554.         <b>height:</b> new height, in pixels. }
  555.     property OnGraphVideoSizeChanged: TOnGraphVideoSizeChanged read FOnGraphVideoSizeChanged write FOnGraphVideoSizeChanged;
  556.     { Sent by filter supporting timecode.<br>
  557.         <b>From:</b> sending object.<br>
  558.         <b>DeviceID:</b> device ID of the sending object}
  559.     property OnGraphTimeCodeAvailable: TOnGraphTimeCodeAvailable read FOnGraphTimeCodeAvailable write FOnGraphTimeCodeAvailable;
  560.     { Sent by filter supporting IAMExtDevice.<br>
  561.         <b>NewMode:</b> the new mode<br>
  562.         <b>DeviceID:</b> the device ID of the sending object}
  563.     property OnGraphEXTDeviceModeChange: TOnGraphEXTDeviceModeChange read FOnGraphEXTDeviceModeChange write FOnGraphEXTDeviceModeChange;
  564.     { The clock provider was disconnected.<br>
  565.       KSProxy signals this event when the pin of a clock-providing filter is disconnected.}
  566.     property OnGraphClockUnset: TNotifyEvent read FOnGraphClockUnset write FOnGraphClockUnset;
  567.     { Identifies the type of rendering mechanism the VMR is using to display video.}
  568.     property OnGraphVMRRenderDevice: TOnGraphVMRRenderDevice read FOnGraphVMRRenderDevice write FOnGraphVMRRenderDevice;
  569.     { Signals that the current audio stream number changed for the main title.<br>
  570.       The current audio stream can change automatically with a navigation command
  571.       authored on the disc as well as through application control by using the IDvdControl2 interface.<br>
  572.       <b>stream:</b> value indicating the new user audio stream number. Audio stream numbers
  573.         range from 0 to 7. Stream $FFFFFFFF indicates that no stream is selected.<br>
  574.       <b>lcid:</b> Language identifier.<br>
  575.       <b>Lang:</b> Language string. }
  576.     property OnDVDAudioStreamChange: TOnDVDAudioStreamChange read FOnDVDAudioStreamChange write FOnDVDAudioStreamChange;
  577.     { Deprecated, use @link(OnDVDCurrentHMSFTime) instead.<br>
  578.       Signals the beginning of every video object unit (VOBU), a video segment
  579.       which is 0.4 to 1.0 seconds in length.<br> }
  580.     property OnDVDCurrentTime: TOnDVDCurrentTime read FOnDVDCurrentTime write FOnDVDCurrentTime;
  581.     { Indicates when the current title number changes.<br>
  582.       Title numbers range from 1 to 99. This number indicates the TTN, which is
  583.       the title number with respect to the whole disc, not the VTS_TTN which is
  584.       the title number with respect to just a current VTS.<br>
  585.       <b>Title:</b> value indicating the new title number.}
  586.     property OnDVDTitleChange: TOnDVDTitleChange read FOnDVDTitleChange write FOnDVDTitleChange;
  587.     { Signals that the DVD player started playback of a new program in the
  588.       DVD_DOMAIN_Title domain.<br>
  589.       Only simple linear movies signal this event.<br>
  590.       <b>chapter:</b> value indicating the new chapter (program) number.}
  591.     property OnDVDChapterStart: TOnDVDChapterStart read FOnDVDChapterStart write FOnDVDChapterStart;
  592.     { Signals that either the number of available angles changed or that the
  593.       current angle number changed.<br>
  594.       Angle numbers range from 1 to 9. The current angle number can change
  595.       automatically with a navigation command authored on the disc as well as
  596.       through application control by using the IDvdControl2 interface.<br>
  597.       <b>total:</b> value indicating the number of available angles. When the
  598.          number of available angles is 1, the current video is not multiangle.<br>
  599.       <b>current:</b> value indicating the current angle number.}
  600.     property OnDVDAngleChange: TOnDVDChange read FOnDVDAngleChange write FOnDVDAngleChange;
  601.     { Signals that the available set of IDvdControl2 interface methods has changed.<br>
  602.       <b>UOPS:</b> value representing a ULONG whose bits indicate which IDvdControl2
  603.       commands the DVD disc explicitly disabled. }
  604.     property OnDVDValidUOPSChange: TOnDVDValidUOPSChange read FOnDVDValidUOPSChange write FOnDVDValidUOPSChange;
  605.     { Signals that either the number of available buttons changed or that the
  606.       currently selected button number changed.<br>
  607.       This event can signal any of the available button numbers. These numbers
  608.       do not always correspond to button numbers used for
  609.       IDvdControl2.SelectAndActivateButton because that method can activate only
  610.       a subset of buttons.<br>
  611.       <b>total:</b> value indicating the number of available buttons.<br>
  612.       <b>current:</b> value indicating the currently selected button number.
  613.         Selected button number zero implies that no button is selected.}
  614.     property OnDVDButtonChange: TOnDVDChange read FOnDVDButtonChange write FOnDVDButtonChange;
  615.     { Indicates that playback stopped as the result of a call to the
  616.       IDvdControl2.PlayChaptersAutoStop method.}
  617.     property OnDVDChapterAutoStop: TNotifyEvent read FOnDVDChapterAutoStop write FOnDVDChapterAutoStop;
  618.     { Signals the beginning of any still (PGC, Cell, or VOBU).
  619.       All combinations of buttons and still are possible (buttons on with still
  620.       on, buttons on with still off, button off with still on, button off with still off).<br>
  621.       <b>NoButtonAvailable</b>: Boolean value indicating whether buttons are
  622.       available. False indicates buttons are available so the IDvdControl2.StillOff
  623.       method won't work. True indicates no buttons are available, so IDvdControl2.StillOff will work.<br>
  624.       <b>seconds</b>: value indicating the number of seconds the still will last.
  625.       $FFFFFFFF indicates an infinite still, meaning wait until the user presses
  626.       a button or until the application calls IDvdControl2.StillOff.}
  627.     property OnDVDStillOn: TOnDVDStillOn read FOnDVDStillOn write FOnDVDStillOn;
  628.     { Signals the end of any still (PGC, Cell, or VOBU).<br>
  629.       This event indicates that any currently active still has been released.}
  630.     property OnDVDStillOff: TNotifyEvent read FOnDVDStillOff write FOnDVDStillOff;
  631.     { Signals that the current subpicture stream number changed for the main title.<br>
  632.       The subpicture can change automatically with a navigation command authored
  633.       on disc as well as through application control using IDvdControl2.<br>
  634.       <b>SubNum:</b> value indicating the new user subpicture stream number.
  635.         Subpicture stream numbers range from 0 to 31. Stream $FFFFFFFF indicates
  636.         that no stream is selected.<br>
  637.       <b>lcid:</b> Language identifier.<br>
  638.       <b>Lang:</b> Language string.}
  639.     property OnDVDSubpictureStreamChange: TOnDVDSubpictureStreamChange read FOnDVDSubpictureStreamChange write FOnDVDSubpictureStreamChange;
  640.     { Signals that the DVD disc does not have a FP_PGC (First Play Program Chain)
  641.       and that the DVD Navigator will not automatically load any PGC and start playback.}
  642.     property OnDVDNoFP_PGC: TNotifyEvent read FOnDVDNoFP_PGC write FOnDVDNoFP_PGC;
  643.     { Signals that a rate change in the playback has been initiated.
  644.       <b>rate:</b> indicate the new playback rate. rate < 0 indicates reverse playback
  645.       mode. rate > 0 indicates forward playback mode.}
  646.     property OnDVDPlaybackRateChange: TOnDVDPlaybackRateChange read FOnDVDPlaybackRateChange write FOnDVDPlaybackRateChange;
  647.     { Signals that the parental level of the authored content is about to change.<br>
  648.       The DVD Navigator source filter does not currently support "on the fly"
  649.       parental level changes in response to SetTmpPML commands on a DVD disc.<br>
  650.       <b>level:</b> value representing the new parental level set in the player.}
  651.     property OnDVDParentalLevelChange: TOnDVDParentalLevelChange read FOnDVDParentalLevelChange write FOnDVDParentalLevelChange;
  652.     { Indicates that playback has been stopped. The DVD Navigator has completed
  653.       playback of the title or chapter and did not find any other branching
  654.       instruction for subsequent playback. }
  655.     property OnDVDPlaybackStopped: TNotifyEvent read FOnDVDPlaybackStopped write FOnDVDPlaybackStopped;
  656.     { Indicates whether an angle block is being played and angle changes can be performed.<br>
  657.       Angle changes are not restricted to angle blocks and the manifestation of
  658.       the angle change can be seen only in an angle block.<br>
  659.       <b>available:</b> Boolean value that indicates if an angle block is being
  660.       played back. False indicates that playback is not in an angle block and
  661.       angles are not available, True indicates that an angle block is being played
  662.       back and angle changes can be performed.}
  663.     property OnDVDAnglesAvailable: TOnDVDAnglesAvailable read FOnDVDAnglesAvailable write FOnDVDAnglesAvailable;
  664.     { Indicates that the Navigator has finished playing the segment specified
  665.       in a call to PlayPeriodInTitleAutoStop.}
  666.     property OnDVDPlayPeriodAutoStop: TNotifyEvent read FOnDVDPlayPeriodAutoStop write FOnDVDPlayPeriodAutoStop;
  667.     { Signals that a menu button has been automatically activated per instructions
  668.       on the disc. This occurs when a menu times out and the disc has specified a
  669.       button to be automatically activated.<br>
  670.       <b>Button</b>: value indicating the button that was activated.}
  671.     property OnDVDButtonAutoActivated: TOnDVDButtonAutoActivated read FOnDVDButtonAutoActivated write FOnDVDButtonAutoActivated;
  672.     { Signals that a particular command has begun.<br>
  673.       <b>CmdID:</b> The Command ID and the HRESULT return value.}
  674.     property OnDVDCMDStart: TOnDVDCMD read FOnDVDCMDStart Write FOnDVDCMDStart;
  675.     { Signals that a particular command has completed.<br>
  676.       <b>CmdID</b> The Command ID and the completion result.}
  677.     property OnDVDCMDEnd: TOnDVDCMD read FOnDVDCMDEnd Write FOnDVDCMDEnd;
  678.     { Signals that a disc was ejected.<br>
  679.       Playback automatically stops when a disc is ejected. The application does
  680.       not have to take any special action in response to this event.}
  681.     property OnDVDDiscEjected: TNotifyEvent read FOnDVDDiscEjected Write FOnDVDDiscEjected;
  682.     { Signals that a disc was inserted into the drive.<br>
  683.       Playback automatically begins when a disc is inserted. The application does
  684.       not have to take any special action in response to this event.}
  685.     property OnDVDDiscInserted: TNotifyEvent read FOnDVDDiscInserted write FOnDVDDiscInserted;
  686.     { Signals the current time, in DVD_HMSF_TIMECODE format, relative to the start
  687.       of the title. This event is triggered at the beginning of every VOBU, which
  688.       occurs every 0.4 to 1.0 seconds.<br>
  689.       The TDVD_HMSF_TIMECODE format is intended to replace the old BCD format that
  690.       is returned in OnDVDCurrentTime events. The HMSF timecodes are easier to
  691.       work with. To have the Navigator send EC_DVD_CURRENT_HMSF_TIME events instead
  692.       of EC_DVD_CURRENT_TIME events, an application must call
  693.       IDvdControl2.SetOption(DVD_HMSF_TimeCodeEvents, TRUE). When this flag is set,
  694.       the Navigator will also expect all time parameters in the IDvdControl2 and
  695.       IDvdInfo2 methods to be passed as TDVD_HMSF_TIMECODEs.<br>
  696.       <b>HMSFTimeCode:</b> HMS Time code structure.<br>
  697.       <b>TimeCode:</b> old time format, do not use. }
  698.     property OnDVDCurrentHMSFTime: TOnDVDCurrentHMSFTime read FOnDVDCurrentHMSFTime write FOnDVDCurrentHMSFTime;
  699.     { Indicates that the Navigator has either begun playing or finished playing karaoke data.<br>
  700.       The DVD player signals this event whenever it changes domains.<br>
  701.       <b>Played:</b> TRUE means that a karaoke track is being played and FALSE means
  702.         that no karaoke data is being played. }
  703.     property OnDVDKaraokeMode: TOnDVDKaraokeMode read FOnDVDKaraokeMode write FOnDVDKaraokeMode;
  704.     { Performing default initialization of a DVD disc.}
  705.     property OnDVDDomainFirstPlay: TNotifyEvent read FOnDVDDomainFirstPlay write FOnDVDDomainFirstPlay;
  706.     { Displaying menus for whole disc. }
  707.     property OnDVDDomainVideoManagerMenu: TNotifyEvent read FOnDVDDomainVideoManagerMenu write FOnDVDDomainVideoManagerMenu;
  708.     { Displaying menus for current title set. }
  709.     property OnDVDDomainVideoTitleSetMenu: TNotifyEvent read FOnDVDDomainVideoTitleSetMenu write FOnDVDDomainVideoTitleSetMenu;
  710.     { Displaying the current title. }
  711.     property OnDVDDomainTitle: TNotifyEvent read FOnDVDDomainTitle write FOnDVDDomainTitle;
  712.     { The DVD Navigator is in the DVD Stop domain.}
  713.     property OnDVDDomainStop: TNotifyEvent read FOnDVDDomainStop write FOnDVDDomainStop;
  714.     { Something unexpected happened; perhaps content is authored incorrectly.
  715.       Playback is stopped.}
  716.     property OnDVDErrorUnexpected: TNotifyEvent read FOnDVDErrorUnexpected write FOnDVDErrorUnexpected;
  717.     { Key exchange for DVD copy protection failed. Playback is stopped. }
  718.     property OnDVDErrorCopyProtectFail: TNotifyEvent read FOnDVDErrorCopyProtectFail write FOnDVDErrorCopyProtectFail;
  719.     { DVD-Video disc is authored incorrectly for specification version 1.x.
  720.       Playback is stopped.}
  721.     property OnDVDErrorInvalidDVD1_0Disc: TNotifyEvent read FOnDVDErrorInvalidDVD1_0Disc write FOnDVDErrorInvalidDVD1_0Disc;
  722.     { DVD-Video disc cannot be played because the disc is not authored to play in
  723.       the system region. }
  724.     property OnDVDErrorInvalidDiscRegion: TNotifyEvent read FOnDVDErrorInvalidDiscRegion write FOnDVDErrorInvalidDiscRegion;
  725.     { Player parental level is lower than the lowest parental level available in
  726.       the DVD content. Playback is stopped. }
  727.     property OnDVDErrorLowParentalLevel: TNotifyEvent read FOnDVDErrorLowParentalLevel write FOnDVDErrorLowParentalLevel;
  728.     { Macrovision