diff options
Diffstat (limited to 'dxsdk/Include/DShowIDL/axcore.idl')
-rw-r--r-- | dxsdk/Include/DShowIDL/axcore.idl | 1284 |
1 files changed, 1284 insertions, 0 deletions
diff --git a/dxsdk/Include/DShowIDL/axcore.idl b/dxsdk/Include/DShowIDL/axcore.idl new file mode 100644 index 00000000..4aceea78 --- /dev/null +++ b/dxsdk/Include/DShowIDL/axcore.idl @@ -0,0 +1,1284 @@ +//------------------------------------------------------------------------------ +// File: AXCore.idl +// +// Desc: Core streaming interfaces. Other ActiveMovie-only interfaces +// are in AXExtend.idl. +// +// Copyright (c) 1992-2002, Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------ + + +// include unknwn.idl and objidl.idl first + +#define CHARS_IN_GUID 39 // 128 bits, plus { - } punctuation and terminal null + // chars NOT BYTES in the standard representation + // e.g. {D3588AB0-0781-11ce-B03A-0020AF0BA770} + null + +cpp_quote("#define CHARS_IN_GUID 39") + + +//===================================================================== +//===================================================================== +// media types & formats +//===================================================================== +//===================================================================== + +// There is a high-level media type (audio, compressed video, +// mpeg video, midi). Within each type, there is a subtype (cinepak, pcm) +// and a length+untyped data block defining the format in a +// type-specific manner. EG for video/cinepak, the data block would be +// a bitmapinfo. +// The contents of the format block are defined by the formattype GUID. +// For example, FORMAT_VideoInfo, FORMAT_WaveFormatEx. In the future, this +// may be a pointer to an object supporting property style interfaces +// in which case the GUID may be something like FORMAT_IUnknown. When +// you are passed a media type you should check the format type, if +// it isn't a type you recognize, then don't touch the format block + +typedef struct _AMMediaType { + GUID majortype; + GUID subtype; + BOOL bFixedSizeSamples; + BOOL bTemporalCompression; + ULONG lSampleSize; + GUID formattype; + IUnknown *pUnk; + ULONG cbFormat; + [size_is(cbFormat)] BYTE * pbFormat; +} AM_MEDIA_TYPE; + +//===================================================================== +//===================================================================== +// pin information +//===================================================================== +//===================================================================== + +// is this an input or output pin +typedef enum _PinDirection { + PINDIR_INPUT, + PINDIR_OUTPUT +} PIN_DIRECTION; + +// other types that need defining +#define MAX_PIN_NAME 128 +cpp_quote("#define MAX_PIN_NAME 128") +cpp_quote("#define MAX_FILTER_NAME 128") +#define MAX_FILTER_NAME 128 + + +//===================================================================== +//===================================================================== +// time information +// +// This represents a time (either reference or stream) in 100ns units. +// The class library contains a CRefTime helper class +// that supports simple comparison and arithmetic operations +//===================================================================== +//===================================================================== + +typedef LONGLONG REFERENCE_TIME; +typedef double REFTIME; + +// Win32 HANDLEs have to be cast to these as the MIDL compiler doesn't +// like the HANDLE type or in fact anything remotely associated with +// them. If this ever gets ported to a MAC environment then these will +// have to become an alertable synchronisation object that it supports + +typedef DWORD_PTR HSEMAPHORE; +typedef DWORD_PTR HEVENT; + +//===================================================================== +//===================================================================== +// Allocator properties +// +// Used to describe the actual properties of an allocator, +// and used to request properties from an allocator or from an upstream +// filter that could create an allocator. See IMemAllocator and +// IMemInputPin. +//===================================================================== +//===================================================================== +typedef struct _AllocatorProperties { + long cBuffers; // count of buffers at this allocator + long cbBuffer; // size of each buffer, excluding any prefix + + // alignment of the buffer - buffer start will be aligned on a multiple of + // this amount + long cbAlign; + + // prefix amount. Each buffer is immediately preceeded by cbPrefix bytes. + // note that GetPointer points to the beginning of the buffer proper. + // the prefix is aligned, i.e. (GetPointer() - cbPrefix) is aligned on cbAlign. + long cbPrefix; +} ALLOCATOR_PROPERTIES; + + + + + +// forward declarations (in alphabetical order - we were getting duplicates) +interface IAMovieSetup; +interface IEnumFilters; +interface IEnumMediaTypes; +interface IEnumPins; +interface IBaseFilter; +interface IFilterGraph; +interface IMediaFilter; +interface IMediaSample; +interface IMemAllocator; +interface IMemAllocatorCallbackTemp; +interface IMemAllocatorNotifyCallbackTemp; +interface IMemInputPin; +interface IPin; +interface IReferenceClock; + + + +//===================================================================== +//===================================================================== +// Defines IPin interface +// +// interface representing a single, unidirection connection point on a +// filter. A Pin will connect to exactly one other pin on another filter. +// This interface represents the interface other objects can call on +// this pin. The interface between the filter and the pin is private to +// the implementation of a specific filter. +// +// During the connection process, one pin will be instructed to take +// the lead: the connect interface on this pin will be calling, passing +// the IPin* for the other pin. This connecting pin will call the +// ReceiveConnection member function on the other pin, as well as presumably +// other format-enumeration and queryinterface calls to establish whether +// the connection is possible. +//===================================================================== +//===================================================================== + +[ +object, +uuid(56a86891-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IPin : IUnknown { + + // initiate a connection to another pin. calls ReceiveConnection on the + // other pin. Verifies that the connection is possible and may reject + // it. + // The mediatype parameter is optional. If it is not null, the pin must + // connect using that media type if possible. The subtype and/or format + // type can be GUID_NULL, meaning that the pin can fill them in as desired. + // This allows an application to partially specify the media type to be + // used for the connection, insisting on eg YUV 422 but leaving details + // (such as the image size) to be negotiated between the pins. + HRESULT Connect( + [in] IPin * pReceivePin, // connect yourself to this pin + [in] const AM_MEDIA_TYPE * pmt // (optional) connect using this type + ); + + // called by a connecting pin to make a connection + HRESULT ReceiveConnection( + [in] IPin * pConnector, + [in] const AM_MEDIA_TYPE *pmt // this is the media type we will exchange + ); + + // break a connection - no params since there is only one connection + // possible on this pin + HRESULT Disconnect(void); + + // Find the pin this pin is connected to (if any) + // The pointer returned is AddRef()d + // Fails if the pin is not connected + HRESULT ConnectedTo( + [out] IPin **pPin + ); + + // Return the media type of a connection if the pin is connected + HRESULT ConnectionMediaType( + [out] AM_MEDIA_TYPE *pmt + ); + + // get information about the pin itself + typedef struct _PinInfo { + IBaseFilter *pFilter; // the filter this pin is on + PIN_DIRECTION dir; // am I an input or output pin? + WCHAR achName[MAX_PIN_NAME]; // the name of this pin within this filter + } PIN_INFO; + + HRESULT QueryPinInfo( + [out] PIN_INFO * pInfo + ); + + // We often want to know the direction. Rather than use the + // relatively expensive QueryPinInfo, use this + HRESULT QueryDirection( + [out] PIN_DIRECTION *pPinDir + ); + + // Get an identifier for the pin (allows connections to be saved). + // The storage will be allocated by the filter using CoTaskMemAlloc + // The caller should free it using CoTaskMemFree + HRESULT QueryId( + [out] LPWSTR * Id + ); + + // will the pin accept the format type, S_OK yes, S_FALSE no + HRESULT QueryAccept( + [in] const AM_MEDIA_TYPE *pmt + ); + + // return an enumerator for this pin's preferred media types + HRESULT EnumMediaTypes( + [out] IEnumMediaTypes **ppEnum + ); + + // return an array of IPin* - the pins that this pin internally connects to + // All pins put in the array must be AddReffed (but no others) + // Errors: "Can't say" - FAIL; not enough slots - return S_FALSE + // Default: return E_NOTIMPL + // The filter graph will interpret E_NOTIMPL as any input pin connects to + // all visible output pins and vise versa. + // apPin can be NULL if nPin==0 (not otherwise). + HRESULT QueryInternalConnections( + [out] IPin* *apPin, // array of IPin* + [in, out] ULONG *nPin // on input, the number of slots + // on output the number of pins + ); + + // notify the pin that no more data is expected until a new run + // command is issued. End of stream should be queued and delivered after + // all queued data is delivered. Pass through if there is no queued data. + // Flush should flush any queued EOS. + // returns S_OK unless there is some error. + // input pins only: output pins will normally return E_UNEXPECTED. + HRESULT EndOfStream(void); + + // Flush + + // Enter flush state: do the following steps (in order) + // -- prevent any more Receives succeeding (set a flushing flag) + // -- discard any queued data + // -- free anyone blocked on Receive in your filter + // -- pass BeginFlush to any downstream pins + HRESULT BeginFlush(void); + + // End flush state: do the following steps in order + // -- ensure no more data will be pushed by your filter + // (sync with thread if you have one, stop it pushing and + // discard any queued data) + // -- re-enable Receive (clear internal flushing flag) + // -- pass EndFlush to any downstream pins + HRESULT EndFlush(void); + + // informational: all data arriving after this call is part of a segment + // from StartTime to StopTime, played at rate. This allows filters that + // process buffers containing more than one sample to clip the rendering + // to within the start and stop times. + // + // A source pin will call a destination pin on this method after completing + // delivery of any previous data, and before any Receive calls for the + // new data + HRESULT NewSegment( + [in] REFERENCE_TIME tStart, + [in] REFERENCE_TIME tStop, + [in] double dRate); +} + +typedef IPin *PPIN; + + +//===================================================================== +//===================================================================== +// Defines IEnumPins interface +// +// interface returned from IBaseFilter::EnumPins(). based on IEnumXXXX +//===================================================================== +//===================================================================== + +[ +object, +uuid(56a86892-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IEnumPins : IUnknown { + + HRESULT Next( + [in] ULONG cPins, // place this many pins... + [out, size_is(cPins)] IPin ** ppPins, // ...in this array + [out] ULONG * pcFetched // actual count passed + ); + + HRESULT Skip( + [in] ULONG cPins); + + HRESULT Reset(void); + + HRESULT Clone( + [out] IEnumPins **ppEnum + ); +} + +typedef IEnumPins *PENUMPINS; + + +//===================================================================== +//===================================================================== +// Defines IEnumMediaTypes interface +// +// Enumerates the preferred formats for a pin +//===================================================================== +//===================================================================== + +[ +object, +uuid(89c31040-846b-11ce-97d3-00aa0055595a), +pointer_default(unique) +] +interface IEnumMediaTypes : IUnknown { + + // to call this member function pass in the address of a pointer to a + // media type. The interface will allocate the necessary AM_MEDIA_TYPE + // structures and initialise them with the variable format block + + HRESULT Next( + [in] ULONG cMediaTypes, // place this many types... + [out, size_is(cMediaTypes)] + AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array + [out] ULONG * pcFetched // actual count passed + ); + + HRESULT Skip( + [in] ULONG cMediaTypes); + + HRESULT Reset(void); + + HRESULT Clone( + [out] IEnumMediaTypes **ppEnum + ); +} + +typedef IEnumMediaTypes *PENUMMEDIATYPES; + + + +//======================================================================== +//======================================================================== +// Defines IFilterGraph interface +// +// abstraction representing a graph of filters +// This allows filters to be joined into a graph and operated as a unit. +//======================================================================== +//======================================================================== + +[ +object, +uuid(56a8689f-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IFilterGraph : IUnknown { + + //========================================================================== + // Low level filter functions + //========================================================================== + + // Add a filter to the graph and name it with *pName. + // If the name is not unique, The request will fail. + // The Filter graph will call the JoinFilterGraph + // member function of the filter to inform it. + // This must be called before attempting Connect, ConnectDirect or Render + // for pins of the filter. + + HRESULT AddFilter + ( [in] IBaseFilter * pFilter, + [in, string] LPCWSTR pName + ); + + + // Remove a filter from the graph. The filter graph implementation + // will inform the filter that it is being removed. + + HRESULT RemoveFilter + ( [in] IBaseFilter * pFilter + ); + + + // Set *ppEnum to be an enumerator for all filters in the graph. + + HRESULT EnumFilters + ( [out] IEnumFilters **ppEnum + ); + + + // Set *ppFilter to be the filter which was added with the name *pName + // Will fail and set *ppFilter to NULL if the name is not in this graph. + + HRESULT FindFilterByName + ( [in, string] LPCWSTR pName, + [out] IBaseFilter ** ppFilter + ); + + //========================================================================== + // Low level connection functions + //========================================================================== + + // Connect these two pins directly (i.e. without intervening filters) + // the media type is optional, and may be partially specified (that is + // the subtype and/or format type may be GUID_NULL). See IPin::Connect + // for details of the media type parameter. + HRESULT ConnectDirect + ( [in] IPin * ppinOut, // the output pin + [in] IPin * ppinIn, // the input pin + [in, unique] const AM_MEDIA_TYPE* pmt // optional mediatype + ); + + // Break the connection that this pin has and reconnect it to the + // same other pin. + + HRESULT Reconnect + ( [in] IPin * ppin // the pin to disconnect and reconnect + ); + + + + // Disconnect this pin, if connected. Successful no-op if not connected. + + HRESULT Disconnect + ( [in] IPin * ppin + ); + + //========================================================================== + // intelligent connectivity - now in IGraphBuilder, axextend.idl + //========================================================================== + + //========================================================================== + // Whole graph functions + //========================================================================== + + // Once a graph is built, it can behave as a (composite) filter. + // To control this filter, QueryInterface for IMediaFilter. + + // The filtergraph will by default ensure that the graph has a sync source + // when it is made to Run. SetSyncSource(NULL) will prevent that and allow + // all the filters to run unsynchronised until further notice. + // SetDefaultSyncSource will set the default sync source (the same as would + // have been set by default on the first call to Run). + HRESULT SetDefaultSyncSource(void); + +} + +typedef IFilterGraph *PFILTERGRAPH; + + + +//========================================================================== +//========================================================================== +// Defines IEnumFilters interface +// +// enumerator interface returned from IFilterGraph::EnumFilters(). +// based on IEnum pseudo-template +//========================================================================== +//========================================================================== + +[ +object, +uuid(56a86893-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IEnumFilters : IUnknown { + + HRESULT Next + ( [in] ULONG cFilters, // place this many filters... + [out] IBaseFilter ** ppFilter, // ...in this array of IBaseFilter* + [out] ULONG * pcFetched // actual count passed returned here + ); + + + HRESULT Skip + ( [in] ULONG cFilters + ); + + + HRESULT Reset(void); + + + HRESULT Clone + ( [out] IEnumFilters **ppEnum + ); +} + +typedef IEnumFilters *PENUMFILTERS; + + +//===================================================================== +//===================================================================== +// Defines IMediaFilter interface +// +// multimedia components that provide time-based data will expose this. +// this interface abstracts an object that processes time-based data streams +// and represents a multimedia device (possibly implemented in software). +// it controls the active/running state of the object and its synchronization +// to other objects in the system. +// +// derived from IPersist so that all filter-type objects in a graph +// can have their class id serialised. +//===================================================================== +//===================================================================== + +[ +object, +uuid(56a86899-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IMediaFilter : IPersist { + + // tell the filter to transition to the new state. The state transition + // may not be instantaneous (external mechanical activity may be involved, + // for example). The state functions may return before the state + // transition has completed + + // these functions will return S_OK if the transition is complete, S_FALSE if + // the transition is not complete but no error has occurred, or some error value + // if the transition failed. + HRESULT Stop(void); + HRESULT Pause(void); + + // in order to synchronise independent streams, you must pass a time + // value with the Run command. This is the difference between stream + // time and reference time. That is, it is the amount to be added to + // the IMediaSample timestamp to get the time at which that sample + // should be rendered according to the reference clock. + // If we are starting at the beginning of the stream, it will thus be + // simply the time at which the first sample should appear. If we are + // restarting from Paused mode in midstream, then it will be the total + // time we have been paused added to the initial start time. + + // the filtergraph will provide this information to its filters. If you + // are an app calling the filtergraph, it's ok to pass a start time of + // 0, in which case the filter graph will calculate a soon-as-possible + // time. FilterGraphs will accept 0 meaning ASAP; most filters will not. + + HRESULT Run(REFERENCE_TIME tStart); + + + // possible states that the filter could be in + typedef enum _FilterState { + State_Stopped, // not in use + State_Paused, // holding resources, ready to go + State_Running // actively processing media stream + } FILTER_STATE; + + // find out what state the filter is in. + // If timeout is 0, will return immediately - if a state transition is + // not complete, it will return the state being transitioned into, and + // the return code will be VFW_S_STATE_INTERMEDIATE. if no state + // transition is in progress the state will be returned and the return + // code will be S_OK. + // + // If timeout is non-zero, GetState will not return until the state + // transition is complete, or the timeout expires. + // The timeout is in milliseconds. + // You can also pass in INFINITE as a special value for the timeout, in + // which case it will block indefinitely waiting for the state transition + // to complete. If the timeout expires, the state returned is the + // state we are trying to reach, and the return code will be + // VFW_S_STATE_INTERMEDIATE. If no state transition is in progress + // the routine returns immediately with return code S_OK. + + // + // return State is State_Running, State_Paused or State_Stopped. + // return code is S_OK, or VFW_S_STATE_INTERMEDIATE if state + // transition is not complete or an error value if the method failed. + HRESULT GetState( + [in] DWORD dwMilliSecsTimeout, + [out] FILTER_STATE *State); + + + // tell the filter the reference clock to which it should synchronize + // activity. This is most important to rendering filters and may not + // be of any interest to other filters. + HRESULT SetSyncSource( + [in] IReferenceClock * pClock); + + // get the reference clock currently in use (it may be NULL) + HRESULT GetSyncSource( + [out] IReferenceClock ** pClock); +} + +typedef IMediaFilter *PMEDIAFILTER; + + +//===================================================================== +//===================================================================== +// Defines IBaseFilter interface +// +// all multimedia components will expose this interface +// this interface abstracts an object that has typed input and output +// connections and can be dynamically aggregated. +// +// IMediaFilter supports synchronisation and activity state: IBaseFilter +// is derived from that since all filters need to support IMediaFilter, +// whereas a few objects (plug-in control distributors for example) will +// support IMediaFilter but not IBaseFilter. +// +// IMediaFilter is itself derived from IPersist so that every filter +//supports GetClassID() +//===================================================================== +//===================================================================== + +[ +object, +uuid(56a86895-0ad4-11ce-b03a-0020af0ba770), +pointer_default(unique) +] +interface IBaseFilter : IMediaFilter { + + // enumerate all the pins available on this filter + // allows enumeration of all pins only. + // + HRESULT EnumPins( + [out] IEnumPins ** ppEnum // enum interface returned here + ); + + // Convert the external identifier of a pin to an IPin * + // This pin id is quite different from the pin Name in CreatePin. + // In CreatePin the Name is invented by the caller. In FindPin the Id + // must have come from a previous call to IPin::QueryId. Whether or not + // this operation would cause a pin to be created depends on the filter + // design, but if called twice with the same id it should certainly + // return the same pin both times. + HRESULT FindPin( + [in, string] LPCWSTR Id, + [out] IPin ** ppPin + ); + + // find out information about this filter + typedef struct _FilterInfo { + WCHAR achName[MAX_FILTER_NAME]; // maybe null if not part of graph + IFilterGraph * pGraph; // null if not part of graph + } FILTER_INFO; + + HRESULT QueryFilterInfo( + [out] FILTER_INFO * pInfo + ); + + // notify a filter that it has joined a filter graph. It is permitted to + // refuse. The filter should addref and store this interface for later use + // since it may need to notify events to this interface. A null pointer indicates + // that the filter is no longer part of a graph. + HRESULT JoinFilterGraph( + [in] IFilterGraph * pGraph, + [in, string] LPCWSTR pName + ); + + // return a Vendor information string. Optional - may return E_NOTIMPL. + // memory returned should be freed using CoTaskMemFree + HRESULT QueryVendorInfo( + [out, string] LPWSTR* pVendorInfo + ); +} + +typedef IBaseFilter *PFILTER; + + +//===================================================================== +//===================================================================== +// sync and state management +//===================================================================== +//===================================================================== + + +//===================================================================== +//===================================================================== +// Defines IReferenceClock interface +//===================================================================== +//===================================================================== + +[ + object, + uuid(56a86897-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IReferenceClock : IUnknown { + + // get the time now + HRESULT GetTime( + [out] REFERENCE_TIME *pTime + ); + + // ask for an async notification that a time has elapsed + HRESULT AdviseTime( + [in] REFERENCE_TIME baseTime, // base reference time + [in] REFERENCE_TIME streamTime, // stream offset time + [in] HEVENT hEvent, // advise via this event + [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes + ); + + // ask for an async periodic notification that a time has elapsed + HRESULT AdvisePeriodic( + [in] REFERENCE_TIME startTime, // starting at this time + [in] REFERENCE_TIME periodTime, // time between notifications + [in] HSEMAPHORE hSemaphore, // advise via a semaphore + [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes + ); + + // cancel a request for notification + HRESULT Unadvise( + [in] DWORD_PTR dwAdviseCookie); +} + +typedef IReferenceClock *PREFERENCECLOCK; + +//===================================================================== +//===================================================================== +// Defines IReferenceClock2 interface +//===================================================================== +//===================================================================== + +[ + object, + uuid(36b73885-c2c8-11cf-8b46-00805f6cef60), + pointer_default(unique) +] +interface IReferenceClock2 : IReferenceClock { +} + +typedef IReferenceClock2 *PREFERENCECLOCK2; + + +//===================================================================== +//===================================================================== +// Data transport interfaces +//===================================================================== +//===================================================================== + + +//===================================================================== +//===================================================================== +// Defines IMediaSample interface +//===================================================================== +//===================================================================== + +[ + local, + object, + uuid(56a8689a-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IMediaSample : IUnknown { + + // get me a read/write pointer to this buffer's memory. I will actually + // want to use sizeUsed bytes. + HRESULT GetPointer([out] BYTE ** ppBuffer); + + // return the size in bytes of the buffer data area + long GetSize(void); + + // get the stream time at which this sample should start and finish. + HRESULT GetTime( + [out] REFERENCE_TIME * pTimeStart, // put time here + [out] REFERENCE_TIME * pTimeEnd + ); + + // Set the stream time at which this sample should start and finish. + // pTimeStart==pTimeEnd==NULL will invalidate the time stamps in + // this sample + HRESULT SetTime( + [in] REFERENCE_TIME * pTimeStart, // put time here + [in] REFERENCE_TIME * pTimeEnd + ); + + // sync-point property. If true, then the beginning of this + // sample is a sync-point. (note that if AM_MEDIA_TYPE.bTemporalCompression + // is false then all samples are sync points). A filter can start + // a stream at any sync point. S_FALSE if not sync-point, S_OK if true. + + HRESULT IsSyncPoint(void); + HRESULT SetSyncPoint(BOOL bIsSyncPoint); + + // preroll property. If true, this sample is for preroll only and + // shouldn't be displayed. + HRESULT IsPreroll(void); + HRESULT SetPreroll(BOOL bIsPreroll); + + long GetActualDataLength(void); + HRESULT SetActualDataLength(long); + + // these allow for limited format changes in band - if no format change + // has been made when you receive a sample GetMediaType will return S_FALSE + + HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType); + HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType); + + // returns S_OK if there is a discontinuity in the data (this frame is + // not a continuation of the previous stream of data + // - there has been a seek or some dropped samples). + HRESULT IsDiscontinuity(void); + // set the discontinuity property - TRUE if this sample is not a + // continuation, but a new sample after a seek or a dropped sample. + HRESULT SetDiscontinuity(BOOL bDiscontinuity); + + // get the media times for this sample + HRESULT GetMediaTime( + [out] LONGLONG * pTimeStart, + [out] LONGLONG * pTimeEnd + ); + + // Set the media times for this sample + // pTimeStart==pTimeEnd==NULL will invalidate the media time stamps in + // this sample + HRESULT SetMediaTime( + [in] LONGLONG * pTimeStart, + [in] LONGLONG * pTimeEnd + ); +} + +typedef IMediaSample *PMEDIASAMPLE; + +// Values for dwFlags for AM_SAMPLE_PROPERTIES +enum tagAM_SAMPLE_PROPERTY_FLAGS + { AM_SAMPLE_SPLICEPOINT = 0x01, /* Is this a splice point + IE can it be decoded + without reference to + previous data */ + AM_SAMPLE_PREROLL = 0x02, /* Is this a preroll sample */ + AM_SAMPLE_DATADISCONTINUITY = 0x04, /* Set if start of new segment */ + AM_SAMPLE_TYPECHANGED = 0x08, /* Has the type changed */ + AM_SAMPLE_TIMEVALID = 0x10, /* Set if time is valid */ + AM_SAMPLE_TIMEDISCONTINUITY = 0x40, /* time gap in data starts after + this sample - pbBuffer can + be NULL + */ + AM_SAMPLE_FLUSH_ON_PAUSE = 0x80, /* For live data - discard + in paused state + */ + AM_SAMPLE_STOPVALID = 0x100, /* Stop time is valid */ + AM_SAMPLE_ENDOFSTREAM = 0x200, /* End of stream after + this data + This is reserved for + kernel streaming and is + not currently used by + ActiveMovie + */ + AM_STREAM_MEDIA = 0, /* Normal data stream id */ + AM_STREAM_CONTROL = 1 /* Control stream id */ + /* > 7FFFFFFF is application + defined stream + */ + }; + +// Media sample generic properties structure +typedef struct tagAM_SAMPLE2_PROPERTIES { + DWORD cbData; // Length of generic data for extensiblity + // Number of bytes INCLUDING this field + DWORD dwTypeSpecificFlags; // Type specific flag data + DWORD dwSampleFlags; // Flags bits defined by AM_SAMPLE_xxx flags + // All undefined bits RESERVED (set to 0, + // leave on copy) + LONG lActual; // Length of data in buffer + REFERENCE_TIME tStart; // Start time if valid + REFERENCE_TIME tStop; // Stop time if valid + DWORD dwStreamId; // Stream 0 is normal media transport + // Stream 1 is control + AM_MEDIA_TYPE *pMediaType; // Copy of media type - INVALID after Release() + BYTE *pbBuffer; // Pointer to buffer - INVALID after Release() + LONG cbBuffer; // Length of buffer +} AM_SAMPLE2_PROPERTIES; + +//===================================================================== +//===================================================================== +// Defines IMediaSample2 interface +//===================================================================== +//===================================================================== + +[ + local, + object, + uuid(36b73884-c2c8-11cf-8b46-00805f6cef60), + pointer_default(unique) +] +interface IMediaSample2 : IMediaSample { + + // Get sample properties + // + // cbProperties - length of generic data to retrieve + // pbProperties - pointer to generic data buffer - can + // be NULL if cbProperties is NULL + // data conforms to AM_SAMPLE_PROPERTIES + // + HRESULT GetProperties( + [in] DWORD cbProperties, + [out, size_is(cbProperties)] BYTE * pbProperties + ); + // Set sample properties + // + // cbProperties - length of generic data to set + // pbProperties - pointer to generic data buffer - can + // be NULL if cbProperties is NULL + // data conforms to AM_SAMPLE_PROPERTIES + // + // + HRESULT SetProperties( + [in] DWORD cbProperties, + [in, size_is(cbProperties)] const BYTE * pbProperties + ); + + + // // Get the clock associated with the sample + // HRESULT GetClock( + // [out] IReferenceClock2 **ppClock + // ); + + // // Get a pointer to the object containing the data + // // + // // riid - IID of interface required on object + // // ppvobject - Pointer to object containing the data + // // + // // Returns + // // S_OK - Got the object + // // E_NOINTERFACE - object does not support this interface + // // if IUnknown is not supported + // // there is no backing object + // // E_NOTIMPL - samples don't have backing objects + // // + // // + // HRESULT GetBackingObject( + // [in] REFIID riid, + // [out] void **ppvObject + // ); +} + +typedef IMediaSample2 *PMEDIASAMPLE2; + + +// flags for dwFlags in IMemAllocator::GetBuffer +// AM_GBF_PREVFRAMESKIPPED is only significant when asking for a buffer from the +// video renderer. It should be TRUE if and only if the previous frame +// was skipped. It affects quality management. +// AM_GBF_NOTASYNCPOINT indicates to the downstream filter (most likely the +// video renderer) that you are not going to fill this buffer with a sync point +// (keyframe) so now would be a bad time to return a buffer with a dynamic +// format change, because you will be unable to switch to the new format without +// waiting for the next sync point, causing some frames to be dropped. +#define AM_GBF_PREVFRAMESKIPPED 1 +#define AM_GBF_NOTASYNCPOINT 2 +cpp_quote("#define AM_GBF_PREVFRAMESKIPPED 1") +cpp_quote("#define AM_GBF_NOTASYNCPOINT 2") + +// This may not be supported by allocators +cpp_quote("#define AM_GBF_NOWAIT 4") + +// This flag is supported by the VMR's surface allocator +// When set the DDraw surface used for the media sample +// is returned is an un-locked state. Calls the GetPointer on +// the returned media sample will fail and return a NULL pointer +// +cpp_quote("#define AM_GBF_NODDSURFACELOCK 8") + +//===================================================================== +//===================================================================== +// Defines IMemAllocator interface +// +// an allocator of IMediaSample blocks to be used for data transfer between +// pins. Can be provided by input, output or a third party. Release +// the IMediaSample object obtained back to the pool by calling +// IMediaSample::Release. +//===================================================================== +//===================================================================== + +[ + object, + uuid(56a8689c-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IMemAllocator : IUnknown { + + // negotiate buffer sizes, buffer count and alignment. pRequest is filled + // in by the caller with the requested values. pActual will be returned + // by the allocator with the closest that the allocator can come to this. + // Cannot be called unless the allocator is decommitted. + // Calls to GetBuffer need not succeed until Commit is called. + HRESULT SetProperties( + [in] ALLOCATOR_PROPERTIES* pRequest, + [out] ALLOCATOR_PROPERTIES* pActual); + + // return the properties actually being used on this allocator + HRESULT GetProperties( + [out] ALLOCATOR_PROPERTIES* pProps); + + + // commit the memory for the agreed buffers + HRESULT Commit(void); + + // release the memory for the agreed buffers. Any threads waiting in + // GetBuffer will return with an error. GetBuffer calls will always fail + // if called before Commit or after Decommit. + HRESULT Decommit(void); + + // get container for a sample. Blocking, synchronous call to get the + // next free buffer (as represented by an IMediaSample interface). + // on return, the time etc properties will be invalid, but the buffer + // pointer and size will be correct. + // Will only succeed if memory is committed. If GetBuffer is blocked + // waiting for a buffer and Decommit is called on another thread, + // GetBuffer will return with an error. + HRESULT GetBuffer( + [out] IMediaSample **ppBuffer, + [in] REFERENCE_TIME * pStartTime, + [in] REFERENCE_TIME * pEndTime, + [in] DWORD dwFlags + ); + + // put a buffer back on the allocators free list. + // this is typically called by the Release() method of the media + // sample when the reference count goes to 0 + // + HRESULT ReleaseBuffer( + [in] IMediaSample *pBuffer + ); +} + +typedef IMemAllocator *PMEMALLOCATOR; + +//===================================================================== +//===================================================================== +// Defines IMemAllocatorCallbackTemp interface +// +// If the allocator supports IMemAllocator2 then callbacks are +// available +// +//===================================================================== +//===================================================================== +[ + object, + uuid(379a0cf0-c1de-11d2-abf5-00a0c905f375), + pointer_default(unique) +] +interface IMemAllocatorCallbackTemp : IMemAllocator { + + // Set notification interface. pNotify can be NULL + HRESULT SetNotify( + [in] IMemAllocatorNotifyCallbackTemp *pNotify); + + // Get current stats + HRESULT GetFreeCount( + [out] LONG *plBuffersFree); +} + +//===================================================================== +//===================================================================== +// Defines IMemAllocatorNotify interface +// +//===================================================================== +//===================================================================== +[ + object, + uuid(92980b30-c1de-11d2-abf5-00a0c905f375), + pointer_default(unique) +] +interface IMemAllocatorNotifyCallbackTemp : IUnknown { + + // Called whenever ReleaseBuffer is called in the allocator + // Note the caller may have acquired locks and this call may + // occur in any context so generally the implementor of this + // call will just set an event or post a message for another + // thread to take action. + HRESULT NotifyRelease(); +} + +//===================================================================== +//===================================================================== +// Defines IMemInputPin interface +// +// basic shared memory transport interface. +//===================================================================== +//===================================================================== + +[ + object, + uuid(56a8689d-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IMemInputPin : IUnknown { + + // return the allocator interface that this input pin + // would like the output pin to use + HRESULT GetAllocator( + [out] IMemAllocator ** ppAllocator); + + // tell the input pin which allocator the output pin is actually + // going to use. + // If the readonly flag is set, then all samples from this allocator are + // to be treated as read-only, and should be copied before being modified. + HRESULT NotifyAllocator( + [in] IMemAllocator * pAllocator, + [in] BOOL bReadOnly + ); + + // this method is optional (can return E_NOTIMPL). Output pins are not obliged to call + // this method, nor are they obliged to fulfil the request. Input pins making such a + // request should check the allocator in NotifyAllocator to see if it meets their needs. If + // not, the input pin is responsible for any necessary data copy. + // Zero values will be treated as don't care: so a pin can return an alignment value + // and leave the other values 0. + HRESULT GetAllocatorRequirements( [out] ALLOCATOR_PROPERTIES*pProps); + + // here's the next block of data from the stream. AddRef it if + // you need to hold it beyond the end of the Receive call. + // call pSample->Release when done with it. + // + // This is a blocking synchronous call. Usually no blocking + // will occur but if a filter cannot process the sample immediately + // it may use the caller's thread to wait until it can. + HRESULT Receive( + [in] IMediaSample * pSample); + + // Same as Receive but with multiple samples. Useful for + // fragmented streams + HRESULT ReceiveMultiple( + [in, size_is(nSamples)] IMediaSample **pSamples, + [in] long nSamples, + [out] long *nSamplesProcessed); + + // See if Receive might block + // Returns S_OK if it can block, S_FALSE if it can't or some + // failure code (assume it can in this case) + HRESULT ReceiveCanBlock(); +} + +typedef IMemInputPin *PMEMINPUTPIN; + + +//===================================================================== +//===================================================================== +// Defines IAMovieSetup interface +// +// exported by filter to allow it to be self-registering +//===================================================================== +//===================================================================== + +[ +object, +uuid(a3d8cec0-7e5a-11cf-bbc5-00805f6cef20), +pointer_default(unique) +] +interface IAMovieSetup : IUnknown { + + // methods to register and unregister filter, etc. + + HRESULT Register( ); + HRESULT Unregister( ); +} + +typedef IAMovieSetup *PAMOVIESETUP; + + +//===================================================================== +//===================================================================== +// Defines IMediaSeeking interface +// +// Controls seeking (time, bytes, frames, fields and samples) +//===================================================================== +//===================================================================== + +typedef enum AM_SEEKING_SeekingFlags +{ + AM_SEEKING_NoPositioning = 0x00, // No change + AM_SEEKING_AbsolutePositioning = 0x01, // Position is supplied and is absolute + AM_SEEKING_RelativePositioning = 0x02, // Position is supplied and is relative + AM_SEEKING_IncrementalPositioning = 0x03, // (Stop) position relative to current + // Useful for seeking when paused (use +1) + AM_SEEKING_PositioningBitsMask = 0x03, // Useful mask + AM_SEEKING_SeekToKeyFrame = 0x04, // Just seek to key frame (performance gain) + AM_SEEKING_ReturnTime = 0x08, // Plug the media time equivalents back into the supplied LONGLONGs + + AM_SEEKING_Segment = 0x10, // At end just do EC_ENDOFSEGMENT, + // don't do EndOfStream + AM_SEEKING_NoFlush = 0x20 // Don't flush +} AM_SEEKING_SEEKING_FLAGS; + +typedef enum AM_SEEKING_SeekingCapabilities +{ + AM_SEEKING_CanSeekAbsolute = 0x001, + AM_SEEKING_CanSeekForwards = 0x002, + AM_SEEKING_CanSeekBackwards = 0x004, + AM_SEEKING_CanGetCurrentPos = 0x008, + AM_SEEKING_CanGetStopPos = 0x010, + AM_SEEKING_CanGetDuration = 0x020, + AM_SEEKING_CanPlayBackwards = 0x040, + AM_SEEKING_CanDoSegments = 0x080, + AM_SEEKING_Source = 0x100 // Doesn't pass thru used to + // count segment ends +} AM_SEEKING_SEEKING_CAPABILITIES; + +[ + object, + uuid(36b73880-c2c8-11cf-8b46-00805f6cef60), + pointer_default(unique) +] +interface IMediaSeeking : IUnknown { + + // Returns the capability flags + HRESULT GetCapabilities( [out] DWORD * pCapabilities ); + + // And's the capabilities flag with the capabilities requested. + // Returns S_OK if all are present, S_FALSE if some are present, E_FAIL if none. + // *pCababilities is always updated with the result of the 'and'ing and can be + // checked in the case of an S_FALSE return code. + HRESULT CheckCapabilities( [in,out] DWORD * pCapabilities ); + + // returns S_OK if mode is supported, S_FALSE otherwise + HRESULT IsFormatSupported([in] const GUID * pFormat); + HRESULT QueryPreferredFormat([out] GUID * pFormat); + + HRESULT GetTimeFormat([out] GUID *pFormat); + // Returns S_OK if *pFormat is the current time format, otherwise S_FALSE + // This may be used instead of the above and will save the copying of the GUID + HRESULT IsUsingTimeFormat([in] const GUID * pFormat); + + // (may return VFE_E_WRONG_STATE if graph is stopped) + HRESULT SetTimeFormat([in] const GUID * pFormat); + + // return current properties + HRESULT GetDuration([out] LONGLONG *pDuration); + HRESULT GetStopPosition([out] LONGLONG *pStop); + HRESULT GetCurrentPosition([out] LONGLONG *pCurrent); + + // Convert time from one format to another. + // We must be able to convert between all of the formats that we say we support. + // (However, we can use intermediate formats (e.g. MEDIA_TIME).) + // If a pointer to a format is null, it implies the currently selected format. + HRESULT ConvertTimeFormat([out] LONGLONG * pTarget, [in] const GUID * pTargetFormat, + [in] LONGLONG Source, [in] const GUID * pSourceFormat ); + + + // Set current and end positions in one operation + // Either pointer may be null, implying no change + HRESULT SetPositions( [in,out] LONGLONG * pCurrent, [in] DWORD dwCurrentFlags + , [in,out] LONGLONG * pStop, [in] DWORD dwStopFlags ); + + // Get CurrentPosition & StopTime + // Either pointer may be null, implying not interested + HRESULT GetPositions( [out] LONGLONG * pCurrent, + [out] LONGLONG * pStop ); + + // Get earliest / latest times to which we can currently seek "efficiently". + // This method is intended to help with graphs where the source filter has + // a very high latency. Seeking within the returned limits should just + // result in a re-pushing of already cached data. Seeking beyond these + // limits may result in extended delays while the data is fetched (e.g. + // across a slow network). + // (NULL pointer is OK, means caller isn't interested.) + HRESULT GetAvailable( [out] LONGLONG * pEarliest, [out] LONGLONG * pLatest ); + + // Rate stuff + HRESULT SetRate([in] double dRate); + HRESULT GetRate([out] double * pdRate); + + // Preroll + HRESULT GetPreroll([out] LONGLONG * pllPreroll); +} + +typedef IMediaSeeking *PMEDIASEEKING; + +// Flags for IMediaEventEx +cpp_quote("enum tagAM_MEDIAEVENT_FLAGS") +cpp_quote("{") +cpp_quote(" AM_MEDIAEVENT_NONOTIFY = 0x01") +cpp_quote("};") |