/*
 * Copyright (C) 2008 Google (Lei Zhang)
 *
 * 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";
import "ocidl.idl";
/* import "dxtrans.idl"; */
import "amstream.idl";
import "msxml.idl";

[
    object,
    uuid(0579154A-2B53-4994-B0D0-E773148EFF85),
    local,
    pointer_default(unique)
]
interface ISampleGrabberCB : IUnknown
{
    HRESULT SampleCB(
        double SampleTime,
        IMediaSample * pSample
    );
    HRESULT BufferCB(
        double SampleTime,
        BYTE * pBuffer,
        LONG BufferLen
    );
}

[
    object,
    uuid(6B652FFF-11FE-4fce-92AD-0266B5D7C78F),
    local,
    pointer_default(unique)
]
interface ISampleGrabber: IUnknown
{
    HRESULT SetOneShot(
        BOOL OneShot
    );

    HRESULT SetMediaType(
        const AM_MEDIA_TYPE * pType
    );

    HRESULT GetConnectedMediaType(
        AM_MEDIA_TYPE * pType
    );

    HRESULT SetBufferSamples(
        BOOL BufferThem
    );

    HRESULT GetCurrentBuffer(
        [in,out] LONG * pBufferSize,
        [out] LONG * pBuffer
    );

    HRESULT GetCurrentSample(
        [out] IMediaSample ** ppSample
    );

    HRESULT SetCallback(
        ISampleGrabberCB * pCallback,
        LONG WhichMethodToCallback
    );
}

[
    object,
    uuid(65bd0710-24d2-4FF7-9324-ed2e5d3abafa),
    pointer_default(unique)
]
interface IMediaDet : IUnknown
{
    HRESULT get_Filter(
        [out] IUnknown* *pVal
    );

    HRESULT put_Filter(
        IUnknown* newVal
    );

    HRESULT get_OutputStreams(
        [out] LONG *pVal
    );

    HRESULT get_CurrentStream(
        [out] LONG *pVal
    );

    HRESULT put_CurrentStream(
        LONG newVal
    );

    HRESULT get_StreamType(
        [out] GUID *pVal
    );

    HRESULT get_StreamTypeB(
        [out] BSTR *pVal
    );

    HRESULT get_StreamLength(
        [out] double *pVal
    );

    HRESULT get_Filename(
        [out] BSTR *pVal
    );

    HRESULT put_Filename(
        BSTR newVal
    );

    HRESULT GetBitmapBits(
        double StreamTime,
        LONG * pBufferSize,
        char * pBuffer,
        LONG Width,
        LONG Height
    );

    HRESULT WriteBitmapBits(
        double StreamTime,
        LONG Width,
        LONG Height,
        BSTR Filename
    );

    HRESULT get_StreamMediaType(
        [out] AM_MEDIA_TYPE * pVal
    );

    HRESULT GetSampleGrabber(
        [out] ISampleGrabber ** ppVal
    );

    HRESULT get_FrameRate(
        [out] double *pVal
    );

    HRESULT EnterBitmapGrabMode(
        double SeekTime
    );
}

[
    uuid(65BD0711-24D2-4ff7-9324-ED2E5D3ABAFA),
]
coclass MediaDet
{
    [default] interface IMediaDet;
}

[
    object,
    uuid(288581E0-66CE-11d2-918F-00C0DF10D434),
    odl,
    pointer_default(unique)
]
interface IMediaLocator : IUnknown
{
    HRESULT FindMediaFile(
        BSTR input,
        BSTR filter,
        BSTR * output,
        long flags
    );

    HRESULT AddFoundLocation(
        BSTR dir
    );
}

typedef struct
{
    BSTR name;
    DISPID dispID;
    LONG nValues;
} DEXTER_PARAM;

typedef struct
{
    VARIANT v;
    REFERENCE_TIME rt;
    DWORD dwInterp;
} DEXTER_VALUE;

[
    object,
    uuid(AE9472BD-B0C3-11D2-8D24-00A0C9441E20),
    pointer_default(unique)
]
interface IPropertySetter : IUnknown
{
    HRESULT LoadXML(
        [in] IUnknown * pxml
    );

