mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.6 KiB
109 lines
2.6 KiB
// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// dmort.cpp - DMO runtime misc.
|
|
//
|
|
#include <windows.h>
|
|
#include "mediaobj.h"
|
|
#include "dmort.h"
|
|
|
|
//
|
|
// Mediatype stuff
|
|
//
|
|
STDAPI MoInitMediaType(DMO_MEDIA_TYPE *pmt, ULONG cbFormat) {
|
|
if (!pmt)
|
|
return E_POINTER;
|
|
pmt->pUnk = NULL;
|
|
if (cbFormat) {
|
|
pmt->pbFormat = (PBYTE)CoTaskMemAlloc(cbFormat);
|
|
if (!pmt->pbFormat)
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
pmt->pbFormat = NULL;
|
|
pmt->cbFormat = cbFormat;
|
|
return NOERROR;
|
|
}
|
|
|
|
STDAPI MoFreeMediaType(DMO_MEDIA_TYPE *pmt) {
|
|
if (!pmt)
|
|
return E_POINTER;
|
|
if (pmt->pUnk) {
|
|
pmt->pUnk->Release();
|
|
pmt->pUnk = NULL;
|
|
}
|
|
if (pmt->pbFormat) {
|
|
CoTaskMemFree(pmt->pbFormat);
|
|
pmt->pbFormat = NULL;
|
|
}
|
|
return NOERROR;
|
|
}
|
|
|
|
// everything has been allocated - just copy
|
|
void CopyMediaTypeInternal(DMO_MEDIA_TYPE *pmtDest, DMO_MEDIA_TYPE const *pmtSrc) {
|
|
if (pmtDest->cbFormat)
|
|
memcpy(pmtDest->pbFormat, pmtSrc->pbFormat, pmtDest->cbFormat);
|
|
|
|
if (pmtSrc->pUnk) {
|
|
pmtSrc->pUnk->AddRef();
|
|
pmtDest->pUnk = pmtSrc->pUnk;
|
|
}
|
|
|
|
pmtDest->majortype = pmtSrc->majortype;
|
|
pmtDest->subtype = pmtSrc->subtype;
|
|
pmtDest->bFixedSizeSamples = pmtSrc->bFixedSizeSamples;
|
|
pmtDest->bTemporalCompression = pmtSrc->bTemporalCompression;
|
|
pmtDest->lSampleSize = pmtSrc->lSampleSize;
|
|
pmtDest->formattype = pmtSrc->formattype;
|
|
}
|
|
|
|
STDAPI MoCopyMediaType(DMO_MEDIA_TYPE *pmtDest, DMO_MEDIA_TYPE const *pmtSrc) {
|
|
if ((!pmtDest) || (!pmtSrc))
|
|
return E_POINTER;
|
|
|
|
ULONG cbFormat = pmtSrc->pbFormat ? pmtSrc->cbFormat : 0;
|
|
|
|
HRESULT hr = MoInitMediaType(pmtDest, cbFormat);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
CopyMediaTypeInternal(pmtDest, pmtSrc);
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDAPI MoCreateMediaType(DMO_MEDIA_TYPE **ppmt, ULONG cbFormat) {
|
|
if (!ppmt)
|
|
return E_POINTER;
|
|
*ppmt = (DMO_MEDIA_TYPE*) CoTaskMemAlloc(sizeof(DMO_MEDIA_TYPE));
|
|
if (!*ppmt)
|
|
return E_OUTOFMEMORY;
|
|
HRESULT hr = MoInitMediaType(*ppmt, cbFormat);
|
|
if (FAILED(hr)) {
|
|
CoTaskMemFree(*ppmt);
|
|
*ppmt = NULL;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
STDAPI MoDeleteMediaType(DMO_MEDIA_TYPE *pmt) {
|
|
if (!pmt)
|
|
return E_POINTER;
|
|
HRESULT hr = MoFreeMediaType(pmt);
|
|
CoTaskMemFree(pmt);
|
|
return hr;
|
|
}
|
|
|
|
STDAPI MoDuplicateMediaType(DMO_MEDIA_TYPE **ppmtDest, DMO_MEDIA_TYPE const *pmtSrc) {
|
|
if (!ppmtDest || !pmtSrc)
|
|
return E_POINTER;
|
|
|
|
ULONG cbFormat = pmtSrc->pbFormat ? pmtSrc->cbFormat : 0;
|
|
|
|
HRESULT hr = MoCreateMediaType(ppmtDest, cbFormat);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
CopyMediaTypeInternal(*ppmtDest, pmtSrc);
|
|
|
|
return NOERROR;
|
|
}
|