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

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;

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