    HRESULT PrintXML(
        [out] char * xml,
        [in] int size,
        [out] int * printed,
        [in] int indent
    );

    HRESULT CloneProps(
        [out] IPropertySetter ** setter,
        [in] REFERENCE_TIME start,
        [in] REFERENCE_TIME stop
    );

    HRESULT AddProp(
        [in] DEXTER_PARAM param,
        [in] DEXTER_VALUE * value
    );

    HRESULT GetProps(
        [out] LONG * params,
        [out] DEXTER_PARAM ** param,
        [out] DEXTER_VALUE ** value
    );

    HRESULT FreeProps(
        [in] LONG params,
        [in] DEXTER_PARAM * param,
        [in] DEXTER_VALUE * value
    );

    HRESULT ClearProps();

    HRESULT SaveToBlob(
        [out] LONG * size,
        [out] BYTE ** blob
    );

    HRESULT LoadFromBlob(
        [in] LONG size,
        [in] BYTE * blob
    );

    HRESULT SetProps(
        [in] IUnknown * target,
        [in] REFERENCE_TIME now
    );
}

[
    object,
    uuid(E43E73A2-0EFA-11d3-9601-00A0C9441E20),
    odl,
    pointer_default(unique)
]
interface IAMErrorLog : IUnknown
{
    HRESULT LogError(
        long severity,
        BSTR error_str,
        long error_code,
        long hresult,
        [in] VARIANT * extra
    );
}

[
    object,
    uuid(963566DA-BE21-4eaf-88E9-35704F8F52A1),
    odl,
    pointer_default(unique)
]
interface IAMSetErrorLog : IUnknown
{
    [propget] HRESULT ErrorLog(
        [out, retval] IAMErrorLog ** log
    );

    [propput] HRESULT ErrorLog(
        [in] IAMErrorLog * log
    );
}

interface IAMTimeline;
interface IAMTimelineGroup;
interface IAMTimelineObj;
interface IAMTimelineSrc;

typedef enum
{
    TIMELINE_MAJOR_TYPE_COMPOSITE = 1,
    TIMELINE_MAJOR_TYPE_TRACK = 2,
    TIMELINE_MAJOR_TYPE_SOURCE = 4,
    TIMELINE_MAJOR_TYPE_TRANSITION = 8,
    TIMELINE_MAJOR_TYPE_EFFECT = 16,
    TIMELINE_MAJOR_TYPE_GROUP = 128
} TIMELINE_MAJOR_TYPE;

[
    object,
    uuid(78530B74-61F9-11D2-8CAD-00A024580902),
    odl,
    pointer_default(unique)
]
interface IAMTimeline : IUnknown
{
    HRESULT CreateEmptyNode(
        [out] IAMTimelineObj ** obj,
        TIMELINE_MAJOR_TYPE type
    );

    HRESULT AddGroup(
        IAMTimelineObj * group
    );

    HRESULT RemGroupFromList(
        IAMTimelineObj * group
    );

    HRESULT GetGroup(
        [out] IAMTimelineObj ** group,
        long index
    );

    HRESULT GetGroupCount(
        long * count
    );

    HRESULT ClearAllGroups();

    HRESULT GetInsertMode(
        long * mode
    );

    HRESULT SetInsertMode(
        long mode
    );

    HRESULT EnableTransitions(
        BOOL enabled
    );

    HRESULT TransitionsEnabled(
        BOOL * enabled
    );

    HRESULT EnableEffects(
        BOOL enabled
    );

    HRESULT EffectsEnabled(
        BOOL * enabled
    );

    HRESULT SetInterestRange(
        REFERENCE_TIME start,
        REFERENCE_TIME stop
    );

    HRESULT GetDuration(
        REFERENCE_TIME * duration
    );

    HRESULT GetDuration2(
        double * duration
    );

    HRESULT SetDefaultFPS(
        double fps
    );

    HRESULT GetDefaultFPS(
        double * fps
    );

    HRESULT IsDirty(
        BOOL * dirty
    );

    HRESULT GetDirtyRange(
        REFERENCE_TIME * start,
        REFERENCE_TIME * stop
    );

