2011-10-27 14 views
1

私は別のDirectShowグラフで作業していますが、私が見ている問題の周りに私の頭を包んでいるように見えません。私はGraphEditの中で一緒にグラフをスナップすると、それは行く:カラーコンバータでの再生DMO歪みスキップ

filesource - >デマルチプレクサ - >デコーダ - >色変換DMO - >外部レンダリング

これは完璧に動作し、再生が素晴らしいです!

しかし、コードでは(グラフは完全にエラーなしで構築されます)...それは私が望むことをしません...代わりにファイルを再生しますが、再生は非常に黒く塗りつぶされており、以前のフレームを削除することはない。

HERESに私のコード:

private static void BuildGraph(IGraphBuilder pGraph, string source) 
{ 
    int hr = 0; 

    // Graph builder. 
    pBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); 
    hr = pBuilder.SetFiltergraph(pGraph); 
    CheckHR(hr, "Can't SetFiltergraph."); 

    // Add File Source (Async.). 
    pFileSourceAsync = (IBaseFilter)new AsyncReader(); 
    hr = pGraph.AddFilter(pFileSourceAsync, "File Source (Async.)"); 
    CheckHR(hr, "Can't add File Source (Async.) to graph."); 

    // Set source filename. 
    pFileSourceAsync_src = pFileSourceAsync as IFileSourceFilter; 

    if (pFileSourceAsync_src == null) 
    { 
     CheckHR(unchecked((int)0x80004002), "Can't get IFileSourceFilter."); 
    } 

    hr = pFileSourceAsync_src.Load(source, null); 
    CheckHR(hr, "Can't load file."); 

    // Add MPEG4 Demultiplexor. 
    pMPEG4Demultiplexor = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_MPEG4Demultiplexor)); 
    hr = pGraph.AddFilter(pMPEG4Demultiplexor, "MPEG4 Demultiplexor"); 
    CheckHR(hr, "Can't add MPEG4 Demultiplexor to graph."); 

    // Add Microsoft DTV-DVD Video Decoder. 
    pMicrosoftDTVDVDVideoDecoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_MicrosoftDTVDVDVideoDecoder)); 
    hr = pGraph.AddFilter(pMicrosoftDTVDVDVideoDecoder, "Microsoft DTV-DVD Video Decoder"); 
    CheckHR(hr, "Can't add Microsoft DTV-DVD Video Decoder to graph."); 

    // Add Color Converter DMO. 
    dmoFilter = (IBaseFilter)new DMOWrapperFilter(); 
    dmoWrapper = (IDMOWrapperFilter)dmoFilter; 
    hr = dmoWrapper.Init(CLSID_ColorConverterDMO, DMOCategory.VideoEffect); 
    CheckHR(hr, "Can't initialize Color Converter DMO."); 
    hr = pGraph.AddFilter(dmoFilter, "DMO Filter"); 
    CheckHR(hr, "Can't add Color Converter DMO to graph."); 


    //IMediaParams dmoParams = dmoFilter as IMediaParams; 
    //MPData srcLeft = new MPData(); 
    //MPData srcTop = new MPData(); 
    //MPData destLeft = new MPData(); 
    //MPData destTop = new MPData(); 
    //MPData width = new MPData(); 
    //MPData height = new MPData(); 
    //srcLeft.vFloat = 0; 
    //srcTop.vFloat = 0; 
    //destLeft.vFloat = 0; 
    //destTop.vFloat = 0; 
    //width.vFloat = 1280; 
    //height.vFloat = 720; 
    //dmoParams.SetParam(0, srcLeft); 
    //dmoParams.SetParam(1, srcTop); 
    //dmoParams.SetParam(2, destLeft); 
    //dmoParams.SetParam(3, destTop); 
    //dmoParams.SetParam(4, width); 
    //dmoParams.SetParam(5, height); 


    // Add Smart Tee. 
    pSmartTee = (IBaseFilter)new SmartTee(); 
    hr = pGraph.AddFilter(pSmartTee, "Smart Tee"); 
    CheckHR(hr, "Can't add Smart Tee to graph."); 

    // Add Decklink Video Render. 
    pDecklinkVideoRender = CreateFilterByName(@"Decklink Video Render", CLSID_ExternalRenderers); 
    hr = pGraph.AddFilter(pDecklinkVideoRender, "Decklink Video Render"); 
    CheckHR(hr, "Can't add Decklink Video Render to graph."); 

    // Add AVI Decompressor. 
    pAVIDecompressor = (IBaseFilter)new AVIDec(); 
    hr = pGraph.AddFilter(pAVIDecompressor, "AVI Decompressor"); 
    CheckHR(hr, "Can't add AVI Decompressor to graph."); 

    // Add Color Space Converter. 
    pColorSpaceConverter = (IBaseFilter)new Colour(); 
    hr = pGraph.AddFilter(pColorSpaceConverter, "Color Space Converter"); 
    CheckHR(hr, "Can't add Color Space Converter to graph."); 

    // Add Null Renderer. 
    pNullRenderer = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_NullRenderer)); 
    hr = pGraph.AddFilter(pNullRenderer, "Null Renderer"); 
    CheckHR(hr, "Can't add Null Renderer to graph."); 

    // Connect File Source (Async.) and MPEG4 Demultiplexor. 
    hr = pGraph.ConnectDirect(GetPin(pFileSourceAsync, "Output"), GetPin(pMPEG4Demultiplexor, "Input"), null); 
    CheckHR(hr, "Can't connect File Source (Async.) and MPEG4 Demultiplexor."); 

    // Connect MPEG4 Demultiplexor and Microsoft DTV-DVD Video Decoder. 
    hr = pGraph.ConnectDirect(GetPin(pMPEG4Demultiplexor, "Video 1"), GetPin(pMicrosoftDTVDVDVideoDecoder, "Video Input"), null); 
    CheckHR(hr, "Can't connect MPEG4 Demultiplexor and Microsoft DTV-DVD Video Decoder."); 

    // Connect Microsoft DTV-DVD Video Decoder and Color Converter DMO. 
    hr = pGraph.ConnectDirect(GetPin(pMicrosoftDTVDVDVideoDecoder, "Video Output 1"), GetPin(dmoFilter, "in0"), null); 
    CheckHR(hr, "Can't connect Microsoft DTV-DVD Video Decoder and Color Converter DMO."); 

    // Connect Color Converter DMO and Smart Tee Filter. 
    hr = pGraph.ConnectDirect(GetPin(dmoFilter, "out0"), GetPin(pSmartTee, "Input"), null); 
    CheckHR(hr, "Can't connect Color Converter DMO and Smart Tee Filter."); 

    // Connect Smart Tee Filter and Decklink Video Render. 
    hr = pGraph.ConnectDirect(GetPin(pSmartTee, "Capture"), GetPin(pDecklinkVideoRender, "In"), null); 
    CheckHR(hr, "Can't connect Smart Tee Filter and Decklink Video Render."); 

    // Add SampleGrabber. 
    pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber)); 
    hr = pGraph.AddFilter(pSampleGrabber, "SampleGrabber"); 
    CheckHR(hr, "Can't add SampleGrabber to graph."); 
    (pSampleGrabber as ISampleGrabber).SetBufferSamples(true); 
    (pSampleGrabber as ISampleGrabber).SetOneShot(false); 

    // Connect Smart Tee and SampleGrabber. 
    hr = pGraph.ConnectDirect(GetPin(pSmartTee, "Preview"), GetPin(pSampleGrabber, "Input"), null); 
    CheckHR(hr, "Can't connect Smart Tee and SampleGrabber."); 

    // Connect SampleGrabber and AVIDecompressor. 
    hr = pGraph.ConnectDirect(GetPin(pSampleGrabber, "Output"), GetPin(pAVIDecompressor, "XForm In"), null); 
    CheckHR(hr, "Can't connect SampleGrabber and AVIDecompressor."); 

    // Connect AVIDecompressor and Color Space Converter. 
    hr = pGraph.ConnectDirect(GetPin(pAVIDecompressor, "XForm Out"), GetPin(pColorSpaceConverter, "Input"), null); 
    CheckHR(hr, "Can't connect Color Space Converter and SampleGrabber."); 

    // Connect Color Space Converter and Null Renderer. 
    hr = pGraph.ConnectDirect(GetPin(pColorSpaceConverter, "XForm Out"), GetPin(pNullRenderer, "In"), null); 
    CheckHR(hr, "Can't connect Color Space Converter and Null Renderer."); 

    // Set SampleGrabber Media Type. 
    AMMediaType pSampleGrabber_pmt = new AMMediaType(); 
    pSampleGrabber_pmt.majorType = MediaType.Video; 
    pSampleGrabber_pmt.subType = MediaSubType.RGB32; 
    pSampleGrabber_pmt.formatType = FormatType.VideoInfo; 
    VideoInfoHeader pSampleGrabber_format = new VideoInfoHeader(); 
    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."); 
} 

