/*
 * Copyright 2009 Alexandre Julliard
 *
 * 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
 */

cpp_quote("#include <wingdi.h>")
#include "strmif.idl"

[
    helpstring("Filter Graph"),
    threading(both),
    uuid(e436ebb3-524f-11ce-9f53-0020af0ba770)
]
coclass FilterGraph { interface IFilterGraph2; }

[
    helpstring("Filter Graph no thread"),
    threading(both),
    uuid(e436ebb8-524f-11ce-9f53-0020af0ba770)
]
coclass FilterGraphNoThread { interface IFilterGraph2; }

[
    helpstring("Filter Mapper"),
    threading(both),
    uuid(e436ebb2-524f-11ce-9f53-0020af0ba770)
]
coclass FilterMapper { interface IFilterMapper; }

[
    helpstring("Filter Mapper2"),
    threading(both),
    uuid(cda42200-bd88-11d0-bd4e-00a0c911ce86)
]
coclass FilterMapper2 { interface IFilterMapper3; }

[
    helpstring("System Clock"),
    threading(both),
    uuid(e436ebb1-524f-11ce-9f53-0020af0ba770)
]
coclass SystemClock { interface IReferenceClock; }

[
    helpstring("Memory Allocator"),
    threading(both),
    uuid(1e651cc0-b199-11d0-8212-00c04fc32c45)
]
coclass MemoryAllocator { interface IMemAllocator; }

[
    helpstring("Seeking"),
    threading(both),
    uuid(060af76c-68dd-11d0-8fc1-00c04fd9189d)
]
coclass SeekingPassThru { interface ISeekingPassThru; }

[
    helpstring("File Source Filter"),
    threading(both),
    uuid(e436ebb5-524f-11ce-9f53-0020af0ba770)
]
coclass AsyncReader { interface IBaseFilter; }

[
    helpstring("AVI Splitter"),
    threading(both),
    uuid(1b544c20-fd0b-11ce-8c63-00aa0044b51e)
]
coclass AviSplitter { interface IBaseFilter; }

[
    helpstring("MPEG-I Stream Splitter"),
    threading(both),
    uuid(336475d0-942a-11ce-a870-00aa002feab5)
]
coclass MPEG1Splitter { interface IBaseFilter; }

[
    helpstring("AVI Decompressor"),
    threading(both),
    uuid(cf49d4e0-1115-11ce-b03a-0020af0ba770)
]
coclass AVIDec { interface IBaseFilter; }

[
    helpstring("DirectSound Audio Renderer"),
    threading(both),
    uuid(79376820-07d0-11cf-a24d-0020afd79767)
]
coclass DSoundRender { interface IBaseFilter; }

[
    helpstring("Wave Audio Renderer"),
    threading(both),
    uuid(e30629d1-27e5-11ce-875d-00608cb78066)
]
coclass AudioRender { interface IBaseFilter; }

[
    helpstring("Null Renderer"),
    threading(both),
    uuid(c1f400a4-3f08-11d3-9f0b-006008039e37)
]
coclass NullRenderer { interface IBaseFilter; }

[
    helpstring("Video Renderer"),
    threading(both),
    uuid(70e102b0-5556-11ce-97c0-00aa0055595a)
]
coclass VideoRenderer { interface IBaseFilter; }

[
    helpstring("Default Video Renderer"),
    threading(both),
    uuid(6bc1cffa-8fc1-4261-ac22-cfb4cc38db50)
]
coclass VideoRendererDefault { interface IBaseFilter; }

[
    helpstring("ACM wrapper"),
    threading(both),
    uuid(6a08cf80-0e18-11cf-a24d-0020afd79767)
]
coclass ACMWrapper { interface IBaseFilter; }

[
    helpstring("Wave Parser"),
    threading(both),
    uuid(d51bd5a1-7548-11cf-a520-0080c77ef58a)
]
coclass WAVEParser { interface IBaseFilter; }
