THe filter graphs renderer method takes a reference of a output pin. But the FileWriter Filter has no output pin. So how do i make the filter graph render itself?
HRESULT hr = pGraph->Render(FilefilterOutPin); //File Writer does not offer an outputpin
This is my code that builds the graph with its filters:
void static SaveFile()
{
CoInitialize(NULL);
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
HRESULT myhr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IFilterGraph, (void **) &pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **) &pEvent);
IBaseFilter *pFileWritter;
IFileSinkFilter* fileSInk = NULL;
CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **) &pFileWritter);
pFileWritter->QueryInterface(IID_IFileSinkFilter, (void **) &fileSInk);
fileSInk->SetFileName(L"C:\\TEMP\\yc1.avi", NULL);
//get source out pin
IBaseFilter *pSource;
IPin* SourcePin;
pGraph->AddSourceFilter(L"C:\\TEMP\\sample.avi", L"sample", &pSource);
SourcePin = GetPin(pSource, PINDIR_OUTPUT);
//AVI SPLITTER
IBaseFilter *aviSplitter;
CoCreateInstance(CLSID_AviSplitter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **) &aviSplitter);
pGraph->AddFilter(aviSplitter, L"AVI-Splitter");
IPin* avisplitIn;
IPin* avisplitOut;
avisplitIn = GetPin(aviSplitter, PINDIR_INPUT);
avisplitOut = GetPin(aviSplitter, PINDIR_OUTPUT);
pGraph->Connect(SourcePin, avisplitIn);
//END
//MyFilter//
IBaseFilter *myFilter;
CoCreateInstance(CLSID_MyFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **) &myFilter);
IMyFilter *myfilterinterface;
myFilter->QueryInterface(IID_IMyFilter, (void **) &myfilterinterface);
myfilterinterface->StartRecording();
pGraph->AddFilter(myFilter, L"MyFilter");
IPin* myInputPin;
IPin* myOutPutPin;
myInputPin = myfilterinterface->GetMyPin(0);
myOutPutPin = myfilterinterface->GetMyPin(3);
pGraph->Connect(avisplitOut, myInputPin);
//END//
///AVMUX
IBaseFilter *avmux;
CoCreateInstance(CLSID_AVIDec, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **) &avmux);
IPin* avmuxIn;
IPin* avmuxOut;
avmuxIn = GetPin(avmux, PINDIR_INPUT);
avmuxOut = GetPin(avmux, PINDIR_OUTPUT);
pGraph->AddFilter(avmux, L"AVmux");
pGraph->Connect(myOutPutPin, avmuxIn);
//END
//get writer inpin
IPin *writerPin;
writerPin = GetPin(pFileWritter, PINDIR_INPUT);
//connect pins
pGraph->Connect(SourcePin, writerPin);
//render
HRESULT hr S_OK;
if(SUCCEEDED(hr))
{
hr = pControl->Run();
if(SUCCEEDED(hr))
{
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
myfilterinterface->StopRecording();
myFilter->Release();
CoUninitialize();
}
}
}
This compiles and runs fine but doesn't produce any file.