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

   }

}