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

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