summaryrefslogtreecommitdiff
path: root/AVStream/samplemft0/Mft0.h
diff options
context:
space:
mode:
Diffstat (limited to 'AVStream/samplemft0/Mft0.h')
-rw-r--r--AVStream/samplemft0/Mft0.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/AVStream/samplemft0/Mft0.h b/AVStream/samplemft0/Mft0.h
new file mode 100644
index 00000000..0cc85733
--- /dev/null
+++ b/AVStream/samplemft0/Mft0.h
@@ -0,0 +1,224 @@
+// Mft0.h : Declaration of the CMft0
+
+#pragma once
+#include "resource.h" // main symbols
+#include "SampleMft0.h"
+#include "SampleHelpers.h"
+
+#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
+#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
+#endif
+
+using namespace ATL;
+
+// CMft0
+
+class ATL_NO_VTABLE CMft0 :
+ public CComObjectRootEx<CComMultiThreadModel>,
+ public CComCoClass<CMft0, &CLSID_Mft0>,
+ public IMft0,
+ public IMFTransform,
+ public IInspectable
+{
+public:
+ CMft0() : m_pSample(NULL),
+ m_pInputType(NULL),
+ m_pOutputType(NULL),
+ m_pInputAttributes(0),
+ m_pGlobalAttributes(0),
+ m_pSourceTransform(0),
+ m_bEnableEffects(TRUE),
+ m_uiStreamId(0),
+ m_percentOfScreen(50),
+ m_nRefCount(1)
+ {
+ InitializeCriticalSection(&m_critSec);
+ }
+
+ DECLARE_REGISTRY_RESOURCEID(IDR_MFT0)
+
+ DECLARE_NOT_AGGREGATABLE(CMft0)
+
+ BEGIN_COM_MAP(CMft0)
+ COM_INTERFACE_ENTRY(IMft0)
+ COM_INTERFACE_ENTRY(IMFTransform)
+ COM_INTERFACE_ENTRY(IInspectable)
+ END_COM_MAP()
+
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+ HRESULT FinalConstruct()
+ {
+ return S_OK;
+ }
+
+ void FinalRelease()
+ {
+ }
+
+public:
+ STDMETHOD(UpdateDsp)(UINT32 uiPercentOfScreen);
+ STDMETHOD(Enable)(void);
+ STDMETHOD(Disable)(void);
+ STDMETHOD(GetDspSetting)(UINT* puiPercentOfScreen, BOOL* pIsEnabled);
+
+ STDMETHODIMP GetIids(
+ /* [out] */ _Out_ ULONG *iidCount,
+ /* [size_is][size_is][out] */ _Outptr_result_buffer_maybenull_(*iidCount) IID **iids);
+
+ STDMETHODIMP GetRuntimeClassName(
+ /* [out] */ _Outptr_result_maybenull_ HSTRING *className);
+
+ STDMETHODIMP GetTrustLevel(
+ /* [out] */ _Out_ TrustLevel *trustLevel);
+
+ STDMETHODIMP GetStreamLimits(
+ /* [out] */ _Out_ DWORD *pdwInputMinimum,
+ /* [out] */ _Out_ DWORD *pdwInputMaximum,
+ /* [out] */ _Out_ DWORD *pdwOutputMinimum,
+ /* [out] */ _Out_ DWORD *pdwOutputMaximum);
+
+ STDMETHODIMP GetStreamCount(
+ /* [out] */ _Out_ DWORD *pcInputStreams,
+ /* [out] */ _Out_ DWORD *pcOutputStreams);
+
+ STDMETHODIMP GetStreamIDs(
+ DWORD dwInputIDArraySize,
+ /* [size_is][out] */ _Out_writes_(dwInputIDArraySize) DWORD *pdwInputIDs,
+ DWORD dwOutputIDArraySize,
+ /* [size_is][out] */ _Out_writes_(dwOutputIDArraySize) DWORD *pdwOutputIDs);
+
+ STDMETHODIMP GetInputStreamInfo(
+ DWORD dwInputStreamID,
+ /* [out] */ _Out_ MFT_INPUT_STREAM_INFO *pStreamInfo);
+
+ STDMETHODIMP GetOutputStreamInfo(
+ DWORD dwOutputStreamID,
+ /* [out] */ _Out_ MFT_OUTPUT_STREAM_INFO *pStreamInfo);
+
+ STDMETHODIMP GetAttributes(
+ /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);
+
+ STDMETHODIMP GetInputStreamAttributes(
+ DWORD dwInputStreamID,
+ /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);
+
+ STDMETHODIMP GetOutputStreamAttributes(
+ DWORD dwOutputStreamID,
+ /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);
+
+ STDMETHODIMP DeleteInputStream(
+ DWORD dwStreamID);
+
+ STDMETHODIMP AddInputStreams(
+ DWORD cStreams,
+ /* [in] */ _In_ DWORD *adwStreamIDs);
+
+ STDMETHODIMP GetInputAvailableType(
+ DWORD dwInputStreamID,
+ DWORD dwTypeIndex,
+ /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);
+
+ STDMETHODIMP GetOutputAvailableType(
+ DWORD dwOutputStreamID,
+ DWORD dwTypeIndex,
+ /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);
+
+ STDMETHODIMP SetInputType(
+ DWORD dwInputStreamID,
+ /* [in] */ _In_opt_ IMFMediaType *pType,
+ DWORD dwFlags);
+
+ STDMETHODIMP SetOutputType(
+ DWORD dwOutputStreamID,
+ /* [in] */ _In_opt_ IMFMediaType *pType,
+ DWORD dwFlags);
+
+ STDMETHODIMP GetInputCurrentType(
+ DWORD dwInputStreamID,
+ /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);
+
+ STDMETHODIMP GetOutputCurrentType(
+ DWORD dwOutputStreamID,
+ /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);
+
+ STDMETHODIMP GetInputStatus(
+ DWORD dwInputStreamID,
+ /* [out] */ _Out_ DWORD *pdwFlags);
+
+ STDMETHODIMP GetOutputStatus(
+ /* [out] */ _Out_ DWORD *pdwFlags);
+
+ STDMETHODIMP SetOutputBounds(
+ LONGLONG hnsLowerBound,
+ LONGLONG hnsUpperBound);
+
+ STDMETHODIMP ProcessEvent(
+ DWORD dwInputStreamID,
+ /* [in] */ _In_opt_ IMFMediaEvent *pEvent);
+
+ STDMETHODIMP ProcessMessage(
+ MFT_MESSAGE_TYPE eMessage,
+ ULONG_PTR ulParam);
+
+ STDMETHODIMP ProcessInput(
+ DWORD dwInputStreamID,
+ IMFSample *pSample,
+ DWORD dwFlags);
+
+ STDMETHODIMP ProcessOutput(
+ DWORD dwFlags,
+ DWORD cOutputBufferCount,
+ /* [size_is][out][in] */ MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
+ /* [out] */ DWORD *pdwStatus);
+
+protected:
+ virtual ~CMft0()
+ {
+ SAFERELEASE(m_pInputAttributes);
+ SAFERELEASE(m_pGlobalAttributes);
+ SAFERELEASE(m_pSourceTransform);
+ SAFERELEASE(m_pInputType);
+ SAFERELEASE(m_pOutputType);
+ SAFERELEASE(m_pSample);
+ DeleteCriticalSection(&m_critSec);
+ }
+
+ STDMETHODIMP GetMediaType(DWORD dwStreamID, DWORD dwTypeIndex, IMFMediaType **ppType);
+ STDMETHODIMP IsMediaTypeSupported(UINT uiStreamId, IMFMediaType *pIMFMediaType, IMFMediaType **ppIMFMediaTypeFull = NULL);
+ STDMETHODIMP GenerateMFMediaTypeListFromDevice(UINT uiStreamId);
+
+ // HasPendingOutput: Returns TRUE if the MFT is holding an input sample.
+ BOOL HasPendingOutput() const { return m_pSample != NULL; }
+
+ // IsValidInputStream: Returns TRUE if dwInputStreamID is a valid input stream identifier.
+ BOOL IsValidInputStream(DWORD dwInputStreamID);
+
+ // IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid output stream identifier.
+ BOOL IsValidOutputStream(DWORD dwOutputStreamID);
+
+ STDMETHODIMP GetDefaultStride(LONG *plStride);
+
+ STDMETHODIMP OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut);
+
+ STDMETHODIMP OnFlush();
+
+ CRITICAL_SECTION m_critSec;
+
+ IMFSample *m_pSample; // Input sample.
+ IMFMediaType *m_pInputType; // Input media type.
+ IMFMediaType *m_pOutputType; // Output media type.
+
+ // Image transform function. (Changes based on the media type.)
+ IMFAttributes *m_pInputAttributes;
+ IMFAttributes *m_pGlobalAttributes;
+ GUID m_stStreamType;
+ IMFTransform *m_pSourceTransform;
+ volatile BOOL m_bEnableEffects;
+ UINT m_uiStreamId;
+ UINT m_percentOfScreen;
+ UINT m_nRefCount;
+ CAtlMap<DWORD, CComPtr<IMFMediaType>> m_listOfMediaTypes;
+};
+
+OBJECT_ENTRY_AUTO(__uuidof(Mft0), CMft0)