Click here to Skip to main content
15,886,873 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I got DixX coder and decoder when i installed "DivX Pro".

As below,it works well when i test in Graphedt.exe.

ScreenCapture -----> DivX 5.2.1 Codec -----> DivX Decoder Filter -----> Video Renderer.


I tried in code like below, but does not work , all i get just a blue screen.

C++
const  CLSID  CLSID_CaptureDesktop = { .....};
const  CLSID  CLSID_DivxCoder      = { .....};
const  CLSID  CLSID_DivxDecoder    = { .....};
const  CLSID  CLSID_VideoRender    = { .....};

    .....
    //some init code
    .....

    //create CaptureDestop
hr = CreateObjectFromPath(TEXT("c:\\monitor\\capture.dll"),CLSID_CaptureDesktop, &pUnk);
IBaseFilterPtr CaptureFilter = pUnk;

//create DivXCoder
hr = CreateObjectFromPath(TEXT("c:\\monitor\\coder.dll"),CLSID_DivxCoder, &pUnk);
IBaseFilterPtr DivXCoderFilter = pUnk;

//create DivXDecoder
hr = CreateObjectFromPath(TEXT("c:\\monitor\\decoder.dll"),CLSID_DivxDecoder, &pUnk);
IBaseFilterPtr DivXDcoderFilter = pUnk;

//create VideoRender
IBaseFilter *VideoRenderFilter;
hr=CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_INPROC,IID_IBaseFilter,(void**)&VideoRenderFilter);

//create ICaptureGraphBuilder2 , IGraphBuilder
ICaptureGraphBuilder2       *GraphBuilder2   = NULL;
IGraphBuilder           *GraphBuilder    = NULL;
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void**)&GraphBuilder2);
hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&GraphBuilder);
GraphBuilder2->SetFiltergraph(GraphBuilder);

//add filter
hr = GraphBuilder->AddFilter(CaptureFilter,L"CaptrueDestop");
hr = GraphBuilder->AddFilter(DivXCoderFilter,L"DivXCoder");
hr = GraphBuilder->AddFilter(DivXDcoderFilter,L"DivXDecoder");
hr = GraphBuilder->AddFilter(VideoRenderFilter,L"VideoRender");

    .....
    //some code about get Pin
    .....

    //connect pins
    hr = GraphBuilder->ConnectDirect(CaptureDestop_OutPin,DivXCoder_InPin,NULL);
hr = GraphBuilder->ConnectDirect(DivXCoder_OutPin,DivXDecoder_InPin,NULL);
hr = GraphBuilder->ConnectDirect(DivXDecoder_OutPin,VideoRender_InPin,NULL);

    //Run
    IMediaControl *pMC = NULL;
hr = GraphBuilder->QueryInterface(IID_IMediaControl, (void **)&pMC);
hr = pMC->Run();



I'm just getting start at directshow, is there something wrong ?
Posted
Comments
Maciej Los 30-Jul-14 5:14am    
Does the name of filter is proper in this line: hr = GraphBuilder->AddFilter(CaptureFilter,L"CaptrueDestop");
niujian2358 30-Jul-14 9:34am    
the return value hr = S_OK , it works.

ScreenCapture -----> DivX 5.2.1 Codec -----> DivX Decoder Filter -----> Video Renderer.
the name of filter,just a short name.
George Jonsson 30-Jul-14 5:48am    
Where in the code does it fail?
You should check the value of hr for each call and throw an exception if hr is not S_OK.
Something like
if (FAILED(hr))
throw hr;
Then catch the exception and analyze the error code.
niujian2358 30-Jul-14 9:35am    
i have checked the return value in debug mode, it's all S_OK.
niujian2358 30-Jul-14 9:39am    
ScreenCapture -----> DivX 5.2.1 Codec ----->Dump into a file.

when i dump into a file in Graphedt.exe, i can play the file by QQPlayer. So i'm sure every function return S_OK.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900