bergi
29th November 2002, 14:34
When starting the program the "connect" function need much time, next problem the function "work" doens't produce a working avi, but in graphedit it works, but graphedit shows an error on clicking at the avimux properties.
Please, if have a look at the code.
#include <dshow.h>
#include <stdio.h>
#include <tchar.h>
#include <atlbase.h>
#include <conio.h>
/*
quartz.lib
msvcrtd.lib
winmm.lib
msacm32.lib
olepro32.lib
strmiids.lib
kernel32.lib
user32.lib
gdi32.lib
comdlg32.lib
ole32.lib
oleaut32.lib
advapi32.lib
uuid.lib
libc.lib
*/
IGraphBuilder *pGraphBuilder = NULL;
IBaseFilter *pSource = NULL;
IBaseFilter *pAVISplitter = NULL;
IBaseFilter *pAVIMux = NULL;
IBaseFilter *pTarget = NULL;
HRESULT AddRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker *pMoniker;
IRunningObjectTable *pROT;
if (FAILED(GetRunningObjectTable(0, &pROT)))
return E_FAIL;
WCHAR wsz[256];
char temp[256];
wsprintf(temp, "FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
mbstowcs(wsz, temp, 257);
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr))
{
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void DelRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT)))
{
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
void GraphEdit()
{
DWORD reg;
AddRot(pGraphBuilder, ®);
printf("Open GraphEdit!\n");
getch();
DelRot(reg);
}
int init()
{
if(CoInitialize(NULL) != S_OK)
return 1;
if(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraphBuilder) != S_OK)
return 1;
return 0;
}
int source(WCHAR *f)
{
IPin *pIn = NULL, *pOut = NULL;
if(pGraphBuilder->AddSourceFilter(f, L"Source", &pSource) != S_OK)
return 1;
if(pSource->FindPin(L"Output", &pOut) != S_OK)
return 1;
if(CoCreateInstance(CLSID_AviSplitter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAVISplitter) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pAVISplitter, L"AVI Splitter") != S_OK)
return 1;
if(pAVISplitter->FindPin(L"input pin", &pIn) != S_OK)
return 1;
if(pGraphBuilder->Connect(pOut, pIn) != S_OK)
return 1;
return 0;
}
int target(WCHAR *f)
{
IPin *pIn = NULL, *pOut = NULL;
IFileSinkFilter *pFileSink = NULL;
IConfigInterleaving *pConfigInterleaving = NULL;
REFERENCE_TIME preroll = 96, interleave = 96;
if(CoCreateInstance(CLSID_AviDest, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAVIMux) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pAVIMux, L"AVI Mux") != S_OK)
return 1;
if(pAVIMux->FindPin(L"AVI Out", &pOut) != S_OK)
return 1;
if(CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pTarget) != S_OK)
return 1;
if(pTarget->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink) != S_OK)
return 1;
if(pFileSink->SetFileName(f, NULL) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pTarget, L"Target") != S_OK)
return 1;
if(pTarget->FindPin(L"in", &pIn) != S_OK)
return 1;
if(pGraphBuilder->Connect(pOut, pIn) != S_OK)
return 1;
if(pAVIMux->QueryInterface(IID_IConfigInterleaving, (void**)&pConfigInterleaving) != S_OK)
return 1;
if(pConfigInterleaving->put_Interleaving(&preroll, &interleave) != S_OK)
return 1;
return 0;
}
int connect()
{
IEnumPins *pEnumPinsIn = NULL;
IEnumPins *pEnumPinsOut = NULL;
IPin *pIn = NULL;
IPin *pOut = NULL;
pAVISplitter->EnumPins(&pEnumPinsOut);
while(pEnumPinsOut->Next(1, &pOut, NULL) == S_OK)
{
pAVIMux->EnumPins(&pEnumPinsIn);
while(pEnumPinsIn->Next(1, &pIn, NULL) == S_OK)
pGraphBuilder->Connect(pOut, pIn);
}
return 0;
}
int work()
{
IMediaControl *pMediaControl = NULL;
IMediaPosition *pMediaPosition = NULL;
if(pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl) != S_OK)
return 1;
if(pGraphBuilder->QueryInterface(IID_IMediaPosition, (void**)&pMediaPosition) != S_OK)
return 1;
pMediaControl->Run();
while(pMediaPosition->get_CurrentPosition(NULL) != pMediaPosition->get_Duration(NULL))
{
printf("*");
Sleep(1000);
}
return 0;
}
int main(int argc, char *argv[])
{
if(init())
return 1;
if(source(L"H:\\TestIn1.avi"))
return 1;
if(target(L"H:\\TestOut.avi"))
return 1;
if(connect())
return 1;
GraphEdit();
if(work())
return 1;
return 0;
}
Please, if have a look at the code.
#include <dshow.h>
#include <stdio.h>
#include <tchar.h>
#include <atlbase.h>
#include <conio.h>
/*
quartz.lib
msvcrtd.lib
winmm.lib
msacm32.lib
olepro32.lib
strmiids.lib
kernel32.lib
user32.lib
gdi32.lib
comdlg32.lib
ole32.lib
oleaut32.lib
advapi32.lib
uuid.lib
libc.lib
*/
IGraphBuilder *pGraphBuilder = NULL;
IBaseFilter *pSource = NULL;
IBaseFilter *pAVISplitter = NULL;
IBaseFilter *pAVIMux = NULL;
IBaseFilter *pTarget = NULL;
HRESULT AddRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker *pMoniker;
IRunningObjectTable *pROT;
if (FAILED(GetRunningObjectTable(0, &pROT)))
return E_FAIL;
WCHAR wsz[256];
char temp[256];
wsprintf(temp, "FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
mbstowcs(wsz, temp, 257);
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr))
{
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void DelRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT)))
{
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
void GraphEdit()
{
DWORD reg;
AddRot(pGraphBuilder, ®);
printf("Open GraphEdit!\n");
getch();
DelRot(reg);
}
int init()
{
if(CoInitialize(NULL) != S_OK)
return 1;
if(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraphBuilder) != S_OK)
return 1;
return 0;
}
int source(WCHAR *f)
{
IPin *pIn = NULL, *pOut = NULL;
if(pGraphBuilder->AddSourceFilter(f, L"Source", &pSource) != S_OK)
return 1;
if(pSource->FindPin(L"Output", &pOut) != S_OK)
return 1;
if(CoCreateInstance(CLSID_AviSplitter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAVISplitter) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pAVISplitter, L"AVI Splitter") != S_OK)
return 1;
if(pAVISplitter->FindPin(L"input pin", &pIn) != S_OK)
return 1;
if(pGraphBuilder->Connect(pOut, pIn) != S_OK)
return 1;
return 0;
}
int target(WCHAR *f)
{
IPin *pIn = NULL, *pOut = NULL;
IFileSinkFilter *pFileSink = NULL;
IConfigInterleaving *pConfigInterleaving = NULL;
REFERENCE_TIME preroll = 96, interleave = 96;
if(CoCreateInstance(CLSID_AviDest, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAVIMux) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pAVIMux, L"AVI Mux") != S_OK)
return 1;
if(pAVIMux->FindPin(L"AVI Out", &pOut) != S_OK)
return 1;
if(CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pTarget) != S_OK)
return 1;
if(pTarget->QueryInterface(IID_IFileSinkFilter, (void**)&pFileSink) != S_OK)
return 1;
if(pFileSink->SetFileName(f, NULL) != S_OK)
return 1;
if(pGraphBuilder->AddFilter(pTarget, L"Target") != S_OK)
return 1;
if(pTarget->FindPin(L"in", &pIn) != S_OK)
return 1;
if(pGraphBuilder->Connect(pOut, pIn) != S_OK)
return 1;
if(pAVIMux->QueryInterface(IID_IConfigInterleaving, (void**)&pConfigInterleaving) != S_OK)
return 1;
if(pConfigInterleaving->put_Interleaving(&preroll, &interleave) != S_OK)
return 1;
return 0;
}
int connect()
{
IEnumPins *pEnumPinsIn = NULL;
IEnumPins *pEnumPinsOut = NULL;
IPin *pIn = NULL;
IPin *pOut = NULL;
pAVISplitter->EnumPins(&pEnumPinsOut);
while(pEnumPinsOut->Next(1, &pOut, NULL) == S_OK)
{
pAVIMux->EnumPins(&pEnumPinsIn);
while(pEnumPinsIn->Next(1, &pIn, NULL) == S_OK)
pGraphBuilder->Connect(pOut, pIn);
}
return 0;
}
int work()
{
IMediaControl *pMediaControl = NULL;
IMediaPosition *pMediaPosition = NULL;
if(pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl) != S_OK)
return 1;
if(pGraphBuilder->QueryInterface(IID_IMediaPosition, (void**)&pMediaPosition) != S_OK)
return 1;
pMediaControl->Run();
while(pMediaPosition->get_CurrentPosition(NULL) != pMediaPosition->get_Duration(NULL))
{
printf("*");
Sleep(1000);
}
return 0;
}
int main(int argc, char *argv[])
{
if(init())
return 1;
if(source(L"H:\\TestIn1.avi"))
return 1;
if(target(L"H:\\TestOut.avi"))
return 1;
if(connect())
return 1;
GraphEdit();
if(work())
return 1;
return 0;
}