/*
 * COM Classes for avifil32
 *
 * Copyright 2010 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

import "wtypes.idl";
import "unknwn.idl";

typedef struct _AVISTREAMINFOW
{
    DWORD fccType;
    DWORD fccHandler;
    DWORD dwFlags;
    DWORD dwCaps;
    WORD  wPriority;
    WORD  wLanguage;
    DWORD dwScale;
    DWORD dwRate;
    DWORD dwStart;
    DWORD dwLength;
    DWORD dwInitialFrames;
    DWORD dwSuggestedBufferSize;
    DWORD dwQuality;
    DWORD dwSampleSize;
    RECT  rcFrame;
    DWORD dwEditCount;
    DWORD dwFormatChangeCount;
    WCHAR szName[64];
} AVISTREAMINFOW;

[
    object,
    uuid(00020021-0000-0000-c000-000000000046)
]
interface IAVIStream : IUnknown
{
    HRESULT Create(LPARAM lParam1, LPARAM lParam2);
    HRESULT Info(AVISTREAMINFOW *psi, LONG lSize);
    LONG FindSample(LONG lPos, LONG lFlags);
    HRESULT ReadFormat(LONG lPos, [out,size_is(*lpcbFormat)] char *lpFormat, [in,out] LONG *lpcbFormat);
    HRESULT SetFormat(LONG lPos, [in,size_is(cbFormat)] char *lpFormat, LONG cbFormat);
    HRESULT Read(LONG lStart, LONG lSamples, [out,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer, LONG *plBytes, LONG *plSamples);
    HRESULT Write(LONG lStart, LONG lSamples, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG *plSampWritten, LONG *plBytesWritten);
    HRESULT Delete(LONG lStart, LONG lSamples);
    HRESULT ReadData(DWORD fcc, [out,size_is(*lpcbBuffer)] char *lpBuffer, [in,out] LONG *lpcbBuffer);
    HRESULT WriteData(DWORD fcc, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer);
    HRESULT SetInfo(AVISTREAMINFOW *plInfo, LONG cbInfo);
};

typedef struct _AVIFILEINFOW
{
    DWORD dwMaxBytesPerSec;
    DWORD dwFlags;
    DWORD dwCaps;
    DWORD dwStreams;
    DWORD dwSuggestedBufferSize;
    DWORD dwWidth;
    DWORD dwHeight;
    DWORD dwScale;
    DWORD dwRate;
    DWORD dwLength;
    DWORD dwEditCount;
    WCHAR szFileType[64];
} AVIFILEINFOW;

[
    object,
    uuid(00020020-0000-0000-c000-000000000046)
]
interface IAVIFile : IUnknown
{
    HRESULT Info(AVIFILEINFOW *pfi, LONG lSize);
    HRESULT GetStream(IAVIStream **ppStream, DWORD fccType, LONG lParam);
    HRESULT CreateStream(IAVIStream **ppStream, AVISTREAMINFOW *psi);
    HRESULT WriteData(DWORD fcc, [in,size_is(cbBuffer)] char *lpBuffer, LONG cbBuffer);
    HRESULT ReadData(DWORD fcc, [out,size_is(*lpcbBuffer)] char *lpBuffer, [in,out] LONG *lpcbBuffer);
    HRESULT EndRecord(void);
    HRESULT DeleteStream(DWORD fccType, LONG lParam);
};

[
    helpstring("Microsoft AVI Files"),
    threading(both),
    uuid(00020000-0000-0000-C000-000000000046)
]
coclass AVIFile { interface IAVIFile; }

[
    helpstring("AVI Compressed Stream"),
    threading(both),
    uuid(00020001-0000-0000-c000-000000000046)
]
coclass ICMStream { interface IAVIStream; }

[
    helpstring("Microsoft Wave File"),
    threading(both),
    uuid(00020003-0000-0000-c000-000000000046)
]
coclass WAVFile { interface IAVIFile; }

[
    helpstring("IAVIStream & IAVIFile Proxy"),
    threading(both),
    uuid(0002000d-0000-0000-c000-000000000046)
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

[
    helpstring("ACM Compressed Audio Stream"),
    threading(both),
    uuid(0002000f-0000-0000-c000-000000000046)
]
coclass ACMStream { interface IAVIStream; }