Syntax bei IGraphBuilder::AddSourceFilter ???

Für allgemeine Fragen zur Programmierung mit PureBasic.
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Syntax bei IGraphBuilder::AddSourceFilter ???

Beitrag von andi256 »

Hi ...

Versuche mich gerade einwenig mit Interfaces .... und Graphen
(man findet eigentlich darüber nichts in PB ... )

habe da ein Problem und zwar bekomm ich IGraphBuilder::AddSourceFilter nicht wirklich auf die Reihe

weis wer wie man einen Source-Filter richtig initialisiert ?

möchte zB.: "a.avi" in den "AVI/WAV File Source" Filter laden .... aber mit der Syntax stimmt da irgendwas nicht ????

Code: Alles auswählen

Debug lpGB\AddSourceFilter(@"N:\a.avi",@"AVI/WAV_File_Source",@lpSource_Filter)

Code: Alles auswählen

#CLSCTX_INPROC_SERVER        = $1
#VFW_E_NOT_FOUND             = $80040216
#MAX_FILTER_NAME             = 128

Structure FilterInfo 
 achName.b[#MAX_FILTER_NAME] 
 lpFilterGraph.IFilterGraph
EndStructure

CoInitialize_(0)
Debug CoCreateInstance_(?CLSID_FilterGraph, #NULL,#CLSCTX_INPROC_SERVER,?IID_IGraphBuilder,@lpGB.IGraphBuilder)
Debug CoCreateInstance_(?CLSID_Source_Filter, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpSource_Filter.IBaseFilter)
Debug CoCreateInstance_(?CLSID_Avi_Splitter, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpAvi_Splitter.IBaseFilter)

Debug lpGB\AddSourceFilter(@"N:\a.avi",@"AVI/WAV_File_Source",@lpSource_Filter)
Debug #VFW_E_NOT_FOUND 

Debug lpGB\AddFilter(lpAvi_Splitter, @"AVI_Splitter")

Debug lpGB\EnumFilters(@lpEnum.IEnumFilters)
While lpEnum\Next(1,@Filter.IBaseFilter,0) = #S_OK
 Filter\QueryFilterinfo(@info.FilterInfo)
 Debug PeekS(@info\achName)
Wend

lpGB\Release()
lpSource_Filter\Release()
lpAvi_Splitter\Release()

CoUninitialize_()

DataSection 
 CLSID_FilterGraph: 
 Data.l $E436EBB3
 Data.w $524F,$11CE
 Data.b $9F,$53,$00,$20,$AF,$0B,$A7,$70
 IID_IGraphBuilder:
 Data.l $56A868A9
 Data.W $0AD4,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_Source_Filter:
 Data.l $D3588AB0
 Data.w $0781,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_Avi_Splitter:
 Data.l $1B544C20
 Data.w $FD0B,$11CE
 Data.b $8C,$63,$00,$AA,$00,$44,$B5,$1E 
 IID_IBaseFilter: 
 Data.l $56A86895
 Data.w $0AD4,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
EndDataSection
für jeden Tipp dankbar
andi256
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: Syntax bei IGraphBuilder::AddSourceFilter ???

Beitrag von traumatic »

andi256 hat geschrieben:[...]aber mit der Syntax stimmt da irgendwas nicht ????[...]

Code: Alles auswählen

HRESULT AddSourceFilter(
LPCWSTR lpwstrFileName,
LPCWSTR lpwstrFilterName,
IBaseFilter **ppFilter
);
LPCWSTR = (Long)Pointer To WideString (Char), die ersten beiden
Parameter müssen also Widechar sein.

Geht es so?

Code: Alles auswählen

file.s = "C:\WINDOWS\MEDIA\Chimes.WAV"

Dim wavFile.w(Len(file))
MultiByteToWideChar_(#CP_ACP, 0, file, -1, wavFile(), Len(file))
Debug lpGB\AddSourceFilter(@wavFile(), @wavFile(), @lpSource_Filter)
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Beitrag von andi256 »

@traumatic
Viele Dank ..... funzt !!!!!

Beispiel: Wiedergabe eines Videos über DirectX

Code: Alles auswählen

#CLSCTX_INPROC_SERVER        = $1
#VFW_E_NOT_FOUND             = $80040216
#MAX_FILTER_NAME             = 128

Structure FilterInfo 
 achName.b[#MAX_FILTER_NAME] 
 lpFilterGraph.IFilterGraph
EndStructure

Enumeration 
 #PINDIR_INPUT
 #PINDIR_OUTPUT
EndEnumeration 

CoInitialize_(0)
Debug CoCreateInstance_(?CLSID_FilterGraph, #NULL,#CLSCTX_INPROC_SERVER,?IID_IGraphBuilder,@lpGB.IGraphBuilder)
Debug lpGB\QueryInterface(?IID_IMediaControl,@lpMC.IMediaControl)

Debug CoCreateInstance_(?CLSID_Source_Filter, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpSource_Filter.IBaseFilter)
Debug CoCreateInstance_(?CLSID_Avi_Decompressor, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpAvi_Decompressor.IBaseFilter)
Debug CoCreateInstance_(?CLSID_VideoRenderer, #NULL, #CLSCTX_INPROC_SERVER,?IID_IBaseFilter,@lpVRender.IBaseFilter)

file.s = "I:\Clock.avi" 

; SOURCE Filter

Dim wavFile.w(Len(file)) 
MultiByteToWideChar_(#CP_ACP, 0, file, -1, wavFile(), Len(file)) 
Debug lpGB\AddSourceFilter(@wavFile(), @wavFile(), @lpSource_Filter) 
lpSource_Filter\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.IPin,0) = #S_OK
 lpPin\QueryDirection(@a)
 If a = #PINDIR_OUTPUT
  lpSource_FilterPinOut = lpPin
 EndIf
Wend
Debug lpSource_FilterPinOut

;AVI_Decompressor

Debug lpGB\AddFilter(lpAvi_Decompressor, @"AVI_Decompressor")
lpAvi_Decompressor\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.IPin,0) = #S_OK
 lpPin\QueryDirection(@a)
 If a = #PINDIR_OUTPUT
  lpAvi_DecompressorPinOut = lpPin
 EndIf
 If a = #PINDIR_INPUT
   lpAvi_DecompressorPinIn  = lpPin 
 EndIf
Wend
Debug lpAvi_DecompressorPinIn
Debug lpAvi_DecompressorPinOut

; Renderer

Debug lpGB\AddFilter(lpVRender, @"Video_Renderer")
lpVRender\EnumPins(@lpNUM.IEnumPins)
While lpNUM\Next(1,@lpPin.Ipin,0) = #S_OK
 lpPin\QueryDirection(@a)
If a =  #PINDIR_INPUT
 lpVRenderPinIn = lpPin
EndIf
Wend

Debug lpVRenderPinIn

; Pins verbinden

Debug lpGB\Connect(lpSource_FilterPinOut,lpAvi_DecompressorPinIn)
Debug lpGB\Connect(lpAvi_DecompressorPinOut,lpVRenderPinIn)

; Verwendete Filter anzeigen

Debug lpGB\EnumFilters(@lpEnum.IEnumFilters)
While lpEnum\Next(1,@lpFilter.IBaseFilter,0) = #S_OK
 lpFilter\QueryFilterinfo(@info.FilterInfo)
 Debug PeekS(@info\achName)
Wend

; Wiedergabe starten

lpMC\Run()

; Freigabe

lpFilter\Release()
lpEnum\Release()
lpPin\Release()
lpNUM\Release()
lpVRender\Release()
lpAvi_Decompressor\Release()
lpSource_Filter\Release()
lpMC\Release()
lpGB\Release()

CoUninitialize_()

DataSection 
 CLSID_FilterGraph: 
 Data.l $E436EBB3
 Data.w $524F,$11CE
 Data.b $9F,$53,$00,$20,$AF,$0B,$A7,$70
 IID_IGraphBuilder:
 Data.l $56A868A9
 Data.W $0AD4,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_Source_Filter:
 Data.l $D3588AB0
 Data.w $0781,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_Avi_Splitter:
 Data.l $1B544C20
 Data.w $FD0B,$11CE
 Data.b $8C,$63,$00,$AA,$00,$44,$B5,$1E 
 IID_IBaseFilter: 
 Data.l $56A86895
 Data.w $0AD4,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_Avi_Decompressor:
 Data.l $CF49D4E0
 Data.w $1115,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
 CLSID_VideoRenderer:
 Data.l $70E102B0
 Data.w $5556,$11CE
 Data.b $97,$C0,$00,$AA,$00,$55,$59,$5A
 IID_IMediaControl:
 Data.l $56A868B1
 Data.w $0AD4,$11CE
 Data.b $B0,$3A,$00,$20,$AF,$0B,$A7,$70
EndDataSection
Andi256
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

andi256 hat geschrieben: Viele Dank ..... funzt !!!!!
Ja klar :allright:


Hmm... so 2 Tassen Kaffee später betrachtet, will mir das mit diesem häßlichen Array irgendwie gar nicht gefallen...

Vielleicht lieber so:

Code: Alles auswählen

Structure WCHAR
  c.w[#MAX_PATH]
EndStructure

Procedure LPWSTR(string.s, *out.WCHAR)
  strLen.l = Len(string)
  MultiByteToWideChar_(#CP_ACP, 0, string, -1, *out, strLen)
  ProcedureReturn strLen
EndProcedure
Ach, ich weiß nicht, da hat bestimmt noch irgendjmd. eine bessere Idee... :)
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Beitrag von andi256 »

machs jetzt so ... ist zwar auch hässlich ... aber wollte hintergrundwissen anschaffen :mrgreen:

Code: Alles auswählen

Procedure LPWSTR(stri.s)
 out.s = Space(Len(stri)*2+4)
 *out = @out
 For i = 0 To Len(stri)-1
  PokeB(*out+(i*2+4),PeekB(@stri+i))
  PokeB(*out+(i*2+5),0)
 Next i
 ProcedureReturn *out+4
EndProcedure

Code: Alles auswählen

file.s = "I:\Clock.avi" 

Debug lpGB\AddSourceFilter(LPWSTR(File),LPWSTR(File), @lpSource_Filter) 
Antworten