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

cpp_quote("#if 0")  /* FIXME: these files are not included on Windows */
import "shldisp.idl";
import "strmif.idl";
cpp_quote("#endif")

interface IMediaControl;
interface IBasicAudio;
interface IBasicVideo;
interface IVideoWindow;
interface IMediaEvent;
interface IMediaEventEx;
interface IMediaPosition;

typedef long OAFilterState;
typedef LONG_PTR OAHWND;
typedef LONG_PTR OAEVENT;

/*****************************************************************************
 * 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();
}


/*****************************************************************************
 * 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 );
}
