home *** CD-ROM | disk | FTP | other *** search
- VERSION 4.00
- Begin VB.Form frmMain
- Caption = "Filter and Pin Viewer"
- ClientHeight = 6060
- ClientLeft = 1680
- ClientTop = 1710
- ClientWidth = 7230
- Height = 6750
- Left = 1620
- LinkTopic = "frmMain"
- ScaleHeight = 6060
- ScaleWidth = 7230
- Top = 1080
- Width = 7350
- Begin VB.Frame frameFilter
- Caption = "Filter Graph"
- Height = 2652
- Left = 120
- TabIndex = 12
- Top = 120
- Width = 6972
- Begin VB.CommandButton cmdSource
- Caption = "Add &Source Filter..."
- Height = 372
- Left = 4560
- TabIndex = 14
- Top = 2160
- Width = 1572
- End
- Begin VB.ListBox listFilters
- Height = 1584
- Left = 3960
- TabIndex = 4
- Top = 480
- Width = 2772
- End
- Begin VB.CommandButton cmdAddRegFilter
- Caption = "&Add ->"
- Height = 372
- Left = 3120
- TabIndex = 13
- Top = 600
- Width = 732
- End
- Begin VB.ListBox listRegFilters
- Height = 1584
- Left = 240
- TabIndex = 2
- Top = 480
- Width = 2772
- End
- Begin VB.Label lblFilters
- Caption = "Filters in current filter &graph"
- Height = 252
- Left = 3960
- TabIndex = 3
- Top = 240
- Width = 2052
- End
- Begin VB.Label lblRegFilters
- Caption = "&Registered filters"
- Height = 252
- Left = 240
- TabIndex = 1
- Top = 240
- Width = 2052
- End
- End
- Begin VB.Frame framePinInfo
- Caption = "Filter"
- Height = 3132
- Left = 120
- TabIndex = 0
- Top = 2760
- Width = 6972
- Begin VB.TextBox txtPinInfo
- Height = 1812
- Left = 3720
- MultiLine = -1 'True
- ScrollBars = 2 'Vertical
- TabIndex = 17
- Text = "builder.frx":0000
- Top = 1200
- Width = 3012
- End
- Begin VB.CommandButton cmdConnect
- Caption = "Co&nnect One Pin..."
- Height = 372
- Left = 1920
- TabIndex = 8
- Top = 2640
- Width = 1692
- End
- Begin VB.CommandButton cmdRender
- Caption = "&Connect Downstream"
- Height = 372
- Left = 120
- TabIndex = 7
- Top = 2640
- Width = 1692
- End
- Begin VB.ListBox listPins
- Height = 1392
- Left = 240
- TabIndex = 6
- Top = 1200
- Width = 3252
- End
- Begin VB.Label lblFilterName
- Height = 255
- Left = 1440
- TabIndex = 16
- Top = 240
- Width = 4815
- End
- Begin VB.Label lblFilter
- Caption = "Filter name:"
- Height = 255
- Left = 240
- TabIndex = 15
- Top = 240
- Width = 975
- End
- Begin VB.Label lblVendor
- Caption = "Vendor: "
- Height = 255
- Left = 240
- TabIndex = 11
- Top = 480
- Width = 735
- End
- Begin VB.Label lblVendorInfo
- Height = 255
- Left = 1440
- TabIndex = 10
- Top = 480
- Width = 4935
- End
- Begin VB.Label lblPinListbox
- Caption = "&Pins in selected filter"
- Height = 255
- Left = 240
- TabIndex = 5
- Top = 840
- Width = 2055
- End
- Begin VB.Label lblPinInfo
- Caption = "Information for selected pin"
- Height = 252
- Left = 3720
- TabIndex = 9
- Top = 840
- Width = 2172
- End
- End
- Begin MSComDlg.CommonDialog CommonDialog1
- Left = 8760
- Top = -120
- _Version = 65536
- _ExtentX = 847
- _ExtentY = 847
- _StockProps = 0
- Flags = 4096
- End
- Begin VB.Menu mnuFilterGraph
- Caption = "&FilterGraph"
- Begin VB.Menu mnu_FilterGraphNew
- Caption = "&New (empty)"
- End
- Begin VB.Menu mnu_FilterGraphGenerate
- Caption = "&Generate from input file..."
- End
- Begin VB.Menu mnu_Separator1
- Caption = "-"
- End
- Begin VB.Menu mnu_FilterGraphRun
- Caption = "&Run"
- End
- Begin VB.Menu mnu_FilterGraphPause
- Caption = "&Pause"
- End
- Begin VB.Menu mnu_FilterGraphStop
- Caption = "&Stop"
- End
- Begin VB.Menu mnu_Separator2
- Caption = "-"
- End
- Begin VB.Menu mnu_FilterGraphExit
- Caption = "E&xit"
- End
- End
- Begin VB.Menu mnu_Options
- Caption = "&Options"
- Begin VB.Menu mnu_BuildCustomGraph
- Caption = "&Build custom graph"
- End
- End
- Attribute VB_Name = "frmMain"
- Attribute VB_Creatable = False
- Attribute VB_Exposed = False
- ' global variables
- ' use the prefix "g_obj" to indicate a global object
- Dim g_objMC As IMediaControl ' object 'IMediaControl
- Dim g_objSelFilter As Object 'IFilterInfo
- Dim g_objRegFilters As Object ' IFilterInfo collection
- Dim g_objLocalRegFilter As Object ' IFilterInfo
- Dim g_objSelPin As Object ' IPinInfo; pin selected from listbox
- Dim g_fRunning As Boolean ' indicates whether the video is running or not
- Private Sub RefreshRegFilters()
- ' update the listbox of registered filters
- ' using the global variable g_objRegFilters
- Dim filter As IRegFilterInfo
- listRegFilters.Clear
- If Not g_objRegFilters Is Nothing Then
- For Each filter In g_objRegFilters
- listRegFilters.AddItem filter.Name
- Next filter
- End If
- If listRegFilters.ListCount > 0 Then
- listRegFilters.ListIndex = 0 ' select first in list
- End If
- End Sub
- Private Sub AddFilter(FName As String, f As IFilterInfo)
- ' call IRegFilterInfo::filter
- Dim LocalRegFilters As Object
- Set LocalRegFilters = g_objMC.RegFilterCollection
- Dim filter As IRegFilterInfo
- For i = 0 To (LocalRegFilters.Count - 1) Step 1
- LocalRegFilters.Item i, filter
- If filter.Name = FName Then
- filter.filter f
- Exit For
- End If
- Next i
- RefreshFilters
- End Sub
- Private Sub cmdAddRegFilter_Click()
- ' IMediaControl property RegFilterCollection is an
- ' an IAMCollection interface
- Dim filter As IRegFilterInfo
- For Each filter In g_objRegFilters ' listRegFilters
- If filter.Name = listRegFilters.Text Then
- Dim f As IFilterInfo
- filter.filter f
- If f.IsFileSource Then
- CommonDialog1.ShowOpen
- ' handle user cancel
- f.filename = CommonDialog1.filename
- End If
- Exit For
- End If
- Next filter
- ' Set frmRegFilters = g_objMC.RegFilterCollection
- RefreshFilters
- End Sub
- Private Sub cmdConnect_Click()
- ' connects the current selected pin, indicated by
- ' g_objSelPin , g_objMC, and g_objSelFilter
- On Error Resume Next ' if already connected, connect fails
- frmSelectPin.OtherDir = g_objSelPin.Direction
- Set frmSelectPin.g_objMC = g_objMC
- Set frmSelectPin.g_objFI = g_objSelFilter
- frmSelectPin.RefreshFilters
- frmSelectPin.Show 1
- If frmSelectPin.bOK Then
- Dim objPI As IPinInfo
- Set objPI = frmSelectPin.g_objPI
- g_objSelPin.Connect objPI
- RefreshFilters ' sub in this VB app that updates display
- End If
- End Sub
- Private Sub Form_Load()
- ' initialize the display
- listFilters.Clear
- listPins.Clear
- txtPinInfo.Text = ""
- ' create the global object used throughout the app
- Set g_objMC = New FilgraphManager
- ' update the display for registered filters
- Set g_objRegFilters = g_objMC.RegFilterCollection
- RefreshRegFilters
- End Sub
- Private Sub cmdRender_Click()
- ' call IPinInfo::Render
- ' complete the graph downstream from this pin
- On Error Resume Next ' if already connected, this fails
- g_objSelPin.Render
- RefreshFilters
- End Sub
- Private Sub cmdSource_Click()
- ' calls IMediaControl::AddSourceFilter
- ' adds to the graph the source filter that can read the given filename
- ' Returns an IFilterInfo object.
- Dim objFilter As Object ' tmp object for valid syntax; not used here
- On Error GoTo cmdsourceclick_cancelerror
- CommonDialog1.CancelError = True
- CommonDialog1.filter = "ActiveMovie files (*.mpg;*.avi;*.mov)|*.mpg;*.avi;*.mov|"
- CommonDialog1.ShowOpen ' open the source filter
- g_objMC.AddSourceFilter CommonDialog1.filename, objFilter
- ' we don't actually use the returned IFilterInfo object here...
- RefreshFilters ' update all info displayed by this VB app
- ' the app displays filters, pins, and detailed pin info
- Exit Sub
- cmdsourceclick_cancelerror:
- ' user canceled out of the Open File dialog; just exit
- Exit Sub
- End Sub
- Public Sub RefreshFilters()
- ' update the contents of the "Filters" combo box
- ' using the current IMediaControl.FilterCollection
- Dim objFI As IFilterInfo
- listFilters.Clear
- For Each objFI In g_objMC.FilterCollection
- listFilters.AddItem objFI.Name
- Next objFI
- If listFilters.ListCount > 0 Then
- listFilters.ListIndex = 0 ' select first in list
- End If
- End Sub
- Private Sub listFilters_Click()
- ' user clicked on a filter in the filters combo box
- ' or entry 0 was selected by default when filling the
- ' "listFilters" listbox
- ' update the pins listbox to show all of its pins
- Dim objFI As IFilterInfo
- For Each objFI In g_objMC.FilterCollection
- If objFI.Name = listFilters.Text Then
- Set g_objSelFilter = objFI
- lblFilterName.Caption = objFI.Name
- lblVendorInfo.Caption = objFI.VendorInfo
- ' add all of this filter's pins to the combo box
- listPins.Clear
- Dim objPI As IPinInfo
- For Each objPI In objFI.Pins
- listPins.AddItem objPI.Name
- Next objPI
- End If
- Next objFI ' next filter info
- listPins.ListIndex = 0 ' select the first in the combobox
- End Sub
- Private Sub listPins_Click()
- ' Add detailed pin information to the listbox on the right
- ' when the user clicks on a pin in the listbox on the left
- Dim strTemp As String
- On Error Resume Next
- Dim objPin As IPinInfo
- For Each objPin In g_objSelFilter.Pins
- If objPin.Name = listPins.Text Then ' selected in listbox?
- Set g_objSelPin = objPin 'yes, get all info
- strTemp = ""
- Dim objPinOther As IPinInfo
- Set objPinOther = objPin.ConnectedTo
- If Err.Number = 0 Then
- strTemp = "Connected to pin: " + objPinOther.Name + " "
- Dim objPeer As IFilterInfo
- Set objPeer = objPinOther.FilterInfo
- strTemp = strTemp + " on filter: " + objPeer.Name + " "
- Dim objMTI As IMediaTypeInfo
- Set objMTI = objPin.ConnectionMediaType
- strTemp = strTemp + vbCrLf + "Media Type: " + objMTI.Type
- End If
- If objPin.Direction = 0 Then
- strTemp = strTemp + " " + vbCrLf + "Direction: Input"
- Else
- strTemp = strTemp + " " + vbCrLf + "Direction: Output"
- End If
- txtPinInfo.Text = strTemp
- End If
- Next objPin
- Exit Sub
- End Sub
- Private Sub listRegFilters_DblClick()
- cmdAddRegFilter_Click
- End Sub
- Private Sub mnu_BuildCustomGraph_Click()
- ' This routine demonstrates a likely common use
- ' of these methods in Visual Basic applications:
- ' Directly creating the filter graph needed
- ' for a specific multimedia file.
- ' The graph has the following filters: AVI Source, AVI Decompressor,
- ' Video Renderer, AVI Splitter, and Audio Renderer.
- ' Note that these filters can be connected by reusing just
- ' two pin object variables, but for clarity of the example,
- ' all are defined using names that reflect their position
- ' in the filter graph.
- ' The filters are declared with their pins, as follows:
- Dim pSourceFilter As IFilterInfo ' AVI source filter; has two pins
- Dim SourceOutputPin As IPinInfo 'Source Filter output pin
- Dim pAVISplitter As IFilterInfo ' AVI splitter
- Dim SplitterInPin As IPinInfo ' AVI splitter pin "Input"
- Dim SplitterOut00Pin As IPinInfo ' AVI splitter pin "Stream 00"
- Dim SplitterOut01Pin As IPinInfo ' AVI splitter pin "Stream 01"
- Dim pDECFilter As IFilterInfo ' AVI Decompressor; has two pins
- Dim DECInPin As IPinInfo 'AVI Decompressor pin "XForm In"
- Dim DECOutPin As IPinInfo ' AVI Decompressor pin "XForm Out"
- Dim pVidRenderer As IFilterInfo ' Video renderer, has one pin
- Dim VidRendInPin As IPinInfo ' Video Renderer pin "Input"
- Dim pAudioRenderer As IFilterInfo 'Audio renderer, has one pin
- Dim AudioRendInPin As IPinInfo ' Audio Renderer pin "Input"
- Dim pPin As IPinInfo
- Set SVideoPin = Nothing
- Set SAudioPin = Nothing
- Set DECInPin = Nothing
- Set DECOutPin = Nothing
- Set VidRendInPin = Nothing
- Set AudioRendInPin = Nothing
- ' reinitialize all global variables
- Set g_objRegFilters = Nothing
- Set g_objSelFilter = Nothing
- Set g_objSelPin = Nothing
- Set g_objMC = Nothing
- ' create a new IMediaControl object
- Set g_objMC = New FilgraphManager
- ' reset the listRegFilters again
- Set g_objRegFilters = g_objMC.RegFilterCollection
- RefreshRegFilters
- ' reinitialize the display
- listFilters.Clear
- lblFilterName.Caption = ""
- lblVendorInfo.Caption = ""
- listPins.Clear
- txtPinInfo.Text = ""
- g_fRunning = False
-
- 'Add source filter for an AVI file
- On Error GoTo err_CustomGraph_Cancel
- CommonDialog1.CancelError = True
- CommonDialog1.filter = "AVI files (*.avi)|*.avi"
- CommonDialog1.ShowOpen ' get the name of the source or filter graph file
- g_objMC.AddSourceFilter CommonDialog1.filename, pSourceFilter
- On Error GoTo err_CustomGraph ' handle other errors
- ' Get the pins we need to connect
- For Each pPin In pSourceFilter.Pins
- Debug.Print pPin.Name
- If pPin.Name = "Output" Then
- Set SourceOutputPin = pPin
- End If
- Next pPin
- 'Add DEC filter
- AddFilter "AVI Decompressor", pDECFilter
- 'Print out list of pins on decompressor filter
- For Each pPin In pDECFilter.Pins
- Debug.Print pPin.Name
- ' save specific pins to connect them
- If pPin.Name = "XForm In" Then
- Set DECInPin = pPin
- End If
- If pPin.Name = "XForm Out" Then
- Set DECOutPin = pPin
- End If
- Next pPin
- 'Add AVI Splitter
- AddFilter "AVI Splitter", pAVISplitter
- 'Print out list of pins on decompressor filter
- For Each pPin In pAVISplitter.Pins
- Debug.Print pPin.Name
- ' save specific pins to connect them
- ' pin 0, pin 1
- If pPin.Name = "input pin" Then
- Set SplitterInPin = pPin
- ElseIf pPin.Name = "Stream 00" Then
- Set SplitterOut00Pin = pPin
- ElseIf pPin.Name = "Stream 01" Then
- Set SplitterOut01Pin = pPin
- End If
- Next pPin
- 'Connect Source video output pin to AVI splitter input pin
- If Not SourceOutputPin Is Nothing And Not SplitterInPin Is Nothing Then
- SourceOutputPin.Connect SplitterInPin
- End If
- ' Splitter now knows how many output pins it needs
- For Each pPin In pAVISplitter.Pins
- Debug.Print pPin.Name
- ' save specific pins to connect them
- ' pin 0, pin 1
- If pPin.Name = "Stream 00" Then
- Set SplitterOut00Pin = pPin
- ElseIf pPin.Name = "Stream 01" Then
- Set SplitterOut01Pin = pPin
- End If
- Next pPin
- 'Add Video Renderer filter and set its pin variables
- AddFilter "Video Renderer", pVidRenderer
- 'Print out list of pins on video renderer filter
- For Each pPin In pVidRenderer.Pins
- Debug.Print pPin.Name
- If pPin.Name = "Input" Then
- Set VidRendInPin = pPin
- End If
- Next pPin
- 'Add Audio Renderer filter and set its pin variables
- AddFilter "Audio Renderer", pAudioRenderer
- 'Print out list of pins on audioo renderer filter
- For Each pPin In pAudioRenderer.Pins
- Debug.Print pPin.Name
- If InStr(pPin.Name, "Input") Then
- Set AudioRendInPin = pPin
- End If
- Next pPin
- ' Connect AVI splitter stream 01 to AVI decompressor
- If Not DECInPin Is Nothing And Not SplitterOut00Pin Is Nothing Then
- SplitterOut00Pin.Connect DECInPin
- End If
- 'Connect DEC filter output pin to Video Renderer input pin
- If Not DECOutPin Is Nothing And Not VidRendInPin Is Nothing Then
- DECOutPin.Connect VidRendInPin
- End If
- ' Connect AVI splitter stream 01 to audio renderer
- ' continue if there is no audio connection for the source AVI file
- On Error Resume Next
- If Not AudioRendInPin Is Nothing And Not SplitterOut01Pin Is Nothing Then
- SplitterOut01Pin.Connect AudioRendInPin
- End If
- RefreshFilters
- Exit Sub
- err_CustomGraph:
- MsgBox "Could not create the custom filter graph. Please select an .AVI file that uses the AVI splitter and AVI decompressor filters."
- Exit Sub
- err_CustomGraph_Cancel:
- ' user cancelled out of File Open dialog; just exit
- Exit Sub
- End Sub
- Private Sub mnu_FilterGraphExit_Click()
- Set g_objLocalRegFilter = Nothing
- Set g_objRegFilters = Nothing
- Set g_objSelFilter = Nothing
- Set g_objSelPin = Nothing
- Set g_objMC = Nothing
- End
- End Sub
- Private Sub mnu_FilterGraphGenerate_Click()
- ' User is initializing the filter graph based on a source file
- ' Create a new filter graph and then get all filters, connections
- ' reset the application's global objects
- Set g_objRegFilters = Nothing
- Set g_objSelFilter = Nothing
- Set g_objSelPin = Nothing
- Set g_objMC = Nothing
- ' initialize the display
- listFilters.Clear
- listPins.Clear
- txtPinInfo.Text = ""
- ' create a new IMediaControl object
- Set g_objMC = New FilgraphManager
- ' refresh the display for registered filters
- Set g_objRegFilters = g_objMC.RegFilterCollection
- RefreshRegFilters
- ' use the common dialog to let the user select the input file
- On Error GoTo filtergraphgenerate_cancelerror
- CommonDialog1.CancelError = True
- CommonDialog1.filter = "ActiveMovie files (*.mpg;*.avi;*.mov)|*.mpg;*.avi;*.mov|"
- CommonDialog1.ShowOpen
- ' call IMediaControl::RenderFile to add all filters and connect all pins
- g_objMC.RenderFile CommonDialog1.filename
- ' update and display the list of registered filters
- ' update and display all active filters for this filter graph
- RefreshFilters ' local subroutine to update the listbox
- Exit Sub
- filtergraphgenerate_cancelerror:
- ' user cancelled out of the File Open dialog
- Exit Sub
- End Sub
- Private Sub mnu_FilterGraphNew_Click()
- ' user wants to start with a fresh filter graph
- ' reset the global objects
- Set g_objRegFilters = Nothing
- Set g_objSelFilter = Nothing
- Set g_objSelPin = Nothing
- Set g_objMC = Nothing
- ' create a new IMediaControl object
- Set g_objMC = New FilgraphManager
- ' reset the listRegFilters again
- Set g_objRegFilters = g_objMC.RegFilterCollection
- RefreshRegFilters
- listFilters.Clear
- lblFilterName.Caption = ""
- lblVendorInfo.Caption = ""
- listPins.Clear
- txtPinInfo.Text = ""
- g_fRunning = False
- End Sub
- Private Sub mnu_FilterGraphPause_Click()
- g_objMC.Pause
- End Sub
- Private Sub mnu_FilterGraphRun_Click()
- g_objMC.Run
- End Sub
- Private Sub mnu_FilterGraphStop_Click()
- g_objMC.Stop
- End Sub
-