47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
#include "clone.h"
|
|
|
|
HRESULT StandardDMOClone_Ending(IMediaObject *pThis, IMediaObject *pCloned, IMediaObjectInPlace **ppCloned)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// Copy the input and output types
|
|
DMO_MEDIA_TYPE mt;
|
|
DWORD cInputStreams = 0;
|
|
DWORD cOutputStreams = 0;
|
|
pThis->GetStreamCount(&cInputStreams, &cOutputStreams);
|
|
|
|
for (DWORD i = 0; i < cInputStreams && SUCCEEDED(hr); ++i)
|
|
{
|
|
hr = pThis->GetInputCurrentType(i, &mt);
|
|
if (hr == DMO_E_TYPE_NOT_SET)
|
|
{
|
|
hr = S_OK; // great, don't need to set the cloned DMO
|
|
}
|
|
else if (SUCCEEDED(hr))
|
|
{
|
|
hr = pCloned->SetInputType(i, &mt, 0);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < cOutputStreams && SUCCEEDED(hr); ++i)
|
|
{
|
|
hr = pThis->GetOutputCurrentType(i, &mt);
|
|
if (hr == DMO_E_TYPE_NOT_SET)
|
|
{
|
|
hr = S_OK; // great, don't need to set the cloned DMO
|
|
}
|
|
else if (SUCCEEDED(hr))
|
|
{
|
|
hr = pCloned->SetOutputType(i, &mt, 0);
|
|
}
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = pCloned->QueryInterface(IID_IMediaObjectInPlace, (void**)ppCloned);
|
|
|
|
// Release the object's original ref. If clone succeeded (made it through QI) then returned pointer
|
|
// has one ref. If we failed, refs drop to zero, freeing the object.
|
|
pCloned->Release();
|
|
return hr;
|
|
}
|