Accessing the IMediaSample Interface for C

The actual DirectX IMediaSample interface can be accessed through the IltmmObjectWrapper interface using the following code:

HRESULT UnwrapMediaSample(IltmmMediaSampleDisp* pDispatch, IMediaSample** ppMediaSample)
{
   if(!ppMediaSample)
      return E_POINTER;
   if(!pDispatch)
   {
      // NULL dispatch means NULL MediaSample
      *ppMediaSample = NULL;
   }
   else
   {
      HRESULT hr;
      IUnknown* pObject;

      // query the IltmmObjectWrapper interface
      IltmmObjectWrapper* pWrapper;
      hr = IUnknown_QueryInterface(pDispatch, &IID_IltmmObjectWrapper, (void**) &pWrapper);
      if(FAILED(hr))
         return hr;
      // get the wrapped object
      hr = IltmmObjectWrapper_GetWrappedObject (pWrapper, &pObject);
      IUnknown_Release(pWrapper);
      if(FAILED(hr))
         return hr;
      // query the IMediaSample interface
      hr = IUnknown_QueryInterface(pObject, &IID_IMediaSample, (void**) ppMediaSample);
      IUnknown_Release(pObject);
      if(FAILED(hr))
         return hr;
   }
   return S_OK;
}

The actual DirectX IMediaSample interface can be accessed through the IltmmObjectWrapper interface using the following code:

L_MULTIMEDIATEX_API HRESULT UnwrapMediaSampleExample (IltmmMediaSampleDisp* pDispatch, IMediaSample** ppMediaSample)
{
   if(!ppMediaSample)
      return E_POINTER;

   if(!pDispatch)
   {
      // NULL dispatch means NULL MediaSample
      *ppMediaSample = NULL;
   }
   else
   {
      HRESULT hr;
      IUnknown* pObject;

      // query the IltmmObjectWrapper interface
      IltmmObjectWrapper* pWrapper;

      hr =IUnknown_QueryInterface(pDispatch, &IID_IltmmObjectWrapper, (void**) &pWrapper);

      if(FAILED(hr))
         return hr;

      // get the wrapped object
      hr = IltmmObjectWrapper_GetWrappedObject (pWrapper, &pObject);

      IUnknown_Release(pWrapper);

      if(FAILED(hr))
         return hr;

      // query the IMediaSample interface
      hr = IUnknown_QueryInterface(pObject, &IID_IMediaSample, (void**) ppMediaSample);

      IUnknown_Release(pObject);
   
      if(FAILED(hr))
         return hr;
   }

   return S_OK;
}