blob: 4c2e49631743c7fcdb7c0ba0bfa9df7756b4a03c [file] [log] [blame]
/*
* Copyright (C) 2002 Alexandre Julliard
* Copyright (C) 2004 Vincent BĂ©ron
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
import "unknwn.idl";
import "objidl.idl";
import "strmif.idl";
typedef struct _DMOMediaType
{
GUID majortype;
GUID subtype;
BOOL bFixedSizeSamples;
BOOL bTemporalCompression;
ULONG lSampleSize;
GUID formattype;
IUnknown *pUnk;
ULONG cbFormat;
BYTE *pbFormat;
} DMO_MEDIA_TYPE;
/*****************************************************************************
* IEnumDMO interface
*/
[
object,
uuid(2C3CD98A-2BFA-4A53-9C27-5249BA64BA0F),
pointer_default(unique)
]
interface IEnumDMO : IUnknown
{
[local]
HRESULT Next(
[in] DWORD cItemsToFetch,
[out] CLSID *pCLSID,
[out] WCHAR **Names,
[out] DWORD *pcItemsFetched
);
HRESULT Skip(
[in] DWORD cItemsToSkip
);
HRESULT Reset();
HRESULT Clone(
[out] IEnumDMO **ppEnum
);
}
/*****************************************************************************
* IMediaBuffer interface
*/
[
object,
uuid(59eff8b9-938c-4a26-82f2-95cb84cdc837),
local
]
interface IMediaBuffer : IUnknown
{
HRESULT SetLength(
DWORD cbLength
);
HRESULT GetMaxLength(
[out] DWORD *pcbMaxLength
);
HRESULT GetBufferAndLength(
[out] BYTE **ppBuffer,
[out] DWORD *pcbLength
);
}
enum _DMO_INPUT_STATUS_FLAGS
{
DMO_INPUT_STATUSF_ACCEPT_DATA = 0x00000001,
};
enum _DMO_INPUT_DATA_BUFFER_FLAGS
{
DMO_INPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001,
DMO_INPUT_DATA_BUFFERF_TIME = 0x00000002,
DMO_INPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004,
};
enum _DMO_PROCESS_OUTPUT_FLAGS
{
DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER = 0x00000001,
};
typedef struct _DMO_OUTPUT_DATA_BUFFER {
IMediaBuffer *pBuffer;
DWORD dwStatus;
REFERENCE_TIME rtTimestamp;
REFERENCE_TIME rtTimelength;
} DMO_OUTPUT_DATA_BUFFER, *PDMO_OUTPUT_DATA_BUFFER;
enum _DMO_INPLACE_PROCESS_FLAGS {
DMO_INPLACE_NORMAL = 0x00000000,
DMO_INPLACE_ZERO = 0x00000001
};
enum _DMO_SET_TYPE_FLAGS {
DMO_SET_TYPEF_TEST_ONLY = 0x00000001,
DMO_SET_TYPEF_CLEAR = 0x00000002,
};
enum _DMO_OUTPUT_DATA_BUFFERF_FLAGS {
DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT = 0x00000001,
DMO_OUTPUT_DATA_BUFFERF_TIME = 0x00000002,
DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH = 0x00000004,
DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE = 0x01000000,
};
/*****************************************************************************
* IMediaObject interface
*/
[
object,
uuid(d8ad0f58-5494-4102-97c5-ec798e59bcf4),
local
]
interface IMediaObject : IUnknown
{
HRESULT GetStreamCount(
[out] DWORD *pcInputStreams,
[out] DWORD *pcOutputStreams
);
HRESULT GetInputStreamInfo(
DWORD dwInputStreamIndex,
[out] DWORD *pdwFlags
);
HRESULT GetOutputStreamInfo(
DWORD dwOutputStreamIndex,
[out] DWORD *pdwFlags
);
HRESULT GetInputType(
DWORD dwInputStreamIndex,
DWORD dwTypeIndex,
[out] DMO_MEDIA_TYPE *pmt
);
HRESULT GetOutputType(
DWORD dwOutputStreamIndex,
DWORD dwTypeIndex,
[out] DMO_MEDIA_TYPE *pmt
);
HRESULT SetInputType(
DWORD dwInputStreamIndex,
[in] const DMO_MEDIA_TYPE *pmt,
DWORD dwFlags
);
HRESULT SetOutputType(
DWORD dwOutputStreamIndex,
[in] const DMO_MEDIA_TYPE *pmt,
DWORD dwFlags
);
HRESULT GetInputCurrentType(
DWORD dwInputStreamIndex,
[out] DMO_MEDIA_TYPE *pmt
);
HRESULT GetOutputCurrentType(
DWORD dwOutputStreamIndex,
[out] DMO_MEDIA_TYPE *pmt
);
HRESULT GetInputSizeInfo(
DWORD dwInputStreamIndex,
[out] DWORD *pcbSize,
[out] DWORD *pcbMaxLookahead,
[out] DWORD *pcbAlignment
);
HRESULT GetOutputSizeInfo(
DWORD dwOutputStreamIndex,
[out] DWORD *pcbSize,
[out] DWORD *pcbAlignment
);
HRESULT GetInputMaxLatency(
DWORD dwInputStreamIndex,
[out] REFERENCE_TIME *prtMaxLatency
);
HRESULT SetInputMaxLatency(
DWORD dwInputStreamIndex,
REFERENCE_TIME rtMaxLatency
);
HRESULT Flush();
HRESULT Discontinuity(DWORD dwInputStreamIndex);
HRESULT AllocateStreamingResources();
HRESULT FreeStreamingResources();
HRESULT GetInputStatus(
DWORD dwInputStreamIndex,
[out] DWORD *dwFlags
);
HRESULT ProcessInput(
DWORD dwInputStreamIndex,
IMediaBuffer *pBuffer,
DWORD dwFlags,
REFERENCE_TIME rtTimestamp,
REFERENCE_TIME rtTimelength
);
HRESULT ProcessOutput(
DWORD dwFlags,
DWORD cOutputBufferCount,
[in,out] DMO_OUTPUT_DATA_BUFFER *pOutputBuffers,
[out] DWORD *pdwStatus
);
HRESULT Lock(LONG bLock);
}
/*****************************************************************************
* IMediaObjectInPlace interface
*/
[
object,
uuid(651b9ad0-0fc7-4aa9-9538-d89931010741),
local
]
interface IMediaObjectInPlace : IUnknown {
HRESULT Process(
[in] ULONG ulSize,
[in,out] BYTE* pData,
[in] REFERENCE_TIME refTimeStart,
[in] DWORD dwFlags
);
HRESULT Clone(
[out] IMediaObjectInPlace **ppMediaObject
);
HRESULT GetLatency(
[out] REFERENCE_TIME *pLatencyTime
);
}
enum _DMO_QUALITY_STATUS_FLAGS
{
DMO_QUALITY_STATUS_ENABLED = 0x00000001,
};
[
object,
uuid(65abea96-cf36-453f-af8a-705e98f16260),
local
]
interface IDMOQualityControl : IUnknown
{
HRESULT SetNow([in] REFERENCE_TIME now);
HRESULT SetStatus([in] DWORD flags);
HRESULT GetStatus([out] DWORD *flags);
}
enum _DMO_VIDEO_OUTPUT_STREAM_FLAGS
{
DMO_VOSF_NEEDS_PREVIOUS_SAMPLE = 0x00000001,
};
[
object,
uuid(be8f4f4e-5b16-4d29-b350-7f6b5d9298ac),
local
]
interface IDMOVideoOutputOptimizations : IUnknown
{
HRESULT QueryOperationModePreferences(ULONG index, DWORD *flags);
HRESULT SetOperationMode(ULONG index, DWORD flags);
HRESULT GetCurrentOperationMode(ULONG index, DWORD *flags);
HRESULT GetCurrentSampleRequirements(ULONG index, DWORD *flags);
}