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

#pragma makedep proxy
#pragma makedep register

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

[
    threading(both),
    uuid(670d1d20-a068-11d0-b3f0-00aa003761c5)  /* IAMCopyCaptureFileProgress */
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

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

[
    helpstring("Video Mixing Renderer"),
    threading(both),
    uuid(b87beb7b-8d29-423f-ae4d-6582c10175ac)
]
coclass VideoMixingRenderer { interface IBaseFilter; }

[
    helpstring("Video Mixing Renderer 9"),
    threading(both),
    uuid(51b4abf3-748f-4e3b-a276-c828330e926a)
]
coclass VideoMixingRenderer9 { interface IBaseFilter; }