    HRESULT GetCountOfType(
        long group,
        long * value,
        long * value_with_comps,
        TIMELINE_MAJOR_TYPE type
    );

    HRESULT ValidateSourceNames(
        long flags,
        IMediaLocator * override,
        LONG_PTR notify_event
    );

    HRESULT SetDefaultTransition(
        GUID * guid
    );

    HRESULT GetDefaultTransition(
        GUID * guid
    );

    HRESULT SetDefaultEffect(
        GUID * guid
    );

    HRESULT GetDefaultEffect(
        GUID * guid
    );

    HRESULT SetDefaultTransitionB(
        BSTR guidb
    );

    HRESULT GetDefaultTransitionB(
        [out,retval] BSTR * guidb
    );

    HRESULT SetDefaultEffectB(
        BSTR guidb
    );

    HRESULT GetDefaultEffectB(
        [out,retval] BSTR * guidb
    );
}

[
    uuid(78530B75-61F9-11D2-8CAD-00A024580902)
]
coclass AMTimeline
{
    [default] interface IAMTimeline;
    interface IPersistStream;
    interface IAMSetErrorLog;
}

[
    object,
    uuid(9EED4F00-B8A6-11d2-8023-00C0DF10D434),
    odl,
    pointer_default(unique)
]
interface IAMTimelineGroup : IUnknown
{
    HRESULT SetTimeline(
        IAMTimeline * timeline
    );

    HRESULT GetTimeline(
        [out] IAMTimeline ** timeline
    );

    HRESULT GetPriority(
        long * priority
    );

    HRESULT GetMediaType(
        [out] AM_MEDIA_TYPE *
    );

    HRESULT SetMediaType(
        [in] AM_MEDIA_TYPE *
    );

    HRESULT SetOutputFPS(
        double fps
    );

    HRESULT GetOutputFPS(
        double * fps
    );

    HRESULT SetGroupName(
        BSTR name
    );

    HRESULT GetGroupName(
        [out,retval] BSTR * name
    );

    HRESULT SetPreviewMode(
        BOOL preview
    );

    HRESULT GetPreviewMode(
        BOOL * preview
    );

    HRESULT SetMediaTypeForVB(
        [in] long type
    );

    HRESULT GetOutputBuffering(
        [out] int * buffer
    );

    HRESULT SetOutputBuffering(
        [in] int buffer
    );

    HRESULT SetSmartRecompressFormat(
        long * format
    );

    HRESULT GetSmartRecompressFormat(
        long ** format
    );

    HRESULT IsSmartRecompressFormatSet(
        BOOL * set
    );

    HRESULT IsRecompressFormatDirty(
        BOOL * dirty
    );

    HRESULT ClearRecompressFormatDirty();

    HRESULT SetRecompFormatFromSource(
        IAMTimelineSrc * source
    );
}

[
    object,
    local,
    uuid(78530B77-61F9-11D2-8CAD-00A024580902),
    odl,
    pointer_default(unique)
]
interface IAMTimelineObj : IUnknown
{
    HRESULT GetStartStop(
        REFERENCE_TIME * start,
        REFERENCE_TIME * stop
    );

    HRESULT GetStartStop2(
        REFTIME * start, REFTIME * stop
    );

    HRESULT FixTimes(
        REFERENCE_TIME * start, REFERENCE_TIME * stop
    );

    HRESULT FixTimes2(
        REFTIME * start, REFTIME * stop
    );

    HRESULT SetStartStop(
        REFERENCE_TIME start,
        REFERENCE_TIME stop
    );

    HRESULT SetStartStop2(
        REFTIME start,
        REFTIME stop
    );

    HRESULT GetPropertySetter(
        [out,retval] IPropertySetter ** setter
    );

    HRESULT SetPropertySetter(
        IPropertySetter * setter
    );

    HRESULT GetSubObject(
        [out,retval] IUnknown ** obj
    );

    HRESULT SetSubObject(
        IUnknown * obj
    );

    HRESULT SetSubObjectGUID(
        GUID guid
    );

    HRESULT SetSubObjectGUIDB(
        BSTR guidb
    );

    HRESULT GetSubObjectGUID(
        GUID * guid
    );

