/*
 * 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";

cpp_quote("#ifdef __strmif_h__")
cpp_quote("typedef AM_MEDIA_TYPE DMO_MEDIA_TYPE;")
cpp_quote("#else")
typedef struct _DMOMediaType
{
    GUID majortype;
    GUID subtype;
    BOOL bFixedSizeSamples;
    BOOL bTemporalCompression;
    ULONG lSampleSize;
    GUID formattype;
    IUnknown *pUnk;
    ULONG cbFormat;
    BYTE *pbFormat;
} DMO_MEDIA_TYPE;

typedef LONGLONG REFERENCE_TIME;
cpp_quote("#endif")

/*****************************************************************************
 * 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);
}
