📄 dspack.pas
字号:
FilterGraph2.QueryInterface(IID_IMediaControl, MediaControl);
FilterGraph2.QueryInterface(IID_IMediaEventEx, MediaEventEx);
FilterGraph2.QueryInterface(IID_IVideoWindow, VideoWindow);
FilterGraph2.QueryInterface(IID_IBasicAudio, BasicAudio);
FilterGraph2.QueryInterface(IID_IBasicVideo2, BasicVideo2);
FilterGraph2.QueryInterface(IID_IMediaSeeking, MediaSeeking);
FilterGraph2.QueryInterface(IID_IAMGraphStreams, AMGraphStreams);
FilterGraph2.QueryInterface(IID_IFilterChain, FilterChain);
FilterGraph2.QueryInterface(IID_IFilterMapper2, FilterMapper2);
FilterGraph2.QueryInterface(IID_IGraphConfig, GraphConfig);
FilterGraph2.QueryInterface(IID_IGraphVersion, GraphVersion);
FilterGraph2.QueryInterface(IID_IMediaEventSink, MediaEventSink);
FilterGraph2.QueryInterface(IID_IQueueCommand, QueueCommand);
FilterGraph2.QueryInterface(IID_IResourceManager, ResourceManager);
FilterGraph2.QueryInterface(IID_IVideoFrameStep, VideoFrameStep);
end;
if assigned(FTB) then FTB.SetGraph(self);
inherited QueryInterfaces;
end;
procedure TDSFilterGraph2.ClearGraph;
begin
if assigned(GraphBuilder) then
begin
if assigned(FTB) then FTB.SetRate(1);
end;
inherited ClearGraph;
end;
//******************************************************************************
//
// TDSDVDGraph implementation
//
//******************************************************************************
procedure TDSDVDGraph.InitServerData;
const
CServerData: TServerData = (
ClassID: '{FCC152B7-F372-11D0-8E00-00C04FD7C08B}'; // CLSID_DvdGraphBuilder
IntfIID: '{FCC152B6-F372-11d0-8E00-00C04FD7C08B}'; // IID_IDvdGraphBuilder
EventIID: '';
LicenseKey: nil;
Version: 500);
begin
ServerData := @CServerData;
end;
procedure TDSDVDGraph.DoEvent(Event, Param1, Param2: longint);
var
lcid : cardinal;
achLang : array[0..MAX_PATH] of Char;
tc : TDVD_TIMECODE;
frate : integer;
hmsftc : TDVD_HMSF_TIMECODE;
begin
inherited DoEvent(Event, Param1, Param2);
case Event of
EC_DVD_ANGLE_CHANGE : if Assigned(FOnDVDAngleChange) then FOnDVDAngleChange(self,Param1,Param2);
EC_DVD_AUDIO_STREAM_CHANGE :
begin
if Assigned(FOnDVDAudioStreamChange) then
begin
DvdInfo2.GetAudioLanguage(Param1, lcid);
GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, achLang, MAX_PATH);
FOnDVDAudioStreamChange(self, Param1, lcid, string(achLang));
end;
end;
EC_DVD_BUTTON_CHANGE : if Assigned(FOnDVDButtonChange) then FOnDVDButtonChange(self, Param1, Param2);
EC_DVD_CHAPTER_AUTOSTOP : if Assigned(FOnDVDChapterAutoStop) then FOnDVDChapterAutoStop(self);
EC_DVD_CHAPTER_START : if Assigned(FOnDVDChapterStart) then FOnDVDChapterStart(self, Param1);
EC_DVD_CURRENT_TIME :
begin
if Assigned(FOnDVDCurrentTime) then
begin
tc := IntToTimeCode(Param1);
case tc.FrameRateCode of
1 : frate := 25;
3 : frate := 30;
else
frate := 0;
end;
FOnDVDCurrentTime(self,tc.Hours1+tc.Hours10*10,tc.Minutes1+tc.Minutes10*10,tc.Seconds1+tc.Seconds10*10,tc.Frames1+tc.Frames10*10,frate);
end;
end;
EC_DVD_DOMAIN_CHANGE :
begin
case Param1 of
1 : if Assigned(FOnDVDDomainFirstPlay) then FOnDVDDomainFirstPlay(self);
2 : if Assigned(FOnDVDDomainVideoManagerMenu) then FOnDVDDomainVideoManagerMenu(self);
3 : if Assigned(FOnDVDDomainVideoTitleSetMenu) then FOnDVDDomainVideoTitleSetMenu(self);
4 : if Assigned(FOnDVDDomainTitle) then FOnDVDDomainTitle(self);
5 : if Assigned(FOnDVDDomainStop) then FOnDVDDomainStop(self);
end;
end;
EC_DVD_ERROR :
begin
case Param1 of
1 : if Assigned(FOnDVDErrorUnexpected) then FOnDVDErrorUnexpected(self);
2 : if Assigned(FOnDVDErrorCopyProtectFail) then FOnDVDErrorCopyProtectFail(self);
3 : if Assigned(FOnDVDErrorInvalidDVD1_0Disc) then FOnDVDErrorInvalidDVD1_0Disc(self);
4 : if Assigned(FOnDVDErrorInvalidDiscRegion) then FOnDVDErrorInvalidDiscRegion(self);
5 : if Assigned(FOnDVDErrorLowParentalLevel) then FOnDVDErrorLowParentalLevel(self);
6 : if Assigned(FOnDVDErrorMacrovisionFail) then FOnDVDErrorMacrovisionFail(self);
7 : if Assigned(FOnDVDErrorIncompatibleSystemAndDecoderRegions) then FOnDVDErrorIncompatibleSystemAndDecoderRegions(self);
8 : if Assigned(FOnDVDErrorIncompatibleDiscAndDecoderRegions) then FOnDVDErrorIncompatibleDiscAndDecoderRegions(self);
end;
end;
EC_DVD_NO_FP_PGC : if Assigned(FOnDVDNoFP_PGC) then FOnDVDNoFP_PGC(self);
EC_DVD_STILL_OFF : if Assigned(FOnDVDStillOff) then FOnDVDStillOff(self);
EC_DVD_STILL_ON : if Assigned(FOnDVDStillOn) then FOnDVDStillOn(self,(Param1 = 1), Param2);
EC_DVD_SUBPICTURE_STREAM_CHANGE:
begin
if Assigned(FOnDVDSubpictureStreamChange) then
begin
DvdInfo2.GetSubpictureLanguage(Param1,lcid);
GetLocaleInfo(lcid,LOCALE_SENGLANGUAGE,achLang,MAX_PATH);
FOnDVDSubpictureStreamChange(self,Param1,lcid,string(achLang));
end;
end;
EC_DVD_TITLE_CHANGE : if Assigned(FOnDVDTitleChange) then FOnDVDTitleChange(self,Param1);
EC_DVD_VALID_UOPS_CHANGE : if Assigned(FOnDVDValidUOPSChange) then FOnDVDValidUOPSChange(self,IntToUOPS(Param1));
EC_DVD_WARNING :
begin
case Param1 of
1 : if Assigned(FOnDVDWarningInvalidDVD1_0Disc) then FOnDVDWarningInvalidDVD1_0Disc(self);
2 : if Assigned(FOnDVDWarningFormatNotSupported) then FOnDVDWarningFormatNotSupported(self);
3 : if Assigned(FOnDVDWarningIllegalNavCommand) then FOnDVDWarningIllegalNavCommand(self);
4 : if Assigned(FOnDVDWarningOpen) then FOnDVDWarningOpen(self);
5 : if Assigned(FOnDVDWarningSeek) then FOnDVDWarningSeek(self);
6 : if Assigned(FOnDVDWarningRead) then FOnDVDWarningRead(self);
end;
end;
EC_DVD_PLAYBACK_RATE_CHANGE : if Assigned(FOnDVDPlaybackRateChange) then FOnDVDPlaybackRateChange(self,trunc(Param1/10000));
EC_DVD_PARENTAL_LEVEL_CHANGE : if Assigned(FOnDVDParentalLevelChange) then FOnDVDParentalLevelChange(self,Param1);
EC_DVD_PLAYBACK_STOPPED : if Assigned(FOnDVDPlaybackStopped) then FOnDVDPlaybackStopped(self);
EC_DVD_ANGLES_AVAILABLE : if Assigned(FOnDVDAnglesAvailable) then FOnDVDAnglesAvailable(self,(Param1 = 1));
EC_DVD_PLAYPERIOD_AUTOSTOP : if Assigned(FOnDVDPlayPeriodAutoStop) then FOnDVDPlayPeriodAutoStop(self);
EC_DVD_BUTTON_AUTO_ACTIVATED : if Assigned(FOnDVDButtonAutoActivated) then FOnDVDButtonAutoActivated(self,Param1);
EC_DVD_CMD_START : if Assigned(FOnDVDCMDStart) then FOnDVDCMDStart(self,Param1);
EC_DVD_CMD_END : if Assigned(FOnDVDCMDEnd) then FOnDVDCMDEnd(self,Param1);
EC_DVD_DISC_EJECTED : if Assigned(FOnDVDDiscEjected) then FOnDVDDiscEjected(self);
EC_DVD_DISC_INSERTED : if Assigned(FOnDVDDiscInserted) then FOnDVDDiscInserted(self);
EC_DVD_CURRENT_HMSF_TIME :
begin
if assigned(FOnDVDCurrentHMSFTime) then
begin
hmsftc := TDVD_HMSF_TIMECODE(param1);
tc := IntToTimeCode(Param2);
FOnDVDCurrentHMSFTime(self,hmsftc,tc);
end;
end;
EC_DVD_KARAOKE_MODE : if assigned(FOnDVDKaraokeMode) then FOnDVDKaraokeMode(self,BOOL(Param1));
end;
end;
constructor TDSDVDGraph.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TDSDVDGraph.Destroy;
begin
inherited Destroy;
end;
procedure TDSDVDGraph.Connect;
var
punk: IUnknown;
begin
if DvdGraphBuilder = nil then
begin
punk := GetServer;
DvdGraphBuilder := punk as IDvdGraphBuilder;
DvdGraphBuilder.GetFiltergraph(GraphBuilder);
if RotEnabled then SetRot(true);
end;
end;
procedure TDSDVDGraph.Disconnect;
begin
if DvdGraphBuilder <> nil then
begin
DvdGraphBuilder := nil;
DvdControl2 := nil;
DvdInfo2 := nil;
AMLine21Decoder := nil;
end;
if Assigned(MediaEventEx) then
MediaEventEx.SetNotifyFlags(AM_MEDIAEVENT_NONOTIFY);
if GraphBuilder <> nil then
begin
if RotEnabled then SetRot(false);
GraphBuilder := nil;
MediaControl := nil;
MediaEventEx := nil;
VideoWindow := nil;
BasicAudio := nil;
BasicVideo2 := nil;
MediaSeeking := nil;
AMGraphStreams := nil;
FilterChain := nil;
FilterMapper2 := nil;
GraphConfig := nil;
GraphVersion := nil;
MediaEventSink := nil;
QueueCommand := nil;
ResourceManager := nil;
VideoFrameStep := nil;
end;
end;
procedure TDSDVDGraph.QueryInterfaces;
begin
if DvdGraphBuilder <> nil then
begin
DvdGraphBuilder.GetDvdInterface(IID_IDvdControl2, DvdControl2);
DvdGraphBuilder.GetDvdInterface(IID_IDvdInfo2, DvdInfo2);
DvdGraphBuilder.GetDvdInterface(IID_IAMLine21Decoder, AMLine21Decoder);
end;
if GraphBuilder <> nil then
begin
GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEventEx);
GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
GraphBuilder.QueryInterface(IID_IBasicAudio, BasicAudio);
GraphBuilder.QueryInterface(IID_IBasicVideo2, BasicVideo2);
GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeeking);
GraphBuilder.QueryInterface(IID_IAMGraphStreams, AMGraphStreams);
GraphBuilder.QueryInterface(IID_IFilterChain, FilterChain);
GraphBuilder.QueryInterface(IID_IFilterMapper2, FilterMapper2);
GraphBuilder.QueryInterface(IID_IGraphConfig, GraphConfig);
GraphBuilder.QueryInterface(IID_IGraphVersion, GraphVersion);
GraphBuilder.QueryInterface(IID_IMediaEventSink, MediaEventSink);
GraphBuilder.QueryInterface(IID_IQueueCommand, QueueCommand);
GraphBuilder.QueryInterface(IID_IResourceManager, ResourceManager);
GraphBuilder.QueryInterface(IID_IVideoFrameStep, VideoFrameStep);
end;
inherited QueryInterfaces;
end;
procedure TDSDVDGraph.SaveBookmark(BookMarkFile: string);
const
IID_IPersistStream : TGUID = '{00000109-0000-0000-C000-000000000046}';
var hr: HRESULT;
Bookmark: IDvdState;
pStorage: IStorage;
pStream : IStream;
PersistStream : IPersistStream;
begin
if assigned(DVDInfo2) then
begin
DVDInfo2.GetState(Bookmark);
StgCreateDocfile(StringToOleStr(BookMarkFile), STGM_CREATE or STGM_WRITE or STGM_SHARE_EXCLUSIVE, 0, pStorage);
pStorage.CreateStream('BookMark', STGM_CREATE or STGM_WRITE or STGM_SHARE_EXCLUSIVE, 0, 0, pStream);
hr := Bookmark.QueryInterface(IID_IPersistStream,PersistStream);
if (SUCCEEDED(hr)) then
begin
OleSaveToStream(PersistStream,pStream);
PersistStream := nil;
end
else
begin
PersistStream := nil;
exit;
end;
end;
end;
procedure TDSDVDGraph.RestoreBookmark(BookMarkFile: string);
var pStorage : IStorage;
pStream : IStream;
pBookmark: IDvdState;
hr : HRESULT;
obj : IDVDCmd;
begin
if assigned(DVDControl2) then
begin
StgOpenStorage(StringToOleStr(BookMarkFile), nil, STGM_READ or STGM_SHARE_EXCLUSIVE, nil , 0, pStorage);
pStorage.OpenStream('BookMark', nil, STGM_READ or STGM_SHARE_EXCLUSIVE, 0, pStream);
OleLoadFromStream(pStream, IID_IDvdState, pBookmark);
hr := DVDControl2.SetState(pBookmark, DVD_CMD_FLAG_None, obj);
if not (failed(hr)) then
begin
obj.WaitForEnd;
obj := nil;
end;
end;
end;
//******************************************************************************
//
// TDSCaptureGraph implementation
//
//******************************************************************************
procedure TDSCaptureGraph.InitServerData;
begin
inherited InitServerData;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -