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

interface IDMOQualityControl;
interface IDMOVideoOutputOptimizations;

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

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
};

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