📄 basefiltereditor.pas
字号:
(name: 'IEnumGuideDataProperties' ; itf: '{AE44423B-4571-475c-AD2C-F40A771D80EF}'),
(name: 'IEnumTuneRequests' ; itf: '{1993299C-CED6-4788-87A3-420067DCE0C7}'),
(name: 'IGuideData' ; itf: '{61571138-5B01-43cd-AEAF-60B784A0BF93}'),
(name: 'IGuideDataLoader' ; itf: '{4764ff7c-fa95-4525-af4d-d32236db9e38}'),
(name: 'IVPEConfig' ; itf: '{BC29A660-30E3-11d0-9E69-00C04FD7C15B}'),
(name: 'IVPE' ; itf: '{BC29A661-30E3-11d0-9E69-00C04FD7C15B}'),
(name: 'IDivXFilterInterface' ; itf: '{D132EE97-3E38-4030-8B17-59163B30A1F5}'),
(name: 'IVMRAspectRatioControl9' ; itf: '{00d96c29-bbde-4efc-9901-bb5036392146}'),
(name: 'IVMRDeinterlaceControl9' ; itf: '{a215fb8d-13c2-4f7f-993c-003d6271a459}'),
(name: 'IVMRFilterConfig9' ; itf: '{5a804648-4f66-4867-9c43-4f5c822cf1b8}'),
(name: 'IVMRImageCompositor9' ; itf: '{4a5c89eb-df51-4654-ac2a-e48e02bbabf6}'),
(name: 'IVMRImagePresenter9' ; itf: '{69188c61-12a3-40f0-8ffc-342e7b433fd7}'),
(name: 'IVMRImagePresenterConfig9' ; itf: '{45c15cab-6e22-420a-8043-ae1f0ac02c7d}'),
(name: 'IVMRMixerBitmap9' ; itf: '{ced175e5-1935-4820-81bd-ff6ad00c9108}'),
(name: 'IVMRMixerControl9' ; itf: '{1a777eaa-47c8-4930-b2c9-8fee1c1b0f3b}'),
(name: 'IVMRMonitorConfig9' ; itf: '{46c2e457-8ba0-4eef-b80b-0680f0978749}'),
(name: 'IVMRSurface9' ; itf: '{dfc581a1-6e1f-4c3a-8d0a-5e9792ea2afc}'),
(name: 'IVMRSurfaceAllocator9' ; itf: '{8d5148ea-3f5d-46cf-9df1-d1b896eedb1f}'),
(name: 'IVMRSurfaceAllocatorNotify9' ; itf: '{dca3f5df-bb3a-4d03-bd81-84614bfbfa0c}'),
(name: 'IVMRWindowlessControl9' ; itf: '{8f537d09-f85e-4414-b23b-502e54c79927}'),
(name: 'IVMRVideoStreamControl9' ; itf: '{d0cfe38b-93e7-4772-8957-0400c49a4485}'),
(name: 'IEnumStreamBufferRecordingAttrib' ; itf: '{C18A9162-1E82-4142-8C73-5690FA62FE33}'),
(name: 'IStreamBufferConfigure' ; itf: '{ce14dfae-4098-4af7-bbf7-d6511f835414}'),
(name: 'IStreamBufferInitialize' ; itf: '{9ce50f2d-6ba7-40fb-a034-50b1a674ec78}'),
(name: 'IStreamBufferMediaSeeking' ; itf: '{f61f5c26-863d-4afa-b0ba-2f81dc978596}'),
(name: 'IStreamBufferRecComp' ; itf: '{9E259A9B-8815-42ae-B09F-221970B154FD}'),
(name: 'IStreamBufferRecordControl' ; itf: '{ba9b6c99-f3c7-4ff2-92db-cfdd4851bf31}'),
(name: 'IStreamBufferRecordingAttribute' ; itf: '{16CA4E03-FE69-4705-BD41-5B7DFC0C95F3}'),
(name: 'IStreamBufferSink' ; itf: '{afd1f242-7efd-45ee-ba4e-407a25c9a77a}'),
(name: 'IStreamBufferSource' ; itf: '{1c5bd776-6ced-4f44-8164-5eab0e98db12}'),
// ole
(name: 'IPersist' ; itf: '{0000010C-0000-0000-C000-000000000046}'),
(name: 'IPersistStream' ; itf: '{00000109-0000-0000-C000-000000000046}'),
(name: 'IPersistFile' ; itf: '{0000010B-0000-0000-C000-000000000046}'),
(name: 'IPersistPropertyBag' ; itf: '{37D84F60-42CB-11CE-8135-00AA004BB851}'),
(name: 'IPersistStorage' ; itf: '{0000010A-0000-0000-C000-000000000046}'),
(name: 'IMoniker' ; itf: '{0000000F-0000-0000-C000-000000000046}'),
(name: 'IStream' ; itf: '{0000000C-0000-0000-C000-000000000046}'),
(name: 'IBindCtx' ; itf: '{0000000E-0000-0000-C000-000000000046}'),
(name: 'IRunningObjectTable' ; itf: '{00000010-0000-0000-C000-000000000046}'),
(name: 'IPropertyBag' ; itf: '{55272A00-42CB-11CE-8135-00AA004BB851}'),
(name: 'IPropertyPage' ; itf: '{B196B28D-BAB4-101A-B69C-00AA00341D07}'),
(name: 'IPropertyPage2' ; itf: '{01E44665-24AC-101B-84ED-08002B2EC713}'),
(name: 'IPropertyStorage' ; itf: '{00000138-0000-0000-C000-000000000046}'),
(name: 'IServiceProvider' ; itf: '{6d5140c1-7436-11ce-8034-00aa006009fa}'),
(name: 'ISpecifyPropertyPages' ; itf: '{B196B28B-BAB4-101A-B69C-00AA00341D07}'),
(name: 'IErrorLog' ; itf: '{3127CA40-446E-11CE-8135-00AA004BB851}'),
(name: 'IErrorInfo' ; itf: '{1CF2B120-547D-101B-8E65-08002B2BD119}'),
(name: 'IStorage' ; itf: '{0000000B-0000-0000-C000-000000000046}'));
var
FormBaseFilter: TFormBaseFilter;
implementation
uses Activex, ComObj;
{$R *.dfm}
{$R BaseFilterEditor.res}
constructor TFormBaseFilter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SysDevEnum := TSysDevEnum.Create;
PinList:= TPinList.Create;
InPinPic := TBitmap.Create;
OutPinPic := TBitmap.Create;
InPinPic.LoadFromResourceName(hinstance, 'INPUT');
OutPinPic.LoadFromResourceName(hinstance, 'OUTPUT');
InfoBtn.Glyph.LoadFromResourceName(hinstance, 'INFO');
Image1.Picture.Bitmap.LoadFromResourceName(hinstance, 'GREEN_MARK');
Image2.Picture.Bitmap.LoadFromResourceName(hinstance, 'RED_MARK');
Image3.Picture.Bitmap.LoadFromResourceName(hinstance, 'BLUE_MARK');
Image4.Picture.Bitmap.LoadFromResourceName(hinstance, 'PURPLE_MARK');
Image5.Picture.Bitmap.LoadFromResourceName(hinstance, 'BLACK_MARK');
Image6.Picture.Bitmap.LoadFromResourceName(hinstance, 'INPUT');
Image7.Picture.Bitmap.LoadFromResourceName(hinstance, 'OUTPUT');
end;
destructor TFormBaseFilter.Destroy;
begin
SysDevEnum.Free;
PinList.Free;
InPinPic.Free;
OutPinPic.Free;
inherited destroy;
end;
procedure TFormBaseFilter.FormShow(Sender: TObject);
var
i, j: integer;
a, b : integer;
AMoniker, MyMoniker: IMoniker;
PropBag: IPropertyBag;
AVariant: OleVariant;
CLSID: TGUID;
Found: boolean;
NodeItem : pNodeItem;
TmpItem : TTreeNode;
begin
PageControl1.ActivePageIndex := 0;
RefreshTree;
Found := False;
j := 0;
MyMoniker := Filter.BaseFilter.Moniker;
if MyMoniker = nil then exit;
MyMoniker.BindToStorage(nil,nil,IPropertyBag, PropBag);
if PropBag.Read('CLSID',AVariant,nil) = S_OK then
CLSID := StringToGUID(AVariant)
else CLSID := GUID_NULL;
for i := 0 to SysDevEnum.CountCategories - 1 do
begin
SysDevEnum.SelectIndexCategory(i);
if SysDevEnum.CountFilters > 0 then
for j := 0 to SysDevEnum.CountFilters - 1 do
begin
if IsEqualGUID(CLSID, SysDevEnum.Filters[j].CLSID) then
begin
AMoniker := SysDevEnum.GetMoniker(j);
Found := AMoniker.IsEqual(MyMoniker) = S_OK;
AMoniker := nil;
end;
if Found then Break;
end;
Filters.SetFocus;
if Found then
begin
for a := 0 to Filters.Items.Count -1 do
begin
NodeItem := pNodeItem(Filters.Items[a].Data);
if (Filters.Items[a].Level = 0) and (NodeItem^.Index = I) then
begin
TmpItem := Filters.Items[a];
for b := 0 to TmpItem.Count -1 do
begin
NodeItem := pNodeItem(TmpItem.Item[b].data);
If NodeItem^.Index = J then
begin
Filters.Selected := TmpItem.Item[b];
Filterschange(Self, TmpItem.Item[b]);
end;
end;
end;
end;
break;
end;
end;
PropBag := nil;
MyMoniker := nil;
end;
procedure TFormBaseFilter.GetFilterInfo;
var
i: integer;
unk: IUnknown;
PinInfo: TPinInfo;
BaseF: IBaseFilter;
begin
BaseF := nil;
try
if Filter.BaseFilter.CreateFilter <> nil then
begin
for i := 0 to length(DSItfs)-1 do
begin
unk := nil;
if Succeeded(IFilter(Filter).QueryInterface(DSItfs[i].itf, unk)) then
Interfaces.Items.Add(DSItfs[i].name);
end;
if Succeeded(Filter.QueryInterface(IBaseFilter, BaseF)) then
begin
PinList.Assign(BaseF);
if PinList.Count > 0 then
for i := 0 to PinList.Count - 1 do
begin
PinInfo := PinList.PinInfo[i];
case PinInfo.dir of
PINDIR_INPUT : Pins.Items.AddObject(format('%s',[PinInfo.achName]), InPinPic);
PINDIR_OUTPUT : Pins.Items.AddObject(format('%s',[PinInfo.achName]), OutPinPic);
end;
PinInfo.pFilter := nil;
end;
End;
end;
finally
unk := nil;
BaseF := nil;
end
end;
procedure TFormBaseFilter.RefreshTree;
var
i, j : Integer;
TmpNode : TTreeNode;
NodeItem : pNodeItem;
MonikerStr : PWideChar;
Tmp : WideString;
begin
Filters.Items.BeginUpdate;
Filters.Items.Clear;
for i := 0 to SysDevEnum.CountCategories - 1 do
begin
New(NodeItem);
NodeItem^.Index := i;
TmpNode := Filters.Items.AddChildObject(nil, SysDevEnum.Categories[i].FriendlyName, NodeItem);
SysDevEnum.SelectIndexCategory(i);
if SysDevEnum.CountFilters > 0 then
for j := 0 to SysDevEnum.CountFilters - 1 do
begin
SysDevEnum.GetMoniker(j).GetDisplayName(nil, nil, MonikerStr);
New(NodeItem);
NodeItem^.Index := j;
NodeItem^.Color := FilterColors[0];
Tmp := MonikerStr;
Tmp := Copy(Tmp, Pos(':', Tmp)+1, 255);
Tmp := uppercase(Copy(Tmp, 1, pos(':', Tmp) -1));
If Tmp = 'PNP' then NodeItem^.Color := FilterColors[1];
If Tmp = 'CM' then NodeItem^.Color := FilterColors[2];
If Tmp = 'KS' then NodeItem^.Color := FilterColors[3];
If Tmp = 'DMO' then NodeItem^.Color := FilterColors[4];
Filters.Items.AddChildObject(TmpNode, SysDevEnum.Filters[j].FriendlyName, NodeItem);
end;
end;
{$IFDEF VER130}
Filters.AlphaSort;
{$ELSE}
Filters.AlphaSort(True);
{$ENDIF}
Filters.Items.EndUpdate;
end;
procedure TFormBaseFilter.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
PinList.Clear;
FilterGraph.ClearGraph;
FilterGraph.Active := false;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -