/*
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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);
}
