/[cvs]/api/include/DShowIDL/axcore.idl
ViewVC logotype

Contents of /api/include/DShowIDL/axcore.idl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Sun Jul 1 20:47:59 2001 UTC (22 years, 10 months ago) by bearsoft
Branch: lazy, MAIN
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
First import

1 //------------------------------------------------------------------------------
2 // File: AXCore.idl
3 //
4 // Desc: Core streaming interfaces. Other ActiveMovie-only interfaces
5 // are in AXExtend.idl.
6 //
7 // Copyright (c) 1992 - 2000, Microsoft Corporation. All rights reserved.
8 //------------------------------------------------------------------------------
9
10
11 // include unknwn.idl and objidl.idl first
12
13
14 #define CHARS_IN_GUID 39 // 128 bits, plus { - } punctuation and terminal null
15 // chars NOT BYTES in the standard representation
16 // e.g. {D3588AB0-0781-11ce-B03A-0020AF0BA770} + null
17 cpp_quote("#define CHARS_IN_GUID 39")
18
19
20 //=====================================================================
21 //=====================================================================
22 // media types & formats
23 //=====================================================================
24 //=====================================================================
25
26 // there is a high-level media type (audio, compressed video,
27 // mpeg video, midi). Within each type, there is a subtype (cinepak, pcm)
28 // and a length+untyped data block defining the format in a
29 // type-specific manner. EG for video/cinepak, the data block would be
30 // a bitmapinfo.
31 // the contents of the format block is defined by the formattype GUID
32 // for example FORMAT_VideoInfo, FORMAT_WaveFormatEx. In the future this
33 // may be a pointer to an object supporting property style interfaces
34 // in which case the GUID may be something like FORMAT_IUnknown. When
35 // you are passed a media type you should check the format type, if
36 // it isn't a type you recognise then don't touch the format block
37
38 typedef struct _AMMediaType {
39 GUID majortype;
40 GUID subtype;
41 BOOL bFixedSizeSamples;
42 BOOL bTemporalCompression;
43 ULONG lSampleSize;
44 GUID formattype;
45 IUnknown *pUnk;
46 ULONG cbFormat;
47 [size_is(cbFormat)] BYTE * pbFormat;
48 } AM_MEDIA_TYPE;
49
50 //=====================================================================
51 //=====================================================================
52 // pin information
53 //=====================================================================
54 //=====================================================================
55
56 // is this an input or output pin
57 typedef enum _PinDirection {
58 PINDIR_INPUT,
59 PINDIR_OUTPUT
60 } PIN_DIRECTION;
61
62 // other types that need defining
63 #define MAX_PIN_NAME 128
64 cpp_quote("#define MAX_PIN_NAME 128")
65 cpp_quote("#define MAX_FILTER_NAME 128")
66 #define MAX_FILTER_NAME 128
67
68
69 //=====================================================================
70 //=====================================================================
71 // time information
72 //
73 // This represents a time (either reference or stream) in 100ns units
74 // The class library contains a CRefTime helper class
75 // that supports simple comparison and arithmetic operations
76 //=====================================================================
77 //=====================================================================
78
79 typedef LONGLONG REFERENCE_TIME;
80 typedef double REFTIME;
81
82 // Win32 HANDLEs have to be cast to these as the MIDL compiler doesn't
83 // like the HANDLE type or in fact anything remotely associated with
84 // them. If this ever gets ported to a MAC environment then these will
85 // have to become an alertable synchronisation object that it supports
86
87 typedef DWORD_PTR HSEMAPHORE;
88 typedef DWORD_PTR HEVENT;
89
90 //=====================================================================
91 //=====================================================================
92 // Allocator properties
93 //
94 // Used to describe the actual properties of an allocator,
95 // and used to request properties from an allocator or from an upstream
96 // filter that could create an allocator. See IMemAllocator and
97 // IMemInputPin.
98 //=====================================================================
99 //=====================================================================
100 typedef struct _AllocatorProperties {
101 long cBuffers; // count of buffers at this allocator
102 long cbBuffer; // size of each buffer, excluding any prefix
103
104 // alignment of the buffer - buffer start will be aligned on a multiple of
105 // this amount
106 long cbAlign;
107
108 // prefix amount. Each buffer is immediately preceeded by cbPrefix bytes.
109 // note that GetPointer points to the beginning of the buffer proper.
110 // the prefix is aligned, i.e. (GetPointer() - cbPrefix) is aligned on cbAlign.
111 long cbPrefix;
112 } ALLOCATOR_PROPERTIES;
113
114
115
116
117
118 // forward declarations (in alphabetical order - we were getting duplicates)
119 interface IAMovieSetup;
120 interface IEnumFilters;
121 interface IEnumMediaTypes;
122 interface IEnumPins;
123 interface IBaseFilter;
124 interface IFilterGraph;
125 interface IMediaFilter;
126 interface IMediaSample;
127 interface IMemAllocator;
128 interface IMemAllocatorCallbackTemp;
129 interface IMemAllocatorNotifyCallbackTemp;
130 interface IMemInputPin;
131 interface IPin;
132 interface IReferenceClock;
133
134
135
136 //=====================================================================
137 //=====================================================================
138 // Defines IPin interface
139 //
140 // interface representing a single, unidirection connection point on a
141 // filter. A Pin will connect to exactly one other pin on another filter.
142 // This interface represents the interface other objects can call on
143 // this pin. The interface between the filter and the pin is private to
144 // the implementation of a specific filter.
145 //
146 // During the connection process, one pin will be instructed to take
147 // the lead: the connect interface on this pin will be calling, passing
148 // the IPin* for the other pin. This connecting pin will call the
149 // ReceiveConnection member function on the other pin, as well as presumably
150 // other format-enumeration and queryinterface calls to establish whether
151 // the connection is possible.
152 //=====================================================================
153 //=====================================================================
154
155 [
156 object,
157 uuid(56a86891-0ad4-11ce-b03a-0020af0ba770),
158 pointer_default(unique)
159 ]
160 interface IPin : IUnknown {
161
162 // initiate a connection to another pin. calls ReceiveConnection on the
163 // other pin. Verifies that the connection is possible and may reject
164 // it.
165 // The mediatype parameter is optional. If it is not null, the pin must
166 // connect using that media type if possible. The subtype and/or format
167 // type can be GUID_NULL, meaning that the pin can fill them in as desired.
168 // This allows an application to partially specify the media type to be
169 // used for the connection, insisting on eg YUV 422 but leaving details
170 // (such as the image size) to be negotiated between the pins.
171 HRESULT Connect(
172 [in] IPin * pReceivePin, // connect yourself to this pin
173 [in] const AM_MEDIA_TYPE * pmt // (optional) connect using this type
174 );
175
176 // called by a connecting pin to make a connection
177 HRESULT ReceiveConnection(
178 [in] IPin * pConnector,
179 [in] const AM_MEDIA_TYPE *pmt // this is the media type we will exchange
180 );
181
182 // break a connection - no params since there is only one connection
183 // possible on this pin
184 HRESULT Disconnect(void);
185
186 // Find the pin this pin is connected to (if any)
187 // The pointer returned is AddRef()d
188 // Fails if the pin is not connected
189 HRESULT ConnectedTo(
190 [out] IPin **pPin
191 );
192
193 // Return the media type of a connection if the pin is connected
194 HRESULT ConnectionMediaType(
195 [out] AM_MEDIA_TYPE *pmt
196 );
197
198 // get information about the pin itself
199 typedef struct _PinInfo {
200 IBaseFilter *pFilter; // the filter this pin is on
201 PIN_DIRECTION dir; // am I an input or output pin?
202 WCHAR achName[MAX_PIN_NAME]; // the name of this pin within this filter
203 } PIN_INFO;
204
205 HRESULT QueryPinInfo(
206 [out] PIN_INFO * pInfo
207 );
208
209 // We often want to know the direction. Rather than use the
210 // relatively expensive QueryPinInfo, use this
211 HRESULT QueryDirection(
212 [out] PIN_DIRECTION *pPinDir
213 );
214
215 // Get an identifier for the pin (allows connections to be saved).
216 // The storage will be allocated by the filter using CoTaskMemAlloc
217 // The caller should free it using CoTaskMemFree
218 HRESULT QueryId(
219 [out] LPWSTR * Id
220 );
221
222 // will the pin accept the format type, S_OK yes, S_FALSE no
223 HRESULT QueryAccept(
224 [in] const AM_MEDIA_TYPE *pmt
225 );
226
227 // return an enumerator for this pin's preferred media types
228 HRESULT EnumMediaTypes(
229 [out] IEnumMediaTypes **ppEnum
230 );
231
232 // return an array of IPin* - the pins that this pin internally connects to
233 // All pins put in the array must be AddReffed (but no others)
234 // Errors: "Can't say" - FAIL; not enough slots - return S_FALSE
235 // Default: return E_NOTIMPL
236 // The filter graph will interpret E_NOTIMPL as any input pin connects to
237 // all visible output pins and vise versa.
238 // apPin can be NULL if nPin==0 (not otherwise).
239 HRESULT QueryInternalConnections(
240 [out] IPin* *apPin, // array of IPin*
241 [in, out] ULONG *nPin // on input, the number of slots
242 // on output the number of pins
243 );
244
245 // notify the pin that no more data is expected until a new run
246 // command is issued. End of stream should be queued and delivered after
247 // all queued data is delivered. Pass through if there is no queued data.
248 // Flush should flush any queued EOS.
249 // returns S_OK unless there is some error.
250 // input pins only: output pins will normally return E_UNEXPECTED.
251 HRESULT EndOfStream(void);
252
253 // Flush
254
255 // Enter flush state: do the following steps (in order)
256 // -- prevent any more Receives succeeding (set a flushing flag)
257 // -- discard any queued data
258 // -- free anyone blocked on Receive in your filter
259 // -- pass BeginFlush to any downstream pins
260 HRESULT BeginFlush(void);
261
262 // End flush state: do the following steps in order
263 // -- ensure no more data will be pushed by your filter
264 // (sync with thread if you have one, stop it pushing and
265 // discard any queued data)
266 // -- re-enable Receive (clear internal flushing flag)
267 // -- pass EndFlush to any downstream pins
268 HRESULT EndFlush(void);
269
270 // informational: all data arriving after this call is part of a segment
271 // from StartTime to StopTime, played at rate. This allows filters that
272 // process buffers containing more than one sample to clip the rendering
273 // to within the start and stop times.
274 //
275 // A source pin will call a destination pin on this method after completing
276 // delivery of any previous data, and before any Receive calls for the
277 // new data
278 HRESULT NewSegment(
279 [in] REFERENCE_TIME tStart,
280 [in] REFERENCE_TIME tStop,
281 [in] double dRate);
282 }
283
284 typedef IPin *PPIN;
285
286
287 //=====================================================================
288 //=====================================================================
289 // Defines IEnumPins interface
290 //
291 // interface returned from IBaseFilter::EnumPins(). based on IEnumXXXX
292 //=====================================================================
293 //=====================================================================
294
295 [
296 object,
297 uuid(56a86892-0ad4-11ce-b03a-0020af0ba770),
298 pointer_default(unique)
299 ]
300 interface IEnumPins : IUnknown {
301
302 HRESULT Next(
303 [in] ULONG cPins, // place this many pins...
304 [out, size_is(cPins)] IPin ** ppPins, // ...in this array
305 [out] ULONG * pcFetched // actual count passed
306 );
307
308 HRESULT Skip(
309 [in] ULONG cPins);
310
311 HRESULT Reset(void);
312
313 HRESULT Clone(
314 [out] IEnumPins **ppEnum
315 );
316 }
317
318 typedef IEnumPins *PENUMPINS;
319
320
321 //=====================================================================
322 //=====================================================================
323 // Defines IEnumMediaTypes interface
324 //
325 // Enumerates the preferred formats for a pin
326 //=====================================================================
327 //=====================================================================
328
329 [
330 object,
331 uuid(89c31040-846b-11ce-97d3-00aa0055595a),
332 pointer_default(unique)
333 ]
334 interface IEnumMediaTypes : IUnknown {
335
336 // to call this member function pass in the address of a pointer to a
337 // media type. The interface will allocate the necessary AM_MEDIA_TYPE
338 // structures and initialise them with the variable format block
339
340 HRESULT Next(
341 [in] ULONG cMediaTypes, // place this many types...
342 [out, size_is(cMediaTypes)]
343 AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array
344 [out] ULONG * pcFetched // actual count passed
345 );
346
347 HRESULT Skip(
348 [in] ULONG cMediaTypes);
349
350 HRESULT Reset(void);
351
352 HRESULT Clone(
353 [out] IEnumMediaTypes **ppEnum
354 );
355 }
356
357 typedef IEnumMediaTypes *PENUMMEDIATYPES;
358
359
360
361 //========================================================================
362 //========================================================================
363 // Defines IFilterGraph interface
364 //
365 // abstraction representing a graph of filters
366 // This allows filters to be joined into a graph and operated as a unit.
367 //========================================================================
368 //========================================================================
369
370 [
371 object,
372 uuid(56a8689f-0ad4-11ce-b03a-0020af0ba770),
373 pointer_default(unique)
374 ]
375 interface IFilterGraph : IUnknown {
376
377 //==========================================================================
378 // Low level filter functions
379 //==========================================================================
380
381 // Add a filter to the graph and name it with *pName.
382 // If the name is not unique, The request will fail.
383 // The Filter graph will call the JoinFilterGraph
384 // member function of the filter to inform it.
385 // This must be called before attempting Connect, ConnectDirect or Render
386 // for pins of the filter.
387
388 HRESULT AddFilter
389 ( [in] IBaseFilter * pFilter,
390 [in, string] LPCWSTR pName
391 );
392
393
394 // Remove a filter from the graph. The filter graph implementation
395 // will inform the filter that it is being removed.
396
397 HRESULT RemoveFilter
398 ( [in] IBaseFilter * pFilter
399 );
400
401
402 // Set *ppEnum to be an enumerator for all filters in the graph.
403
404 HRESULT EnumFilters
405 ( [out] IEnumFilters **ppEnum
406 );
407
408
409 // Set *ppFilter to be the filter which was added with the name *pName
410 // Will fail and set *ppFilter to NULL if the name is not in this graph.
411
412 HRESULT FindFilterByName
413 ( [in, string] LPCWSTR pName,
414 [out] IBaseFilter ** ppFilter
415 );
416
417 //==========================================================================
418 // Low level connection functions
419 //==========================================================================
420
421 // Connect these two pins directly (i.e. without intervening filters)
422 // the media type is optional, and may be partially specified (that is
423 // the subtype and/or format type may be GUID_NULL). See IPin::Connect
424 // for details of the media type parameter.
425 HRESULT ConnectDirect
426 ( [in] IPin * ppinOut, // the output pin
427 [in] IPin * ppinIn, // the input pin
428 [in, unique] const AM_MEDIA_TYPE* pmt // optional mediatype
429 );
430
431 // Break the connection that this pin has and reconnect it to the
432 // same other pin.
433
434 HRESULT Reconnect
435 ( [in] IPin * ppin // the pin to disconnect and reconnect
436 );
437
438
439
440 // Disconnect this pin, if connected. Successful no-op if not connected.
441
442 HRESULT Disconnect
443 ( [in] IPin * ppin
444 );
445
446 //==========================================================================
447 // intelligent connectivity - now in IGraphBuilder, axextend.idl
448 //==========================================================================
449
450 //==========================================================================
451 // Whole graph functions
452 //==========================================================================
453
454 // Once a graph is built, it can behave as a (composite) filter.
455 // To control this filter, QueryInterface for IMediaFilter.
456
457 // The filtergraph will by default ensure that the graph has a sync source
458 // when it is made to Run. SetSyncSource(NULL) will prevent that and allow
459 // all the filters to run unsynchronised until further notice.
460 // SetDefaultSyncSource will set the default sync source (the same as would
461 // have been set by default on the first call to Run).
462 HRESULT SetDefaultSyncSource(void);
463
464 }
465
466 typedef IFilterGraph *PFILTERGRAPH;
467
468
469
470 //==========================================================================
471 //==========================================================================
472 // Defines IEnumFilters interface
473 //
474 // enumerator interface returned from IFilterGraph::EnumFilters().
475 // based on IEnum pseudo-template
476 //==========================================================================
477 //==========================================================================
478
479 [
480 object,
481 uuid(56a86893-0ad4-11ce-b03a-0020af0ba770),
482 pointer_default(unique)
483 ]
484 interface IEnumFilters : IUnknown {
485
486 HRESULT Next
487 ( [in] ULONG cFilters, // place this many filters...
488 [out] IBaseFilter ** ppFilter, // ...in this array of IBaseFilter*
489 [out] ULONG * pcFetched // actual count passed returned here
490 );
491
492
493 HRESULT Skip
494 ( [in] ULONG cFilters
495 );
496
497
498 HRESULT Reset(void);
499
500
501 HRESULT Clone
502 ( [out] IEnumFilters **ppEnum
503 );
504 }
505
506 typedef IEnumFilters *PENUMFILTERS;
507
508
509 //=====================================================================
510 //=====================================================================
511 // Defines IMediaFilter interface
512 //
513 // multimedia components that provide time-based data will expose this.
514 // this interface abstracts an object that processes time-based data streams
515 // and represents a multimedia device (possibly implemented in software).
516 // it controls the active/running state of the object and its synchronization
517 // to other objects in the system.
518 //
519 // derived from IPersist so that all filter-type objects in a graph
520 // can have their class id serialised.
521 //=====================================================================
522 //=====================================================================
523
524 [
525 object,
526 uuid(56a86899-0ad4-11ce-b03a-0020af0ba770),
527 pointer_default(unique)
528 ]
529 interface IMediaFilter : IPersist {
530
531 // tell the filter to transition to the new state. The state transition
532 // may not be instantaneous (external mechanical activity may be involved,
533 // for example). The state functions may return before the state
534 // transition has completed
535
536 // these functions will return S_OK if the transition is complete, S_FALSE if
537 // the transition is not complete but no error has occurred, or some error value
538 // if the transition failed.
539 HRESULT Stop(void);
540 HRESULT Pause(void);
541
542 // in order to synchronise independent streams, you must pass a time
543 // value with the Run command. This is the difference between stream
544 // time and reference time. That is, it is the amount to be added to
545 // the IMediaSample timestamp to get the time at which that sample
546 // should be rendered according to the reference clock.
547 // If we are starting at the beginning of the stream, it will thus be
548 // simply the time at which the first sample should appear. If we are
549 // restarting from Paused mode in midstream, then it will be the total
550 // time we have been paused added to the initial start time.
551
552 // the filtergraph will provide this information to its filters. If you
553 // are an app calling the filtergraph, it's ok to pass a start time of
554 // 0, in which case the filter graph will calculate a soon-as-possible
555 // time. FilterGraphs will accept 0 meaning ASAP; most filters will not.
556
557 HRESULT Run(REFERENCE_TIME tStart);
558
559
560 // possible states that the filter could be in
561 typedef enum _FilterState {
562 State_Stopped, // not in use
563 State_Paused, // holding resources, ready to go
564 State_Running // actively processing media stream
565 } FILTER_STATE;
566
567 // find out what state the filter is in.
568 // If timeout is 0, will return immediately - if a state transition is
569 // not complete, it will return the state being transitioned into, and
570 // the return code will be VFW_S_STATE_INTERMEDIATE. if no state
571 // transition is in progress the state will be returned and the return
572 // code will be S_OK.
573 //
574 // If timeout is non-zero, GetState will not return until the state
575 // transition is complete, or the timeout expires.
576 // The timeout is in milliseconds.
577 // You can also pass in INFINITE as a special value for the timeout, in
578 // which case it will block indefinitely waiting for the state transition
579 // to complete. If the timeout expires, the state returned is the
580 // state we are trying to reach, and the return code will be
581 // VFW_S_STATE_INTERMEDIATE. If no state transition is in progress
582 // the routine returns immediately with return code S_OK.
583
584 //
585 // return State is State_Running, State_Paused or State_Stopped.
586 // return code is S_OK, or VFW_S_STATE_INTERMEDIATE if state
587 // transition is not complete or an error value if the method failed.
588 HRESULT GetState(
589 [in] DWORD dwMilliSecsTimeout,
590 [out] FILTER_STATE *State);
591
592
593 // tell the filter the reference clock to which it should synchronize
594 // activity. This is most important to rendering filters and may not
595 // be of any interest to other filters.
596 HRESULT SetSyncSource(
597 [in] IReferenceClock * pClock);
598
599 // get the reference clock currently in use (it may be NULL)
600 HRESULT GetSyncSource(
601 [out] IReferenceClock ** pClock);
602 }
603
604 typedef IMediaFilter *PMEDIAFILTER;
605
606
607 //=====================================================================
608 //=====================================================================
609 // Defines IBaseFilter interface
610 //
611 // all multimedia components will expose this interface
612 // this interface abstracts an object that has typed input and output
613 // connections and can be dynamically aggregated.
614 //
615 // IMediaFilter supports synchronisation and activity state: IBaseFilter
616 // is derived from that since all filters need to support IMediaFilter,
617 // whereas a few objects (plug-in control distributors for example) will
618 // support IMediaFilter but not IBaseFilter.
619 //
620 // IMediaFilter is itself derived from IPersist so that every filter
621 //supports GetClassID()
622 //=====================================================================
623 //=====================================================================
624
625 [
626 object,
627 uuid(56a86895-0ad4-11ce-b03a-0020af0ba770),
628 pointer_default(unique)
629 ]
630 interface IBaseFilter : IMediaFilter {
631
632 // enumerate all the pins available on this filter
633 // allows enumeration of all pins only.
634 //
635 HRESULT EnumPins(
636 [out] IEnumPins ** ppEnum // enum interface returned here
637 );
638
639 // Convert the external identifier of a pin to an IPin *
640 // This pin id is quite different from the pin Name in CreatePin.
641 // In CreatePin the Name is invented by the caller. In FindPin the Id
642 // must have come from a previous call to IPin::QueryId. Whether or not
643 // this operation would cause a pin to be created depends on the filter
644 // design, but if called twice with the same id it should certainly
645 // return the same pin both times.
646 HRESULT FindPin(
647 [in, string] LPCWSTR Id,
648 [out] IPin ** ppPin
649 );
650
651 // find out information about this filter
652 typedef struct _FilterInfo {
653 WCHAR achName[MAX_FILTER_NAME]; // maybe null if not part of graph
654 IFilterGraph * pGraph; // null if not part of graph
655 } FILTER_INFO;
656
657 HRESULT QueryFilterInfo(
658 [out] FILTER_INFO * pInfo
659 );
660
661 // notify a filter that it has joined a filter graph. It is permitted to
662 // refuse. The filter should addref and store this interface for later use
663 // since it may need to notify events to this interface. A null pointer indicates
664 // that the filter is no longer part of a graph.
665 HRESULT JoinFilterGraph(
666 [in] IFilterGraph * pGraph,
667 [in, string] LPCWSTR pName
668 );
669
670 // return a Vendor information string. Optional - may return E_NOTIMPL.
671 // memory returned should be freed using CoTaskMemFree
672 HRESULT QueryVendorInfo(
673 [out, string] LPWSTR* pVendorInfo
674 );
675 }
676
677 typedef IBaseFilter *PFILTER;
678
679
680 //=====================================================================
681 //=====================================================================
682 // sync and state management
683 //=====================================================================
684 //=====================================================================
685
686
687 //=====================================================================
688 //=====================================================================
689 // Defines IReferenceClock interface
690 //=====================================================================
691 //=====================================================================
692
693 [
694 object,
695 uuid(56a86897-0ad4-11ce-b03a-0020af0ba770),
696 pointer_default(unique)
697 ]
698 interface IReferenceClock : IUnknown {
699
700 // get the time now
701 HRESULT GetTime(
702 [out] REFERENCE_TIME *pTime
703 );
704
705 // ask for an async notification that a time has elapsed
706 HRESULT AdviseTime(
707 [in] REFERENCE_TIME baseTime, // base reference time
708 [in] REFERENCE_TIME streamTime, // stream offset time
709 [in] HEVENT hEvent, // advise via this event
710 [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes
711 );
712
713 // ask for an async periodic notification that a time has elapsed
714 HRESULT AdvisePeriodic(
715 [in] REFERENCE_TIME startTime, // starting at this time
716 [in] REFERENCE_TIME periodTime, // time between notifications
717 [in] HSEMAPHORE hSemaphore, // advise via a semaphore
718 [out] DWORD_PTR * pdwAdviseCookie // where your cookie goes
719 );
720
721 // cancel a request for notification
722 HRESULT Unadvise(
723 [in] DWORD_PTR dwAdviseCookie);
724 }
725
726 typedef IReferenceClock *PREFERENCECLOCK;
727
728 //=====================================================================
729 //=====================================================================
730 // Defines IReferenceClock2 interface
731 //=====================================================================
732 //=====================================================================
733
734 [
735 object,
736 uuid(36b73885-c2c8-11cf-8b46-00805f6cef60),
737 pointer_default(unique)
738 ]
739 interface IReferenceClock2 : IReferenceClock {
740 }
741
742 typedef IReferenceClock2 *PREFERENCECLOCK2;
743
744
745 //=====================================================================
746 //=====================================================================
747 // Data transport interfaces
748 //=====================================================================
749 //=====================================================================
750
751
752 //=====================================================================
753 //=====================================================================
754 // Defines IMediaSample interface
755 //=====================================================================
756 //=====================================================================
757
758 [
759 local,
760 object,
761 uuid(56a8689a-0ad4-11ce-b03a-0020af0ba770),
762 pointer_default(unique)
763 ]
764 interface IMediaSample : IUnknown {
765
766 // get me a read/write pointer to this buffer's memory. I will actually
767 // want to use sizeUsed bytes.
768 HRESULT GetPointer([out] BYTE ** ppBuffer);
769
770 // return the size in bytes of the buffer data area
771 long GetSize(void);
772
773 // get the stream time at which this sample should start and finish.
774 HRESULT GetTime(
775 [out] REFERENCE_TIME * pTimeStart, // put time here
776 [out] REFERENCE_TIME * pTimeEnd
777 );
778
779 // Set the stream time at which this sample should start and finish.
780 // pTimeStart==pTimeEnd==NULL will invalidate the time stamps in
781 // this sample
782 HRESULT SetTime(
783 [in] REFERENCE_TIME * pTimeStart, // put time here
784 [in] REFERENCE_TIME * pTimeEnd
785 );
786
787 // sync-point property. If true, then the beginning of this
788 // sample is a sync-point. (note that if AM_MEDIA_TYPE.bTemporalCompression
789 // is false then all samples are sync points). A filter can start
790 // a stream at any sync point. S_FALSE if not sync-point, S_OK if true.
791
792 HRESULT IsSyncPoint(void);
793 HRESULT SetSyncPoint(BOOL bIsSyncPoint);
794
795 // preroll property. If true, this sample is for preroll only and
796 // shouldn't be displayed.
797 HRESULT IsPreroll(void);
798 HRESULT SetPreroll(BOOL bIsPreroll);
799
800 long GetActualDataLength(void);
801 HRESULT SetActualDataLength(long);
802
803 // these allow for limited format changes in band - if no format change
804 // has been made when you receive a sample GetMediaType will return S_FALSE
805
806 HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType);
807 HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType);
808
809 // returns S_OK if there is a discontinuity in the data (this frame is
810 // not a continuation of the previous stream of data
811 // - there has been a seek or some dropped samples).
812 HRESULT IsDiscontinuity(void);
813 // set the discontinuity property - TRUE if this sample is not a
814 // continuation, but a new sample after a seek or a dropped sample.
815 HRESULT SetDiscontinuity(BOOL bDiscontinuity);
816
817 // get the media times for this sample
818 HRESULT GetMediaTime(
819 [out] LONGLONG * pTimeStart,
820 [out] LONGLONG * pTimeEnd
821 );
822
823 // Set the media times for this sample
824 // pTimeStart==pTimeEnd==NULL will invalidate the media time stamps in
825 // this sample
826 HRESULT SetMediaTime(
827 [in] LONGLONG * pTimeStart,
828 [in] LONGLONG * pTimeEnd
829 );
830 }
831
832 typedef IMediaSample *PMEDIASAMPLE;
833
834 // Values for dwFlags for AM_SAMPLE_PROPERTIES
835 enum tagAM_SAMPLE_PROPERTY_FLAGS
836 { AM_SAMPLE_SPLICEPOINT = 0x01, /* Is this a splice point
837 IE can it be decoded
838 without reference to
839 previous data */
840 AM_SAMPLE_PREROLL = 0x02, /* Is this a preroll sample */
841 AM_SAMPLE_DATADISCONTINUITY = 0x04, /* Set if start of new segment */
842 AM_SAMPLE_TYPECHANGED = 0x08, /* Has the type changed */
843 AM_SAMPLE_TIMEVALID = 0x10, /* Set if time is valid */
844 AM_SAMPLE_TIMEDISCONTINUITY = 0x40, /* time gap in data starts after
845 this sample - pbBuffer can
846 be NULL
847 */
848 AM_SAMPLE_FLUSH_ON_PAUSE = 0x80, /* For live data - discard
849 in paused state
850 */
851 AM_SAMPLE_STOPVALID = 0x100, /* Stop time is valid */
852 AM_SAMPLE_ENDOFSTREAM = 0x200, /* End of stream after
853 this data
854 This is reserved for
855 kernel streaming and is
856 not currently used by
857 ActiveMovie
858 */
859 AM_STREAM_MEDIA = 0, /* Normal data stream id */
860 AM_STREAM_CONTROL = 1 /* Control stream id */
861 /* > 7FFFFFFF is application
862 defined stream
863 */
864 };
865
866 // Media sample generic properties structure
867 typedef struct tagAM_SAMPLE2_PROPERTIES {
868 DWORD cbData; // Length of generic data for extensiblity
869 // Number of bytes INCLUDING this field
870 DWORD dwTypeSpecificFlags; // Type specific flag data
871 DWORD dwSampleFlags; // Flags bits defined by AM_SAMPLE_xxx flags
872 // All undefined bits RESERVED (set to 0,
873 // leave on copy)
874 LONG lActual; // Length of data in buffer
875 REFERENCE_TIME tStart; // Start time if valid
876 REFERENCE_TIME tStop; // Stop time if valid
877 DWORD dwStreamId; // Stream 0 is normal media transport
878 // Stream 1 is control
879 AM_MEDIA_TYPE *pMediaType; // Copy of media type - INVALID after Release()
880 BYTE *pbBuffer; // Pointer to buffer - INVALID after Release()
881 LONG cbBuffer; // Length of buffer
882 } AM_SAMPLE2_PROPERTIES;
883
884 //=====================================================================
885 //=====================================================================
886 // Defines IMediaSample2 interface
887 //=====================================================================
888 //=====================================================================
889
890 [
891 local,
892 object,
893 uuid(36b73884-c2c8-11cf-8b46-00805f6cef60),
894 pointer_default(unique)
895 ]
896 interface IMediaSample2 : IMediaSample {
897
898 // Get sample properties
899 //
900 // cbProperties - length of generic data to retrieve
901 // pbProperties - pointer to generic data buffer - can
902 // be NULL if cbProperties is NULL
903 // data conforms to AM_SAMPLE_PROPERTIES
904 //
905 HRESULT GetProperties(
906 [in] DWORD cbProperties,
907 [out, size_is(cbProperties)] BYTE * pbProperties
908 );
909 // Set sample properties
910 //
911 // cbProperties - length of generic data to set
912 // pbProperties - pointer to generic data buffer - can
913 // be NULL if cbProperties is NULL
914 // data conforms to AM_SAMPLE_PROPERTIES
915 //
916 //
917 HRESULT SetProperties(
918 [in] DWORD cbProperties,
919 [in, size_is(cbProperties)] const BYTE * pbProperties
920 );
921
922
923 // // Get the clock associated with the sample
924 // HRESULT GetClock(
925 // [out] IReferenceClock2 **ppClock
926 // );
927
928 // // Get a pointer to the object containing the data
929 // //
930 // // riid - IID of interface required on object
931 // // ppvobject - Pointer to object containing the data
932 // //
933 // // Returns
934 // // S_OK - Got the object
935 // // E_NOINTERFACE - object does not support this interface
936 // // if IUnknown is not supported
937 // // there is no backing object
938 // // E_NOTIMPL - samples don't have backing objects
939 // //
940 // //
941 // HRESULT GetBackingObject(
942 // [in] REFIID riid,
943 // [out] void **ppvObject
944 // );
945 }
946
947 typedef IMediaSample2 *PMEDIASAMPLE2;
948
949
950 // flags for dwFlags in IMemAllocator::GetBuffer
951 // AM_GBF_PREVFRAMESKIPPED is only significant when asking for a buffer from the
952 // video renderer. It should be TRUE if and only if the previous frame
953 // was skipped. It affects quality management.
954 // AM_GBF_NOTASYNCPOINT indicates to the downstream filter (most likely the
955 // video renderer) that you are not going to fill this buffer with a sync point
956 // (keyframe) so now would be a bad time to return a buffer with a dynamic
957 // format change, because you will be unable to switch to the new format without
958 // waiting for the next sync point, causing some frames to be dropped.
959 #define AM_GBF_PREVFRAMESKIPPED 1
960 #define AM_GBF_NOTASYNCPOINT 2
961 cpp_quote("#define AM_GBF_PREVFRAMESKIPPED 1")
962 cpp_quote("#define AM_GBF_NOTASYNCPOINT 2")
963
964 // This may not be supported by allocators
965 cpp_quote("#define AM_GBF_NOWAIT 4")
966
967 //=====================================================================
968 //=====================================================================
969 // Defines IMemAllocator interface
970 //
971 // an allocator of IMediaSample blocks to be used for data transfer between
972 // pins. Can be provided by input, output or a third party. Release
973 // the IMediaSample object obtained back to the pool by calling
974 // IMediaSample::Release.
975 //=====================================================================
976 //=====================================================================
977
978 [
979 object,
980 uuid(56a8689c-0ad4-11ce-b03a-0020af0ba770),
981 pointer_default(unique)
982 ]
983 interface IMemAllocator : IUnknown {
984
985 // negotiate buffer sizes, buffer count and alignment. pRequest is filled
986 // in by the caller with the requested values. pActual will be returned
987 // by the allocator with the closest that the allocator can come to this.
988 // Cannot be called unless the allocator is decommitted.
989 // Calls to GetBuffer need not succeed until Commit is called.
990 HRESULT SetProperties(
991 [in] ALLOCATOR_PROPERTIES* pRequest,
992 [out] ALLOCATOR_PROPERTIES* pActual);
993
994 // return the properties actually being used on this allocator
995 HRESULT GetProperties(
996 [out] ALLOCATOR_PROPERTIES* pProps);
997
998
999 // commit the memory for the agreed buffers
1000 HRESULT Commit(void);
1001
1002 // release the memory for the agreed buffers. Any threads waiting in
1003 // GetBuffer will return with an error. GetBuffer calls will always fail
1004 // if called before Commit or after Decommit.
1005 HRESULT Decommit(void);
1006
1007 // get container for a sample. Blocking, synchronous call to get the
1008 // next free buffer (as represented by an IMediaSample interface).
1009 // on return, the time etc properties will be invalid, but the buffer
1010 // pointer and size will be correct.
1011 // Will only succeed if memory is committed. If GetBuffer is blocked
1012 // waiting for a buffer and Decommit is called on another thread,
1013 // GetBuffer will return with an error.
1014 HRESULT GetBuffer(
1015 [out] IMediaSample **ppBuffer,
1016 [in] REFERENCE_TIME * pStartTime,
1017 [in] REFERENCE_TIME * pEndTime,
1018 [in] DWORD dwFlags
1019 );
1020
1021 // put a buffer back on the allocators free list.
1022 // this is typically called by the Release() method of the media
1023 // sample when the reference count goes to 0
1024 //
1025 HRESULT ReleaseBuffer(
1026 [in] IMediaSample *pBuffer
1027 );
1028 }
1029
1030 typedef IMemAllocator *PMEMALLOCATOR;
1031
1032 //=====================================================================
1033 //=====================================================================
1034 // Defines IMemAllocatorCallbackTemp interface
1035 //
1036 // If the allocator supports IMemAllocator2 then callbacks are
1037 // available
1038 //
1039 //=====================================================================
1040 //=====================================================================
1041 [
1042 object,
1043 uuid(379a0cf0-c1de-11d2-abf5-00a0c905f375),
1044 pointer_default(unique)
1045 ]
1046 interface IMemAllocatorCallbackTemp : IMemAllocator {
1047
1048 // Set notification interface. pNotify can be NULL
1049 HRESULT SetNotify(
1050 [in] IMemAllocatorNotifyCallbackTemp *pNotify);
1051
1052 // Get current stats
1053 HRESULT GetFreeCount(
1054 [out] LONG *plBuffersFree);
1055 }
1056
1057 //=====================================================================
1058 //=====================================================================
1059 // Defines IMemAllocatorNotify interface
1060 //
1061 //=====================================================================
1062 //=====================================================================
1063 [
1064 object,
1065 uuid(92980b30-c1de-11d2-abf5-00a0c905f375),
1066 pointer_default(unique)
1067 ]
1068 interface IMemAllocatorNotifyCallbackTemp : IUnknown {
1069
1070 // Called whenever ReleaseBuffer is called in the allocator
1071 // Note the caller may have acquired locks and this call may
1072 // occur in any context so generally the implementor of this
1073 // call will just set an event or post a message for another
1074 // thread to take action.
1075 HRESULT NotifyRelease();
1076 }
1077
1078 //=====================================================================
1079 //=====================================================================
1080 // Defines IMemInputPin interface
1081 //
1082 // basic shared memory transport interface.
1083 //=====================================================================
1084 //=====================================================================
1085
1086 [
1087 object,
1088 uuid(56a8689d-0ad4-11ce-b03a-0020af0ba770),
1089 pointer_default(unique)
1090 ]
1091 interface IMemInputPin : IUnknown {
1092
1093 // return the allocator interface that this input pin
1094 // would like the output pin to use
1095 HRESULT GetAllocator(
1096 [out] IMemAllocator ** ppAllocator);
1097
1098 // tell the input pin which allocator the output pin is actually
1099 // going to use.
1100 // If the readonly flag is set, then all samples from this allocator are
1101 // to be treated as read-only, and should be copied before being modified.
1102 HRESULT NotifyAllocator(
1103 [in] IMemAllocator * pAllocator,
1104 [in] BOOL bReadOnly
1105 );
1106
1107 // this method is optional (can return E_NOTIMPL). Output pins are not obliged to call
1108 // this method, nor are they obliged to fulfil the request. Input pins making such a
1109 // request should check the allocator in NotifyAllocator to see if it meets their needs. If
1110 // not, the input pin is responsible for any necessary data copy.
1111 // Zero values will be treated as don't care: so a pin can return an alignment value
1112 // and leave the other values 0.
1113 HRESULT GetAllocatorRequirements( [out] ALLOCATOR_PROPERTIES*pProps);
1114
1115 // here's the next block of data from the stream. AddRef it if
1116 // you need to hold it beyond the end of the Receive call.
1117 // call pSample->Release when done with it.
1118 //
1119 // This is a blocking synchronous call. Usually no blocking
1120 // will occur but if a filter cannot process the sample immediately
1121 // it may use the caller's thread to wait until it can.
1122 HRESULT Receive(
1123 [in] IMediaSample * pSample);
1124 // Same as Receive but with multiple samples. Useful for
1125 // fragmented streams
1126 HRESULT ReceiveMultiple(
1127 [in, size_is(nSamples)] IMediaSample **pSamples,
1128 [in] long nSamples,
1129 [out] long *nSamplesProcessed);
1130
1131 // See if Receive might block
1132 // Returns S_OK if it can block, S_FALSE if it can't or some
1133 // failure code (assume it can in this case)
1134 HRESULT ReceiveCanBlock();
1135 }
1136
1137 typedef IMemInputPin *PMEMINPUTPIN;
1138
1139
1140 //=====================================================================
1141 //=====================================================================
1142 // Defines IAMovieSetup interface
1143 //
1144 // exported by filter to allow it to be self-registering
1145 //=====================================================================
1146 //=====================================================================
1147
1148 [
1149 object,
1150 uuid(a3d8cec0-7e5a-11cf-bbc5-00805f6cef20),
1151 pointer_default(unique)
1152 ]
1153 interface IAMovieSetup : IUnknown {
1154
1155 // methods to register and unregister
1156 // filter, etc.
1157
1158 HRESULT Register( );
1159 HRESULT Unregister( );
1160 }
1161
1162 typedef IAMovieSetup *PAMOVIESETUP;
1163
1164
1165 //=====================================================================
1166 //=====================================================================
1167 // Defines IMediaSeeking interface
1168 //
1169 // Controls seeking (time, bytes, frames, fields and samples)
1170 //=====================================================================
1171 //=====================================================================
1172
1173 typedef enum AM_SEEKING_SeekingFlags
1174 {
1175 AM_SEEKING_NoPositioning = 0x00, // No change
1176 AM_SEEKING_AbsolutePositioning = 0x01, // Position is supplied and is absolute
1177 AM_SEEKING_RelativePositioning = 0x02, // Position is supplied and is relative
1178 AM_SEEKING_IncrementalPositioning = 0x03, // (Stop) position relative to current
1179 // Useful for seeking when paused (use +1)
1180 AM_SEEKING_PositioningBitsMask = 0x03, // Useful mask
1181 AM_SEEKING_SeekToKeyFrame = 0x04, // Just seek to key frame (performance gain)
1182 AM_SEEKING_ReturnTime = 0x08, // Plug the media time equivalents back into the supplied LONGLONGs
1183
1184 AM_SEEKING_Segment = 0x10, // At end just do EC_ENDOFSEGMENT,
1185 // don't do EndOfStream
1186 AM_SEEKING_NoFlush = 0x20 // Don't flush
1187 } AM_SEEKING_SEEKING_FLAGS;
1188
1189 typedef enum AM_SEEKING_SeekingCapabilities
1190 {
1191 AM_SEEKING_CanSeekAbsolute = 0x001,
1192 AM_SEEKING_CanSeekForwards = 0x002,
1193 AM_SEEKING_CanSeekBackwards = 0x004,
1194 AM_SEEKING_CanGetCurrentPos = 0x008,
1195 AM_SEEKING_CanGetStopPos = 0x010,
1196 AM_SEEKING_CanGetDuration = 0x020,
1197 AM_SEEKING_CanPlayBackwards = 0x040,
1198 AM_SEEKING_CanDoSegments = 0x080,
1199 AM_SEEKING_Source = 0x100 // Doesn't pass thru used to
1200 // count segment ends
1201 } AM_SEEKING_SEEKING_CAPABILITIES;
1202
1203 [
1204 object,
1205 uuid(36b73880-c2c8-11cf-8b46-00805f6cef60),
1206 pointer_default(unique)
1207 ]
1208 interface IMediaSeeking : IUnknown {
1209
1210 // Returns the capability flags
1211 HRESULT GetCapabilities( [out] DWORD * pCapabilities );
1212
1213 // And's the capabilities flag with the capabilities requested.
1214 // Returns S_OK if all are present, S_FALSE if some are present, E_FAIL if none.
1215 // *pCababilities is always updated with the result of the 'and'ing and can be
1216 // checked in the case of an S_FALSE return code.
1217 HRESULT CheckCapabilities( [in,out] DWORD * pCapabilities );
1218
1219 // returns S_OK if mode is supported, S_FALSE otherwise
1220 HRESULT IsFormatSupported([in] const GUID * pFormat);
1221 HRESULT QueryPreferredFormat([out] GUID * pFormat);
1222
1223 HRESULT GetTimeFormat([out] GUID *pFormat);
1224 // Returns S_OK if *pFormat is the current time format, otherwise S_FALSE
1225 // This may be used instead of the above and will save the copying of the GUID
1226 HRESULT IsUsingTimeFormat([in] const GUID * pFormat);
1227
1228 // (may return VFE_E_WRONG_STATE if graph is stopped)
1229 HRESULT SetTimeFormat([in] const GUID * pFormat);
1230
1231 // return current properties
1232 HRESULT GetDuration([out] LONGLONG *pDuration);
1233 HRESULT GetStopPosition([out] LONGLONG *pStop);
1234 HRESULT GetCurrentPosition([out] LONGLONG *pCurrent);
1235
1236 // Convert time from one format to another.
1237 // We must be able to convert between all of the formats that we say we support.
1238 // (However, we can use intermediate formats (e.g. MEDIA_TIME).)
1239 // If a pointer to a format is null, it implies the currently selected format.
1240 HRESULT ConvertTimeFormat([out] LONGLONG * pTarget, [in] const GUID * pTargetFormat,
1241 [in] LONGLONG Source, [in] const GUID * pSourceFormat );
1242
1243
1244 // Set current and end positions in one operation
1245 // Either pointer may be null, implying no change
1246 HRESULT SetPositions( [in,out] LONGLONG * pCurrent, [in] DWORD dwCurrentFlags
1247 , [in,out] LONGLONG * pStop, [in] DWORD dwStopFlags );
1248
1249 // Get CurrentPosition & StopTime
1250 // Either pointer may be null, implying not interested
1251 HRESULT GetPositions( [out] LONGLONG * pCurrent,
1252 [out] LONGLONG * pStop );
1253
1254 // Get earliest / latest times to which we can currently seek "efficiently".
1255 // This method is intended to help with graphs where the source filter has
1256 // a very high latency. Seeking within the returned limits should just
1257 // result in a re-pushing of already cached data. Seeking beyond these
1258 // limits may result in extended delays while the data is fetched (e.g.
1259 // across a slow network).
1260 // (NULL pointer is OK, means caller isn't interested.)
1261 HRESULT GetAvailable( [out] LONGLONG * pEarliest, [out] LONGLONG * pLatest );
1262
1263 // Rate stuff
1264 HRESULT SetRate([in] double dRate);
1265 HRESULT GetRate([out] double * pdRate);
1266
1267 // Preroll
1268 HRESULT GetPreroll([out] LONGLONG * pllPreroll);
1269 }
1270
1271 typedef IMediaSeeking *PMEDIASEEKING;
1272
1273 // Flags for IMediaEventEx
1274 cpp_quote("enum tagAM_MEDIAEVENT_FLAGS")
1275 cpp_quote("{")
1276 cpp_quote(" AM_MEDIAEVENT_NONOTIFY = 0x01")
1277 cpp_quote("};")

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26