あなたが、私はそれをコメントしてきたように(これが原因ではない、スマートティーをフックとして、コードとサンプルグラバに多くを持っていることがわかります結果を確認して変更を加えずに、最終的にはビデオストリームから静止画像を取得したいので、準備ができたらそれを持っています)。

私はこの問題がカラーコンバータdmoであるとは思っていますが、私は完全にはわかりません... grapheditの正確なグラフは問題なく実行されますが、コードモードは恐ろしい再生をもたらします。たぶん私はカラーコンバータdmoとは忘れている何かをtheres?またはラッパーですか?どんなアイデアでも大歓迎です。

ありがとう、 乾杯。

+0

誰もカラーコンバータDMOでの作業経験はありますか? – bl4kh4k

+0

グラフに直接接続するのではなく、レンダリングストリームを使用している例があります。これは違いをもたらすだろうか? – bl4kh4k

答えて

1

私はColor Converter DMOについての詳細は持っていませんが、他のVista + DMOの経験から - DirectShowでの使用を意図していません。はい、彼らはまだIMediaObjectインターフェイスを実装し、DMO Wrapper Filterもあるが、小さな問題が統合を台無しにしている、まだDMOです。

ボックスの外で動作しない場合は、DMOを独自のラッパーフィルタの中に配置する必要があります。これは間違いなくうまくいくでしょう - 良いニュース - それほど複雑ではありません。

旧式のDMOは、DirectShow内でストックラッパーフィルタを使用していることが確かにテストされています。そのため、これが機能している理由で、DMO Wrapper Filterが最初に利用可能です。

関連する問題