Directly Accessing DirectShow Objects

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 objects 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(); 
   } 
} 

Help Version 20.0.2020.4.2
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2020 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS Multimedia C API Help