    HRESULT GetSubObjectGUIDB(
        [out,retval] BSTR * guidb
    );

    HRESULT GetSubObjectLoaded(
        BOOL * loaded
    );

    HRESULT GetTimelineType(
        TIMELINE_MAJOR_TYPE * type
    );

    HRESULT SetTimelineType(
        TIMELINE_MAJOR_TYPE type
    );

    HRESULT GetUserID(
        long * id
    );

    HRESULT SetUserID(
        long id
    );

    HRESULT GetGenID(
        long * id
    );

    HRESULT GetUserName(
        [out,retval] BSTR * name
    );

    HRESULT SetUserName(
        BSTR name
    );

    HRESULT GetUserData(
        BYTE * data,
        long * size
    );

    HRESULT SetUserData(
        BYTE * data,
        long size
    );

    HRESULT GetMuted(
        BOOL * muted
    );

    HRESULT SetMuted(
        BOOL muted
    );

    HRESULT GetLocked(
        BOOL * locked
    );

    HRESULT SetLocked(
        BOOL locked
    );

    HRESULT GetDirtyRange(
        REFERENCE_TIME * start,
        REFERENCE_TIME * stop
    );

    HRESULT GetDirtyRange2(
        REFTIME * start,
        REFTIME * stop
    );

    HRESULT SetDirtyRange(
        REFERENCE_TIME start,
        REFERENCE_TIME stop
    );

    HRESULT SetDirtyRange2(
        REFTIME start,
        REFTIME stop
    );

    HRESULT ClearDirty();

    HRESULT Remove();

    HRESULT RemoveAll();

    HRESULT GetTimelineNoRef(
        IAMTimeline ** timeline
    );

    HRESULT GetGroupIBelongTo(
        [out] IAMTimelineGroup ** group
    );

    HRESULT GetEmbedDepth(
        long * depth
    );
}

[
    object,
    uuid(78530B79-61F9-11D2-8CAD-00A024580902),
    odl,
    pointer_default(unique)
]
interface IAMTimelineSrc : IUnknown
{
    HRESULT GetMediaTimes(
        REFERENCE_TIME * start,
        REFERENCE_TIME * stop
    );

    HRESULT GetMediaTimes2(
        REFTIME * start,
        REFTIME * stop
    );

    HRESULT ModifyStopTime(
        REFERENCE_TIME stop
    );

    HRESULT ModifyStopTime2(
        REFTIME stop
    );

    HRESULT FixMediaTimes(
        REFERENCE_TIME * start,
        REFERENCE_TIME * stop
    );

    HRESULT FixMediaTimes2(
        REFTIME * start,
        REFTIME * stop
    );

    HRESULT SetMediaTimes(
        REFERENCE_TIME Start,
        REFERENCE_TIME Stop
    );

    HRESULT SetMediaTimes2(
        REFTIME Start,
        REFTIME Stop
    );

    HRESULT SetMediaLength(
        REFERENCE_TIME length
    );

    HRESULT SetMediaLength2(
        REFTIME length
    );

    HRESULT GetMediaLength(
        REFERENCE_TIME * length
    );

    HRESULT GetMediaLength2(
        REFTIME * length
    );

    HRESULT GetMediaName(
        [out,retval] BSTR * name
    );

    HRESULT SetMediaName(
        BSTR name
    );

    HRESULT SpliceWithNext(
        IAMTimelineObj * next
    );

    HRESULT GetStreamNumber(
        long * num
    );

    HRESULT SetStreamNumber(
        long num
    );

    HRESULT IsNormalRate(
        BOOL * normal
    );

    HRESULT GetDefaultFPS(
        double * fps
    );

    HRESULT SetDefaultFPS(
        double fps
    );

    HRESULT GetStretchMode(
        int * mode
    );

    HRESULT SetStretchMode(
        int mode
    );
}

enum
{
    E_NOTINTREE = 0x80040400,
    E_RENDER_ENGINE_IS_BROKEN = 0x80040401,
    E_MUST_INIT_RENDERER = 0x80040402,
    E_NOTDETERMINED = 0x80040403,
    E_NO_TIMELINE = 0x80040404,
    S_WARN_OUTPUTRESET = 40404
};