Infognition forum
February 11, 2012, 05:58:48 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Last GraphEditPlus version: 1.4.0   Last Video Enhancer version: 1.9.7
 
   Home   Help Search Login Register  
Pages: [1]
  Print  
Author Topic: Canīt connect filters  (Read 1380 times)
cgillopez
Newbie
*

Karma: +1/-0
Posts: 7


View Profile
« on: April 07, 2010, 08:07:44 PM »

Hello,

I want to decode a MKV file, and write an avi file, i do it with three filters:
- A Matroska Splitter Filter 
- Video Decoder DMO
- SampleGrabber
- 3ivx MPEG-4 Video Encoder
- AVI Mux
- File writer

The video can be written when the graph is running, but when i run the generated code i get and error on: "ConnectDirect(GetPin(p3ivxMPEG4VideoEncoder, "XForm Out"), GetPin(pAVIMux, "Input 01"), null);"

It seems to do right the GetPin function, but it doesnt work when it does ConnectDirect

            // Get a ICaptureGraphBuilder2 to help build the graph
            ICaptureGraphBuilder2 pBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

            // Link the ICaptureGraphBuilder2 to the IFilterGraph2
            hr = pBuilder.SetFiltergraph(pGraph);
            checkHR(hr, "Can't SetFilterGraph");

            Guid CLSID_AXISMatroskaSplitterFilter = new Guid("{c696dddc-d62b-48a0-a449-369700f96903}"); //AXISMatroskaSlitterFilter.ax
            Guid CLSID_AXISH264VideoDecoderDMO = new Guid("{7340f0e4-aeda-47c6-8971-9db314030bd7}"); //qasf.dll
            Guid CLSID_3ivxMPEG4VideoEncoder = new Guid("{01EF6E5C-C79B-4E3E-A320-4B57B84F1807}"); //quartz.dll
            Guid CLSID_SampleGrabber = new Guid("{C1F400A0-3F08-11D3-9F0B-006008039E37}"); //qedit.dll

            // Add the filters necessary to render the file
            // Add AXIS Matroska splitter Filter
            IBaseFilter pAXISMAtroskaSplitterFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_AXISMatroskaSplitterFilter));
            hr = pGraph.AddFilter(pAXISMAtroskaSplitterFilter, "AXIS Matroska Splitter Filter");

            checkHR(hr, "Can't add AXIS Matroska Splitter Filter to graph");
            //set source filename
            IFileSourceFilter pAXISMatroskaSplitterFilter_src = pAXISMAtroskaSplitterFilter as IFileSourceFilter;
            if (pAXISMatroskaSplitterFilter_src == null)
                checkHR(unchecked((int)0x80004002), "Can't get IFilsourceFilter");
            hr = pAXISMatroskaSplitterFilter_src.Load(srcFile1, null);
            checkHR(hr, "Can't load file");

            //add AXIS H.264 Video Decoder DMO
            //wrapper para DMO
            IBaseFilter dmoFilter = null;
            IDMOWrapperFilter dmoWrapperFilter = null;

            dmoFilter = (IBaseFilter)new DMOWrapperFilter();
            dmoWrapperFilter = (IDMOWrapperFilter)dmoFilter;
            hr = dmoWrapperFilter.Init(CLSID_AXISH264VideoDecoderDMO, DirectShowLib.DMO.DMOCategory.VideoDecoder);
            DMOError.ThrowExceptionForHR(hr);

            hr = pGraph.AddFilter(dmoFilter, "DMO Filter");
            DsError.ThrowExceptionForHR(hr);

            //connect AXIS Matroska splitter Filter and AXIS H.264 Video Decoder DMO
            hr = pGraph.ConnectDirect(GetPin(pAXISMAtroskaSplitterFilter, "Video"), GetPin(dmoFilter, "in0"), null);
            checkHR(hr, "Can't connect AXIS Matroska splitter Filter and AXIS H.264 Video Decoder DMO");


            // add 3ivx MPEG4 Video Encoder
            IBaseFilter p3ivxMPEG4VideoEncoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_3ivxMPEG4VideoEncoder));
            hr = pGraph.AddFilter(p3ivxMPEG4VideoEncoder, "3ivx MPEG-4 Video Encoder");
            checkHR(hr, "Can't add 3ivx MPEG-4 Video Encoder");

            // add AVI Mux
            IBaseFilter pAVIMux = (IBaseFilter) new AviDest();
            hr = pGraph.AddFilter(pAVIMux, "AVI Mux");
            checkHR(hr, "Can't add AVI Mux");

            // connect 3ivx MPEG4 Video Encoder Filter and AVI Mux
            hr = pGraph.ConnectDirect(GetPin(p3ivxMPEG4VideoEncoder, "XForm Out"), GetPin(pAVIMux, "Input 01"), null);
            checkHR(hr, "Can't connect 3ivx MPEG4 Video Encoder Filter and AVI Mux");

            // add File writer
            IBaseFilter pFilewriter = (IBaseFilter)new FileWriter();
            hr = pGraph.AddFilter(pFilewriter, "File Writer");
            checkHR(hr, "Can't add File Writer");
            // set destination filename
            IFileSinkFilter pFilewriter_sink = pFilewriter as IFileSinkFilter;
            if (pFilewriter_sink == null)
                checkHR(unchecked((int) 0x80004002), "Can't get IFileSinkFilter");
            hr = pFilewriter_sink.SetFileName(dstFile1, null);
            checkHR(hr, "Can't set filename");

               //connect AVI Mux and File Writer
            hr = pGraph.ConnectDirect(GetPin(pAVIMux, "AVI Out"),GetPin(pFilewriter, "in") , null);
            checkHR(hr, "Can't connect AVI Mux and File Writer");

            //add SampleGrabber
            IBaseFilter pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber));
            hr = pGraph.AddFilter(pSampleGrabber, "SampleGrabber");
            checkHR(hr, "Can't add SampleGrabber to graph");

            AMMediaType pSampleGrabber_pmt= new AMMediaType();
            pSampleGrabber_pmt.majorType = MediaType.Video;
            pSampleGrabber_pmt.subType = MediaSubType.YUY2;
            pSampleGrabber_pmt.formatType = FormatType.VideoInfo;
            pSampleGrabber_pmt.fixedSizeSamples = false;
            pSampleGrabber_pmt.formatSize = 88;
            pSampleGrabber_pmt.sampleSize = 811008;
            pSampleGrabber_pmt.temporalCompression = true;
           
            VideoInfoHeader pSampleGrabber_format= new VideoInfoHeader();
            pSampleGrabber_format.SrcRect= new DsRect();
            pSampleGrabber_format.SrcRect.right= 704;
            pSampleGrabber_format.SrcRect.bottom= 576;
            pSampleGrabber_format.TargetRect= new DsRect();
            pSampleGrabber_format.TargetRect.right= 704;
            pSampleGrabber_format.TargetRect.bottom= 576;
           
            pSampleGrabber_format.BmiHeader= new BitmapInfoHeader();
            pSampleGrabber_format.BmiHeader.Size = 40;
            pSampleGrabber_format.BmiHeader.Width = 704;
            pSampleGrabber_format.BmiHeader.Height = 576;
            pSampleGrabber_format.BmiHeader.Planes = 1;
            pSampleGrabber_format.BmiHeader.BitCount = 16;
            pSampleGrabber_format.BmiHeader.Compression = 844715353;
            pSampleGrabber_format.BmiHeader.ImageSize = 811008;

            pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_format));
            Marshal.StructureToPtr(pSampleGrabber_format, pSampleGrabber_pmt.formatPtr, false);
            hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt);
            DsUtils.FreeAMMediaType(pSampleGrabber_pmt);
            checkHR(hr, @"Can't set media type to sample grabber");


            //connect AXIS H.264 Video Decoder DMO and 3ivx MPEG4 Video Encoder Filter
            hr = pGraph.ConnectDirect(GetPin(dmoFilter, "out0"), GetPin(pSampleGrabber, "Input"), null);
            checkHR(hr, "Can't connect AXIS H.264 Video Decoder DMO and SampleGrabber");

            //connect SampleGrabber and 3ivx MPEG4 Video Encoder Filter
            hr = pGraph.ConnectDirect(GetPin(pSampleGrabber, "Output"), GetPin(p3ivxMPEG4VideoEncoder, "XForm In"), null);
            checkHR(hr, "Can't connect SampleGrabber and 3ivx MPEG-4 Video Encoder");

Why i the graph runs but the code doesnt??
What can i do to fix it? Do i need another filter?

Thanks in advance for your help.
Logged
Dee Mon
Administrator
Hero Member
*****

Karma: +8/-0
Posts: 517



View Profile WWW
« Reply #1 on: April 09, 2010, 12:43:27 PM »

You're trying to connect encoder with muxer, but decoder is not yet connected to anything, so it doesn't have an output pin yet. The problem is with order of connection: graph must be built from left to right.
« Last Edit: April 09, 2010, 12:49:04 PM by Dee Mon » Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.13 | SMF © 2006-2011, Simple Machines LLC Valid XHTML 1.0! Valid CSS!