📄 dmoimpl.h
字号:
return DMO_E_INVALIDSTREAMINDEX;
}
if (NULL == pulSize || NULL == pulAlignment) {
return E_POINTER;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
if (!m_fTypesSet || !OutputTypeSet(ulStreamIndex)) {
return DMO_E_TYPE_NOT_SET;
}
return INTERNAL_CALL(_DERIVED_, GetOutputSizeInfo)(ulStreamIndex, pulSize, pulAlignment);
}
STDMETHODIMP SetInputType(ULONG ulStreamIndex, const DMO_MEDIA_TYPE *pmt, DWORD dwFlags) {
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
if (dwFlags & ~ (DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY)) {
return E_INVALIDARG;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
if (dwFlags & DMO_SET_TYPEF_CLEAR) {
MoFreeMediaType(&m_InputInfo[ulStreamIndex].CurrentMediaType);
m_InputInfo[ulStreamIndex].fTypeSet = FALSE;
if (!CheckTypesSet()) {
Flush();
FreeStreamingResources();
}
return NOERROR;
}
if (NULL == pmt) {
return E_POINTER;
}
HRESULT hr = INTERNAL_CALL(_DERIVED_, CheckInputType)(ulStreamIndex, pmt);
if (FAILED(hr))
return hr;
if (dwFlags & DMO_SET_TYPEF_TEST_ONLY) {
return NOERROR;
}
// actually set the type
DMO_MEDIA_TYPE mtTemp;
if (S_OK == MoCopyMediaType(&mtTemp, pmt)) {
// Free any previous mediatype
if (InputTypeSet(ulStreamIndex)) {
MoFreeMediaType(&m_InputInfo[ulStreamIndex].CurrentMediaType);
}
m_InputInfo[ulStreamIndex].CurrentMediaType = mtTemp;
m_InputInfo[ulStreamIndex].fTypeSet = TRUE;
CheckTypesSet();
} else {
return E_OUTOFMEMORY;
}
return NOERROR;
}
STDMETHODIMP SetOutputType(ULONG ulStreamIndex, const DMO_MEDIA_TYPE *pmt, DWORD dwFlags) {
if (ulStreamIndex >= NUMBEROFOUTPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
if (dwFlags & ~ (DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY)) {
return E_INVALIDARG;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
if (dwFlags & DMO_SET_TYPEF_CLEAR) {
MoFreeMediaType(&m_OutputInfo[ulStreamIndex].CurrentMediaType);
m_OutputInfo[ulStreamIndex].fTypeSet = FALSE;
if (!CheckTypesSet()) {
Flush();
FreeStreamingResources();
}
return NOERROR;
}
if (NULL == pmt) {
return E_POINTER;
}
HRESULT hr = INTERNAL_CALL(_DERIVED_, CheckOutputType)(ulStreamIndex, pmt);
if (FAILED(hr)) {
return hr;
}
if (dwFlags & DMO_SET_TYPEF_TEST_ONLY) {
return NOERROR;
}
// actually set the type
DMO_MEDIA_TYPE mtTemp;
if (S_OK == MoCopyMediaType(&mtTemp, pmt)) {
// Free any previous mediatype
if (OutputTypeSet(ulStreamIndex)) {
MoFreeMediaType(&m_OutputInfo[ulStreamIndex].CurrentMediaType);
}
m_OutputInfo[ulStreamIndex].CurrentMediaType = mtTemp;
m_OutputInfo[ulStreamIndex].fTypeSet = TRUE;
CheckTypesSet();
} else {
return E_OUTOFMEMORY;
}
return NOERROR;
}
STDMETHODIMP GetInputStatus(
ULONG ulStreamIndex,
DWORD *pdwStatus
) {
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
if (NULL == pdwStatus) {
return E_POINTER;
}
*pdwStatus = 0;
LockIt lck(static_cast<_DERIVED_ *>(this));
if (!m_fTypesSet) {
return DMO_E_TYPE_NOT_SET;
}
if (INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex) == S_OK) {
*pdwStatus |= DMO_INPUT_STATUSF_ACCEPT_DATA;
}
return NOERROR;
}
STDMETHODIMP GetInputMaxLatency(unsigned long ulStreamIndex, REFERENCE_TIME *prtLatency) {
if (prtLatency == NULL) {
return E_POINTER;
}
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
return INTERNAL_CALL(_DERIVED_, GetInputMaxLatency)(ulStreamIndex, prtLatency);
}
STDMETHODIMP SetInputMaxLatency(unsigned long ulStreamIndex, REFERENCE_TIME rtLatency) {
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
return INTERNAL_CALL(_DERIVED_, SetInputMaxLatency)(ulStreamIndex, rtLatency);
}
STDMETHODIMP Discontinuity(ULONG ulStreamIndex) {
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
if (!m_fTypesSet) {
return DMO_E_TYPE_NOT_SET;
}
if (S_OK != INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex)) {
return DMO_E_NOTACCEPTING;
}
return INTERNAL_CALL(_DERIVED_, Discontinuity)(ulStreamIndex);
}
STDMETHODIMP Flush()
{
LockIt lck(static_cast<_DERIVED_ *>(this));
if (!m_fTypesSet) {
return S_OK;
}
if (m_fFlushed) {
return S_OK;
}
HRESULT hr = INTERNAL_CALL(_DERIVED_, Flush)();
m_fFlushed = true;
return hr;
}
STDMETHODIMP AllocateStreamingResources() {
LockIt lck(static_cast<_DERIVED_ *>(this));
if (!m_fTypesSet) {
return DMO_E_TYPE_NOT_SET;
}
if (m_fResourcesAllocated) {
return S_OK;
}
HRESULT hr = INTERNAL_CALL(_DERIVED_, AllocateStreamingResources)();
if (SUCCEEDED(hr)) {
m_fResourcesAllocated = true;
}
return hr;
}
STDMETHODIMP FreeStreamingResources()
{
LockIt lck(static_cast<_DERIVED_ *>(this));
if (m_fResourcesAllocated) {
m_fResourcesAllocated = false;
INTERNAL_CALL(_DERIVED_, Flush)();
return INTERNAL_CALL(_DERIVED_, FreeStreamingResources)();
}
return S_OK;
}
//
// Processing methods - public entry points
//
STDMETHODIMP ProcessInput(
DWORD ulStreamIndex,
IMediaBuffer *pBuffer, // [in], must not be NULL
DWORD dwFlags, // [in] - discontinuity, timestamp, etc.
REFERENCE_TIME rtTimestamp, // [in], valid if flag set
REFERENCE_TIME rtTimelength // [in], valid if flag set
) {
if (!pBuffer) {
return E_POINTER;
}
if (ulStreamIndex >= NUMBEROFINPUTS) {
return DMO_E_INVALIDSTREAMINDEX;
}
if (dwFlags & ~(DMO_INPUT_DATA_BUFFERF_SYNCPOINT |
DMO_INPUT_DATA_BUFFERF_TIME |
DMO_INPUT_DATA_BUFFERF_TIMELENGTH)) {
return E_INVALIDARG;
}
LockIt lck(static_cast<_DERIVED_ *>(this));
// Make sure all streams have media types set and resources are allocated
HRESULT hr = AllocateStreamingResources();
if (FAILED(hr)) {
return hr;
}
if (INTERNAL_CALL(_DERIVED_, AcceptingInput)(ulStreamIndex) != S_OK) {
return DMO_E_NOTACCEPTING;
}
m_fFlushed = false;
return INTERNAL_CALL(_DERIVED_, ProcessInput)(
ulStreamIndex,
pBuffer,
dwFlags,
rtTimestamp,
rtTimelength);
}
STDMETHODIMP ProcessOutput(
DWORD dwFlags,
DWORD ulOutputBufferCount,
DMO_OUTPUT_DATA_BUFFER *pOutputBuffers,
DWORD *pdwStatus)
{
if (pdwStatus == NULL) {
return E_POINTER;
}
if (ulOutputBufferCount != NUMBEROFOUTPUTS || (dwFlags & ~DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER)) {
return E_INVALIDARG;
}
if (NUMBEROFOUTPUTS != 0 && pOutputBuffers == NULL) {
return E_POINTER;
}
*pdwStatus = 0;
LockIt lck(static_cast<_DERIVED_ *>(this));
HRESULT hr = AllocateStreamingResources();
if (FAILED(hr)) {
return hr;
}
for (DWORD dw = 0; dw < NUMBEROFOUTPUTS; dw++) {
pOutputBuffers[dw].dwStatus = 0;
}
hr = INTERNAL_CALL(_DERIVED_, ProcessOutput)(
dwFlags,
ulOutputBufferCount,
pOutputBuffers,
pdwStatus);
// remember the DMO's incomplete status
for (dw = 0; dw < NUMBEROFOUTPUTS; dw++) {
if (pOutputBuffers[dw].dwStatus & DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE) {
m_OutputInfo[dw].fIncomplete = TRUE;
} else {
m_OutputInfo[dw].fIncomplete = FALSE;
}
}
return hr;
}
STDMETHODIMP DMOLock(LONG lLock)
{
if (lLock) {
static_cast<_DERIVED_ *>(this)->Lock();
} else {
static_cast<_DERIVED_ *>(this)->Unlock();
}
return S_OK;
}
};
#endif // _dmoimpl_h_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -