/*
 * Copyright (C) 2002 Robert Shearman
 *
 * 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
 */

#if 0
#pragma makedep install
#endif

interface IPinConnection;
interface IPinFlowControl;
interface IGraphConfig;
interface IGraphConfigCallback;

[
    local,
    object,
    uuid(4a9a62d3-27d4-403d-91e9-89f540e55534),
    pointer_default(unique)
]
interface IPinConnection : IUnknown
{
    HRESULT DynamicQueryAccept([in] const AM_MEDIA_TYPE *pmt);

    HRESULT NotifyEndOfStream([in] HANDLE hNotifyEvent);

    HRESULT IsEndPin();

    HRESULT DynamicDisconnect();
}

[
    local,
    object,
    uuid(c56e9858-dbf3-4f6b-8119-384af2060deb),
    pointer_default(unique)
]
interface IPinFlowControl : IUnknown
{
    HRESULT Block([in] DWORD dwBlockFlags, [in] HANDLE hEvent);
}

enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS
{
    AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001,
};

typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS
{
    AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001,
    AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002,
    AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004
} AM_GRAPH_CONFIG_RECONNECT_FLAGS;

enum _REM_FILTER_FLAGS
{
    REMFILTERF_LEAVECONNECTED = 0x00000001
};

typedef enum _AM_FILTER_FLAGS
{
     AM_FILTER_FLAGS_REMOVABLE = 0x00000001
} AM_FILTER_FLAGS;

[
    local,
    object,
    uuid(03A1EB8E-32BF-4245-8502-114D08A9CB88),
    pointer_default(unique)
]
interface IGraphConfig : IUnknown
{
    HRESULT Reconnect(
        [in] IPin *pOutputPin,
        [in] IPin *pInputPin,
        [in] const AM_MEDIA_TYPE *pmtFirstConnection,
        [in] IBaseFilter *pUsingFilter,
        [in] HANDLE hAbortEvent,
        [in] DWORD dwFlags);

    HRESULT Reconfigure(
        [in] IGraphConfigCallback *pCallback,
        [in] PVOID pvContext,
        [in] DWORD dwFlags,
        [in] HANDLE hAbortEvent);

    HRESULT AddFilterToCache([in] IBaseFilter *pFilter);

    HRESULT EnumCacheFilter([out] IEnumFilters **pEnum);

    HRESULT RemoveFilterFromCache([in]IBaseFilter *pFilter);

    HRESULT GetStartTime([out] REFERENCE_TIME *prtStart);

    HRESULT PushThroughData(
        [in] IPin *pOutputPin,
        [in] IPinConnection *pConnection,
        [in] HANDLE hEventAbort);

    HRESULT SetFilterFlags([in] IBaseFilter *pFilter, [in] DWORD dwFlags);

    HRESULT GetFilterFlags([in] IBaseFilter *pFilter, [out] DWORD *pdwFlags);

    HRESULT RemoveFilterEx([in] IBaseFilter *pFilter, DWORD Flags);
}

[
    local,
    object,
    uuid(ade0fd60-d19d-11d2-abf6-00a0c905f375),
    pointer_default(unique)
]
interface IGraphConfigCallback : IUnknown
{
    HRESULT Reconfigure(PVOID pvContext, DWORD dwFlags);
}

[
    local,
    object,
    uuid(DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29),
    pointer_default(unique)
]
interface IFilterChain : IUnknown
{
    HRESULT StartChain(
        [in] IBaseFilter *pStartFilter,
        [in] IBaseFilter *pEndFilter);

    HRESULT PauseChain(
        [in] IBaseFilter *pStartFilter,
        [in] IBaseFilter *pEndFilter);

    HRESULT StopChain(
        [in] IBaseFilter *pStartFilter,
        [in] IBaseFilter *pEndFilter);

    HRESULT RemoveChain(
        [in] IBaseFilter *pStartFilter,
        [in] IBaseFilter *pEndFilter);
}
