/*
 * Copyright (C) 2002 Lionel Ulmer
 * Copyright (C) 2004 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
 */

import "oaidl.idl";

[
    version(1.0),
    uuid(56a868b0-0ad4-11ce-b03a-0020af0ba770)
]
library QuartzTypeLib
{
    importlib("stdole2.tlb");

    typedef LONG OAFilterState;
    typedef LONG_PTR OAHWND;
    typedef LONG_PTR OAEVENT;

    cpp_quote("#ifndef REFTIME_DEFINED")
    cpp_quote("#define REFTIME_DEFINED")
    typedef DOUBLE REFTIME;
    cpp_quote("#endif")

    /***************************************************************************
     * IMediaControl interface
     */
    [
        object,
        uuid(56a868b1-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IMediaControl : IDispatch
    {
        HRESULT Run();
        HRESULT Pause();
        HRESULT Stop();
        HRESULT GetState( [in] LONG msTimeout, [out] OAFilterState *pfs );
        HRESULT RenderFile( [in] BSTR strFilename );
        HRESULT AddSourceFilter( [in] BSTR strFilename, [out] IDispatch **ppUnk );
        [propget] HRESULT FilterCollection( [out] IDispatch **ppUnk );
        [propget] HRESULT RegFilterCollection( [out] IDispatch **ppUnk );
        HRESULT StopWhenReady();
    }


    /***************************************************************************
     * IBasicAudio interface
     */
    [
        object,
        uuid(56a868b3-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IBasicAudio : IDispatch
    {
        [propput] HRESULT Volume( [in] LONG lVolume );
        [propget] HRESULT Volume( [out] LONG *plVolume );
        [propput] HRESULT Balance( [in] LONG lBalance );
        [propget] HRESULT Balance( [out] LONG *plBalance );
    }


    /***************************************************************************
     * IVideoWindow interface
     */
    [
        object,
        uuid(56a868b4-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IVideoWindow : IDispatch
    {
        [propput] HRESULT Caption( [in] BSTR strCaption );
        [propget] HRESULT Caption( [out] BSTR *strCaption );
        [propput] HRESULT WindowStyle( [in] LONG WindowStyle );
        [propget] HRESULT WindowStyle( [out] LONG *WindowStyle );
        [propput] HRESULT WindowStyleEx( [in] LONG WindowStyleEx );
        [propget] HRESULT WindowStyleEx( [out] LONG *WindowStyleEx );
        [propput] HRESULT AutoShow( [in] LONG AutoShow );
        [propget] HRESULT AutoShow( [out] LONG *AutoShow );
        [propput] HRESULT WindowState( [in] LONG WindowState );
        [propget] HRESULT WindowState( [out] LONG *WindowState );
        [propput] HRESULT BackgroundPalette( [in] LONG BackgroundPalette );
        [propget] HRESULT BackgroundPalette( [out] LONG *pBackgroundPalette );
        [propput] HRESULT Visible( [in] LONG Visible );
        [propget] HRESULT Visible( [out] LONG *pVisible );
        [propput] HRESULT Left( [in] LONG Left );
        [propget] HRESULT Left( [out] LONG *pLeft );
        [propput] HRESULT Width( [in] LONG Width );
        [propget] HRESULT Width( [out] LONG *pWidth );
        [propput] HRESULT Top( [in] LONG Top );
        [propget] HRESULT Top( [out] LONG *pTop );
        [propput] HRESULT Height( [in] LONG Height );
        [propget] HRESULT Height( [out] LONG *pHeight );
        [propput] HRESULT Owner( [in] OAHWND Owner );
        [propget] HRESULT Owner( [out] OAHWND *Owner );
        [propput] HRESULT MessageDrain( [in] OAHWND Drain );
        [propget] HRESULT MessageDrain( [out] OAHWND *Drain );
        [propget] HRESULT BorderColor( [out] LONG *Color );
        [propput] HRESULT BorderColor( [in] LONG Color );
        [propget] HRESULT FullScreenMode( [out] LONG *FullScreenMode );
        [propput] HRESULT FullScreenMode( [in] LONG FullScreenMode );
        HRESULT SetWindowForeground( [in] LONG Focus );
        HRESULT NotifyOwnerMessage( [in] OAHWND hwnd, [in] LONG uMsg, [in] LONG_PTR wParam, [in] LONG_PTR lParam );
        HRESULT SetWindowPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
        HRESULT GetWindowPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT GetMinIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT GetMaxIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT GetRestorePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT HideCursor( [in] LONG HideCursor );
        HRESULT IsCursorHidden( [out] LONG *CursorHidden );
    }


    /***************************************************************************
     * IBasicVideo interface
     */
    [
        object,
        uuid(56a868b5-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IBasicVideo : IDispatch
    {
        [propget] HRESULT AvgTimePerFrame( [out] REFTIME *pAvgTimePerFrame );
        [propget] HRESULT BitRate( [out] LONG *pBitRate );
        [propget] HRESULT BitErrorRate( [out] LONG *pBitErrorRate );
        [propget] HRESULT VideoWidth( [out] LONG *pVideoWidth );
        [propget] HRESULT VideoHeight( [out] LONG *pVideoHeight );
        [propput] HRESULT SourceLeft( [in] LONG SourceLeft );
        [propget] HRESULT SourceLeft( [out] LONG *pSourceLeft );
        [propput] HRESULT SourceWidth( [in] LONG SourceWidth );
        [propget] HRESULT SourceWidth( [out] LONG *pSourceWidth );
        [propput] HRESULT SourceTop( [in] LONG SourceTop );
        [propget] HRESULT SourceTop( [out] LONG *pSourceTop );
        [propput] HRESULT SourceHeight( [in] LONG SourceHeight );
        [propget] HRESULT SourceHeight( [out] LONG *pSourceHeight );
        [propput] HRESULT DestinationLeft( [in] LONG DestinationLeft );
        [propget] HRESULT DestinationLeft( [out] LONG *pDestinationLeft );
        [propput] HRESULT DestinationWidth( [in] LONG DestinationWidth );
        [propget] HRESULT DestinationWidth( [out] LONG *pDestinationWidth );
        [propput] HRESULT DestinationTop( [in] LONG DestinationTop );
        [propget] HRESULT DestinationTop( [out] LONG *pDestinationTop );
        [propput] HRESULT DestinationHeight( [in] LONG DestinationHeight );
        [propget] HRESULT DestinationHeight( [out] LONG *pDestinationHeight );
        HRESULT SetSourcePosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
        HRESULT GetSourcePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT SetDefaultSourcePosition();
        HRESULT SetDestinationPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
        HRESULT GetDestinationPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT SetDefaultDestinationPosition();
        HRESULT GetVideoSize( [out] LONG *pWidth, [out] LONG *pHeight );
        HRESULT GetVideoPaletteEntries( [in] LONG StartIndex,
                                        [in] LONG Entries,
                                        [out] LONG *pRetrieved,
                                        [out, size_is(Entries), length_is(*pRetrieved)] LONG *pPalette );
        HRESULT GetCurrentImage( [in, out] LONG *pBufferSize,
                                 [out, size_is(*pBufferSize), length_is(*pBufferSize)] LONG *pDIBImage );
        HRESULT IsUsingDefaultSource();
        HRESULT IsUsingDefaultDestination();
    }

    [
        uuid(329bb360-f6ea-11d1-9038-00a0c9697298),
        helpstring("IBasicVideo2"),
        odl
    ]

    interface IBasicVideo2 : IBasicVideo
    {
        HRESULT GetPreferredAspectRatio([out] LONG *plAspectX, [out] LONG *plAspectY);
    }


    /***************************************************************************
     * IMediaEvent interface
     */
    [
        object,
        uuid(56a868b6-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IMediaEvent : IDispatch
    {
        HRESULT GetEventHandle( [out] OAEVENT *hEvent );
        HRESULT GetEvent( [out] LONG *lEventCode, [out] LONG_PTR *lParam1, [out] LONG_PTR *lParam2, [in] LONG msTimeout );
        HRESULT WaitForCompletion( [in] LONG msTimeout, [out] LONG *pEvCode );
        HRESULT CancelDefaultHandling( [in] LONG lEvCode );
        HRESULT RestoreDefaultHandling( [in] LONG lEvCode );
        HRESULT FreeEventParams( [in] LONG lEvCode, [in] LONG_PTR lParam1, [in] LONG_PTR lParam2 );
    }


    /***************************************************************************
     * IMediaEventEx interface
     */
    [
        object,
        uuid(56a868c0-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IMediaEventEx : IMediaEvent
    {
        HRESULT SetNotifyWindow( [in] OAHWND hwnd, [in] LONG lMsg, [in] LONG_PTR lInstanceData );
        HRESULT SetNotifyFlags( [in] LONG lNoNotifyFlags );
        HRESULT GetNotifyFlags( [out] LONG *lplNoNotifyFlags );
    }


    /***************************************************************************
     * IMediaPosition interface
     */
    [
        object,
        uuid(56a868b2-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
    ]
    interface IMediaPosition : IDispatch
    {
        HRESULT get_Duration( [out] REFTIME *plength );
        HRESULT put_CurrentPosition( [in] REFTIME llTime );
        HRESULT get_CurrentPosition( [out] REFTIME *pllTime );
        HRESULT get_StopTime( [out] REFTIME *pllTime );
        HRESULT put_StopTime( [in] REFTIME llTime );
        HRESULT get_PrerollTime( [out] REFTIME *pllTime );
        HRESULT put_PrerollTime( [in] REFTIME llTime );
        HRESULT put_Rate( [in] double dRate );
        HRESULT get_Rate( [out] double *pdRate );
        HRESULT CanSeekForward( [out] LONG *pCanSeekForward );
        HRESULT CanSeekBackward( [out] LONG *pCanSeekBackward );
    }

} /* library QuartzTypeLib */
