/*
 * 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, retval] LONG *plVolume );
        [propput] HRESULT Balance( [in] LONG lBalance );
        [propget] HRESULT Balance( [out, retval] 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, retval] BSTR *strCaption );
        [propput] HRESULT WindowStyle( [in] LONG WindowStyle );
        [propget] HRESULT WindowStyle( [out, retval] LONG *WindowStyle );
        [propput] HRESULT WindowStyleEx( [in] LONG WindowStyleEx );
        [propget] HRESULT WindowStyleEx( [out, retval] LONG *WindowStyleEx );
        [propput] HRESULT AutoShow( [in] LONG AutoShow );
        [propget] HRESULT AutoShow( [out, retval] LONG *AutoShow );
        [propput] HRESULT WindowState( [in] LONG WindowState );
        [propget] HRESULT WindowState( [out, retval] LONG *WindowState );
        [propput] HRESULT BackgroundPalette( [in] LONG BackgroundPalette );
        [propget] HRESULT BackgroundPalette( [out, retval] LONG *pBackgroundPalette );
        [propput] HRESULT Visible( [in] LONG Visible );
        [propget] HRESULT Visible( [out, retval] LONG *pVisible );
        [propput] HRESULT Left( [in] LONG Left );
        [propget] HRESULT Left( [out, retval] LONG *pLeft );
        [propput] HRESULT Width( [in] LONG Width );
        [propget] HRESULT Width( [out, retval] LONG *pWidth );
        [propput] HRESULT Top( [in] LONG Top );
        [propget] HRESULT Top( [out, retval] LONG *pTop );
        [propput] HRESULT Height( [in] LONG Height );
        [propget] HRESULT Height( [out, retval] LONG *pHeight );
        [propput] HRESULT Owner( [in] OAHWND Owner );
        [propget] HRESULT Owner( [out, retval] OAHWND *Owner );
        [propput] HRESULT MessageDrain( [in] OAHWND Drain );
        [propget] HRESULT MessageDrain( [out, retval] OAHWND *Drain );
        [propget] HRESULT BorderColor( [out, retval] LONG *Color );
        [propput] HRESULT BorderColor( [in] LONG Color );
        [propget] HRESULT FullScreenMode( [out, retval] 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, retval] REFTIME *pAvgTimePerFrame );
        [propget] HRESULT BitRate( [out, retval] LONG *pBitRate );
        [propget] HRESULT BitErrorRate( [out, retval] LONG *pBitErrorRate );
        [propget] HRESULT VideoWidth( [out, retval] LONG *pVideoWidth );
        [propget] HRESULT VideoHeight( [out, retval] LONG *pVideoHeight );
        [propput] HRESULT SourceLeft( [in] LONG SourceLeft );
        [propget] HRESULT SourceLeft( [out, retval] LONG *pSourceLeft );
        [propput] HRESULT SourceWidth( [in] LONG SourceWidth );
        [propget] HRESULT SourceWidth( [out, retval] LONG *pSourceWidth );
        [propput] HRESULT SourceTop( [in] LONG SourceTop );
        [propget] HRESULT SourceTop( [out, retval] LONG *pSourceTop );
        [propput] HRESULT SourceHeight( [in] LONG SourceHeight );
        [propget] HRESULT SourceHeight( [out, retval] LONG *pSourceHeight );
        [propput] HRESULT DestinationLeft( [in] LONG DestinationLeft );
        [propget] HRESULT DestinationLeft( [out, retval] LONG *pDestinationLeft );
        [propput] HRESULT DestinationWidth( [in] LONG DestinationWidth );
        [propget] HRESULT DestinationWidth( [out, retval] LONG *pDestinationWidth );
        [propput] HRESULT DestinationTop( [in] LONG DestinationTop );
        [propget] HRESULT DestinationTop( [out, retval] LONG *pDestinationTop );
        [propput] HRESULT DestinationHeight( [in] LONG DestinationHeight );
        [propget] HRESULT DestinationHeight( [out, retval] 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 */
