5#include <private/qmemoryvideobuffer_p.h>
6#include <private/qwindowsmultimediautils_p.h>
25 m_videoSinkTypeHandler(0),
33 m_inputType->Release();
36 m_outputType->Release();
38 if (m_videoSinkTypeHandler)
39 m_videoSinkTypeHandler->Release();
63 if (m_videoSinkTypeHandler) {
64 m_videoSinkTypeHandler->Release();
65 m_videoSinkTypeHandler = NULL;
69 videoSink->QueryInterface(IID_PPV_ARGS(&m_videoSinkTypeHandler));
76 if (
riid == IID_IMFTransform) {
77 *
ppv =
static_cast<IMFTransform*
>(
this);
78 }
else if (
riid == IID_IUnknown) {
79 *
ppv =
static_cast<IUnknown*
>(
this);
90 return InterlockedIncrement(&m_cRef);
95 ULONG cRef = InterlockedDecrement(&m_cRef);
104 if (!pdwInputMinimum || !pdwInputMaximum || !pdwOutputMinimum || !pdwOutputMaximum)
106 *pdwInputMinimum = 1;
107 *pdwInputMaximum = 1;
108 *pdwOutputMinimum = 1;
109 *pdwOutputMaximum = 1;
115 if (!pcInputStreams || !pcOutputStreams)
119 *pcOutputStreams = 1;
137 if (dwInputStreamID > 0)
138 return MF_E_INVALIDSTREAMNUMBER;
143 pStreamInfo->cbSize = 0;
144 pStreamInfo->hnsMaxLatency = 0;
145 pStreamInfo->cbMaxLookahead = 0;
146 pStreamInfo->cbAlignment = 0;
147 pStreamInfo->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES
148 | MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER
149 | MFT_INPUT_STREAM_PROCESSES_IN_PLACE;
158 if (dwOutputStreamID > 0)
159 return MF_E_INVALIDSTREAMNUMBER;
164 pStreamInfo->cbSize = 0;
165 pStreamInfo->cbAlignment = 0;
166 pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES
167 | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER
168 | MFT_OUTPUT_STREAM_PROVIDES_SAMPLES
169 | MFT_OUTPUT_STREAM_DISCARDABLE;
215 if (!m_videoSinkTypeHandler)
218 if (dwInputStreamID > 0)
219 return MF_E_INVALIDSTREAMNUMBER;
224 return m_videoSinkTypeHandler->GetMediaTypeByIndex(dwTypeIndex, ppType);
232 if (dwOutputStreamID > 0)
233 return MF_E_INVALIDSTREAMNUMBER;
240 return MF_E_TRANSFORM_TYPE_NOT_SET;
243 return MF_E_NO_MORE_TYPES;
246 if (FAILED(MFCreateMediaType(ppType)))
247 return E_OUTOFMEMORY;
249 return m_inputType->CopyAllItems(*ppType);
254 if (dwInputStreamID > 0)
255 return MF_E_INVALIDSTREAMNUMBER;
260 return MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;
262 if (!isMediaTypeSupported(pType))
263 return MF_E_INVALIDMEDIATYPE;
265 if (dwFlags == MFT_SET_TYPE_TEST_ONLY)
266 return pType ? S_OK : E_POINTER;
269 m_inputType->Release();
272 if (m_outputType && m_outputType->IsEqual(pType, &
flags) != S_OK) {
273 m_outputType->Release();
281 m_inputType->AddRef();
288 if (dwOutputStreamID > 0)
289 return MF_E_INVALIDSTREAMNUMBER;
291 if (dwFlags == MFT_SET_TYPE_TEST_ONLY && !pType)
298 return MF_E_TRANSFORM_TYPE_NOT_SET;
301 return MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;
304 if (pType && m_inputType->IsEqual(pType, &
flags) != S_OK)
305 return MF_E_INVALIDMEDIATYPE;
307 if (dwFlags == MFT_SET_TYPE_TEST_ONLY)
308 return pType ? S_OK : E_POINTER;
311 m_outputType->Release();
313 m_outputType = pType;
316 m_outputType->AddRef();
317 m_format = videoFormatForMFMediaType(m_outputType, &m_bytesPerLine);
325 if (dwInputStreamID > 0)
326 return MF_E_INVALIDSTREAMNUMBER;
334 return MF_E_TRANSFORM_TYPE_NOT_SET;
337 if (FAILED(MFCreateMediaType(ppType)))
338 return E_OUTOFMEMORY;
340 return m_inputType->CopyAllItems(*ppType);
345 if (dwOutputStreamID > 0)
346 return MF_E_INVALIDSTREAMNUMBER;
354 return MF_E_TRANSFORM_TYPE_NOT_SET;
357 if (FAILED(MFCreateMediaType(ppType)))
358 return E_OUTOFMEMORY;
360 return m_outputType->CopyAllItems(*ppType);
365 if (dwInputStreamID > 0)
366 return MF_E_INVALIDSTREAMNUMBER;
373 if (!m_inputType || !m_outputType)
374 return MF_E_TRANSFORM_TYPE_NOT_SET;
379 *pdwFlags = MFT_INPUT_STATUS_ACCEPT_DATA;
391 if (!m_inputType || !m_outputType)
392 return MF_E_TRANSFORM_TYPE_NOT_SET;
395 *pdwFlags = MFT_OUTPUT_STATUS_SAMPLE_READY;
425 case MFT_MESSAGE_COMMAND_FLUSH:
429 case MFT_MESSAGE_COMMAND_DRAIN:
435 case MFT_MESSAGE_SET_D3D_MANAGER:
443 case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING:
444 case MFT_MESSAGE_NOTIFY_END_STREAMING:
445 case MFT_MESSAGE_NOTIFY_END_OF_STREAM:
446 case MFT_MESSAGE_NOTIFY_START_OF_STREAM:
458 if (dwInputStreamID > 0)
459 return MF_E_INVALIDSTREAMNUMBER;
467 return MF_E_TRANSFORM_TYPE_NOT_SET;
470 return MF_E_NOTACCEPTING;
473 DWORD dwBufferCount = 0;
474 HRESULT hr = pSample->GetBufferCount(&dwBufferCount);
478 if (dwBufferCount == 0)
481 if (dwBufferCount > 1)
482 return MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS;
501 if (pOutputSamples == NULL || pdwStatus == NULL)
504 if (cOutputBufferCount != 1)
510 return MF_E_TRANSFORM_TYPE_NOT_SET;
513 pOutputSamples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE;
514 return MF_E_TRANSFORM_STREAM_CHANGE;
517 if (dwFlags == MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER)
519 else if (dwFlags != 0)
523 return MF_E_TRANSFORM_NEED_MORE_INPUT;
527 if (pOutputSamples[0].pSample != NULL)
530 pOutputSamples[0].pSample = m_sample;
531 pOutputSamples[0].pSample->AddRef();
536 m_videoProbeMutex.
lock();
543 m_videoProbeMutex.
unlock();
546 pOutputSamples[0].dwStatus = 0;
566QVideoFrameFormat MFTransform::videoFormatForMFMediaType(IMFMediaType *mediaType,
int *bytesPerLine)
569 if (FAILED(mediaType->GetUINT32(MF_MT_DEFAULT_STRIDE, &
stride))) {
574 *bytesPerLine = (int)
stride;
578 if (FAILED(MFGetAttributeSize(mediaType, MF_MT_FRAME_SIZE, &
width, &
height)))
584 GUID subtype = GUID_NULL;
585 if (FAILED(mediaType->GetGUID(MF_MT_SUBTYPE, &subtype)))
593 if (SUCCEEDED(MFGetAttributeRatio(mediaType, MF_MT_FRAME_RATE, &
num, &den))) {
607 IMFMediaBuffer *
buffer = 0;
610 if (FAILED(m_sample->ConvertToContiguousBuffer(&
buffer)))
625 if (SUCCEEDED(m_sample->GetSampleTime(&
startTime))) {
628 LONGLONG duration = -1;
629 if (SUCCEEDED(m_sample->GetSampleDuration(&duration)))
651 IDirect3DSurface9 *surface = 0;
653 if (FAILED(MFGetService(
buffer, MR_BUFFER_SERVICE, IID_IDirect3DSurface9, (
void**)&surface)))
657 if (FAILED(surface->LockRect(&
rect, NULL, D3DLOCK_READONLY)))
661 *bytesPerLine = (int)
rect.Pitch;
664 surface->UnlockRect();
676bool MFTransform::isMediaTypeSupported(IMFMediaType *
type)
680 if (!m_videoSinkTypeHandler || !
type)
683 return m_videoSinkTypeHandler->IsMediaTypeSupported(
type, NULL) == S_OK;
The QMemoryVideoBuffer class provides a system memory allocated video data buffer.
void unlock() noexcept
Unlocks the mutex.
void lock() noexcept
Locks the mutex.
The QVideoFrame class represents a frame of video data.
STDMETHODIMP_(ULONG) MFTransform
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint GLenum GLsizei length
const void GLsizei GLsizei stride
GLint GLsizei GLsizei GLenum format
IUIViewSettingsInterop __RPC__in REFIID riid
IUIViewSettingsInterop __RPC__in REFIID __RPC__deref_out_opt void ** ppv