The ltmmCapture, ltmmConvert, and ltmmPlay objects implement the GetSubObject function so you can access DirectShow specific objects directly.
Suppose for example, you wanted access to the ltmmCapture object’s underlying FilterGraph in order to set up the log file output.
The following code, in C, accomplishes this:
IltmmCapture *pCapture; // initialized elsewhere
HANDLE hLogFile; // handle to logfile, set elsewhere
HRESULT hr;
IUnknown *pUnk;
IGraphBuilder *pFg;
// call the Capture object to retrieve the FilterGraph
hr = IltmmCapture_GetSubObject(pCapture, ltmmCapture_Object_FilterGraph, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IGraphBuilder interface
hr = IUnknown_QueryInterface(pUnk, IID_IGraphBuilder, (void**) &pFg) ;
IUnknown_Release(pUnk);
if(SUCCEEDED(hr))
{
// assign the logfile
IGraphBuilder _SetLogFile(pFg, (DWORD_PTR) hLogFile);
IUnknown_Release(pFg);
}
}
In C++, you would do the following:
IltmmCapture *pCapture; // initialized elsewhere
HANDLE hLogFile; // handle to logfile, set elsewhere
HRESULT hr;
IUnknown *pUnk;
IGraphBuilder *pFg;
// call the Capture object to retrieve the FilterGraph
hr = pCapture->GetSubObject(ltmmCapture_Object_FilterGraph, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IGraphBuilder interface
hr = pUnk->QueryInterface(IID_IGraphBuilder, (void**) &pFg) ;
pUnk->Release();
if(SUCCEEDED(hr))
{
// assign the logfile
pFg->SetLogFile((DWORD_PTR) hLogFile);
pFg->Release();
}
}
Another example is to call the ltmmPlay object to retrieve the Video Renderer in order to enable RGB mode.
This is demonstrated, in C, as follows:
IltmmPlay *pPlay; // initialized elsewhere
HRESULT hr;
IUnknown *pUnk;
IDirectDrawVideo *pDDV;
// call the Play object to retrieve the VideoRenderer
hr = IltmmPlay_GetSubObject(pPlay, ltmmPlay_Object_VideoRenderer, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IDirectDrawVideo interface
hr = IUnknown_QueryInterface(pUnk, IID_IGraphBuilder, (void**) &pDDV) ;
IUnknown_Release(pUnk);
if(SUCCEEDED(hr))
{
// set rgb mode
IDirectDrawVideo _SetSwitches(pDDV, AMDDS_RGB);
IUnknown_Release(pDDV);
}
}
In C++, you would do the following:
IltmmPlay *pPlay; // initialized elsewhere
HRESULT hr;
IUnknown *pUnk;
IDirectDrawVideo *pDDV;
// call the Play object to retrieve the VideoRenderer
hr = pPlay->GetSubObject(ltmmPlay_Object_VideoRenderer, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IDirectDrawVideo interface
hr = pUnk->QueryInterface(IID_IGraphBuilder, (void**) &pDDV) ;
pUnk->Release(pUnk);
if(SUCCEEDED(hr))
{
// set rgb mode
pDDV->SetSwitches(AMDDS_RGB);
pDDV->Release();
}
}
A third example is to call the ltmmConvert object to retrieve the video compressor in order to adjust the compression quality. This is demonstrated, in C, as follows:
IltmmConvert *pConvert; // initialized elsewhere
HRESULT hr;
IUnknown *pUnk;
IAMVideoCompression *pVC;
// call the Convert object to retrieve the Video Compressor
hr = IltmmConvert_GetSubObject(pConvert, ltmmConvert_Object_VideoCompressor, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IAMVideoCompression interface
hr = IUnknown_QueryInterface(pUnk, IID_IAMVideoCompression, (void**) &pVC) ;
IUnknown_Release(pUnk);
if(SUCCEEDED(hr))
{
// set the quality to the best available
IAMVideoCompression_put_Quality(pVC, 1.0);
IUnknown_Release(pVC);
}
}
In C++, you would do the following:
IltmmConvert *pConvert; // initialized elsewhere
HRESULT hr;
IUnknown *pUnk;
IAMVideoCompression *pVC;
// call the Convert object to retrieve the Video Compressor
hr = pConvert->GetSubObject(ltmmConvert_Object_VideoCompressor, &pUnk);
if(SUCCEEDED(hr))
{
// retrieve the IAMVideoCompression interface
hr = pUnk->QueryInterface(IID_IAMVideoCompression, (void**) &pVC) ;
pUnk->Release(pUnk);
if(SUCCEEDED(hr))
{
// set the quality to the best available
pVC->put_Quality(1.0);
pVC->Release();
}
}