cgillopez
Newbie
Karma: +1/-0
Posts: 7
|
 |
« 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.
|